@gx-design-vue/pro-layout 0.1.0-alpha.2 → 0.1.0-alpha.21

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.
Files changed (272) hide show
  1. package/dist/ProLayout.d.ts +4 -536
  2. package/dist/ProLayout.js +489 -358
  3. package/dist/components/AppPage/context.d.ts +4 -3
  4. package/dist/components/AppPage/context.js +3 -5
  5. package/dist/components/AppPage/index.d.ts +29 -52
  6. package/dist/components/AppPage/index.js +71 -54
  7. package/dist/components/AppPage/style.d.ts +8 -7
  8. package/dist/components/AppPage/style.js +16 -17
  9. package/dist/components/Breadcrumb/index.d.ts +19 -0
  10. package/dist/components/Breadcrumb/index.js +129 -0
  11. package/dist/components/Breadcrumb/interface.d.ts +33 -0
  12. package/dist/components/Breadcrumb/interface.js +1 -0
  13. package/dist/components/CollapseButton/Arrow.d.ts +4 -0
  14. package/dist/components/{SiderMenu → CollapseButton}/Arrow.js +2 -4
  15. package/dist/components/CollapseButton/index.d.ts +7 -0
  16. package/dist/components/CollapseButton/index.js +45 -0
  17. package/dist/components/CollapseButton/interface.d.ts +19 -0
  18. package/dist/components/CollapseButton/interface.js +1 -0
  19. package/dist/components/Footer/index.d.ts +10 -0
  20. package/dist/components/Footer/index.js +69 -0
  21. package/dist/components/Footer/interface.d.ts +22 -0
  22. package/dist/components/Footer/interface.js +1 -0
  23. package/dist/components/FooterToolbar/index.d.ts +5 -72
  24. package/dist/components/FooterToolbar/index.js +77 -90
  25. package/dist/components/FooterToolbar/style.d.ts +10 -0
  26. package/dist/components/FooterToolbar/style.js +34 -0
  27. package/dist/components/Header/index.d.ts +7 -0
  28. package/dist/components/Header/index.js +140 -0
  29. package/dist/components/Header/interface.d.ts +41 -0
  30. package/dist/components/Header/interface.js +1 -0
  31. package/dist/components/Logo/index.d.ts +9 -0
  32. package/dist/components/Logo/index.js +63 -0
  33. package/dist/components/Logo/interface.d.ts +13 -0
  34. package/dist/components/Logo/interface.js +1 -0
  35. package/dist/components/Menu/iconRender.d.ts +10 -0
  36. package/dist/components/Menu/iconRender.js +23 -0
  37. package/dist/components/Menu/index.d.ts +13 -0
  38. package/dist/components/Menu/index.js +778 -0
  39. package/dist/components/Menu/interface.d.ts +50 -0
  40. package/dist/components/Menu/interface.js +9 -0
  41. package/dist/components/Menu/overflow.d.ts +39 -0
  42. package/dist/components/Menu/overflow.js +81 -0
  43. package/dist/components/Menu/style/base.d.ts +12 -0
  44. package/dist/components/Menu/style/base.js +36 -0
  45. package/dist/components/Menu/style/horizontal.d.ts +19 -0
  46. package/dist/components/Menu/style/horizontal.js +303 -0
  47. package/dist/components/Menu/style/index.d.ts +356 -0
  48. package/dist/components/Menu/style/index.js +147 -0
  49. package/dist/components/Menu/style/inline.d.ts +13 -0
  50. package/dist/components/Menu/style/inline.js +292 -0
  51. package/dist/components/PageContainer/PageHeader.d.ts +30 -36
  52. package/dist/components/PageContainer/PageHeader.js +80 -46
  53. package/dist/components/PageContainer/index.d.ts +8 -194
  54. package/dist/components/PageContainer/index.js +297 -209
  55. package/dist/components/PageContainer/style.d.ts +5 -0
  56. package/dist/components/PageContainer/style.js +142 -0
  57. package/dist/components/PageTransition/animate.d.ts +41 -0
  58. package/dist/components/PageTransition/animate.js +106 -0
  59. package/dist/components/PageTransition/index.d.ts +57 -0
  60. package/dist/components/PageTransition/index.js +66 -0
  61. package/dist/components/{PageTranstion → PageTransition}/keyFrame/back.d.ts +4 -4
  62. package/dist/components/{PageTranstion → PageTransition}/keyFrame/back.js +2 -4
  63. package/dist/components/{PageTranstion → PageTransition}/keyFrame/bounce.d.ts +4 -4
  64. package/dist/components/{PageTranstion → PageTransition}/keyFrame/bounce.js +2 -4
  65. package/dist/components/{PageTranstion → PageTransition}/keyFrame/fade.d.ts +4 -4
  66. package/dist/components/{PageTranstion → PageTransition}/keyFrame/fade.js +2 -4
  67. package/dist/components/{PageTranstion → PageTransition}/keyFrame/flip.d.ts +4 -4
  68. package/dist/components/{PageTranstion → PageTransition}/keyFrame/flip.js +2 -4
  69. package/dist/components/{PageTranstion → PageTransition}/keyFrame/lightSpeed.d.ts +4 -4
  70. package/dist/components/{PageTranstion → PageTransition}/keyFrame/lightSpeed.js +2 -4
  71. package/dist/components/PageTransition/keyFrame/roll.d.ts +10 -0
  72. package/dist/components/{PageTranstion → PageTransition}/keyFrame/roll.js +2 -4
  73. package/dist/components/{PageTranstion → PageTransition}/keyFrame/rotate.d.ts +4 -4
  74. package/dist/components/{PageTranstion → PageTransition}/keyFrame/rotate.js +2 -4
  75. package/dist/components/{PageTranstion → PageTransition}/keyFrame/slide.d.ts +4 -4
  76. package/dist/components/{PageTranstion → PageTransition}/keyFrame/slide.js +2 -4
  77. package/dist/components/{PageTranstion → PageTransition}/keyFrame/zoom.d.ts +4 -4
  78. package/dist/components/{PageTranstion → PageTransition}/keyFrame/zoom.js +2 -4
  79. package/dist/components/PageTransition/style.d.ts +11 -0
  80. package/dist/components/{PageTranstion → PageTransition}/style.js +9 -13
  81. package/dist/components/Sider/index.d.ts +7 -0
  82. package/dist/components/Sider/index.js +206 -0
  83. package/dist/components/Sider/interface.d.ts +39 -0
  84. package/dist/components/Sider/interface.js +1 -0
  85. package/dist/components/Tabs/InnerTabs.d.ts +7 -0
  86. package/dist/components/Tabs/InnerTabs.js +117 -0
  87. package/dist/components/Tabs/contextMenu.d.ts +41 -0
  88. package/dist/components/Tabs/contextMenu.js +89 -0
  89. package/dist/components/Tabs/hooks/flipAnimate.d.ts +24 -0
  90. package/dist/components/Tabs/hooks/flipAnimate.js +40 -0
  91. package/dist/components/Tabs/hooks/useAutoScroll.d.ts +27 -0
  92. package/dist/components/Tabs/hooks/useAutoScroll.js +122 -0
  93. package/dist/components/Tabs/hooks/useTabDrag.d.ts +31 -0
  94. package/dist/components/Tabs/hooks/useTabDrag.js +252 -0
  95. package/dist/components/Tabs/index.d.ts +13 -0
  96. package/dist/components/Tabs/index.js +181 -0
  97. package/dist/components/Tabs/interface.d.ts +74 -0
  98. package/dist/components/Tabs/interface.js +1 -0
  99. package/dist/components/Tabs/style/index.d.ts +35 -0
  100. package/dist/components/Tabs/style/index.js +161 -0
  101. package/dist/components/WrapContent/index.d.ts +9 -0
  102. package/dist/components/WrapContent/index.js +26 -0
  103. package/dist/components/WrapContent/interface.d.ts +15 -0
  104. package/dist/components/WrapContent/interface.js +1 -0
  105. package/dist/context/index.d.ts +53 -0
  106. package/dist/context/index.js +5 -0
  107. package/dist/defaultConfig.d.ts +10 -0
  108. package/dist/defaultConfig.js +38 -0
  109. package/dist/hooks/useLayoutBase.d.ts +78 -0
  110. package/dist/hooks/useLayoutBase.js +86 -0
  111. package/dist/hooks/useMenu.d.ts +77 -0
  112. package/dist/hooks/useMenu.js +166 -0
  113. package/dist/hooks/useTabs.d.ts +54 -0
  114. package/dist/hooks/useTabs.js +388 -0
  115. package/dist/index.d.ts +22 -27
  116. package/dist/index.js +15 -24
  117. package/dist/interface.d.ts +516 -0
  118. package/dist/interface.js +34 -0
  119. package/dist/pro-layout.esm.js +5848 -5075
  120. package/dist/pro-layout.js +16 -37
  121. package/dist/style/breadcrumb.d.ts +8 -0
  122. package/dist/style/breadcrumb.js +77 -0
  123. package/dist/style/collapseButton.d.ts +8 -0
  124. package/dist/style/collapseButton.js +57 -0
  125. package/dist/style/content.d.ts +8 -0
  126. package/dist/style/content.js +29 -0
  127. package/dist/style/footer.d.ts +8 -0
  128. package/dist/style/footer.js +33 -0
  129. package/dist/style/header.d.ts +8 -0
  130. package/dist/style/header.js +76 -0
  131. package/dist/style/index.d.ts +3 -22
  132. package/dist/style/index.js +51 -55
  133. package/dist/style/logo.d.ts +8 -0
  134. package/dist/style/logo.js +76 -0
  135. package/dist/style/menu.d.ts +15 -0
  136. package/dist/style/menu.js +49 -0
  137. package/dist/style/rightContent.d.ts +12 -0
  138. package/dist/style/rightContent.js +74 -0
  139. package/dist/style/search.d.ts +12 -0
  140. package/dist/style/search.js +94 -0
  141. package/dist/style/sider.d.ts +8 -0
  142. package/dist/style/sider.js +92 -0
  143. package/dist/style/tabs.d.ts +14 -0
  144. package/dist/style/tabs.js +97 -0
  145. package/dist/theme/augment.d.ts +20 -0
  146. package/dist/theme/augment.js +1 -0
  147. package/dist/theme/interface/components.d.ts +20 -0
  148. package/dist/theme/interface/components.js +1 -0
  149. package/dist/utils/config.d.ts +12 -0
  150. package/dist/utils/config.js +18 -0
  151. package/dist/utils/menu.d.ts +111 -20
  152. package/dist/utils/menu.js +263 -118
  153. package/dist/utils/style.d.ts +4 -0
  154. package/dist/utils/style.js +21 -0
  155. package/dist/utils/themeComponents.d.ts +28 -0
  156. package/dist/utils/themeComponents.js +89 -0
  157. package/package.json +24 -15
  158. package/dist/Context/expose.d.ts +0 -6
  159. package/dist/Context/expose.js +0 -7
  160. package/dist/Context/index.d.ts +0 -43
  161. package/dist/Context/index.js +0 -18
  162. package/dist/WrapContent.d.ts +0 -100
  163. package/dist/WrapContent.js +0 -45
  164. package/dist/components/BaseMenu/index.d.ts +0 -255
  165. package/dist/components/BaseMenu/index.js +0 -381
  166. package/dist/components/BaseMenu/props.d.ts +0 -105
  167. package/dist/components/BaseMenu/props.js +0 -94
  168. package/dist/components/BaseMenu/style.d.ts +0 -6
  169. package/dist/components/BaseMenu/style.js +0 -155
  170. package/dist/components/BreadCrumb/Breadcrumb.d.ts +0 -33
  171. package/dist/components/BreadCrumb/Breadcrumb.js +0 -75
  172. package/dist/components/BreadCrumb/index.d.ts +0 -7
  173. package/dist/components/BreadCrumb/index.js +0 -44
  174. package/dist/components/BreadCrumb/style.d.ts +0 -8
  175. package/dist/components/BreadCrumb/style.js +0 -87
  176. package/dist/components/CollapsedIcon/index.d.ts +0 -33
  177. package/dist/components/CollapsedIcon/index.js +0 -51
  178. package/dist/components/CollapsedIcon/style.d.ts +0 -9
  179. package/dist/components/CollapsedIcon/style.js +0 -34
  180. package/dist/components/FooterToolbar/props.d.ts +0 -47
  181. package/dist/components/FooterToolbar/props.js +0 -33
  182. package/dist/components/FooterToolbar/style/index.d.ts +0 -14
  183. package/dist/components/FooterToolbar/style/index.js +0 -48
  184. package/dist/components/FooterToolbar/style/stylish.d.ts +0 -18
  185. package/dist/components/FooterToolbar/style/stylish.js +0 -16
  186. package/dist/components/GlobalFooter/index.d.ts +0 -73
  187. package/dist/components/GlobalFooter/index.js +0 -77
  188. package/dist/components/GlobalFooter/style.d.ts +0 -6
  189. package/dist/components/GlobalFooter/style.js +0 -29
  190. package/dist/components/GlobalHeader/DefaultHeader.d.ts +0 -164
  191. package/dist/components/GlobalHeader/DefaultHeader.js +0 -149
  192. package/dist/components/GlobalHeader/index.d.ts +0 -164
  193. package/dist/components/GlobalHeader/index.js +0 -78
  194. package/dist/components/GlobalHeader/props.d.ts +0 -70
  195. package/dist/components/GlobalHeader/props.js +0 -56
  196. package/dist/components/GlobalHeader/style/defaultHeader.d.ts +0 -6
  197. package/dist/components/GlobalHeader/style/defaultHeader.js +0 -108
  198. package/dist/components/GlobalHeader/style/header.d.ts +0 -6
  199. package/dist/components/GlobalHeader/style/header.js +0 -41
  200. package/dist/components/LogoContent/index.d.ts +0 -80
  201. package/dist/components/LogoContent/index.js +0 -90
  202. package/dist/components/LogoContent/props.d.ts +0 -57
  203. package/dist/components/LogoContent/props.js +0 -37
  204. package/dist/components/LogoContent/style.d.ts +0 -6
  205. package/dist/components/LogoContent/style.js +0 -63
  206. package/dist/components/PageContainer/props.d.ts +0 -138
  207. package/dist/components/PageContainer/props.js +0 -103
  208. package/dist/components/PageContainer/style/index.d.ts +0 -14
  209. package/dist/components/PageContainer/style/index.js +0 -52
  210. package/dist/components/PageContainer/style/pageHeader.d.ts +0 -6
  211. package/dist/components/PageContainer/style/pageHeader.js +0 -44
  212. package/dist/components/PageTranstion/index.d.ts +0 -40
  213. package/dist/components/PageTranstion/index.js +0 -71
  214. package/dist/components/PageTranstion/keyFrame/roll.d.ts +0 -10
  215. package/dist/components/PageTranstion/style.d.ts +0 -10
  216. package/dist/components/SiderMenu/Arrow.d.ts +0 -6
  217. package/dist/components/SiderMenu/SiderMenu.d.ts +0 -180
  218. package/dist/components/SiderMenu/SiderMenu.js +0 -265
  219. package/dist/components/SiderMenu/index.d.ts +0 -193
  220. package/dist/components/SiderMenu/index.js +0 -51
  221. package/dist/components/SiderMenu/props.d.ts +0 -77
  222. package/dist/components/SiderMenu/props.js +0 -67
  223. package/dist/components/SiderMenu/style/index.d.ts +0 -12
  224. package/dist/components/SiderMenu/style/index.js +0 -162
  225. package/dist/components/SiderMenu/typings.d.ts +0 -38
  226. package/dist/components/SiderMenu/typings.js +0 -1
  227. package/dist/components/TabsRoute/index.d.ts +0 -95
  228. package/dist/components/TabsRoute/index.js +0 -405
  229. package/dist/components/TabsRoute/props.d.ts +0 -78
  230. package/dist/components/TabsRoute/props.js +0 -47
  231. package/dist/components/TabsRoute/style.d.ts +0 -15
  232. package/dist/components/TabsRoute/style.js +0 -133
  233. package/dist/components/TabsRoute/utils/config.d.ts +0 -18
  234. package/dist/components/TabsRoute/utils/config.js +0 -64
  235. package/dist/config/animate.d.ts +0 -11
  236. package/dist/config/animate.js +0 -76
  237. package/dist/config/index.d.ts +0 -34
  238. package/dist/config/index.js +0 -30
  239. package/dist/hooks/collapsed/index.d.ts +0 -15
  240. package/dist/hooks/collapsed/index.js +0 -50
  241. package/dist/hooks/layout/useLayoutExpose.d.ts +0 -15
  242. package/dist/hooks/layout/useLayoutExpose.js +0 -22
  243. package/dist/hooks/layout/usePageContent.d.ts +0 -6
  244. package/dist/hooks/layout/usePageContent.js +0 -28
  245. package/dist/hooks/menu/context.d.ts +0 -21
  246. package/dist/hooks/menu/context.js +0 -7
  247. package/dist/hooks/menu/index.d.ts +0 -29
  248. package/dist/hooks/menu/index.js +0 -118
  249. package/dist/hooks/theme/index.d.ts +0 -11
  250. package/dist/hooks/theme/index.js +0 -13
  251. package/dist/props/collapsedProps.d.ts +0 -39
  252. package/dist/props/collapsedProps.js +0 -45
  253. package/dist/props/defaultSettings.d.ts +0 -62
  254. package/dist/props/defaultSettings.js +0 -56
  255. package/dist/props/index.d.ts +0 -226
  256. package/dist/props/index.js +0 -109
  257. package/dist/props/themeProps.d.ts +0 -14
  258. package/dist/props/themeProps.js +0 -10
  259. package/dist/types/Breadcrumb.d.ts +0 -22
  260. package/dist/types/Breadcrumb.js +0 -1
  261. package/dist/types/MenuTypings.d.ts +0 -46
  262. package/dist/types/MenuTypings.js +0 -1
  263. package/dist/types/RouteTypings.d.ts +0 -96
  264. package/dist/types/RouteTypings.js +0 -1
  265. package/dist/types/SlotsTypings.d.ts +0 -124
  266. package/dist/types/SlotsTypings.js +0 -32
  267. package/dist/types/typings.d.ts +0 -73
  268. package/dist/types/typings.js +0 -3
  269. package/dist/utils/index.d.ts +0 -7
  270. package/dist/utils/index.js +0 -17
  271. package/dist/utils/style/index.d.ts +0 -44
  272. package/dist/utils/style/index.js +0 -103
