mirror of
				https://github.com/em-squared/5e-drs.git
				synced 2025-10-30 21:24:18 +00:00 
			
		
		
		
	
		
			
	
	
		
			138 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			138 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
|   | <template> | ||
|  |   <div | ||
|  |     class="theme-container" | ||
|  |     :class="pageClasses" | ||
|  |     @touchstart="onTouchStart" | ||
|  |     @touchend="onTouchEnd" | ||
|  |   > | ||
|  |     <Navbar | ||
|  |       v-if="shouldShowNavbar" | ||
|  |       @toggle-sidebar="toggleSidebar" | ||
|  |     /> | ||
|  | 
 | ||
|  |     <div | ||
|  |       class="sidebar-mask" | ||
|  |       @click="toggleSidebar(false)" | ||
|  |     /> | ||
|  | 
 | ||
|  |     <Sidebar | ||
|  |       :items="sidebarItems" | ||
|  |       @toggle-sidebar="toggleSidebar" | ||
|  |     > | ||
|  |       <template #top> | ||
|  |         <slot name="sidebar-top" /> | ||
|  |       </template> | ||
|  |       <template #bottom> | ||
|  |         <slot name="sidebar-bottom" /> | ||
|  |       </template> | ||
|  |     </Sidebar> | ||
|  | 
 | ||
|  |     <DefaultGlobalLayout/> | ||
|  |   </div> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script> | ||
|  | import GlobalLayout from '@app/components/GlobalLayout.vue' | ||
|  | import Navbar from '@theme/components/Navbar.vue' | ||
|  | import Sidebar from '@theme/components/Sidebar.vue' | ||
|  | import { resolveSidebarItems } from '../util' | ||
|  | 
 | ||
|  | export default { | ||
|  |   name: 'GlobalLayout', | ||
|  | 
 | ||
|  |   components: { | ||
|  |     DefaultGlobalLayout: GlobalLayout, | ||
|  |     Sidebar, | ||
|  |     Navbar | ||
|  |   }, | ||
|  | 
 | ||
|  |   data () { | ||
|  |     return { | ||
|  |       isSidebarOpen: false | ||
|  |     } | ||
|  |   }, | ||
|  | 
 | ||
|  |   computed: { | ||
|  |     shouldShowNavbar () { | ||
|  |       const { themeConfig } = this.$site | ||
|  |       const { frontmatter } = this.$page | ||
|  |       if ( | ||
|  |         frontmatter.navbar === false | ||
|  |         || themeConfig.navbar === false) { | ||
|  |         return false | ||
|  |       } | ||
|  |       return ( | ||
|  |         this.$title | ||
|  |         || themeConfig.logo | ||
|  |         || themeConfig.repo | ||
|  |         || themeConfig.nav | ||
|  |         || this.$themeLocaleConfig.nav | ||
|  |       ) | ||
|  |     }, | ||
|  | 
 | ||
|  |     shouldShowSidebar () { | ||
|  |       const { frontmatter } = this.$page | ||
|  |       return ( | ||
|  |         !frontmatter.home | ||
|  |         && frontmatter.sidebar !== false | ||
|  |         && this.sidebarItems.length | ||
|  |       ) | ||
|  |     }, | ||
|  | 
 | ||
|  |     sidebarItems () { | ||
|  |       return resolveSidebarItems( | ||
|  |         this.$page, | ||
|  |         this.$page.regularPath, | ||
|  |         this.$site, | ||
|  |         this.$localePath | ||
|  |       ) | ||
|  |     }, | ||
|  | 
 | ||
|  |     pageClasses () { | ||
|  |       const userPageClass = this.$page.frontmatter.pageClass | ||
|  |       return [ | ||
|  |         { | ||
|  |           'no-navbar': !this.shouldShowNavbar, | ||
|  |           'sidebar-open': this.isSidebarOpen, | ||
|  |           'no-sidebar': !this.shouldShowSidebar | ||
|  |         }, | ||
|  |         userPageClass | ||
|  |       ] | ||
|  |     } | ||
|  |   }, | ||
|  | 
 | ||
|  |   mounted () { | ||
|  |     this.$router.afterEach(() => { | ||
|  |       this.isSidebarOpen = false | ||
|  |     }) | ||
|  |   }, | ||
|  | 
 | ||
|  |   methods: { | ||
|  |     toggleSidebar (to) { | ||
|  |       this.isSidebarOpen = typeof to === 'boolean' ? to : !this.isSidebarOpen | ||
|  |       this.$emit('toggle-sidebar', this.isSidebarOpen) | ||
|  |     }, | ||
|  | 
 | ||
|  |     // side swipe
 | ||
|  |     onTouchStart (e) { | ||
|  |       this.touchStart = { | ||
|  |         x: e.changedTouches[0].clientX, | ||
|  |         y: e.changedTouches[0].clientY | ||
|  |       } | ||
|  |     }, | ||
|  | 
 | ||
|  |     onTouchEnd (e) { | ||
|  |       const dx = e.changedTouches[0].clientX - this.touchStart.x | ||
|  |       const dy = e.changedTouches[0].clientY - this.touchStart.y | ||
|  |       if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 40) { | ||
|  |         if (dx > 0 && this.touchStart.x <= 80) { | ||
|  |           this.toggleSidebar(true) | ||
|  |         } else { | ||
|  |           this.toggleSidebar(false) | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | </script> |