|
$m: 2; |
|
$d: 2*1em; |
|
$z: 2*$d; |
|
$p: 42.5%; |
|
$t: '🎅⛄️merry✨✨christmas🕯️☃️ from Siddhant'; |
|
$l: 2*(str-length($t) + 1); |
|
|
|
%anim { animation: a 4s ease-in-out alternate infinite } |
|
|
|
%ymov { animation-name: ymov } |
|
%xrot { animation-name: xrot } |
|
%zrot { animation-name: zrot } |
|
%fade { animation-name: fade } |
|
|
|
@keyframes xmov { |
|
to { transform: translate(-50%) } |
|
} |
|
|
|
@keyframes ymov { |
|
0%, #{$p} { transform: translatey(0) } |
|
#{100% - $p}, 100% { transform: translatey(calc(var(--i)*#{$d}*(1.4 - 1))) } |
|
} |
|
|
|
@keyframes xrot { |
|
0%, #{$p} { transform: perspective(35em) translatez(-$z) rotatex(0deg) translatez($z) rotatex(0deg) } |
|
#{100% - $p}, 100% { transform: perspective(35em) translatez(-$z) rotatex(calc(var(--sgnp)*.5turn)) translatez($z) rotatex(calc(var(--sgnp)*-.5turn)) } |
|
} |
|
|
|
@keyframes zrot { |
|
0%, #{$p} { transform: rotate(0deg) } |
|
#{100% - $p}, 100% { transform: rotate(calc(var(--sgnk)*45deg)) } |
|
} |
|
|
|
@keyframes fade { |
|
0%, #{$p} { opacity: 0 } |
|
#{100% - $p} { opacity: 1 } |
|
} |
|
|
|
*, :before, :after { |
|
--notk: calc(1 - var(--k)); |
|
--sgnk: calc(var(--sgnl, 1)*(1 - 2*var(--k))); |
|
--sgnp: calc(1 - 2*var(--p)); |
|
margin: 0; |
|
padding: 0; |
|
min-width: $d; min-height: $d |
|
} |
|
|
|
body { |
|
overflow-x: hidden; |
|
min-height: 100vh; |
|
background: url(https://images.unsplash.com/photo-1512389142860-9c449e58a543?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjE0NTg5fQ) 50%/ cover #ccc; |
|
background-blend-mode: overlay; |
|
font: 900 calc(25vmin/(var(--n) + 2))/ #{$m} monospace; |
|
text-align: center; |
|
|
|
&:after { |
|
position: fixed; |
|
bottom: 0; left: 0; |
|
color: crimson; |
|
font-size: 1.5em; |
|
letter-spacing: 1em; |
|
text-shadow: 0 0 1px #000, 0 0 2px #000; |
|
white-space: nowrap; |
|
animation: xmov $l*.2s linear infinite; |
|
content: '#{$t}#{$t}' |
|
} |
|
} |
|
|
|
ul { list-style: none } |
|
|
|
.deco { |
|
padding-bottom: calc((1.4 - 1)*(var(--n) - 1)*#{$d}); |
|
transform-style: preserve-3d; |
|
|
|
&:before, &:after { |
|
--p: 0; |
|
grid-row: 1; |
|
grid-column: 1; |
|
margin: 2em; |
|
border-radius: .5em; |
|
box-shadow: 0 0 .5em #fff, 0 0 .25em #fff; |
|
background: rgba(#fff, .75); |
|
font-size: 1.25em; |
|
@extend %anim; |
|
animation-name: xrot, fade; |
|
counter-reset: n var(--n); |
|
content: 'grid: n·n = n² = ' counter(n) '²' |
|
} |
|
|
|
&:before { |
|
--p: 1; |
|
animation-direction: alternate-reverse; |
|
counter-reset: n var(--n); |
|
content: 'incr. rows: 1 + 3 + ... + (2·' counter(n) ' - 1) = ∑(2·i - 1)' |
|
} |
|
} |
|
|
|
.star { font-size: 2em } |
|
|
|
.tree { |
|
position: relative; |
|
|
|
&:before, &:after { |
|
position: absolute; |
|
bottom: 100%; left: 0; |
|
@extend %anim; |
|
@extend %fade; |
|
animation-direction: alternate-reverse; |
|
content: 'row number:' |
|
} |
|
|
|
&:after { |
|
right: 0; left: auto; |
|
content: 'items/ row (2·i - 1):' |
|
} |
|
} |
|
|
|
ul:not(.tree) { display: grid } |
|
|
|
.row { |
|
--p: 0; |
|
position: relative; |
|
@extend %anim; |
|
@extend %ymov; |
|
counter-reset: i calc(var(--i) + 1) o calc(2*var(--i) + 1); |
|
|
|
&:nth-child(2n) { --p: 1 } |
|
|
|
> ul { |
|
place-content: center; |
|
grid-template-columns: repeat(3, max-content); |
|
grid-auto-flow: row dense |
|
} |
|
|
|
&:before, &:after { |
|
position: absolute; |
|
top: 0; right: 0; |
|
padding: 0 .5em; |
|
@extend %anim; |
|
@extend %fade; |
|
animation-direction: alternate-reverse; |
|
content: counter(o) |
|
} |
|
|
|
&:before { |
|
left: 0; bottom: 0; |
|
background: hsl(0, 0%, calc(85% + (1 - 2*var(--p))*5%)); |
|
text-align: left; |
|
content: counter(i); |
|
} |
|
} |
|
|
|
.mid { grid-column: 2 } |
|
|
|
.branch { |
|
transform-origin: calc(var(--notk)*100% + var(--sgnk)*#{.5*$d}); |
|
@extend %anim; |
|
@extend %zrot; |
|
|
|
.row:last-child & { |
|
position: relative; |
|
|
|
&:after { |
|
position: absolute; |
|
top: 100%; left: calc(50% - #{.5*$d}); |
|
box-shadow: 0 4px crimson; |
|
text-align: center; |
|
@extend %anim; |
|
animation-name: zrot, fade; |
|
counter-reset: n var(--n); |
|
content: counter(n) |
|
} |
|
} |
|
|
|
li, ul:after, &:after { |
|
--sgnl: -1; |
|
@extend %anim; |
|
@extend %zrot |
|
} |
|
|
|
ul { |
|
grid-template-columns: repeat(calc(var(--i) + 1), max-content); |
|
|
|
&:after { |
|
grid-row: 1; |
|
grid-column: calc(var(--i)*var(--k) + 1); |
|
animation-name: zrot, fade; |
|
content: counter(i) |
|
} |
|
} |
|
} |
|
|
|
.leaf { |
|
overflow: hidden; |
|
position: relative; |
|
border-radius: 50%; |
|
box-shadow: inset 0 0 0 2px hsl(calc(var(--p)*120), 50%, 25%); |
|
background: hsl(calc(var(--p)*120), 50%, 75%); |
|
|
|
&:before, &:after { |
|
position: absolute; |
|
left: 0; |
|
@extend %anim; |
|
@extend %fade; |
|
content: '🎄🎀'; |
|
|
|
.row:nth-child(odd) & { bottom: 0 } |
|
} |
|
|
|
&:before { |
|
animation-direction: alternate-reverse; |
|
content: '🌲🎁' |
|
} |
|
} |