useRenderLayout.tsx 9.3 KB

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