quasar
Version:
Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time
77 lines (64 loc) • 1.96 kB
JavaScript
import { h, computed, inject, getCurrentInstance } from 'vue'
import { createComponent } from '../../utils/private.create/create.js'
import { hSlot } from '../../utils/private.render/render.js'
import {
pageContainerKey,
layoutKey,
emptyRenderFn
} from '../../utils/private.symbols/symbols.js'
export default createComponent({
name: 'QPage',
props: {
padding: Boolean,
styleFn: Function
},
setup(props, { slots }) {
const {
proxy: { $q }
} = getCurrentInstance()
const $layout = inject(layoutKey, emptyRenderFn)
if ($layout === emptyRenderFn) {
console.error('QPage needs to be a deep child of QLayout')
return emptyRenderFn
}
const $pageContainer = inject(pageContainerKey, emptyRenderFn)
if ($pageContainer === emptyRenderFn) {
console.error('QPage needs to be child of QPageContainer')
return emptyRenderFn
}
const style = computed(() => {
const offset =
($layout.header.space === true ? $layout.header.size : 0) +
($layout.footer.space === true ? $layout.footer.size : 0)
if (typeof props.styleFn === 'function') {
const height =
$layout.isContainer.value === true
? $layout.containerHeight.value
: $q.screen.height
return props.styleFn(offset, height)
}
return {
minHeight:
$layout.isContainer.value === true
? $layout.containerHeight.value - offset + 'px'
: $q.screen.height === 0
? offset !== 0
? `calc(100vh - ${offset}px)`
: '100vh'
: $q.screen.height - offset + 'px'
}
})
const classes = computed(
() => `q-page${props.padding === true ? ' q-layout-padding' : ''}`
)
return () =>
h(
'main',
{
class: classes.value,
style: style.value
},
hSlot(slots.default)
)
}
})