@@ -0,0 +1,7 @@
1
+ import { LayoutSiderEmits, LayoutSiderProps, LayoutSiderSlots } from "./interface.js";
2
+ import { SlotsType } from "vue";
3
+
4
+ //#region src/components/Sider/index.d.ts
5
+ declare const LayoutSider: import("vue").DefineSetupFnComponent<LayoutSiderProps, LayoutSiderEmits, SlotsType<LayoutSiderSlots>, LayoutSiderProps, import("vue").PublicProps>;
6
+ //#endregion
7
+ export { LayoutSider as default };
@@ -0,0 +1,206 @@
1
+ import { useLayoutBase } from "../../hooks/useLayoutBase.js";
2
+ import LayoutCollapseButton from "../CollapseButton/index.js";
3
+ import LayoutLogo from "../Logo/index.js";
4
+ import ProMenu from "../Menu/index.js";
5
+ import { Fragment, computed, createVNode, defineComponent, isVNode, nextTick, onMounted, reactive, shallowRef } from "vue";
6
+ import { unit } from "@gx-design-vue/pro-provider";
7
+ import { classNames } from "@gx-design-vue/pro-utils";
8
+ import { useResizeObserver } from "@vueuse/core";
9
+ import { Drawer, LayoutSider as LayoutSider$1 } from "antdv-next";
10
+ import { GScrollbar } from "@gx-design-vue/scrollbar";
11
+ //#region src/components/Sider/index.tsx
12
+ function _isSlot(s) {
13
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
14
+ }
15
+ const LayoutSider = /* @__PURE__ */ defineComponent((props, { emit, slots }) => {
16
+ const { sider, header, layout, menuState, prefixCls, cssVarCls, rootCls, collapseConfig, collapsed, isMobile, logoConfig, logoTitle, selectedKeys, openKeys, proClasses, proStyles, siderWidth, collapsedWidth } = useLayoutBase(props);
17
+ /** GScrollbar 组件引用,用于获取滚动容器 DOM */
18
+ const scrollbarRef = shallowRef();
19
+ /** 滚动阴影状态:上下边缘是否可继续滚动 */
20
+ const scrollShadow = reactive({
21
+ showTop: false,
22
+ showBottom: false
23
+ });
24
+ /** 根据滚动容器当前状态更新阴影显隐 */
25
+ function updateScrollShadow() {
26
+ const el = scrollbarRef.value?.wrapRef;
27
+ if (!el) return;
28
+ scrollShadow.showTop = el.scrollTop > 0;
29
+ scrollShadow.showBottom = el.scrollTop + el.clientHeight < el.scrollHeight - 2;
30
+ }
31
+ onMounted(() => {
32
+ nextTick(() => updateScrollShadow());
33
+ });
34
+ const scrollbarWrapEl = computed(() => scrollbarRef.value?.wrapRef);
35
+ const scrollbarViewEl = computed(() => scrollbarWrapEl.value?.firstElementChild);
36
+ useResizeObserver(scrollbarWrapEl, () => updateScrollShadow());
37
+ useResizeObserver(scrollbarViewEl, () => updateScrollShadow());
38
+ const siderMenus = computed(() => menuState?.siderMenus.value ?? []);
39
+ const siderClassNames = computed(() => classNames(`${prefixCls.value}-sider`, proClasses.value.sider, { [`${prefixCls.value}-sider-fixed`]: sider.value?.fixed }));
40
+ const siderChildrenClassNames = computed(() => classNames(`${prefixCls.value}-sider-children`, proClasses.value.siderChildren));
41
+ const siderHeaderClassNames = computed(() => classNames(`${prefixCls.value}-sider-header`, proClasses.value.siderHeader));
42
+ const siderFooterClassNames = computed(() => classNames(`${prefixCls.value}-sider-footer`, proClasses.value.siderFooter));
43
+ function handleToggleCollapsed() {
44
+ emit("update:collapsed", !collapsed.value);
45
+ }
46
+ function handleLogoClick() {
47
+ emit("logoClick");
48
+ }
49
+ function handleSelect(info) {
50
+ emit("select", info);
51
+ }
52
+ function handleOpenChange(keys) {
53
+ emit("openChange", keys);
54
+ }
55
+ function handleSiderCollapse(collapsedValue) {
56
+ emit("update:collapsed", collapsedValue);
57
+ }
58
+ function handleBreakpoint(broken) {
59
+ if (broken) emit("update:collapsed", true);
60
+ }
61
+ function renderSiderContent() {
62
+ const logoRender = slots.logo || logoConfig.value?.render;
63
+ const collapseRender = slots.collapse || collapseConfig.value?.render;
64
+ const collapseIconRender = slots.collapseIcon || collapseConfig.value?.icon;
65
+ return createVNode(Fragment, null, [
66
+ [
67
+ "side",
68
+ "mix",
69
+ "wide"
70
+ ].includes(layout.value ?? "") && logoConfig.value && createVNode("div", {
71
+ "class": siderHeaderClassNames.value,
72
+ "style": {
73
+ ...proStyles.value.siderHeader,
74
+ ...["mix", "wide"].includes(layout.value ?? "") && header.value?.height ? { height: unit(header.value.height) } : {}
75
+ }
76
+ }, [typeof logoRender === "function" ? logoRender?.({
77
+ collapsed: collapsed.value,
78
+ title: logoTitle.value
79
+ }) : createVNode(LayoutLogo, { "onClick": handleLogoClick }, slots)]),
80
+ slots.menuHeader?.({
81
+ collapsed: collapsed.value,
82
+ isMobile: isMobile.value
83
+ }),
84
+ createVNode("div", { "class": `${prefixCls.value}-sider-content` }, [slots.menuExtra?.(), createVNode(GScrollbar, {
85
+ "ref": scrollbarRef,
86
+ "wrapClass": `${prefixCls.value}-sider-menu-container`,
87
+ "viewClass": `${prefixCls.value}-sider-menu-view`,
88
+ "onScroll": updateScrollShadow,
89
+ "data-top-shadow": scrollShadow.showTop,
90
+ "data-bottom-shadow": scrollShadow.showBottom
91
+ }, { default: () => [createVNode(ProMenu, {
92
+ "menus": siderMenus.value,
93
+ "selectedKeys": selectedKeys.value,
94
+ "openKeys": openKeys.value,
95
+ "collapsed": collapsed.value,
96
+ "getScrollContainer": () => scrollbarRef.value?.wrapRef,
97
+ "onSelect": handleSelect,
98
+ "onOpenChange": handleOpenChange
99
+ }, {
100
+ menuItemIcon: slots.menuItemIcon,
101
+ menuItemLabel: slots.menuItemLabel,
102
+ menuItemExtra: slots.menuItemExtra
103
+ })] })]),
104
+ slots.menuFooter && createVNode("div", {
105
+ "class": siderFooterClassNames.value,
106
+ "style": proStyles.value.siderFooter
107
+ }, [slots.menuFooter({
108
+ collapsed: collapsed.value,
109
+ isMobile: isMobile.value
110
+ })]),
111
+ collapseConfig.value && collapseConfig.value.placement === "sider" && (collapseRender?.({ collapsed: collapsed.value }) ?? createVNode(LayoutCollapseButton, {
112
+ "collapsed": collapsed.value,
113
+ "onClick": handleToggleCollapsed
114
+ }, { icon: collapseIconRender }))
115
+ ]);
116
+ }
117
+ function renderSiderChildren() {
118
+ return createVNode("div", {
119
+ "class": siderChildrenClassNames.value,
120
+ "style": proStyles.value.siderChildren
121
+ }, [renderSiderContent()]);
122
+ }
123
+ return () => {
124
+ let _slot2;
125
+ const breakpoint = sider.value?.breakpoint || void 0;
126
+ if (isMobile.value) {
127
+ let _slot;
128
+ return createVNode(Drawer, {
129
+ "maskClosable": true,
130
+ "open": !collapsed.value,
131
+ "closable": false,
132
+ "placement": "left",
133
+ "rootClass": classNames(cssVarCls.value, rootCls.value),
134
+ "class": siderClassNames.value,
135
+ "style": {
136
+ padding: 0,
137
+ height: "100vh",
138
+ ...proStyles.value.sider
139
+ },
140
+ "bodyStyle": {
141
+ height: "100vh",
142
+ padding: 0,
143
+ display: "flex",
144
+ flexDirection: "row"
145
+ },
146
+ "width": siderWidth.value,
147
+ "onClose": () => emit("update:collapsed", true)
148
+ }, _isSlot(_slot = renderSiderChildren()) ? _slot : { default: () => [_slot] });
149
+ }
150
+ return createVNode(Fragment, null, [sider.value?.fixed && createVNode("div", { "style": {
151
+ width: `${unit(siderWidth.value)}`,
152
+ overflow: "hidden",
153
+ flex: `0 0 ${unit(siderWidth.value)}`,
154
+ maxWidth: `${unit(siderWidth.value)}`,
155
+ minWidth: `${unit(siderWidth.value)}`,
156
+ transition: "all 0.2s ease 0s"
157
+ } }, null), createVNode(LayoutSider$1, {
158
+ "collapsible": true,
159
+ "collapsed": collapsed.value,
160
+ "width": sider.value?.width,
161
+ "collapsedWidth": collapsedWidth.value,
162
+ "breakpoint": breakpoint ?? void 0,
163
+ "class": siderClassNames.value,
164
+ "style": proStyles.value.sider,
165
+ "onCollapse": handleSiderCollapse,
166
+ "onBreakpoint": handleBreakpoint
167
+ }, _isSlot(_slot2 = renderSiderChildren()) ? _slot2 : { default: () => [_slot2] })]);
168
+ };
169
+ }, {
170
+ props: {
171
+ proClasses: {
172
+ type: Object,
173
+ required: false
174
+ },
175
+ proStyles: {
176
+ type: Object,
177
+ required: false
178
+ },
179
+ "onUpdate:collapsed": {
180
+ type: Function,
181
+ required: false
182
+ },
183
+ onSelect: {
184
+ type: Function,
185
+ required: false
186
+ },
187
+ onOpenChange: {
188
+ type: Function,
189
+ required: false
190
+ },
191
+ onLogoClick: {
192
+ type: Function,
193
+ required: false
194
+ }
195
+ },
196
+ emits: [
197
+ "update:collapsed",
198
+ "select",
199
+ "openChange",
200
+ "logoClick"
201
+ ],
202
+ name: "LayoutSider",
203
+ inheritAttrs: false
204
+ });
205
+ //#endregion
206
+ export { LayoutSider as default };
@@ -0,0 +1,39 @@
1
+ import { LayoutClassNamesType, LayoutMenuItemSlotProps, LayoutSelectInfo, LayoutSiderSlotProps, LayoutStylesType } from "../../interface.js";
2
+
3
+ //#region src/components/Sider/interface.d.ts
4
+ interface LayoutSiderEmits {
5
+ 'update:collapsed': (collapsed: boolean) => void;
6
+ 'select': (info: LayoutSelectInfo) => void;
7
+ 'openChange': (keys: string[]) => void;
8
+ 'logoClick': () => void;
9
+ }
10
+ interface LayoutSiderEmitsProps {
11
+ 'onUpdate:collapsed'?: LayoutSiderEmits['update:collapsed'];
12
+ onSelect?: LayoutSiderEmits['select'];
13
+ onOpenChange?: LayoutSiderEmits['openChange'];
14
+ onLogoClick?: LayoutSiderEmits['logoClick'];
15
+ }
16
+ interface LayoutSiderProps extends LayoutSiderEmitsProps {
17
+ proClasses?: LayoutClassNamesType;
18
+ proStyles?: LayoutStylesType;
19
+ }
20
+ interface LayoutSiderSlots {
21
+ logo?: (props: {
22
+ collapsed: boolean;
23
+ title?: string;
24
+ }) => any;
25
+ collapse?: (props: {
26
+ collapsed: boolean;
27
+ }) => any;
28
+ collapseIcon?: (props: {
29
+ collapsed: boolean;
30
+ }) => any;
31
+ menuHeader?: (props: LayoutSiderSlotProps) => any;
32
+ menuFooter?: (props: LayoutSiderSlotProps) => any;
33
+ menuExtra?: () => any;
34
+ menuItemIcon?: (props: LayoutMenuItemSlotProps) => any;
35
+ menuItemLabel?: (props: LayoutMenuItemSlotProps) => any;
36
+ menuItemExtra?: (props: LayoutMenuItemSlotProps) => any;
37
+ }
38
+ //#endregion
39
+ export { LayoutSiderEmits, LayoutSiderEmitsProps, LayoutSiderProps, LayoutSiderSlots };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { InnerTabsEmits, InnerTabsProps, InnerTabsSlots } from "./interface.js";
2
+ import { SlotsType } from "vue";
3
+
4
+ //#region src/components/Tabs/InnerTabs.d.ts
5
+ declare const InnerTabs: import("vue").DefineSetupFnComponent<InnerTabsProps, InnerTabsEmits, SlotsType<InnerTabsSlots>, InnerTabsProps, import("vue").PublicProps>;
6
+ //#endregion
7
+ export { InnerTabs as default };
@@ -0,0 +1,117 @@
1
+ import { useTabDrag } from "./hooks/useTabDrag.js";
2
+ import style_default from "./style/index.js";
3
+ import { Fragment, computed, createVNode, defineComponent, mergeProps, nextTick, ref, watch } from "vue";
4
+ import { classNames } from "@gx-design-vue/pro-utils";
5
+ import { useScroll } from "@vueuse/core";
6
+ import { useBaseConfig } from "antdv-next/config-provider/context";
7
+ import useCSSVarCls from "antdv-next/config-provider/hooks/useCSSVarCls";
8
+ import { GIcon } from "@gx-design-vue/icon";
9
+ //#region src/components/Tabs/InnerTabs.tsx
10
+ /** 溢出时两端透明裁切宽度(px) */
11
+ const MASK_GUTTER = 16;
12
+ const MASK_COLOR = "#fff";
13
+ const InnerTabs = /* @__PURE__ */ defineComponent((props, { slots, emit }) => {
14
+ const { prefixCls } = useBaseConfig("pro-inner-tabs", props);
15
+ const rootCls = useCSSVarCls(prefixCls);
16
+ const [hashId, cssVarCls] = style_default(prefixCls, rootCls);
17
+ const scrollRef = ref();
18
+ const items = computed(() => props.items ?? []);
19
+ const activeKey = computed(() => props.activeKey ?? "");
20
+ const { arrivedState } = useScroll(scrollRef);
21
+ const { draggingKey: tabDraggingKey, getItemProps } = useTabDrag({
22
+ items,
23
+ scrollEl: scrollRef,
24
+ onReorder: (fromKey, toKey) => emit("reorder", fromKey, toKey),
25
+ enabled: computed(() => props.draggable !== false)
26
+ });
27
+ const wrapStyle = computed(() => {
28
+ const atLeft = arrivedState.left;
29
+ const atRight = arrivedState.right;
30
+ if (atLeft && atRight) return {};
31
+ const maskImage = !atLeft && !atRight ? `linear-gradient(90deg, transparent, ${MASK_COLOR} ${MASK_GUTTER}px, ${MASK_COLOR} calc(100% - ${MASK_GUTTER}px), transparent)` : !atLeft ? `linear-gradient(90deg, transparent, ${MASK_COLOR} ${MASK_GUTTER}px)` : `linear-gradient(90deg, ${MASK_COLOR} calc(100% - ${MASK_GUTTER}px), transparent)`;
32
+ return {
33
+ WebkitMaskImage: maskImage,
34
+ maskImage
35
+ };
36
+ });
37
+ function handleTabClick(item) {
38
+ if (item.disabled || item.key === activeKey.value) return;
39
+ emit("update:activeKey", item.key);
40
+ emit("change", item.key);
41
+ }
42
+ function handleRemoveClick(event, item) {
43
+ event.stopPropagation();
44
+ event.preventDefault();
45
+ emit("close", item.key);
46
+ }
47
+ function renderItem(item) {
48
+ const active = item.key === activeKey.value;
49
+ const closable = item.closable !== false;
50
+ const customTab = slots.tab?.({
51
+ item,
52
+ active
53
+ });
54
+ const dragging = tabDraggingKey.value === item.key;
55
+ return createVNode("div", mergeProps({
56
+ "key": item.key,
57
+ "class": classNames(`${prefixCls.value}-tab`, {
58
+ [`${prefixCls.value}-tab-active`]: active,
59
+ [`${prefixCls.value}-tab-disabled`]: item.disabled,
60
+ [`${prefixCls.value}-tab-dragging`]: dragging
61
+ }),
62
+ "data-key": item.key,
63
+ "onClick": () => handleTabClick(item)
64
+ }, getItemProps(item.key)), [customTab ?? createVNode(Fragment, null, [createVNode("span", { "class": `${prefixCls.value}-tab-btn` }, [item.label]), closable && createVNode(GIcon, {
65
+ "type": "CloseOutlined",
66
+ "class": `${prefixCls.value}-tab-close ${prefixCls.value}-tab-remove`,
67
+ "data-drag-ignore": "true",
68
+ "onClick": (event) => handleRemoveClick(event, item)
69
+ }, null)])]);
70
+ }
71
+ watch(() => [props.activeKey, items.value.length], () => {
72
+ nextTick(() => {
73
+ (scrollRef.value?.querySelector(`[data-key="${activeKey.value}"]`))?.scrollIntoView?.({
74
+ inline: "nearest",
75
+ block: "nearest"
76
+ });
77
+ });
78
+ }, { immediate: true });
79
+ return () => {
80
+ if (items.value.length === 0) return null;
81
+ return createVNode("div", { "class": classNames(prefixCls.value, hashId.value, cssVarCls.value, rootCls.value) }, [createVNode("div", { "class": `${prefixCls.value}-nav` }, [createVNode("div", {
82
+ "ref": scrollRef,
83
+ "class": `${prefixCls.value}-nav-wrap`,
84
+ "style": wrapStyle.value
85
+ }, [createVNode("div", { "class": `${prefixCls.value}-nav-list` }, [items.value.map((item) => renderItem(item))])]), slots.extra && createVNode("div", { "class": `${prefixCls.value}-extra` }, [slots.extra()])])]);
86
+ };
87
+ }, {
88
+ props: {
89
+ prefixCls: {
90
+ type: String,
91
+ required: false
92
+ },
93
+ items: {
94
+ type: Array,
95
+ required: false
96
+ },
97
+ activeKey: {
98
+ type: String,
99
+ required: false
100
+ },
101
+ draggable: {
102
+ type: Boolean,
103
+ required: false,
104
+ default: void 0
105
+ }
106
+ },
107
+ emits: [
108
+ "update:activeKey",
109
+ "change",
110
+ "close",
111
+ "reorder"
112
+ ],
113
+ name: "InnerTabs",
114
+ inheritAttrs: false
115
+ });
116
+ //#endregion
117
+ export { InnerTabs as default };
@@ -0,0 +1,41 @@
1
+ import { LayoutMenuRoute } from "../../interface.js";
2
+ import { VNode } from "vue";
3
+
4
+ //#region src/components/Tabs/contextMenu.d.ts
5
+ /**
6
+ * 右键菜单操作类型
7
+ */
8
+ type TabsMenuType = 'fixed' | 'close' | 'fullScreen' | 'reloadPage' | 'newBlank' | 'closeLeftTabs' | 'closeRightTabs' | 'closeOthersTabs' | 'closeAllTabs';
9
+ /**
10
+ * 菜单项配置
11
+ */
12
+ interface TabsMenuItem {
13
+ /** 唯一标识 */
14
+ key: TabsMenuType | 'divider';
15
+ /** 显示标签 */
16
+ label?: string;
17
+ /** 图标(VNode 或函数) */
18
+ icon?: VNode | ((value: boolean) => VNode);
19
+ }
20
+ /**
21
+ * 静态菜单项列表(含分隔符)
22
+ */
23
+ declare const CONTEXT_MENU_ITEMS: TabsMenuItem[];
24
+ /**
25
+ * 判断菜单项是否应禁用
26
+ *
27
+ * @param menuKey - 菜单项 key
28
+ * @param targetName - 目标标签 name
29
+ * @param dataSource - 完整标签列表
30
+ * @param isFixed - 目标标签是否固定
31
+ */
32
+ declare function getDisabledState(menuKey: TabsMenuType, targetName: string, dataSource: LayoutMenuRoute[], isFixed: boolean): boolean;
33
+ /**
34
+ * 获取菜单项动态标签(固定/取消固定、全屏/还原)
35
+ */
36
+ declare function getMenuItemLabel(key: TabsMenuType, options: {
37
+ isFixed: boolean;
38
+ isFullscreen: boolean;
39
+ }): string;
40
+ //#endregion
41
+ export { CONTEXT_MENU_ITEMS, TabsMenuItem, TabsMenuType, getDisabledState, getMenuItemLabel };
@@ -0,0 +1,89 @@
1
+ import { h } from "vue";
2
+ import { GIcon } from "@gx-design-vue/icon";
3
+ //#region src/components/Tabs/contextMenu.ts
4
+ /**
5
+ * 静态菜单项列表(含分隔符)
6
+ */
7
+ const CONTEXT_MENU_ITEMS = [
8
+ {
9
+ key: "fixed",
10
+ label: "置顶",
11
+ icon: (value) => h(GIcon, { type: value ? "PinOff" : "Pin" })
12
+ },
13
+ {
14
+ key: "close",
15
+ label: "关闭",
16
+ icon: h(GIcon, { type: "CloseOutlined" })
17
+ },
18
+ {
19
+ key: "fullScreen",
20
+ icon: (value) => h(GIcon, { type: value ? "FullscreenExitOutlined" : "FullscreenOutlined" })
21
+ },
22
+ {
23
+ key: "reloadPage",
24
+ label: "重新加载",
25
+ icon: h(GIcon, { type: "ReloadOutlined" })
26
+ },
27
+ {
28
+ key: "newBlank",
29
+ label: "新窗口打开",
30
+ icon: h(GIcon, { type: "ExportOutlined" })
31
+ },
32
+ { key: "divider" },
33
+ {
34
+ key: "closeLeftTabs",
35
+ label: "关闭左侧",
36
+ icon: h(GIcon, { type: "VerticalRightOutlined" })
37
+ },
38
+ {
39
+ key: "closeRightTabs",
40
+ label: "关闭右侧",
41
+ icon: h(GIcon, { type: "VerticalLeftOutlined" })
42
+ },
43
+ { key: "divider" },
44
+ {
45
+ key: "closeOthersTabs",
46
+ label: "关闭其他",
47
+ icon: h(GIcon, {
48
+ type: "VerticalAlignMiddleOutlined",
49
+ rotate: 90
50
+ })
51
+ },
52
+ {
53
+ key: "closeAllTabs",
54
+ label: "关闭全部",
55
+ icon: h(GIcon, { type: "SwapOutlined" })
56
+ }
57
+ ];
58
+ /**
59
+ * 判断菜单项是否应禁用
60
+ *
61
+ * @param menuKey - 菜单项 key
62
+ * @param targetName - 目标标签 name
63
+ * @param dataSource - 完整标签列表
64
+ * @param isFixed - 目标标签是否固定
65
+ */
66
+ function getDisabledState(menuKey, targetName, dataSource, isFixed) {
67
+ const activeIndex = dataSource.findIndex((item) => item.name === targetName);
68
+ switch (menuKey) {
69
+ case "close": return isFixed;
70
+ case "closeOthersTabs": return dataSource.filter((item, index) => index !== activeIndex && !isFixedTab(item)).length === 0;
71
+ case "closeLeftTabs": return dataSource.filter((item, index) => index < activeIndex && !isFixedTab(item)).length === 0;
72
+ case "closeRightTabs": return dataSource.filter((item, index) => index > activeIndex && !isFixedTab(item)).length === 0;
73
+ case "closeAllTabs": return dataSource.filter((item) => !isFixedTab(item)).length === 0;
74
+ default: return false;
75
+ }
76
+ }
77
+ /**
78
+ * 获取菜单项动态标签(固定/取消固定、全屏/还原)
79
+ */
80
+ function getMenuItemLabel(key, options) {
81
+ if (key === "fixed") return options.isFixed ? "取消置顶" : "置顶";
82
+ if (key === "fullScreen") return options.isFullscreen ? "还原" : "最大化";
83
+ return CONTEXT_MENU_ITEMS.find((i) => i.key === key)?.label ?? "";
84
+ }
85
+ function isFixedTab(route) {
86
+ return route?.meta?.tabState?.fixed === true;
87
+ }
88
+ //#endregion
89
+ export { CONTEXT_MENU_ITEMS, getDisabledState, getMenuItemLabel };
@@ -0,0 +1,24 @@
1
+ //#region src/components/Tabs/hooks/flipAnimate.d.ts
2
+ interface FlipAnimateOptions {
3
+ /** 动画时长 ms,默认 200 */
4
+ duration?: number;
5
+ /** 缓动函数,默认 cubic-bezier(0.2,0,0,1)(对齐 dnd-kit motionEase) */
6
+ easing?: string;
7
+ }
8
+ interface FlipEntry {
9
+ key: string;
10
+ el: HTMLElement;
11
+ }
12
+ /**
13
+ * FLIP 动画 —— 精简复刻 `@dnd-kit/dom` 的 `sortable#animate`。
14
+ *
15
+ * 用 Web Animations API(`element.animate`)+ CSS `translate` 属性(非 transform):
16
+ * 1. 取消元素上 transform/translate/scale 的 CSS transition(避免 getBoundingClientRect 取到中间帧)
17
+ * 2. 测新旧位置算 `delta = prev.left - next.left`
18
+ * 3. `el.animate({ translate: [delta, 0] }, { duration, easing })`
19
+ *
20
+ * 命中 `prefers-reduced-motion` 时 duration 置 0。
21
+ */
22
+ declare function flipAnimate(entries: FlipEntry[], prevRects: Map<string, DOMRect>, options?: FlipAnimateOptions): void;
23
+ //#endregion
24
+ export { FlipAnimateOptions, FlipEntry, flipAnimate };
@@ -0,0 +1,40 @@
1
+ //#region src/components/Tabs/hooks/flipAnimate.ts
2
+ /**
3
+ * FLIP 动画 —— 精简复刻 `@dnd-kit/dom` 的 `sortable#animate`。
4
+ *
5
+ * 用 Web Animations API(`element.animate`)+ CSS `translate` 属性(非 transform):
6
+ * 1. 取消元素上 transform/translate/scale 的 CSS transition(避免 getBoundingClientRect 取到中间帧)
7
+ * 2. 测新旧位置算 `delta = prev.left - next.left`
8
+ * 3. `el.animate({ translate: [delta, 0] }, { duration, easing })`
9
+ *
10
+ * 命中 `prefers-reduced-motion` 时 duration 置 0。
11
+ */
12
+ function flipAnimate(entries, prevRects, options = {}) {
13
+ const { duration = 200, easing = "cubic-bezier(0.2, 0, 0, 1)" } = options;
14
+ const finalDuration = typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches ? 0 : duration;
15
+ for (const { key, el } of entries) {
16
+ const prev = prevRects.get(key);
17
+ if (!prev) continue;
18
+ for (const animation of el.getAnimations()) {
19
+ const transitionProperty = animation.transitionProperty;
20
+ if (transitionProperty === "transform" || transitionProperty === "translate" || transitionProperty === "scale") animation.cancel();
21
+ }
22
+ const next = el.getBoundingClientRect();
23
+ const deltaX = prev.left - next.left;
24
+ const deltaY = prev.top - next.top;
25
+ if (deltaX === 0 && deltaY === 0) continue;
26
+ const animation = el.animate({ translate: [`${deltaX}px ${deltaY}px`, "0px 0px"] }, {
27
+ duration: finalDuration,
28
+ easing
29
+ });
30
+ const clearTranslate = () => {
31
+ el.style.translate = "";
32
+ };
33
+ if ("addEventListener" in animation) {
34
+ animation.addEventListener("finish", clearTranslate, { once: true });
35
+ animation.addEventListener("cancel", clearTranslate, { once: true });
36
+ }
37
+ }
38
+ }
39
+ //#endregion
40
+ export { flipAnimate };
@@ -0,0 +1,27 @@
1
+ import { Ref } from "vue";
2
+
3
+ //#region src/components/Tabs/hooks/useAutoScroll.d.ts
4
+ interface UseAutoScrollOptions {
5
+ /** 边缘激活区域占容器宽度比例,默认 0.2(对齐 dnd-kit detectScrollIntent threshold) */
6
+ threshold?: number;
7
+ /** 滚动加速度(基础速度),默认 25 */
8
+ acceleration?: number;
9
+ /** 指针超出边缘的容差(px),默认 10 */
10
+ tolerance?: number;
11
+ /** 滚动后回调,用于同步拖拽元素和让位元素位置 */
12
+ onScroll?: () => void;
13
+ }
14
+ /**
15
+ * 横向自动滚动 —— 精简复刻 `@dnd-kit/dom` 的 `detectScrollIntent` + `Scroller` 思路。
16
+ *
17
+ * 指针进入 `scrollEl` 左/右边缘 threshold 区域时,按距边缘的比例计算速度
18
+ * (越靠边越快)。滚动方向必须先被用户同向移动解锁;如果当前方向已经到达边界,
19
+ * 则不产生滚动 intent,避免触底后因为鼠标还在边缘区被反复重新激活。
20
+ */
21
+ declare function useAutoScroll(scrollEl: Ref<HTMLElement | undefined>, getPointerX: () => number | null, options?: UseAutoScrollOptions): {
22
+ scroll: () => boolean;
23
+ start: () => void;
24
+ stop: () => void;
25
+ };
26
+ //#endregion
27
+ export { UseAutoScrollOptions, useAutoScroll };