useRenderLayout.tsx 9.0 KB

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