useRenderLayout.tsx 9.9 KB

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