.play-cta

	input#toggle(type='checkbox' name='toggle')

	button.play-cta__btn.plyr__controls__item.plyr__control.play-cta__btn--sunset.play-cta__btn--smooth-sunset
		svg.icon--pressed(
			role='presentation'
			focusable="false"
		)
			use(xlink:href='#pause')
		svg.icon--not-pressed(
			role='presentation'
			focusable='false'
		)
			use(xlink:href='#play')
	
	.play-cta__screens.play-cta__screens--radial-sunset.play-cta__screens--linear-sunset

	.play-cta__label
		h2.play-cta__label--play
			each val in ['P','l','a','y']
				span= val
		h2.play-cta__label--pause
			each val in ['P','a','u','s', 'e']
				span= val

// icons
svg(
	xmlns='http://www.w3.org/2000/svg'
	xmlns:xlink='http://www.w3.org/1999/xlink'
)
	symbol(
		id='play'
		viewBox='0 0 24 24'
	)
		path(d='M8,5.14V19.14L19,12.14L8,5.14Z')
	symbol(
		id='pause'
		viewBox='0 0 24 24'
	)
		path(d='M14,19H18V5H14M6,19H10V5H6V19Z')
View Compiled
.play-cta
	width: 16.4rem
	height: 13.6rem
	position: relative
	top: calc(50vh - (16.4rem / 2))
	left: calc(50vw - (13.6rem / 2))
	position: relative
	z-index: 1

	&:hover
		& .play-cta__btn
			box-shadow: var(--levitation), var(--accent)
			transform: scale(1.2) translateY(-1.6rem)

		& .play-cta__screens::before, & .play-cta__screens::after
			animation-play-state: running

		& .play-cta__label .play-cta__label--play span
			transform: translateY(0)
			opacity: 1
		
		& #toggle:checked:hover
			&~.play-cta__label
				& .play-cta__label--play span
					transform: translateY(-6.4rem)
					opacity: 0

				& .play-cta__label--pause span
					transform: translateY(0)
					opacity: 1

	&:active
		& .play-cta__btn
			box-shadow: var(--levitation), var(--pressed)

	#toggle
		width: 100%
		height: 100%
		position: absolute
		margin: 0
		-webkit-appearance: unset
		z-index: 2
		outline: 0
		top: 0
		left: 0
		cursor: pointer

		&:checked
			&~.play-cta__btn
				& svg.icon--pressed
					display: block

				& svg.icon--not-pressed
					display: none

			&~.play-cta__screens
				&::before, &::after
					animation-play-state: running
		
				&--linear-sunset::before
					--duration: .5s
			
				&--radial-sunset::after
					--duration: .25s
		
	.play-cta__btn
		width: 100%
		height: 100%
		background-color: var(--jb-white)
		border-radius: var(--regular-border-radius)
		border: 0
		outline: 0
		margin: 0
		padding: 0
		transition: var(--jb-transition)
		transition-delay: var(--delay)

		svg
			width: 4.8rem
			height: 4.8rem
			margin: auto
			fill: var(--jb-blueberry)
			
			&.icon--pressed
				display: none

	.play-cta__screens
		width: 100%
		height: 100%
		position: absolute
		z-index: -1
		top: 0
		left: 0
		transition: var(--jb-transition)
		pointer-events: none

		&::before, &::after
			--lower-value: .75
			--upper-value: 2
			--medium-value: 1.5

			--lower-value-radius: 2.8rem
			--upper-value-radius: .8rem
			--medium-value-radius: 1.2rem
	
			--duration: .6s
	
			@extend .play-cta__screens
			content: ''
			border-radius: var(--regular-border-radius)
	
			animation-name: bouncing
			animation-duration: var(--duration)
			animation-iteration-count: infinite
			animation-timing-function: linear
			animation-fill-mode: none
			animation-play-state: paused

		&--linear-sunset::before
			background: var(--jb-linear-sunset)
			top: 1.6rem
			left: 3.2rem
			z-index: -3
			transform-origin: 100% 100%

		&--radial-sunset::after
			background: var(--jb-radial-sunset)
			top: 4.0rem
			left: -4.0rem
			z-index: -2
			transform-origin: 0% 100%

	.play-cta__label
		width: 60rem
		height: 20rem
		position: absolute
		top: -22.8rem
		left: -28.8rem
		z-index: 1
		pointer-events: none

		.play-cta__label--play, .play-cta__label--pause
			width: 100%
			height: 100%
			position: absolute
			display: flex

		span
			transition: opacity .2s var(--ease-peps), transform var(--duration) var(--ease-peps)
			transform: translateY(6.4rem)
			opacity: 0
			display: block

			@for $i from 1 through 6
				&:nth-child(0n + #{$i})
					transition-delay: ($i * .1s) - .1s

// animation
@keyframes bouncing
	0%, 100%
		transform: scale(1)
		border-radius: var(--regular-border-radius)
	15%
		transform: scale(var(--lower-value))
		border-radius: var(--lower-value-radius)
	50%
		transform: scale(var(--upper-value))
		border-radius: var(--upper-value-radius)
	85%
		transform: scale(var(--medium-value))
		border-radius: var(--medium-value-radius)

// init
html, body
	width: 100%
	height: 100%
	margin: 0
	background-color: var(--jb-blueberry)
	font-family: var(--montserrat)
	font-size: var(--font-size)
	line-height: 1.3
	color: var(--jb-white)

	h2
		font-size: var(--large-size)
		letter-spacing: var(--large-kerning)
		font-weight: 700
		margin: 0

*, *::before, *::after
	box-sizing: border-box

// custom properties
\:root
	// typography
	--font-size: 62.5%
	--xlarge-size: 16rem
	--large-size: calc(var(--xlarge-size) - var(--plain-text))
	--medium-size: calc(var(--large-size) - var(--plain-text))
	--small-size: calc(var(--medium-size) - var(--plain-text))
	--xsmall-size: calc(var(--small-size) - var(--plain-text))
	--xxsmall-size: calc(var(--xsmall-size) - var(--plain-text))
	
	--plain-text: 1.6rem
	--small-plain-text: 1.2rem

	--large-kerning: .8rem
	--medium-kerning: .4rem

	--montserrat: 'Montserrat', Arial, Helvetica, sans-serif

	// spacing
	--xlarge-space: 6.4rem
	--large-space: 3.2rem
	--regular-space: 1.6rem
	--small-space: .8rem
	--xsmall-space: .4rem

	// colors
	--jb-white-rgb: 255, 255, 255
	--jb-white: rgba(var(--jb-white-rgb), 1)
	--jb-white-9: rgba(var(--jb-white-rgb), .9)
	--jb-white-8: rgba(var(--jb-white-rgb), .8)
	--jb-white-7: rgba(var(--jb-white-rgb), .7)
	--jb-white-6: rgba(var(--jb-white-rgb), .6)
	--jb-white-5: rgba(var(--jb-white-rgb), .5)
	--jb-white-4: rgba(var(--jb-white-rgb), .4)
	--jb-white-3: rgba(var(--jb-white-rgb), .3)
	--jb-white-2: rgba(var(--jb-white-rgb), .2)
	--jb-white-1: rgba(var(--jb-white-rgb), .1)

	--jb-blueberry-rgb: 25, 0, 56
	--jb-blueberry: rgba(var(--jb-blueberry-rgb), 1)
	--jb-blueberry-9: rgba(var(--jb-blueberry-rgb), .9)
	--jb-blueberry-8: rgba(var(--jb-blueberry-rgb), .8)
	--jb-blueberry-7: rgba(var(--jb-blueberry-rgb), .7)
	--jb-blueberry-6: rgba(var(--jb-blueberry-rgb), .6)
	--jb-blueberry-5: rgba(var(--jb-blueberry-rgb), .5)
	--jb-blueberry-4: rgba(var(--jb-blueberry-rgb), .4)
	--jb-blueberry-3: rgba(var(--jb-blueberry-rgb), .3)
	--jb-blueberry-2: rgba(var(--jb-blueberry-rgb), .2)
	--jb-blueberry-1: rgba(var(--jb-blueberry-rgb), .1)
	--jb-blueberry-05: rgba(var(--jb-blueberry-rgb), .05)

	--jb-salmon: rgb(255, 178, 170)
	--jb-desert: rgb(255, 241, 118)
	--jb-milka: rgb(187, 176, 255)

	// gradients
	--jb-salmon-milka-linear: linear-gradient(30deg, var(--jb-salmon) 0%, var(--jb-milka) 100%)
	--jb-linear-shine: linear-gradient(30deg, transparent 25%, var(--jb-desert) 50%, transparent 75%)
	--jb-linear-sunset: var(--jb-linear-shine), var(--jb-salmon-milka-linear)

	--jb-salmon-milka-radial: radial-gradient(circle, var(--jb-salmon) 0%, var(--jb-milka) 100%)
	--jb-radial-shine: radial-gradient(circle, transparent 0%, var(--jb-desert) 50%, transparent 100%)
	--jb-radial-sunset: var(--jb-radial-shine), var(--jb-salmon-milka-radial)

	--radial-mask: radial-gradient(circle, var(--jb-white-1) 0%, transparent 40%, var(--jb-blueberry) 100%)

	// box shadow
	--shadow-color: var(--jb-blueberry-1)
	--shadow-spread: .4rem

	--levitation: 0 .8rem .8rem var(--shadow-color)
	--accent: inset 0 0 0 var(--shadow-spread) var(--shadow-color)
	--pressed: inset 0 0 0 var(--shadow-spread) var(--jb-blueberry-4)
	--focus: 0 0 0 var(--shadow-spread) var(--jb-milka)

	// radius
	--regular-border-radius: 1.6rem
	--small-border-radius: .8rem

	// easing
	--ease-peps: cubic-bezier(.03,.85,.36,1)

	// transition/animation
	--duration: .4s
	--delay: 0s
	--functions: all

	--jb-transition: var(--functions) var(--duration) var(--ease-peps) var(--delay)
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.