vue-stack-tabs 1.4.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +1 -0
- package/README.md +1 -0
- package/README.ru.md +1 -0
- package/dist/StackTabs.vue.d.ts +5 -2
- package/dist/components/ContextMenu/ContextMenuItem.vue.d.ts +1 -1
- package/dist/components/StackKeepAlive/StackCacheRenderer.vue.d.ts +0 -2
- package/dist/hooks/stackTabsContext.d.ts +0 -1
- package/dist/hooks/tabPanel/evict.d.ts +2 -2
- package/dist/hooks/tabPanel/refresh.d.ts +4 -2
- package/dist/hooks/tabPanel/scroll.d.ts +0 -2
- package/dist/hooks/tabPanel/state.d.ts +0 -1
- package/dist/hooks/tabPanel/tabStore.d.ts +12 -1
- package/dist/hooks/useIframeManager.d.ts +1 -1
- package/dist/hooks/useScrollShadow.d.ts +11 -2
- package/dist/hooks/useTabActions.d.ts +1 -0
- package/dist/hooks/useTabEventBus.d.ts +5 -0
- package/dist/hooks/useTabPanel.d.ts +14 -2
- package/dist/model/TabModel.d.ts +17 -5
- package/dist/nuxt/module.mjs +1 -1
- package/dist/nuxt/runtime/plugin.mjs +8 -1598
- package/dist/style.css +1 -1
- package/dist/utils/scrollUtils.d.ts +0 -2
- package/dist/utils/tabInfoEncoder.d.ts +8 -0
- package/dist/utils/urlParser.d.ts +20 -10
- package/dist/vue-stack-tabs.es.js +1 -1
- package/package.json +4 -7
- package/src/lib/StackTabs.vue +40 -3
- package/src/lib/assets/image/close_all.svg +1 -9
- package/src/lib/assets/image/close_lefts.svg +1 -1
- package/src/lib/assets/image/close_other.svg +1 -1
- package/src/lib/assets/image/close_rights.svg +1 -1
- package/src/lib/assets/image/reload.svg +1 -3
- package/src/lib/assets/image/reload_all.svg +1 -6
- package/src/lib/assets/style/common/mixins.scss +58 -19
- package/src/lib/assets/style/common/var.scss +100 -60
- package/src/lib/assets/style/icon.scss +31 -98
- package/src/lib/assets/style/index.scss +2 -2
- package/src/lib/assets/style/loading.scss +45 -0
- package/src/lib/assets/style/{stackTab.scss → stack-tab.scss} +116 -182
- package/src/lib/assets/style/transition.scss +12 -17
- package/src/lib/components/ContextMenu/ContextMenuItem.vue +5 -5
- package/src/lib/components/ContextMenu/index.vue +22 -19
- package/src/lib/components/PageLoading.vue +12 -11
- package/src/lib/components/StackKeepAlive/StackCacheRenderer.vue +1 -5
- package/src/lib/components/StackKeepAlive/StackKeepAlive.vue +5 -3
- package/src/lib/components/TabHeader/TabHeaderItem.vue +13 -7
- package/src/lib/components/TabHeader/TabHeaderScroll.vue +170 -94
- package/src/lib/components/TabHeader/index.vue +67 -12
- package/src/lib/hooks/stackTabsContext.ts +0 -1
- package/src/lib/hooks/tabPanel/evict.ts +14 -6
- package/src/lib/hooks/tabPanel/pageComponentFactory.tsx +252 -7
- package/src/lib/hooks/tabPanel/refresh.ts +27 -9
- package/src/lib/hooks/tabPanel/scroll.ts +4 -15
- package/src/lib/hooks/tabPanel/session.ts +11 -4
- package/src/lib/hooks/tabPanel/state.ts +0 -2
- package/src/lib/hooks/tabPanel/tabStore.ts +114 -26
- package/src/lib/hooks/useContextMenu.ts +1 -1
- package/src/lib/hooks/useIframeManager.ts +21 -18
- package/src/lib/hooks/useScrollShadow.ts +74 -19
- package/src/lib/hooks/useTabActions.ts +18 -8
- package/src/lib/hooks/useTabEventBus.ts +3 -0
- package/src/lib/hooks/useTabPanel.tsx +247 -58
- package/src/lib/hooks/useTabRouter.ts +18 -11
- package/src/lib/model/TabModel.ts +19 -5
- package/src/lib/nuxt/module.ts +3 -1
- package/src/lib/nuxt/runtime/plugin.ts +7 -3
- package/src/lib/utils/scrollUtils.ts +0 -18
- package/src/lib/utils/tabInfoEncoder.ts +121 -18
- package/src/lib/utils/urlParser.ts +75 -48
- package/dist/vue-stack-tabs.css +0 -2
- package/src/lib/assets/style/overlayer.scss +0 -46
package/README.en.md
CHANGED
|
@@ -368,6 +368,7 @@ fetchData().finally(() => closeTabLoading())
|
|
|
368
368
|
| `iframeAllow` | `string` | `''` | iframe allow attribute, e.g. `fullscreen` |
|
|
369
369
|
| `iframeLoadTimeout` | `number` | `15000` | iframe load timeout in ms |
|
|
370
370
|
| `defaultTabs` | `ITabData[]` | `[]` | Initial tab list |
|
|
371
|
+
| `homeTab` | `ITabData` | — | Pinned home tab: always first, non-closable and non-draggable; other tabs cannot move before it. Omit to keep the previous behavior. |
|
|
371
372
|
| `max` | `number` | `20` | Maximum number of tabs |
|
|
372
373
|
| `contextmenu` | `boolean \| object` | `true` | Enable context menu |
|
|
373
374
|
| `pageTransition` | `string` | `'stack-tab-swap'` | Page transition animation name for forward navigation |
|
package/README.md
CHANGED
|
@@ -372,6 +372,7 @@ fetchData().finally(() => closeTabLoading())
|
|
|
372
372
|
| `iframeAllow` | `string` | `''` | iframe allow 属性,例如 `fullscreen` |
|
|
373
373
|
| `iframeLoadTimeout` | `number` | `15000` | iframe 加载超时时间,单位 ms |
|
|
374
374
|
| `defaultTabs` | `ITabData[]` | `[]` | 初始标签列表 |
|
|
375
|
+
| `homeTab` | `ITabData` | — | 固定首页:始终第一位、不可关闭、不可拖动;其他标签不能排到它前面;不配置时保持原行为 |
|
|
375
376
|
| `max` | `number` | `20` | 最大标签数量 |
|
|
376
377
|
| `contextmenu` | `boolean \| object` | `true` | 是否启用右键菜单 |
|
|
377
378
|
| `pageTransition` | `string` | `'stack-tab-swap'` | 前进时的页面转场动画名 |
|
package/README.ru.md
CHANGED
|
@@ -372,6 +372,7 @@ fetchData().finally(() => closeTabLoading())
|
|
|
372
372
|
| `iframeAllow` | `string` | `''` | Атрибут allow для iframe, например `fullscreen` |
|
|
373
373
|
| `iframeLoadTimeout` | `number` | `15000` | Тайм-аут загрузки iframe в мс |
|
|
374
374
|
| `defaultTabs` | `ITabData[]` | `[]` | Начальный список вкладок |
|
|
375
|
+
| `homeTab` | `ITabData` | — | Закреплённая домашняя вкладка: всегда первая, не закрывается и не перемещается; другие вкладки не могут встать перед ней |
|
|
375
376
|
| `max` | `number` | `20` | Максимальное количество вкладок |
|
|
376
377
|
| `contextmenu` | `boolean \| object` | `true` | Включить контекстное меню |
|
|
377
378
|
| `pageTransition` | `string` | `'stack-tab-swap'` | Имя анимации перехода при навигации вперёд |
|
package/dist/StackTabs.vue.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { ITabData, TabScrollMode } from './model/TabModel';
|
|
|
3
3
|
type StackTabsIframeReferrerPolicy = '' | 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url';
|
|
4
4
|
type __VLS_Props = {
|
|
5
5
|
defaultTabs?: ITabData[];
|
|
6
|
+
/** 固定首页:始终位于第一位、不可关闭、不可移动,其他标签也不能排到它前面。 */
|
|
7
|
+
homeTab?: ITabData;
|
|
6
8
|
max?: number;
|
|
7
9
|
contextmenu?: boolean | object;
|
|
8
10
|
pageTransition?: string;
|
|
@@ -45,13 +47,14 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
|
|
|
45
47
|
onOnPageLoaded?: ((...args: any[]) => any) | undefined;
|
|
46
48
|
}>, {
|
|
47
49
|
contextmenu: boolean | object;
|
|
48
|
-
defaultTabs: ITabData[];
|
|
49
50
|
max: number;
|
|
50
51
|
space: number;
|
|
51
|
-
width: string;
|
|
52
52
|
tabScrollMode: TabScrollMode;
|
|
53
53
|
tabTransition: string | TransitionProps;
|
|
54
|
+
width: string;
|
|
54
55
|
iframeLoadTimeout: number;
|
|
56
|
+
defaultTabs: ITabData[];
|
|
57
|
+
homeTab: ITabData;
|
|
55
58
|
pageTransition: string;
|
|
56
59
|
pageTransitionBack: string;
|
|
57
60
|
height: string;
|
|
@@ -7,7 +7,6 @@ export declare const STACK_TABS_CONTEXT_UNAVAILABLE_MESSAGE = "VueStackTabs runt
|
|
|
7
7
|
export declare const STACK_TABS_DUPLICATE_INSTANCE_MESSAGE = "VueStackTabs only supports one <VueStackTabs> instance per Vue app.";
|
|
8
8
|
export interface StackTabsRuntimeContext {
|
|
9
9
|
tabs: Ref<ITabItem[]>;
|
|
10
|
-
defaultTabs: Ref<ITabItem[]>;
|
|
11
10
|
caches: ShallowRef<string[]>;
|
|
12
11
|
components: Map<string, DefineComponent>;
|
|
13
12
|
cacheIdsToEvict: Set<string>;
|
|
@@ -5,12 +5,12 @@ export interface TabPanelEvictionApi {
|
|
|
5
5
|
markTabPagesForEviction: (tab: {
|
|
6
6
|
id: string;
|
|
7
7
|
pages: {
|
|
8
|
-
|
|
8
|
+
readonlyList(): readonly ITabPage[];
|
|
9
9
|
};
|
|
10
10
|
}) => void;
|
|
11
11
|
markTabPagesForEvictionOnly: (tab: {
|
|
12
12
|
pages: {
|
|
13
|
-
|
|
13
|
+
readonlyList(): readonly ITabPage[];
|
|
14
14
|
};
|
|
15
15
|
}) => void;
|
|
16
16
|
addCache: (cacheName: string) => void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Ref } from 'vue';
|
|
2
2
|
import { ITabItem, ITabPage } from '../../model/TabModel';
|
|
3
|
-
import { PagePatch } from './tabStore';
|
|
3
|
+
import { PagePatch, PageUpdate } from './tabStore';
|
|
4
4
|
export interface TabPanelRefreshApi {
|
|
5
5
|
refreshTab: (id: string) => void;
|
|
6
6
|
refreshAllTabs: () => void;
|
|
@@ -8,8 +8,10 @@ export interface TabPanelRefreshApi {
|
|
|
8
8
|
export interface CreateTabPanelRefreshOptions {
|
|
9
9
|
getTabs: () => readonly ITabItem[];
|
|
10
10
|
getTopPage: (tabId: string) => ITabPage | null;
|
|
11
|
-
/** 修改页面字段(刷新版本 / 页面 id
|
|
11
|
+
/** 修改页面字段(刷新版本 / 页面 id) */
|
|
12
12
|
updatePage: (tabId: string, pageId: string, patch: PagePatch) => boolean;
|
|
13
|
+
/** 批量修改页面字段,refreshAllTabs 最后统一触发一次 tabs 更新 */
|
|
14
|
+
updatePages: (updates: readonly PageUpdate[]) => void;
|
|
13
15
|
iframeRefreshKeys: Ref<Record<string, number>>;
|
|
14
16
|
createPageId: () => string;
|
|
15
17
|
addCache: (cacheName: string) => void;
|
|
@@ -4,7 +4,5 @@ export interface TabPanelScrollApi {
|
|
|
4
4
|
saveScroller: (pageCacheId: string) => void;
|
|
5
5
|
removeScroller: (pageCacheId: string) => void;
|
|
6
6
|
addPageScroller: (pageCacheId: string, ...selectorIds: string[]) => void;
|
|
7
|
-
/** 主动失效某页面的滚动元素缓存,例如外部强制刷新缓存页时 */
|
|
8
|
-
invalidateAutoScrollCache: (pageCacheId: string) => void;
|
|
9
7
|
}
|
|
10
8
|
export declare const createTabPanelScroll: (context: StackTabsRuntimeContext) => TabPanelScrollApi;
|
|
@@ -8,6 +8,11 @@ export interface RemoveTabResult {
|
|
|
8
8
|
/** 关闭后应激活的相邻标签;没有可激活标签时为空字符串 */
|
|
9
9
|
nextActiveId: string;
|
|
10
10
|
}
|
|
11
|
+
export interface PageUpdate {
|
|
12
|
+
tabId: string;
|
|
13
|
+
pageId: string;
|
|
14
|
+
patch: PagePatch;
|
|
15
|
+
}
|
|
11
16
|
/** updatePage 允许修改的字段;页面身份与刷新版本必须通过 store 写入 */
|
|
12
17
|
export interface PagePatch {
|
|
13
18
|
id?: string;
|
|
@@ -25,12 +30,16 @@ export interface TabStoreApi extends TabPanelEvictionApi {
|
|
|
25
30
|
canAddTab: () => boolean;
|
|
26
31
|
getPages: (tabId: string) => readonly ITabPage[];
|
|
27
32
|
getTopPage: (tabId: string) => ITabPage | null;
|
|
33
|
+
/** 读取任意页面的刷新版本;渲染层据此只重建对应页面 */
|
|
34
|
+
getPageRefreshVersion: (pageId: string) => number;
|
|
28
35
|
/** 返回深拷贝的页面栈快照,可直接用于 rollback */
|
|
29
36
|
getPageSnapshot: (tabId: string) => ITabPage[];
|
|
30
37
|
addTab: (tab: ITabItem) => void;
|
|
31
38
|
addTabs: (tabs: readonly ITabItem[]) => void;
|
|
32
39
|
/** 唯一 active 写入口 */
|
|
33
40
|
activateTab: (id: string) => ITabItem | null;
|
|
41
|
+
/** 动态更新标签标题;返回 false 表示标签不存在 */
|
|
42
|
+
updateTabTitle: (id: string, title: string) => boolean;
|
|
34
43
|
moveTab: (id: string, targetIndex: number) => boolean;
|
|
35
44
|
removeTab: (id: string) => RemoveTabResult;
|
|
36
45
|
removeTabs: (shouldRemove: (tab: ITabItem, index: number) => boolean) => ITabItem[];
|
|
@@ -40,8 +49,10 @@ export interface TabStoreApi extends TabPanelEvictionApi {
|
|
|
40
49
|
/** 用给定页面替换整个栈(内部深拷贝页面) */
|
|
41
50
|
replacePages: (tabId: string, pages: readonly ITabPage[]) => void;
|
|
42
51
|
clearPages: (tabId: string) => void;
|
|
43
|
-
/** 修改页面字段(id / refreshVersion / _backParams
|
|
52
|
+
/** 修改页面字段(id / refreshVersion / _backParams);仅 id 变化时重建 tabs 数组 */
|
|
44
53
|
updatePage: (tabId: string, pageId: string, patch: PagePatch) => boolean;
|
|
54
|
+
/** 批量修改页面字段,最后最多重建一次 tabs 数组(供 refreshAllTabs 使用) */
|
|
55
|
+
updatePages: (updates: readonly PageUpdate[]) => void;
|
|
45
56
|
/** 取出并清除栈顶页面的 _backParams;pageId 不是当前栈顶时返回 null */
|
|
46
57
|
consumeBackParams: (tabId: string, pageId: string) => Record<string, unknown> | null;
|
|
47
58
|
isTabMarkedForEviction: (id: string) => boolean;
|
|
@@ -8,7 +8,7 @@ interface IframeLoadState {
|
|
|
8
8
|
export interface UseIframeManagerOptions {
|
|
9
9
|
tabs: Ref<ITabItem[]>;
|
|
10
10
|
iframeRefreshKeys: Ref<Record<string, number>>;
|
|
11
|
-
iframeLoadTimeout: number
|
|
11
|
+
iframeLoadTimeout: Ref<number>;
|
|
12
12
|
t: (key: string) => string;
|
|
13
13
|
}
|
|
14
14
|
export declare function useIframeManager(options: UseIframeManagerOptions): {
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { Ref } from 'vue';
|
|
2
2
|
export interface UseScrollShadowOptions {
|
|
3
|
-
/**
|
|
3
|
+
/** 滚动容器:用于监听 scroll / resize 并读取滚动尺寸 */
|
|
4
4
|
target: Ref<HTMLElement | null> | (() => HTMLElement | null);
|
|
5
|
+
/**
|
|
6
|
+
* 阴影类挂载目标,默认与 target 相同。
|
|
7
|
+
* 当 target 参与 transform 动画(如刷新转场)时,应传入不参与动画的祖先
|
|
8
|
+
* (例如 .stack-tab__keep-alive-panel),否则 ::after 的绝对定位包含块会变化,
|
|
9
|
+
* 阴影会随动画错位或消失。
|
|
10
|
+
*/
|
|
11
|
+
classTarget?: Ref<HTMLElement | null> | (() => HTMLElement | null);
|
|
5
12
|
/**
|
|
6
13
|
* 是否监听内容缩放/尺寸变化(默认 true)。
|
|
7
14
|
* 启用后会用 ResizeObserver 监视目标尺寸,容器或子树尺寸变化都会重新计算阴影边界。
|
|
@@ -14,7 +21,9 @@ export interface UseScrollShadowOptions {
|
|
|
14
21
|
edgeThreshold?: number;
|
|
15
22
|
}
|
|
16
23
|
export interface UseScrollShadowReturn {
|
|
17
|
-
/**
|
|
24
|
+
/** 重新解析滚动/阴影目标并同步一次(用于 keep-alive 激活、DOM 重新挂载后) */
|
|
18
25
|
sync: () => void;
|
|
26
|
+
/** 移除阴影类并取消待执行的 rAF(用于 keep-alive 失活) */
|
|
27
|
+
clear: () => void;
|
|
19
28
|
}
|
|
20
29
|
export declare const useScrollShadow: (options: UseScrollShadowOptions) => UseScrollShadowReturn;
|
|
@@ -21,6 +21,7 @@ export default function useTabActions(providedRuntimeContext?: StackTabsRuntimeC
|
|
|
21
21
|
refreshAllTabs: () => void;
|
|
22
22
|
activeTab: (id: string, route?: boolean) => Promise<void | import('vue-router').NavigationFailure | undefined>;
|
|
23
23
|
moveTab: (id: string, targetIndex: number) => boolean;
|
|
24
|
+
updateTabTitle: (tabId: string, title: string) => boolean;
|
|
24
25
|
reset: () => void;
|
|
25
26
|
tabs: import('vue').Ref<import('..').ITabItem[], import('..').ITabItem[]>;
|
|
26
27
|
setIFramePath: (path: string) => void;
|
|
@@ -10,6 +10,8 @@ declare module '@vue/runtime-core' {
|
|
|
10
10
|
export declare enum TabEventType {
|
|
11
11
|
PAGE_LOADING = "PAGE_LOADING",
|
|
12
12
|
TAB_ACTIVE = "TAB_ACTIVE",
|
|
13
|
+
/** 请求标签栏将指定标签滚动到可视区域(不改变激活状态) */
|
|
14
|
+
TAB_SCROLL_TO = "TAB_SCROLL_TO",
|
|
13
15
|
FORWARD = "FORWARD",
|
|
14
16
|
BACKWARD = "BACKWARD",
|
|
15
17
|
REFRESH_IFRAME_POSTMESSAGE = "REFRESH_IFRAME_POSTMESSAGE"
|
|
@@ -23,6 +25,9 @@ export interface TabEventPayloadMap extends Record<EventType, unknown> {
|
|
|
23
25
|
id: string;
|
|
24
26
|
isRoute?: boolean;
|
|
25
27
|
};
|
|
28
|
+
[TabEventType.TAB_SCROLL_TO]: {
|
|
29
|
+
id: string;
|
|
30
|
+
};
|
|
26
31
|
[TabEventType.FORWARD]: void;
|
|
27
32
|
[TabEventType.BACKWARD]: void;
|
|
28
33
|
[TabEventType.REFRESH_IFRAME_POSTMESSAGE]: string;
|
|
@@ -4,7 +4,7 @@ import { RouteLocationNormalizedLoaded } from 'vue-router';
|
|
|
4
4
|
import { StackTabsRuntimeContext } from './stackTabsContext';
|
|
5
5
|
/** 规范化路径(nginx 等可能加尾部斜杠) */
|
|
6
6
|
export declare const normalizePathForCache: (route: RouteLocationNormalizedLoaded) => string;
|
|
7
|
-
declare const
|
|
7
|
+
declare const createTabPanelApi: (runtimeContext: StackTabsRuntimeContext) => {
|
|
8
8
|
tabs: import('vue').Ref<ITabItem[], ITabItem[]>;
|
|
9
9
|
caches: import('vue').ShallowRef<string[]>;
|
|
10
10
|
refreshKey: import('vue').Ref<number, number>;
|
|
@@ -13,9 +13,10 @@ declare const _default: (providedRuntimeContext?: StackTabsRuntimeContext) => {
|
|
|
13
13
|
isInitialized: import('vue').Ref<boolean, boolean>;
|
|
14
14
|
setMaxSize: (value: number) => void;
|
|
15
15
|
canAddTab: () => boolean;
|
|
16
|
-
initialize: (staticTabs: ITabData[]) => void;
|
|
16
|
+
initialize: (staticTabs: ITabData[], homeTab?: ITabData) => void;
|
|
17
17
|
size: () => number;
|
|
18
18
|
active: (id: string, route?: boolean) => Promise<void | import('vue-router').NavigationFailure | undefined>;
|
|
19
|
+
updateTabTitle: (tabId: string, title: string) => boolean;
|
|
19
20
|
getCacheName: () => string;
|
|
20
21
|
destroy: () => void;
|
|
21
22
|
reset: () => void;
|
|
@@ -25,6 +26,7 @@ declare const _default: (providedRuntimeContext?: StackTabsRuntimeContext) => {
|
|
|
25
26
|
getActiveTab: () => ITabItem | null;
|
|
26
27
|
getTopPage: (tabId: string) => ITabPage | null;
|
|
27
28
|
getPages: (tabId: string) => readonly ITabPage[];
|
|
29
|
+
getPageRefreshVersion: (pageId: string) => number;
|
|
28
30
|
getPageSnapshot: (tabId: string) => ITabPage[];
|
|
29
31
|
moveTab: (id: string, targetIndex: number) => boolean;
|
|
30
32
|
addTab: (tab: ITabItem) => void;
|
|
@@ -33,6 +35,7 @@ declare const _default: (providedRuntimeContext?: StackTabsRuntimeContext) => {
|
|
|
33
35
|
replacePages: (tabId: string, pages: readonly ITabPage[]) => void;
|
|
34
36
|
clearPages: (tabId: string) => void;
|
|
35
37
|
updatePage: (tabId: string, pageId: string, patch: import('./tabPanel/tabStore').PagePatch) => boolean;
|
|
38
|
+
updatePages: (updates: readonly import('./tabPanel/tabStore').PageUpdate[]) => void;
|
|
36
39
|
removeTab: (id: string) => string;
|
|
37
40
|
removeAllTabs: () => void;
|
|
38
41
|
removeLeftTabs: (id: string) => void;
|
|
@@ -56,4 +59,13 @@ declare const _default: (providedRuntimeContext?: StackTabsRuntimeContext) => {
|
|
|
56
59
|
clearSession: () => void;
|
|
57
60
|
setSessionPrefix: (value: string) => void;
|
|
58
61
|
};
|
|
62
|
+
type TabPanelApi = ReturnType<typeof createTabPanelApi>;
|
|
63
|
+
/**
|
|
64
|
+
* 同一个运行时上下文复用同一套 panel API。
|
|
65
|
+
*
|
|
66
|
+
* StackTabs、StackKeepAlive、StackCacheRenderer、ContextMenu 与页面内的 useTabRouter
|
|
67
|
+
* 都会调用本 hook;首次调用在 setup 上下文中完成 useRouter/useI18n 注入,
|
|
68
|
+
* 后续调用直接返回缓存,避免重复创建 scroll/session/refresh 闭包与局部状态。
|
|
69
|
+
*/
|
|
70
|
+
declare const _default: (providedRuntimeContext?: StackTabsRuntimeContext) => TabPanelApi;
|
|
59
71
|
export default _default;
|
package/dist/model/TabModel.d.ts
CHANGED
|
@@ -11,22 +11,29 @@ export declare enum TabScrollMode {
|
|
|
11
11
|
BUTTON = "button",
|
|
12
12
|
BOTH = "both"
|
|
13
13
|
}
|
|
14
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* @deprecated 标签栏拖拽内部已不再使用该类型;保留仅为兼容 2.x 的公开类型导出,
|
|
16
|
+
* 将在下一个大版本移除。
|
|
17
|
+
*/
|
|
15
18
|
export interface DragData {
|
|
16
19
|
thumbLeft: number;
|
|
17
20
|
startScrollLeft: number;
|
|
18
21
|
startThumbLeft: number;
|
|
19
22
|
startPageX: number;
|
|
20
23
|
}
|
|
21
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* @deprecated 内部滚轮/滚动事件常量已不再使用该类型;保留仅为兼容 2.x 的公开类型导出,
|
|
26
|
+
* 将在下一个大版本移除。
|
|
27
|
+
*/
|
|
28
|
+
export type ScrollEvents = {
|
|
29
|
+
ScrollUpdate: void;
|
|
30
|
+
};
|
|
31
|
+
/** 滚动条滑块计算所需的数据(滚动过程中保持非响应式) */
|
|
22
32
|
export interface ScrollData {
|
|
23
33
|
clientWidth: number;
|
|
24
34
|
scrollWidth: number;
|
|
25
35
|
scrollLeft: number;
|
|
26
36
|
}
|
|
27
|
-
export type ScrollEvents = {
|
|
28
|
-
ScrollUpdate: void;
|
|
29
|
-
};
|
|
30
37
|
/** 打开标签时传入的完整数据(含 path、query) */
|
|
31
38
|
export interface ITabData extends ITabBase {
|
|
32
39
|
title: string;
|
|
@@ -55,6 +62,11 @@ export interface ITabItem extends ITabBase {
|
|
|
55
62
|
url?: string;
|
|
56
63
|
active: boolean;
|
|
57
64
|
pages: Stack<ITabPage>;
|
|
65
|
+
/**
|
|
66
|
+
* 固定在标签栏最前方的内部标记(目前仅 homeTab 使用)。
|
|
67
|
+
* pinned 标签不可被拖动,其他标签也不能排到它前面;仅存在于运行时,不写入 __tab。
|
|
68
|
+
*/
|
|
69
|
+
pinned?: boolean;
|
|
58
70
|
}
|
|
59
71
|
/** 标签内的单个页面(对应 keep-alive 的一个缓存实例) */
|
|
60
72
|
export interface ITabPage {
|
package/dist/nuxt/module.mjs
CHANGED
|
@@ -11,7 +11,7 @@ var a = i({
|
|
|
11
11
|
a.options.runtimeConfig.public.vueStackTabs = { locale: i.locale }, n({ src: o("./runtime/plugin") }), e({
|
|
12
12
|
name: "VueStackTabs",
|
|
13
13
|
export: "VueStackTabs",
|
|
14
|
-
filePath: o("../
|
|
14
|
+
filePath: o("../vue-stack-tabs.es.js")
|
|
15
15
|
}), t([
|
|
16
16
|
{
|
|
17
17
|
name: "useTabActions",
|