Site > Add fireworks git add --all! :boom::star2::rocket:🔥💥

This commit is contained in:
brunosimon
2017-09-07 23:42:25 +02:00
parent 1c7b076641
commit c3f122ac43
11 changed files with 306 additions and 8 deletions
+3
View File
@@ -0,0 +1,3 @@
<template src="./template.html"></template>
<script src="./script.js"></script>
<style src="./style.styl" lang="stylus" scoped></style>
+42
View File
@@ -0,0 +1,42 @@
export default
{
name: 'blast',
data()
{
return {
sparks: [],
color: 'yellow'
}
},
created()
{
// Create sparks
for(let i = 0; i < 25; i++)
{
this.sparks.push([
Math.random() * 360 + 'deg',
Math.random(),
0.5 + Math.random() * 1.5 + 's'
])
}
// End timeout
window.setTimeout(() =>
{
this.$emit('end', this.index)
}, 4000)
// Color
this.color = `hsl(${255 * Math.random()}, 100%, 50%)`
},
mounted()
{
},
methods:
{
}
}
+43
View File
@@ -0,0 +1,43 @@
.blast
position absolute
transform translateY(0px)
will-change transform
animation-name blast
animation-duration 3s
animation-timing-function ease-in-out
animation-fill-mode forwards
@keyframes blast
0%
opacity 1
transform translateY(0px)
50%
opacity 1
100%
opacity 0
transform translateY(80px)
.spark
position absolute
.inner-1
position absolute
transform translateY(0px)
will-change transform
animation-name spark-inner-1
animation-timing-function cubic-bezier(0, 0, 0, 1)
animation-fill-mode forwards
@keyframes spark-inner-1
0%
transform translateY(0px)
100%
transform translateY(160px)
.inner-2
position absolute
top -3px
left -3px
width 30px
height 30px
+7
View File
@@ -0,0 +1,7 @@
<div class="blast" :style="`left:${Math.random() * 100}%;top:${Math.random() * 100}%;`">
<div v-for="spark of sparks" class="spark" :style="`transform: rotate(${spark[0]}) scale(${spark[1]}, ${spark[1]});`">
<div class="inner-1" :style="`animation-duration: ${spark[2]}`">
<div class="inner-2" :style="`transform: scale(${1 - spark[1]}, ${1 - spark[1]}); background-color: ${color};`"></div>
</div>
</div>
</div>
+3
View File
@@ -0,0 +1,3 @@
<template src="./template.html"></template>
<script src="./script.js"></script>
<style src="./style.styl" lang="stylus" scoped></style>
+85
View File
@@ -0,0 +1,85 @@
import Blast from '@/components/blast'
export default
{
name: 'fireworks',
components:
{
Blast
},
props:
{
running: { type: Boolean, default: true }
},
data()
{
return {
blasts: []
}
},
watch:
{
running: 'onRunningChange'
},
created()
{
this.blastsIndex = 0
},
mounted()
{
this.start()
},
methods:
{
onRunningChange(value)
{
if(value)
{
this.addBlast()
}
},
start()
{
if(this.running)
{
this.addBlast()
}
},
addBlast()
{
this.blasts.push(this.blastsIndex++)
if(this.running)
{
window.setTimeout(() =>
{
this.addBlast()
}, 1000 + Math.random() * 3000)
}
},
removeBlast(index)
{
const blast = this.blasts.indexOf(index)
if(blast !== -1)
{
this.blasts.splice(blast, 1)
}
},
onBlastEnd(index)
{
this.removeBlast(index)
}
}
}
+9
View File
@@ -0,0 +1,9 @@
.fireworks
position absolute
top 50%
left 50%
width 400px
height 400px
margin-top -280px
margin-left calc(-200px - 145px)
z-index 1
@@ -0,0 +1,3 @@
<div class="fireworks">
<blast v-for="blast in blasts" :key="blast" @end="onBlastEnd(blast)"></blast>
</div>
+68
View File
@@ -1,9 +1,29 @@
import quotes from './quotes' import quotes from './quotes'
import Fireworks from '@/components/fireworks'
export default export default
{ {
name: 'landing', name: 'landing',
components:
{
Fireworks
},
data()
{
return {
focus: false,
fireworksRunning: false,
stars: []
}
},
watch:
{
focus: 'onFocusChange'
},
computed: computed:
{ {
quote: () => quotes[Math.floor(quotes.length * Math.random())], quote: () => quotes[Math.floor(quotes.length * Math.random())],
@@ -11,5 +31,53 @@ export default
{ {
return this.$store.state.url return this.$store.state.url
} }
},
created()
{
for(let i = 0; i < 20; i++)
{
this.stars.push([
Math.round(Math.random() * 200 - 50) + '%',
Math.round(Math.random() * 200 - 50) + '%',
Math.random() * 4 + 's'
])
}
},
methods:
{
onFocusChange(value)
{
// Enter focus
if(value)
{
// Wait few seconds
window.setTimeout(() =>
{
// Still focusing
if(this.focus)
{
this.fireworksRunning = true
}
}, 3000)
}
// Leave focus
else
{
this.fireworksRunning = false
}
},
onUrlClick()
{
this.focus = !this.focus
},
onLandingClick()
{
this.focus = false
}
} }
} }
+31 -5
View File
@@ -25,11 +25,6 @@
background #2D2D49 background #2D2D49
font-family 'DINNextRoundedLTPro' font-family 'DINNextRoundedLTPro'
.url
color #fff
font-size 20px
margin-bottom 50px
.illustration .illustration
position relative position relative
width 300px width 300px
@@ -117,3 +112,34 @@
color #4bd1c5 color #4bd1c5
font-size 18px font-size 18px
.url
color #fff
font-size 20px
margin-bottom 30px
padding 20px
cursor pointer
z-index 2
transform translateX(0) translateY(0) scale(1, 1)
transition transform 0.3s
.focus &
transform translateX(-145px) translateY(250px) scale(3, 3)
transition-duration 5s
.mask
position absolute
top 0
left -290px
width calc(100% + 290px)
height 100%
background #000
z-index 1
pointer-events none
opacity 0
transition opacity 0.3s
will-change opacity
.focus &
pointer-events default
opacity 0.8
transition-duration 3s
+12 -3
View File
@@ -1,9 +1,11 @@
<div class="landing"> <div class="landing" :class="[ focus ? 'focus' : '' ]" @click.prevent="onLandingClick">
<div class="url">
<div class="url" @click.prevent.stop="onUrlClick">
{{ url }} {{ url }}
</div> </div>
<div class="illustration"> <div class="illustration">
<div class="element star" v-for="index in 20" :style="`left: ${Math.random() * 200 - 50}%;top: ${Math.random() * 200 - 50}%;animation-delay: ${Math.random() * 4}s;`"> <div class="element star" v-for="star of stars" :style="`left: ${star[0]};top: ${star[1]};animation-delay: ${star[2]};`">
<span class="bar bar-1"></span> <span class="bar bar-1"></span>
<span class="bar bar-2"></span> <span class="bar bar-2"></span>
</div> </div>
@@ -11,13 +13,20 @@
<img class="element astronaut" src="../../../static/svg/landing-astronaut.svg" alt=""> <img class="element astronaut" src="../../../static/svg/landing-astronaut.svg" alt="">
<img class="element book" src="../../../static/svg/landing-book.svg" alt=""> <img class="element book" src="../../../static/svg/landing-book.svg" alt="">
</div> </div>
<div class="title"> <div class="title">
Welcome to keppler! Welcome to keppler!
</div> </div>
<div class="sub-title"> <div class="sub-title">
Here you can browse the presenter's code in real time. Here you can browse the presenter's code in real time.
</div> </div>
<div class="quote"> <div class="quote">
— {{ quote }} — {{ quote }}
</div> </div>
<div class="mask"></div>
<fireworks :running="fireworksRunning"></fireworks>
</div> </div>