useRenderLayout.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import { computed } from 'vue'
  2. import { useAppStore } from '@/store/modules/app'
  3. import { Menu } from '@/layout/components/Menu'
  4. import { TabMenu } from '@/layout/components/TabMenu'
  5. import { TagsView } from '@/layout/components/TagsView'
  6. import { Logo } from '@/layout/components/Logo'
  7. import AppView from './AppView.vue'
  8. import ToolHeader from './ToolHeader.vue'
  9. import { ElScrollbar } from 'element-plus'
  10. import { useDesign } from '@/hooks/web/useDesign'
  11. const { getPrefixCls } = useDesign()
  12. const prefixCls = getPrefixCls('layout')
  13. const appStore = useAppStore()
  14. const pageLoading = computed(() => appStore.getPageLoading)
  15. // 标签页
  16. const tagsView = computed(() => appStore.getTagsView)
  17. // 菜单折叠
  18. const collapse = computed(() => appStore.getCollapse)
  19. // logo
  20. const logo = computed(() => appStore.logo)
  21. // 固定头部
  22. const fixedHeader = computed(() => appStore.getFixedHeader)
  23. // 是否是移动端
  24. const mobile = computed(() => appStore.getMobile)
  25. // 固定菜单
  26. const fixedMenu = computed(() => appStore.getFixedMenu)
  27. export const useRenderLayout = () => {
  28. const renderClassic = () => {
  29. return (
  30. <>
  31. <div class={['absolute top-0 left-0 h-full', { '!fixed z-3000': mobile.value }]}>
  32. {logo.value ? (
  33. <Logo
  34. class={[
  35. 'bg-[var(--left-menu-bg-color)] border-bottom-1 border-solid border-[var(--logo-border-color)] dark:border-[var(--el-border-color)]',
  36. {
  37. '!pl-0': mobile.value && collapse.value,
  38. 'w-[var(--left-menu-min-width)]': appStore.getCollapse,
  39. 'w-[var(--left-menu-max-width)]': !appStore.getCollapse
  40. }
  41. ]}
  42. style="transition: all var(--transition-time-02);"
  43. ></Logo>
  44. ) : undefined}
  45. <Menu class={[{ '!h-[calc(100%-var(--logo-height))]': logo.value }]}></Menu>
  46. </div>
  47. <div
  48. class={[
  49. `${prefixCls}-content`,
  50. 'absolute top-0 h-[100%]',
  51. {
  52. 'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)]':
  53. collapse.value && !mobile.value && !mobile.value,
  54. 'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)]':
  55. !collapse.value && !mobile.value && !mobile.value,
  56. 'fixed !w-full !left-0': mobile.value
  57. }
  58. ]}
  59. style="transition: all var(--transition-time-02);"
  60. >
  61. <ElScrollbar
  62. v-loading={pageLoading.value}
  63. class={[
  64. `${prefixCls}-content-scrollbar`,
  65. {
  66. '!h-[calc(100%-var(--top-tool-height)-var(--tags-view-height))] mt-[calc(var(--top-tool-height)+var(--tags-view-height))]':
  67. fixedHeader.value
  68. }
  69. ]}
  70. >
  71. <div
  72. class={[
  73. {
  74. 'fixed top-0 left-0 z-10': fixedHeader.value,
  75. 'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)]':
  76. collapse.value && fixedHeader.value && !mobile.value,
  77. 'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)]':
  78. !collapse.value && fixedHeader.value && !mobile.value,
  79. '!w-full !left-0': mobile.value
  80. }
  81. ]}
  82. style="transition: all var(--transition-time-02);"
  83. >
  84. <ToolHeader class="border-bottom-1 border-solid border-[var(--top-tool-border-color)] bg-[var(--top-header-bg-color)] dark:border-[var(--el-border-color)]"></ToolHeader>
  85. {tagsView.value ? (
  86. <TagsView class="border-bottom-1 border-top-1 border-solid border-[var(--tags-view-border-color)] dark:border-[var(--el-border-color)]"></TagsView>
  87. ) : undefined}
  88. </div>
  89. <AppView></AppView>
  90. </ElScrollbar>
  91. </div>
  92. </>
  93. )
  94. }
  95. const renderTopLeft = () => {
  96. return (
  97. <>
  98. <div class="flex items-center bg-[var(--top-header-bg-color)] border-bottom-1 border-solid border-[var(--top-tool-border-color)] dark:border-[var(--el-border-color)]">
  99. {logo.value ? <Logo class="hover-trigger !pr-15px"></Logo> : undefined}
  100. <ToolHeader class="flex-1"></ToolHeader>
  101. </div>
  102. <div class="absolute top-[var(--logo-height)+1px] left-0 w-full h-[calc(100%-1px-var(--logo-height))] flex">
  103. <Menu class="!h-full"></Menu>
  104. <div
  105. class={[
  106. `${prefixCls}-content`,
  107. 'h-[100%]',
  108. {
  109. 'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)]':
  110. collapse.value,
  111. 'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)]':
  112. !collapse.value
  113. }
  114. ]}
  115. style="transition: all var(--transition-time-02);"
  116. >
  117. <ElScrollbar
  118. v-loading={pageLoading.value}
  119. class={[
  120. `${prefixCls}-content-scrollbar`,
  121. {
  122. '!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]':
  123. fixedHeader.value && tagsView.value
  124. }
  125. ]}
  126. >
  127. {tagsView.value ? (
  128. <TagsView
  129. class={[
  130. 'border-bottom-1 border-top-1 border-solid border-[var(--tags-view-border-color)] dark:border-[var(--el-border-color)]',
  131. {
  132. '!fixed top-0 left-0 z-10': fixedHeader.value,
  133. 'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)] mt-[var(--logo-height)]':
  134. collapse.value && fixedHeader.value,
  135. 'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)] mt-[var(--logo-height)]':
  136. !collapse.value && fixedHeader.value
  137. }
  138. ]}
  139. style="transition: width var(--transition-time-02), left var(--transition-time-02);"
  140. ></TagsView>
  141. ) : undefined}
  142. <AppView></AppView>
  143. </ElScrollbar>
  144. </div>
  145. </div>
  146. </>
  147. )
  148. }
  149. const renderTop = () => {
  150. return (
  151. <>
  152. <div class="flex items-center justify-between bg-[var(--top-header-bg-color)] border-bottom-1 border-solid border-[var(--top-tool-border-color)] dark:border-[var(--el-border-color)]">
  153. {logo.value ? <Logo class="hover-trigger"></Logo> : undefined}
  154. <Menu class="flex-1 px-10px h-[var(--top-tool-height)]"></Menu>
  155. <ToolHeader></ToolHeader>
  156. </div>
  157. <div class={[`${prefixCls}-content`, 'h-full w-full']}>
  158. <ElScrollbar
  159. v-loading={pageLoading.value}
  160. class={[
  161. `${prefixCls}-content-scrollbar`,
  162. {
  163. 'mt-[var(--tags-view-height)] !pb-[calc(var(--tags-view-height)+var(--app-footer-height))]':
  164. fixedHeader.value,
  165. 'pb-[var(--app-footer-height)]': !fixedHeader.value
  166. }
  167. ]}
  168. >
  169. {tagsView.value ? (
  170. <TagsView
  171. class={[
  172. 'border-bottom-1 border-top-1 border-solid border-[var(--tags-view-border-color)] dark:border-[var(--el-border-color)]',
  173. {
  174. '!fixed w-full top-[var(--top-tool-height)] left-0': fixedHeader.value
  175. }
  176. ]}
  177. style="transition: width var(--transition-time-02), left var(--transition-time-02);"
  178. ></TagsView>
  179. ) : undefined}
  180. <AppView></AppView>
  181. </ElScrollbar>
  182. </div>
  183. </>
  184. )
  185. }
  186. const renderCutMenu = () => {
  187. return (
  188. <>
  189. <div class="flex items-center bg-[var(--top-header-bg-color)] border-bottom-1 border-solid border-[var(--top-tool-border-color)] dark:border-[var(--el-border-color)]">
  190. {logo.value ? <Logo class="hover-trigger !pr-15px"></Logo> : undefined}
  191. <ToolHeader class="flex-1"></ToolHeader>
  192. </div>
  193. <div class="absolute top-[var(--logo-height)] left-0 w-full h-[calc(100%-var(--logo-height))] flex">
  194. <TabMenu></TabMenu>
  195. <div
  196. class={[
  197. `${prefixCls}-content`,
  198. 'h-[100%]',
  199. {
  200. 'w-[calc(100%-var(--tab-menu-min-width))] left-[var(--tab-menu-min-width)]':
  201. collapse.value && !fixedMenu.value,
  202. 'w-[calc(100%-var(--tab-menu-max-width))] left-[var(--tab-menu-max-width)]':
  203. !collapse.value && !fixedMenu.value,
  204. 'w-[calc(100%-var(--tab-menu-min-width)-var(--left-menu-max-width))] ml-[var(--left-menu-max-width)]':
  205. collapse.value && fixedMenu.value,
  206. 'w-[calc(100%-var(--tab-menu-max-width)-var(--left-menu-max-width))] ml-[var(--left-menu-max-width)]':
  207. !collapse.value && fixedMenu.value
  208. }
  209. ]}
  210. style="transition: all var(--transition-time-02);"
  211. >
  212. <ElScrollbar
  213. v-loading={pageLoading.value}
  214. class={[
  215. `${prefixCls}-content-scrollbar`,
  216. {
  217. '!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]':
  218. fixedHeader.value && tagsView.value
  219. }
  220. ]}
  221. >
  222. {tagsView.value ? (
  223. <TagsView
  224. class={[
  225. 'border-bottom-1 border-top-1 border-solid border-[var(--tags-view-border-color)] dark:border-[var(--el-border-color)]',
  226. {
  227. '!fixed top-0 left-0 z-10': fixedHeader.value,
  228. 'w-[calc(100%-var(--tab-menu-min-width))] left-[var(--tab-menu-min-width)] mt-[var(--logo-height)]':
  229. collapse.value && fixedHeader.value,
  230. 'w-[calc(100%-var(--tab-menu-max-width))] left-[var(--tab-menu-max-width)] mt-[var(--logo-height)]':
  231. !collapse.value && fixedHeader.value,
  232. '!fixed top-0 left-[var(--tab-menu-min-width)+var(--left-menu-max-width)] z-10':
  233. fixedHeader.value && fixedMenu.value,
  234. 'w-[calc(100%-var(--tab-menu-min-width)-var(--left-menu-max-width))] left-[var(--tab-menu-min-width)+var(--left-menu-max-width)] mt-[var(--logo-height)]':
  235. collapse.value && fixedHeader.value && fixedMenu.value,
  236. 'w-[calc(100%-var(--tab-menu-max-width)-var(--left-menu-max-width))] left-[var(--tab-menu-max-width)+var(--left-menu-max-width)] mt-[var(--logo-height)]':
  237. !collapse.value && fixedHeader.value && fixedMenu.value
  238. }
  239. ]}
  240. style="transition: width var(--transition-time-02), left var(--transition-time-02);"
  241. ></TagsView>
  242. ) : undefined}
  243. <AppView></AppView>
  244. </ElScrollbar>
  245. </div>
  246. </div>
  247. </>
  248. )
  249. }
  250. return {
  251. renderClassic,
  252. renderTopLeft,
  253. renderTop,
  254. renderCutMenu
  255. }
  256. }