vue-stack-tabs 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +14 -0
- package/README.md +14 -0
- package/dist/StackTabs.vue.d.ts +2 -2
- package/dist/components/StackKeepAlive/StackCacheRenderer.vue.d.ts +0 -2
- package/dist/hooks/stackTabsContext.d.ts +0 -1
- package/dist/hooks/tabPageContext.d.ts +18 -0
- package/dist/hooks/tabPanel/evict.d.ts +2 -2
- package/dist/hooks/tabPanel/scroll.d.ts +0 -2
- package/dist/hooks/tabPanel/state.d.ts +0 -1
- package/dist/hooks/useIframeManager.d.ts +1 -1
- package/dist/hooks/useScrollShadow.d.ts +11 -2
- package/dist/hooks/useTabEventBus.d.ts +5 -0
- package/dist/hooks/useTabLoading.d.ts +2 -1
- package/dist/hooks/useTabRouter.d.ts +5 -1
- package/dist/model/TabModel.d.ts +12 -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 +0 -2
- package/dist/utils/urlParser.d.ts +6 -7
- package/dist/vue-stack-tabs.es.js +1 -1
- package/package.json +2 -2
- package/src/lib/StackTabs.vue +16 -1
- package/src/lib/assets/image/open.svg +1 -1
- package/src/lib/assets/style/common/mixins.scss +6 -6
- package/src/lib/assets/style/common/theme.scss +148 -0
- package/src/lib/assets/style/common/var.scss +104 -1
- package/src/lib/assets/style/index.scss +1 -0
- package/src/lib/assets/style/loading.scss +3 -3
- package/src/lib/assets/style/stack-tab.scss +62 -56
- package/src/lib/components/ContextMenu/index.vue +3 -1
- package/src/lib/components/PageLoading.vue +10 -9
- package/src/lib/components/StackKeepAlive/StackCacheRenderer.vue +1 -5
- package/src/lib/components/TabHeader/TabHeaderScroll.vue +164 -90
- package/src/lib/components/TabHeader/index.vue +51 -10
- package/src/lib/hooks/stackTabsContext.ts +0 -1
- package/src/lib/hooks/tabPageContext.ts +50 -0
- package/src/lib/hooks/tabPanel/evict.ts +14 -6
- package/src/lib/hooks/tabPanel/pageComponentFactory.tsx +224 -47
- 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 +28 -10
- package/src/lib/hooks/useIframeManager.ts +11 -15
- package/src/lib/hooks/useScrollShadow.ts +74 -19
- package/src/lib/hooks/useTabActions.ts +10 -4
- package/src/lib/hooks/useTabEventBus.ts +3 -0
- package/src/lib/hooks/useTabLoading.ts +6 -4
- package/src/lib/hooks/useTabPanel.tsx +46 -34
- package/src/lib/hooks/useTabRouter.ts +11 -14
- package/src/lib/model/TabModel.ts +14 -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 +21 -2
- package/src/lib/utils/urlParser.ts +40 -37
package/README.en.md
CHANGED
|
@@ -509,6 +509,20 @@ You can specify refresh behavior via `iframeRefreshMode` when calling `openTab`:
|
|
|
509
509
|
|
|
510
510
|
---
|
|
511
511
|
|
|
512
|
+
## Theming
|
|
513
|
+
|
|
514
|
+
Every color and shadow is controlled by CSS variables. Light-theme defaults match the previous release, so no change is needed after upgrading. Re-skin by overriding variables:
|
|
515
|
+
|
|
516
|
+
```css
|
|
517
|
+
:root {
|
|
518
|
+
--stack-tab-accent: #4f46e5;
|
|
519
|
+
--stack-tab-accent-active: #4338ca;
|
|
520
|
+
--stack-tab-accent-contrast: #fff;
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
A dark palette is built in and activates via `<html class="dark">`, `<html data-theme="dark">` or any `[data-theme="dark"]` container. See the [theming guide](https://jktantan.github.io/vue-stack-tabs/advance/theme) for the full variable list and scoped overrides.
|
|
525
|
+
|
|
512
526
|
## i18n
|
|
513
527
|
|
|
514
528
|
Built-in languages: `zh-CN` (Chinese), `en` (English).
|
package/README.md
CHANGED
|
@@ -513,6 +513,20 @@ window.addEventListener('message', (ev) => {
|
|
|
513
513
|
|
|
514
514
|
---
|
|
515
515
|
|
|
516
|
+
## 🎨 主题定制
|
|
517
|
+
|
|
518
|
+
组件颜色与阴影全部由 CSS 变量控制,浅色默认值与旧版完全一致,升级后无需改动。直接覆盖变量即可换肤:
|
|
519
|
+
|
|
520
|
+
```css
|
|
521
|
+
:root {
|
|
522
|
+
--stack-tab-accent: #4f46e5;
|
|
523
|
+
--stack-tab-accent-active: #4338ca;
|
|
524
|
+
--stack-tab-accent-contrast: #fff;
|
|
525
|
+
}
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
深色主题内置,支持 `<html class="dark">`、`<html data-theme="dark">` 或任意 `[data-theme="dark"]` 容器。完整变量清单与覆盖方式见[主题定制文档](https://jktantan.github.io/vue-stack-tabs/zh/advance/theme)。
|
|
529
|
+
|
|
516
530
|
## 🌍 国际化
|
|
517
531
|
|
|
518
532
|
内置语言:`zh-CN`(中文)、`en`(英文)。
|
package/dist/StackTabs.vue.d.ts
CHANGED
|
@@ -47,13 +47,13 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
|
|
|
47
47
|
onOnPageLoaded?: ((...args: any[]) => any) | undefined;
|
|
48
48
|
}>, {
|
|
49
49
|
contextmenu: boolean | object;
|
|
50
|
-
defaultTabs: ITabData[];
|
|
51
50
|
max: number;
|
|
52
51
|
space: number;
|
|
53
|
-
width: string;
|
|
54
52
|
tabScrollMode: TabScrollMode;
|
|
55
53
|
tabTransition: string | TransitionProps;
|
|
54
|
+
width: string;
|
|
56
55
|
iframeLoadTimeout: number;
|
|
56
|
+
defaultTabs: ITabData[];
|
|
57
57
|
homeTab: ITabData;
|
|
58
58
|
pageTransition: string;
|
|
59
59
|
pageTransitionBack: 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>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { InjectionKey } from 'vue';
|
|
2
|
+
export interface TabPageContext {
|
|
3
|
+
/** 当前页面所属的标签 id(旧实现中的 attrs.tId) */
|
|
4
|
+
tabId: string;
|
|
5
|
+
/** 当前页面的缓存 id,即 cacheName(旧实现中的 attrs.pId) */
|
|
6
|
+
pageId: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const tabPageContextKey: InjectionKey<TabPageContext>;
|
|
9
|
+
/**
|
|
10
|
+
* 解析当前页面上下文。
|
|
11
|
+
*
|
|
12
|
+
* 优先读取缓存包装组件 provide 的上下文;attrs / props 仅作为旧版
|
|
13
|
+
* cloneVNode 注入方式以及手工挂载场景的兼容回退。
|
|
14
|
+
*
|
|
15
|
+
* 返回值允许只包含其中一个字段:useTabLoading 只依赖 tabId,
|
|
16
|
+
* 旧代码或手工挂载可能只传了其中一个 id。
|
|
17
|
+
*/
|
|
18
|
+
export declare const resolveTabPageContext: () => Partial<TabPageContext> | null;
|
|
@@ -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;
|
|
@@ -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,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;
|
|
@@ -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;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* useTabLoading - 标签内页面加载状态 Hook
|
|
3
3
|
*
|
|
4
4
|
* 职责:通过 PAGE_LOADING 事件控制 PageLoading 组件的显示/隐藏
|
|
5
|
-
*
|
|
5
|
+
* 使用范围:标签内的页面组件;tabId 由缓存包装组件 provide,
|
|
6
|
+
* 页面通过 tabPageContext 解析(兼容旧版 attrs / props 注入)。
|
|
6
7
|
*/
|
|
7
8
|
declare const _default: () => {
|
|
8
9
|
openTabLoading: () => void;
|
|
@@ -3,15 +3,19 @@ import { RouteLocationPathRaw } from 'vue-router';
|
|
|
3
3
|
* useTabRouter - 标签内路由 Hook
|
|
4
4
|
*
|
|
5
5
|
* 职责:在单个标签内实现「前进/后退」栈式导航,以及滚动位置的记录与恢复
|
|
6
|
-
*
|
|
6
|
+
* 使用范围:仅在标签内的页面组件中使用;页面上下文由缓存包装组件 provide,
|
|
7
|
+
* 通过 tabPageContext 解析(兼容旧版 attrs / props 注入)。
|
|
7
8
|
*
|
|
8
9
|
* 主要 API:
|
|
9
10
|
* - forward(to) 前进:push 新页面到该标签的 pages 栈
|
|
10
11
|
* - backward(to, backQuery) 后退:pop 栈顶、驱逐缓存,跳转到新栈顶
|
|
11
12
|
* - addScrollTarget(...) 注册需要记录滚动位置的选择器
|
|
13
|
+
* - tabId / pageId 当前页面所属标签与缓存页 id(只读)
|
|
12
14
|
*/
|
|
13
15
|
export default function useTabRouter(): {
|
|
14
16
|
forward: (to: RouteLocationPathRaw) => void;
|
|
15
17
|
backward: (to: number | string, backQuery?: Record<string, unknown>) => boolean;
|
|
16
18
|
addScrollTarget: (...selectors: string[]) => void;
|
|
19
|
+
tabId: string;
|
|
20
|
+
pageId: string;
|
|
17
21
|
};
|
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;
|
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",
|