123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- <template>
- <q-layout
- ref="layout"
- view="lHh Lpr fff"
- :left-class="{'bg-grey-2': true}"
- >
- <q-toolbar slot="header" class="glossy">
- <q-btn
- flat
- @click="$refs.layout.toggleLeft()"
- >
- <q-icon name="menu" />
- </q-btn>
- <q-toolbar-title>
- Quasar App
- <div slot="subtitle">Running on Quasar v{{$q.version}}</div>
- </q-toolbar-title>
- </q-toolbar>
- <div slot="left">
- <!--
- Use <q-side-link> component
- instead of <q-item> for
- internal vue-router navigation
- -->
- <q-list no-border link inset-delimiter>
- <q-list-header>Essential Links</q-list-header>
- <q-item @click="launch('http://quasar-framework.org')">
- <q-item-side icon="school" />
- <q-item-main label="Docs" sublabel="quasar-framework.org" />
- </q-item>
- <q-item @click="launch('http://forum.quasar-framework.org')">
- <q-item-side icon="record_voice_over" />
- <q-item-main label="Forum" sublabel="forum.quasar-framework.org" />
- </q-item>
- <q-item @click="launch('https://gitter.im/quasarframework/Lobby')">
- <q-item-side icon="chat" />
- <q-item-main label="Gitter Channel" sublabel="Quasar Lobby" />
- </q-item>
- <q-item @click="launch('https://twitter.com/quasarframework')">
- <q-item-side icon="rss feed" />
- <q-item-main label="Twitter" sublabel="@quasarframework" />
- </q-item>
- </q-list>
- </div>
- <!--
- Replace following <div> with
- <router-view /> component
- if using subRoutes
- -->
- <div class="layout-padding logo-container non-selectable no-pointer-events">
- <div class="logo" :style="position">
- <img src="~assets/quasar-logo-full.svg">
- </div>
- </div>
- </q-layout>
- </template>
- <script>
- import {
- dom,
- event,
- openURL,
- QLayout,
- QToolbar,
- QToolbarTitle,
- QBtn,
- QIcon,
- QList,
- QListHeader,
- QItem,
- QItemSide,
- QItemMain
- } from 'quasar'
- const
- { viewport } = dom,
- { position } = event,
- moveForce = 30,
- rotateForce = 40,
- RAD_TO_DEG = 180 / Math.PI
- function getRotationFromAccel (accelX, accelY, accelZ) {
- /* Reference: http://stackoverflow.com/questions/3755059/3d-accelerometer-calculate-the-orientation#answer-30195572 */
- const sign = accelZ > 0 ? 1 : -1
- const miu = 0.001
- return {
- roll: Math.atan2(accelY, sign * Math.sqrt(Math.pow(accelZ, 2) + miu * Math.pow(accelX, 2))) * RAD_TO_DEG,
- pitch: -Math.atan2(accelX, Math.sqrt(Math.pow(accelY, 2) + Math.pow(accelZ, 2))) * RAD_TO_DEG
- }
- }
- export default {
- name: 'index',
- components: {
- QLayout,
- QToolbar,
- QToolbarTitle,
- QBtn,
- QIcon,
- QList,
- QListHeader,
- QItem,
- QItemSide,
- QItemMain
- },
- data () {
- return {
- orienting: window.DeviceOrientationEvent && !this.$q.platform.is.desktop,
- rotating: window.DeviceMotionEvent && !this.$q.platform.is.desktop,
- moveX: 0,
- moveY: 0,
- rotateY: 0,
- rotateX: 0
- }
- },
- computed: {
- position () {
- const transform = `rotateX(${this.rotateX}deg) rotateY(${this.rotateY}deg)`
- return {
- top: this.moveY + 'px',
- left: this.moveX + 'px',
- '-webkit-transform': transform,
- '-ms-transform': transform,
- transform
- }
- }
- },
- methods: {
- launch (url) {
- openURL(url)
- },
- move (evt) {
- const
- {width, height} = viewport(),
- {top, left} = position(evt),
- halfH = height / 2,
- halfW = width / 2
- this.moveX = (left - halfW) / halfW * -moveForce
- this.moveY = (top - halfH) / halfH * -moveForce
- this.rotateY = (left / width * rotateForce * 2) - rotateForce
- this.rotateX = -((top / height * rotateForce * 2) - rotateForce)
- },
- rotate (evt) {
- if (evt.rotationRate &&
- evt.rotationRate.beta !== null &&
- evt.rotationRate.gamma !== null) {
- this.rotateX = evt.rotationRate.beta * 0.7
- this.rotateY = evt.rotationRate.gamma * -0.7
- }
- else {
- /* evt.acceleration may be null in some cases, so we'll fall back
- to evt.accelerationIncludingGravity */
- const
- accelX = evt.acceleration.x || evt.accelerationIncludingGravity.x,
- accelY = evt.acceleration.y || evt.accelerationIncludingGravity.y,
- accelZ = evt.acceleration.z || evt.accelerationIncludingGravity.z - 9.81,
- rotation = getRotationFromAccel(accelX, accelY, accelZ)
- this.rotateX = rotation.roll * 0.7
- this.rotateY = rotation.pitch * -0.7
- }
- },
- orient (evt) {
- if (evt.beta === null || evt.gamma === null) {
- window.removeEventListener('deviceorientation', this.orient, false)
- this.orienting = false
- window.addEventListener('devicemotion', this.rotate, false)
- }
- else {
- this.rotateX = evt.beta * 0.7
- this.rotateY = evt.gamma * -0.7
- }
- }
- },
- mounted () {
- this.$nextTick(() => {
- if (this.orienting) {
- window.addEventListener('deviceorientation', this.orient, false)
- }
- else if (this.rotating) {
- window.addEventListener('devicemove', this.rotate, false)
- }
- else {
- document.addEventListener('mousemove', this.move)
- }
- })
- },
- beforeDestroy () {
- if (this.orienting) {
- window.removeEventListener('deviceorientation', this.orient, false)
- }
- else if (this.rotating) {
- window.removeEventListener('devicemove', this.rotate, false)
- }
- else {
- document.removeEventListener('mousemove', this.move)
- }
- }
- }
- </script>
- <style lang="stylus">
- .logo-container
- width 255px
- height 242px
- perspective 800px
- position absolute
- top 50%
- left 50%
- transform translateX(-50%) translateY(-50%)
- .logo
- position absolute
- transform-style preserve-3d
- </style>
|