CSS+Vanilla JS shooting stars (P5JS no longuer in use but still there); more styling; favicons; Trying to get in touch with Bandcamp
This commit is contained in:
289
css/main.css
289
css/main.css
@@ -5,13 +5,40 @@
|
|||||||
--accent-color-1: #ff91d8;
|
--accent-color-1: #ff91d8;
|
||||||
--accent-color-1-light: #ffcdff;
|
--accent-color-1-light: #ffcdff;
|
||||||
--accent-color-2: #ffff7d;
|
--accent-color-2: #ffff7d;
|
||||||
|
|
||||||
|
--crossfader-thumb-width: 30px;
|
||||||
|
--crossfader-thumb-height: 60px;
|
||||||
|
--crossfader-thumb-radius: 15px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(fonts/Roboto Regular.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(fonts/Roboto Thin.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(fonts/Roboto Black.woff2) format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
html {
|
html {
|
||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
|
font-family: Roboto, Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
::-moz-selection {
|
::-moz-selection {
|
||||||
@@ -52,14 +79,6 @@ textarea {
|
|||||||
resize: vertical;
|
resize: vertical;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ==========================================================================
|
|
||||||
Author's custom styles
|
|
||||||
========================================================================== */
|
|
||||||
|
|
||||||
html {
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#bg {
|
#bg {
|
||||||
z-index: -2;
|
z-index: -2;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -73,11 +92,8 @@ html {
|
|||||||
#bg img {
|
#bg img {
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
/* max-width: 100%;
|
|
||||||
max-height: 100%; */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#desk {
|
#desk {
|
||||||
/* display: none; */
|
/* display: none; */
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -92,6 +108,10 @@ html {
|
|||||||
padding-bottom: 2em;
|
padding-bottom: 2em;
|
||||||
gap: 15px;
|
gap: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.player {
|
.player {
|
||||||
max-width: 480px;
|
max-width: 480px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -124,9 +144,11 @@ iframe {
|
|||||||
|
|
||||||
.load-button {
|
.load-button {
|
||||||
/* flex-grow: 2; */
|
/* flex-grow: 2; */
|
||||||
|
cursor: pointer;
|
||||||
border: none;
|
border: none;
|
||||||
background-color: var(--accent-color-2);
|
background-color: var(--accent-color-2);
|
||||||
color: var(--bg-color);
|
color: var(--bg-color);
|
||||||
|
font-weight: 900;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
/* padding: 2em; */
|
/* padding: 2em; */
|
||||||
width: 50%;
|
width: 50%;
|
||||||
@@ -137,10 +159,12 @@ iframe {
|
|||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
|
|
||||||
margin: auto;
|
margin: auto;
|
||||||
|
font-weight: 100;
|
||||||
color: var(--text-color-light);
|
color: var(--text-color-light);
|
||||||
}
|
}
|
||||||
|
|
||||||
.control-label span {
|
.control-label span {
|
||||||
|
font-weight: 400;
|
||||||
color: var(--accent-color-2);
|
color: var(--accent-color-2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,10 +203,35 @@ span.volume-value {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
#crossfader {
|
|
||||||
|
#crossfader-wrapper {
|
||||||
width: 30em;
|
width: 30em;
|
||||||
padding: 3em 0;
|
padding: 3em 0;
|
||||||
}
|
}
|
||||||
|
#crossfader {
|
||||||
|
width: 100%;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graduations {
|
||||||
|
z-index: 0;
|
||||||
|
width: 100;
|
||||||
|
margin: 0 13px 0 13px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.graduation {
|
||||||
|
z-index: 0;
|
||||||
|
width: 3px;
|
||||||
|
height: 23px;
|
||||||
|
border-radius: 23px;
|
||||||
|
background-color: var(--accent-color-1-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.graduation-small {
|
||||||
|
width: 2px;
|
||||||
|
height: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Custom crossfader styling made using http://danielstern.ca/range.css */
|
/* Custom crossfader styling made using http://danielstern.ca/range.css */
|
||||||
input[type=range] {
|
input[type=range] {
|
||||||
@@ -216,10 +265,10 @@ input[type=range]::-moz-range-track {
|
|||||||
}
|
}
|
||||||
input[type=range]::-moz-range-thumb {
|
input[type=range]::-moz-range-thumb {
|
||||||
background: var(--accent-color-2);
|
background: var(--accent-color-2);
|
||||||
border: solid var(--accent-color-1-light);
|
/* border: solid var(--accent-color-1-light); */
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
border-width: 0px;
|
border-width: 0px;
|
||||||
border-radius: 25px;
|
border-radius: var(--crossfader-thumb-radius);
|
||||||
}
|
}
|
||||||
input[type=range]::-ms-track {
|
input[type=range]::-ms-track {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
@@ -238,7 +287,7 @@ input[type=range]::-ms-fill-upper {
|
|||||||
}
|
}
|
||||||
input[type=range]::-ms-thumb {
|
input[type=range]::-ms-thumb {
|
||||||
background: var(--accent-color-2);
|
background: var(--accent-color-2);
|
||||||
border: solid var(--accent-color-1-light);
|
/* border: solid var(--accent-color-1-light); */
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
/*Needed to keep the Edge thumb centred*/
|
/*Needed to keep the Edge thumb centred*/
|
||||||
@@ -256,47 +305,50 @@ input[type=range]#crossfader::-webkit-slider-runnable-track {
|
|||||||
}
|
}
|
||||||
input[type=range]#crossfader::-webkit-slider-thumb {
|
input[type=range]#crossfader::-webkit-slider-thumb {
|
||||||
margin-top: -20.65px;
|
margin-top: -20.65px;
|
||||||
width: 30px;
|
width: var(--crossfader-thumb-width);
|
||||||
height: 50px;
|
height: var(--crossfader-thumb-height);
|
||||||
border-width: 5px;
|
/* border-width: 5px;
|
||||||
border-radius: 12px;
|
border-radius: 12px; */
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=range]#crossfader::-moz-range-track {
|
input[type=range]#crossfader::-moz-range-track {
|
||||||
border-radius: 25px;
|
/* border-radius: 25px; */
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 13.3px;
|
height: 13.3px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
input[type=range]#crossfader::-moz-range-thumb {
|
input[type=range]#crossfader::-moz-range-thumb {
|
||||||
width: 30px;
|
width: var(--crossfader-thumb-width);
|
||||||
height: 50px;
|
height: var(--crossfader-thumb-height);
|
||||||
border-width: 5px;
|
/* border-width: 5px; */
|
||||||
border-radius: 12px;
|
/* border-radius: 12px; */
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
input[type=range]#crossfader::-ms-track {
|
input[type=range]#crossfader::-ms-track {
|
||||||
border-width: 18.75px 0;
|
/* border-width: 18.75px 0; */
|
||||||
height: 13.3px;
|
height: 13.3px;
|
||||||
}
|
}
|
||||||
input[type=range]#crossfader::-ms-fill-lower {
|
input[type=range]#crossfader::-ms-fill-lower {
|
||||||
border-width: 2.3px;
|
/* border-width: 2.3px;
|
||||||
border-radius: 50px;
|
border-radius: 50px; */
|
||||||
}
|
}
|
||||||
input[type=range]#crossfader::-ms-fill-upper {
|
input[type=range]#crossfader::-ms-fill-upper {
|
||||||
border-radius: 50px;
|
/* border-radius: 50px; */
|
||||||
}
|
}
|
||||||
input[type=range]#crossfader::-ms-thumb {
|
input[type=range]#crossfader::-ms-thumb {
|
||||||
width: 30px;
|
width: var(--crossfader-thumb-width);
|
||||||
height: 50px;
|
height: var(--crossfader-thumb-height);
|
||||||
border-width: 5px;
|
/* border-width: 5px;
|
||||||
border-radius: 12px;
|
border-radius: 12px; */
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
/*Needed to keep the Edge thumb centred*/
|
/*Needed to keep the Edge thumb centred*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
font-weight: 100;
|
||||||
|
}
|
||||||
.footer a, .footer a:visited {
|
.footer a, .footer a:visited {
|
||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -305,176 +357,3 @@ input[type=range]#crossfader::-ms-thumb {
|
|||||||
.footer span {
|
.footer span {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
/* ==========================================================================
|
|
||||||
Helper classes
|
|
||||||
========================================================================== */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hide visually and from screen readers
|
|
||||||
*/
|
|
||||||
|
|
||||||
.hidden,
|
|
||||||
[hidden] {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hide only visually, but have it available for screen readers:
|
|
||||||
* https://snook.ca/archives/html_and_css/hiding-content-for-accessibility
|
|
||||||
*
|
|
||||||
* 1. For long content, line feeds are not interpreted as spaces and small width
|
|
||||||
* causes content to wrap 1 word per line:
|
|
||||||
* https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe
|
|
||||||
*/
|
|
||||||
|
|
||||||
.sr-only {
|
|
||||||
border: 0;
|
|
||||||
clip: rect(0, 0, 0, 0);
|
|
||||||
height: 1px;
|
|
||||||
margin: -1px;
|
|
||||||
overflow: hidden;
|
|
||||||
padding: 0;
|
|
||||||
position: absolute;
|
|
||||||
white-space: nowrap;
|
|
||||||
width: 1px;
|
|
||||||
/* 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Extends the .sr-only class to allow the element
|
|
||||||
* to be focusable when navigated to via the keyboard:
|
|
||||||
* https://www.drupal.org/node/897638
|
|
||||||
*/
|
|
||||||
|
|
||||||
.sr-only.focusable:active,
|
|
||||||
.sr-only.focusable:focus {
|
|
||||||
clip: auto;
|
|
||||||
height: auto;
|
|
||||||
margin: 0;
|
|
||||||
overflow: visible;
|
|
||||||
position: static;
|
|
||||||
white-space: inherit;
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hide visually and from screen readers, but maintain layout
|
|
||||||
*/
|
|
||||||
|
|
||||||
.invisible {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Clearfix: contain floats
|
|
||||||
*
|
|
||||||
* For modern browsers
|
|
||||||
* 1. The space content is one way to avoid an Opera bug when the
|
|
||||||
* `contenteditable` attribute is included anywhere else in the document.
|
|
||||||
* Otherwise it causes space to appear at the top and bottom of elements
|
|
||||||
* that receive the `clearfix` class.
|
|
||||||
* 2. The use of `table` rather than `block` is only necessary if using
|
|
||||||
* `:before` to contain the top-margins of child elements.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.clearfix::before,
|
|
||||||
.clearfix::after {
|
|
||||||
content: " ";
|
|
||||||
display: table;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clearfix::after {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ==========================================================================
|
|
||||||
EXAMPLE Media Queries for Responsive Design.
|
|
||||||
These examples override the primary ('mobile first') styles.
|
|
||||||
Modify as content requires.
|
|
||||||
========================================================================== */
|
|
||||||
|
|
||||||
@media only screen and (min-width: 35em) {
|
|
||||||
/* Style adjustments for viewports that meet the condition */
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print,
|
|
||||||
(-webkit-min-device-pixel-ratio: 1.25),
|
|
||||||
(min-resolution: 1.25dppx),
|
|
||||||
(min-resolution: 120dpi) {
|
|
||||||
/* Style adjustments for high resolution devices */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ==========================================================================
|
|
||||||
Print styles.
|
|
||||||
Inlined to avoid the additional HTTP request:
|
|
||||||
https://www.phpied.com/delay-loading-your-print-css/
|
|
||||||
========================================================================== */
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
background: #fff !important;
|
|
||||||
color: #000 !important;
|
|
||||||
/* Black prints faster */
|
|
||||||
box-shadow: none !important;
|
|
||||||
text-shadow: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,
|
|
||||||
a:visited {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
a[href]::after {
|
|
||||||
content: " (" attr(href) ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
abbr[title]::after {
|
|
||||||
content: " (" attr(title) ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't show links that are fragment identifiers,
|
|
||||||
* or use the `javascript:` pseudo protocol
|
|
||||||
*/
|
|
||||||
a[href^="#"]::after,
|
|
||||||
a[href^="javascript:"]::after {
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
white-space: pre-wrap !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre,
|
|
||||||
blockquote {
|
|
||||||
border: 1px solid #999;
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Printing Tables:
|
|
||||||
* https://web.archive.org/web/20180815150934/http://css-discuss.incutio.com/wiki/Printing_Tables
|
|
||||||
*/
|
|
||||||
thead {
|
|
||||||
display: table-header-group;
|
|
||||||
}
|
|
||||||
|
|
||||||
tr,
|
|
||||||
img {
|
|
||||||
page-break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
h3 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
160
css/shooting-star.css
Normal file
160
css/shooting-star.css
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
:root {
|
||||||
|
--shooting-star-duration: 3000ms;
|
||||||
|
--shooting-star-angle: 10deg;
|
||||||
|
--shooting-star-translate: 300px;
|
||||||
|
--shooting-star-direction: 1; /* 1 or -1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* From https://www.geeksforgeeks.org/how-to-create-shooting-star-animation-effect-using-css/ */
|
||||||
|
.shooting-stars-wrapper {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-webkit-transform: scaleX(var(--shooting-star-direction)) rotateZ(var(--shooting-star-angle));
|
||||||
|
|
||||||
|
transform: scaleX(var(--shooting-star-direction)) rotateZ(var(--shooting-star-angle));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.shooting-star {
|
||||||
|
position: absolute;
|
||||||
|
/* left: 50%; */
|
||||||
|
top: 50%;
|
||||||
|
height: 2px;
|
||||||
|
border-radius: 885px;
|
||||||
|
background: linear-gradient(-45deg, #eef0f5, rgba(0, 0, 255, 0));
|
||||||
|
|
||||||
|
-webkit-filter: drop-shadow(0 0 6px #eef1f8);
|
||||||
|
filter: drop-shadow(0 0 6px #d7dff0);
|
||||||
|
|
||||||
|
-webkit-animation: tail var(--shooting-star-duration) ease-in-out 1,
|
||||||
|
shooting var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
animation: tail var(--shooting-star-duration) ease-in-out 1,
|
||||||
|
shooting var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* .shooting-star.is-shooting {
|
||||||
|
-webkit-animation: tail var(--shooting-star-duration) ease-in-out 1,
|
||||||
|
shooting var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
animation: tail var(--shooting-star-duration) ease-in-out 1,
|
||||||
|
shooting var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
} */
|
||||||
|
|
||||||
|
/* Here we add before and after effect to star */
|
||||||
|
.shooting-star::before,
|
||||||
|
.shooting-star::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: calc(50% - 1px);
|
||||||
|
right: 0;
|
||||||
|
height: 2px;
|
||||||
|
background: linear-gradient(
|
||||||
|
-45deg,
|
||||||
|
rgba(0, 0, 255, 0),
|
||||||
|
#eaeef8,
|
||||||
|
rgba(0, 0, 255, 0)
|
||||||
|
);
|
||||||
|
-webkit-transform: translateX(50%) rotateZ(45deg);
|
||||||
|
transform: translateX(50%) rotateZ(45deg);
|
||||||
|
border-radius: 100%;
|
||||||
|
-webkit-animation: shining var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
animation: shining var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
}
|
||||||
|
/* .shooting-star.is-shooting::before,
|
||||||
|
.shooting-star.is-shooting::after {
|
||||||
|
-webkit-animation: shining var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
animation: shining var(--shooting-star-duration) ease-in-out 1;
|
||||||
|
} */
|
||||||
|
.shooting-star::after {
|
||||||
|
-webkit-transform: translateX(50%) rotateZ(-45deg);
|
||||||
|
transform: translateX(50%) rotateZ(-45deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here we are adding location of each
|
||||||
|
nth-child, animations, delays, and
|
||||||
|
before and after effects to each
|
||||||
|
and every balls(stars) */
|
||||||
|
/* .shooting-star:nth-child(1) {
|
||||||
|
top: calc(50% - -119px);
|
||||||
|
left: calc(50% - 43px);
|
||||||
|
-webkit-animation-delay: 4000ms;
|
||||||
|
animation-delay: 4000ms;
|
||||||
|
}
|
||||||
|
.shooting-star:nth-child(1)::before,
|
||||||
|
.shooting-star:nth-child(1)::after {
|
||||||
|
-webkit-animation-delay: 4000ms;
|
||||||
|
animation-delay: 4000ms;
|
||||||
|
} */
|
||||||
|
|
||||||
|
/* This code will help to generate
|
||||||
|
effect in tail of star */
|
||||||
|
@keyframes tail {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@-webkit-keyframes tail {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This code will generate shining
|
||||||
|
effect in head of star */
|
||||||
|
@keyframes shining {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
width: 30px;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@-webkit-keyframes shining {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
width: 30px;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here we make shooting effect */
|
||||||
|
@keyframes shooting {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: translateX(0);
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: translateX(var(--shooting-star-translate));
|
||||||
|
transform: translateX(var(--shooting-star-translate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@-webkit-keyframes shooting {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: translateX(0);
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: translateX(var(--shooting-star-translate));
|
||||||
|
transform: translateX(var(--shooting-star-translate));
|
||||||
|
}
|
||||||
|
}
|
BIN
favicon.ico
Normal file
BIN
favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
fonts/Roboto Black.woff2
Normal file
BIN
fonts/Roboto Black.woff2
Normal file
Binary file not shown.
BIN
fonts/Roboto Regular.woff2
Normal file
BIN
fonts/Roboto Regular.woff2
Normal file
Binary file not shown.
BIN
fonts/Roboto Thin.woff2
Normal file
BIN
fonts/Roboto Thin.woff2
Normal file
Binary file not shown.
BIN
img/icon/android-chrome-192x192.png
Normal file
BIN
img/icon/android-chrome-192x192.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.1 KiB |
BIN
img/icon/android-chrome-512x512.png
Normal file
BIN
img/icon/android-chrome-512x512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
BIN
img/icon/apple-touch-icon.png
Normal file
BIN
img/icon/apple-touch-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
BIN
img/icon/favicon-16x16.png
Normal file
BIN
img/icon/favicon-16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 600 B |
BIN
img/icon/favicon-32x32.png
Normal file
BIN
img/icon/favicon-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
62
index.html
62
index.html
@@ -12,12 +12,14 @@
|
|||||||
<meta property="og:url" content="">
|
<meta property="og:url" content="">
|
||||||
<meta property="og:image" content="">
|
<meta property="og:image" content="">
|
||||||
|
|
||||||
<link rel="manifest" href="site.webmanifest">
|
<link rel="apple-touch-icon" sizes="180x180" href="/img/icon/apple-touch-icon.png">
|
||||||
<!-- <link rel="apple-touch-icon" href="icon.png"> -->
|
<link rel="icon" type="image/png" sizes="32x32" href="/img/icon/favicon-32x32.png">
|
||||||
<!-- Place favicon.ico in the root directory -->
|
<link rel="icon" type="image/png" sizes="16x16" href="/img/icon/favicon-16x16.png">
|
||||||
|
<link rel="manifest" href="/site.webmanifest">
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/normalize.css">
|
<link rel="stylesheet" href="/css/normalize.css">
|
||||||
<link rel="stylesheet" href="css/main.css">
|
<link rel="stylesheet" href="/css/main.css">
|
||||||
|
<link rel="stylesheet" href="/css/shooting-star.css">
|
||||||
|
|
||||||
<meta name="theme-color" content="#fafafa">
|
<meta name="theme-color" content="#fafafa">
|
||||||
</head>
|
</head>
|
||||||
@@ -26,6 +28,9 @@
|
|||||||
|
|
||||||
<div id="bg">
|
<div id="bg">
|
||||||
<img src="img/stars_1920x1080.svg" alt="A night sky with plenty of stars">
|
<img src="img/stars_1920x1080.svg" alt="A night sky with plenty of stars">
|
||||||
|
<div class="shooting-stars-wrapper">
|
||||||
|
<!-- <div class="shooting-star"></div> -->
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="desk">
|
<div id="desk">
|
||||||
@@ -54,36 +59,43 @@
|
|||||||
</div>
|
</div>
|
||||||
<input class='load-button' type="button" value="Load new track or playlist">
|
<input class='load-button' type="button" value="Load new track or playlist">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="hidden">
|
||||||
|
<!-- <iframe style="border: 0; width: 480px; height: 270px;" src="https://bandcamp.com/EmbeddedPlayer/album=78256716/size=large/bgcol=ffffff/linkcol=0687f5/artwork=small/track=1064671887/transparent=true/" seamless><a href="https://clett.bandcamp.com/album/tancarville">Tancarville by Clett</a></iframe> -->
|
||||||
|
<!-- For a single track:
|
||||||
|
<iframe style="border: 0; width: 480px; height: 270px;" src="https://bandcamp.com/EmbeddedPlayer/album=78256716/size=large/bgcol=ffffff/linkcol=0687f5/artwork=small/track=1064671887/transparent=true/" seamless><a href="https://clett.bandcamp.com/album/tancarville">Tancarville by Clett</a></iframe>-->
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input type="range" id='crossfader' name="crossfader" min='0' max='1000' value='500'>
|
<div id="crossfader-wrapper">
|
||||||
<!-- <div id="search-area">
|
<input type="range" id='crossfader' name="crossfader" min='0' max='1000' value='500'>
|
||||||
<div class="search">
|
<div class="graduations">
|
||||||
<input type="button" value="Load new track or playlist">
|
<div class="graduation"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation graduation-small"></div>
|
||||||
|
<div class="graduation"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<label for="url-player-A">Enter link of a YT video or playlist</label>
|
<h1>🔊 Mix like a pro youtube DJ! 🎧</h1>
|
||||||
<input type="url" name="url-player-A" id="url_A" placeholder="https://www.youtube.com/watch?v=...." pattern="https://.*" size="40">
|
|
||||||
</div>
|
|
||||||
<div class="search">
|
|
||||||
<input type="button" value="Load new track or playlist">
|
|
||||||
<label for="url-player-B">Enter link of a YT video or playlist</label>
|
|
||||||
<input type="url" name="url-player-B" id="url_B" placeholder="https://www.youtube.com/watch?v=...." pattern="https://.*" size="40">
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
<h1>Mix like a pro youtube DJ!</h1>
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<p><span id='shooting-stars-enable'></span>by <a href="https://tflcl.xyz">tflcl.xyz</a> </p>
|
<p><span id='shooting-stars-enable'></span> ⚒ <a href="https://tflcl.xyz">Made by tflcl.xyz</a> 🧩</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script async defer data-website-id="8db8311f-63a6-47d5-a77f-7d9b80db22b1" src="https://stats.tflcl.xyz/sucre.js"></script>
|
<script async defer data-website-id="8db8311f-63a6-47d5-a77f-7d9b80db22b1" src="https://stats.tflcl.xyz/sucre.js"></script>
|
||||||
<script src="js/vendor/modernizr-3.11.2.min.js"></script>
|
<!-- <script src="/js/vendor/p5.js"></script>
|
||||||
<!-- <script src="./js/vendor/p5.js"></script>
|
<script src="/js/vendor/p5.svg.js"></script>
|
||||||
<script src="./js/vendor/p5.svg.js"></script>
|
<script src="/js/sketch.js"></script> -->
|
||||||
<script src="js/sketch.js"></script> -->
|
<script src="/js/main.js"></script>
|
||||||
<script src="js/main.js"></script>
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
163
js/main.js
163
js/main.js
@@ -51,19 +51,28 @@ class player {
|
|||||||
let url = prompt('Enter a YouTube URL (track or playlist):', 'https://www.youtube.com/watch?v=' + this.trackID);
|
let url = prompt('Enter a YouTube URL (track or playlist):', 'https://www.youtube.com/watch?v=' + this.trackID);
|
||||||
|
|
||||||
if (url) {
|
if (url) {
|
||||||
let newTrackID = get_video_id(url);
|
let resp = check_url(url);
|
||||||
let newPlaylistID = get_playlist_id(url);
|
|
||||||
|
|
||||||
if (newPlaylistID[0] != 0) {
|
if (resp < 0) {
|
||||||
console.log('playlistid to load: ' + newPlaylistID);
|
|
||||||
this.loadPlaylist(newPlaylistID);
|
|
||||||
} else if (newTrackID != 0) {
|
|
||||||
console.log('track to load: ' + newTrackID);
|
|
||||||
this.load(newTrackID);
|
|
||||||
} else {
|
|
||||||
console.log('Nothing to load!');
|
console.log('Nothing to load!');
|
||||||
|
} else if (resp == 0) {
|
||||||
|
let newTrackID = get_video_id(url);
|
||||||
|
let newPlaylistID = get_playlist_id(url);
|
||||||
|
|
||||||
|
if (newPlaylistID[0] != 0) {
|
||||||
|
console.log('playlistid to load: ' + newPlaylistID);
|
||||||
|
this.loadPlaylist(newPlaylistID);
|
||||||
|
} else if (newTrackID != 0) {
|
||||||
|
console.log('track to load: ' + newTrackID);
|
||||||
|
this.load(newTrackID);
|
||||||
|
} else {
|
||||||
|
console.log('Nothing to load!');
|
||||||
|
}
|
||||||
|
} else if (resp == 1) {
|
||||||
|
fetch_bandcamp_url(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -124,7 +133,7 @@ calcCrossfaderCoefs(crossfader.value);
|
|||||||
|
|
||||||
crossfader.addEventListener('input', (e) => {
|
crossfader.addEventListener('input', (e) => {
|
||||||
//Makes the slider stick on the middle
|
//Makes the slider stick on the middle
|
||||||
if (Math.abs(crossfader.value - 500) < 15) {
|
if (Math.abs(crossfader.value - 500) < 20) {
|
||||||
crossfader.value = 500;
|
crossfader.value = 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,6 +164,16 @@ function calcCrossfaderCoefs(input) {
|
|||||||
playerB.crossfaderCoef = coefB;
|
playerB.crossfaderCoef = coefB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function check_url(url) {
|
||||||
|
let test = url.indexOf('youtu');
|
||||||
|
if (test > -1 && test < 13) {
|
||||||
|
return 0; //It's most likely a youtube link
|
||||||
|
} else if (url.indexOf('.bandcamp') > -1 || url.indexOf('/album/') > -1 || url.indexOf('/track/') > -1) {
|
||||||
|
return 1; //It's most likely a bandcamp link
|
||||||
|
} else {
|
||||||
|
return -1; //Wrong link
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// From https://stackoverflow.com/a/55616161/14182148
|
// From https://stackoverflow.com/a/55616161/14182148
|
||||||
function get_playlist_id(url) {
|
function get_playlist_id(url) {
|
||||||
@@ -184,16 +203,15 @@ function get_video_id(url) { //originally 'video_id_from_playlist'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// From https://thomaspark.co/projects/needledrop/ by Thomas Park
|
function fetch_bandcamp_url(url) {
|
||||||
// function getYouTubeID(url){
|
let iframe = document.createElement('iframe');
|
||||||
// url = url.split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
|
iframe.setAttribute('class','hidden');
|
||||||
// return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_\-]/i)[0] : false;
|
iframe.setAttribute('src',url);
|
||||||
// }
|
playerB.node.parentNode.appendChild(iframe);
|
||||||
|
console.log(iframe);
|
||||||
// function get_video_id(url) {
|
let scrap = iframe.contentWindow.document.querySelector('script[data-tralbum]');
|
||||||
// url = url.split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
|
console.log('scrap: ' + scrap);
|
||||||
// return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_\-]/i)[0] : url[0];
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
function componentToHex(c) {
|
function componentToHex(c) {
|
||||||
var hex = c.toString(16);
|
var hex = c.toString(16);
|
||||||
@@ -201,20 +219,101 @@ function componentToHex(c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Thumbnails: https://i1.ytimg.com/vi/{trackID}/mqdefault.jpg
|
// Thumbnails: https://i1.ytimg.com/vi/{trackID}/mqdefault.jpg
|
||||||
if (typeof variable !== 'undefined') {
|
|
||||||
let separatorSpan = document.createElement('span');
|
let bcURL = 'https://clett.bandcamp.com/track/placenta';
|
||||||
separatorSpan.innerHTML = ' - ';
|
// let html = async await fetch(bcURL).text(); // html as text
|
||||||
document.getElementById('shooting-stars-enable').after(separatorSpan);
|
// let doc = new DOMParser().parseFromString(html, 'text/html');
|
||||||
document.getElementById('shooting-stars-enable').innerHTML = 'Disable shooting stars⭐️';
|
// doc.title; doc.body;
|
||||||
|
|
||||||
|
// let Http = new XMLHttpRequest();
|
||||||
|
// Http.open("GET", bcURL);
|
||||||
|
// Http.send();
|
||||||
|
//
|
||||||
|
// Http.onreadystatechange = (e) => {
|
||||||
|
// console.log(Http.responseText)
|
||||||
|
// }
|
||||||
|
|
||||||
|
let areStarsShooting = true;
|
||||||
|
let shootingStarWrapper = document.getElementsByClassName('shooting-stars-wrapper')[0];
|
||||||
|
let shootingStar;
|
||||||
|
|
||||||
|
function newShootingStar() {
|
||||||
|
shootingStar = document.createElement('div');
|
||||||
|
|
||||||
|
let topStart = Math.floor(0.6 * window.innerHeight * Math.random());
|
||||||
|
let leftStart = Math.floor(window.innerWidth * (0.1 + 0.8 * Math.random()));
|
||||||
|
let duration = 1000 + Math.floor(Math.random() * 5000);
|
||||||
|
let distance = 200 + Math.floor(Math.random() * 500);
|
||||||
|
let angle = Math.floor(Math.random() * 30) - 15;
|
||||||
|
let direction = Math.random() < 0.5 ? -1 : 1;
|
||||||
|
|
||||||
|
shootingStar.style.top = topStart + 'px';
|
||||||
|
shootingStar.style.left = leftStart + 'px';
|
||||||
|
// root.style.setProperty('--shooting-star-duration', duration + "px");
|
||||||
|
// shootingStarCSS.insertRule(':root{--shooting-star-duration: '+ duration + 'ms}');
|
||||||
|
|
||||||
|
document.documentElement.style.setProperty('--shooting-star-duration', duration + "ms");
|
||||||
|
document.documentElement.style.setProperty('--shooting-star-translate', distance + "px");
|
||||||
|
document.documentElement.style.setProperty('--shooting-star-angle', angle + "deg");
|
||||||
|
document.documentElement.style.setProperty('--shooting-star-direction', direction);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
shootingStarWrapper.appendChild(shootingStar);
|
||||||
|
shootingStar.classList.add('shooting-star');
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
shootingStar.remove();
|
||||||
|
// let nextIn = 10;
|
||||||
|
let nextIn = 7000 + Math.floor(Math.random() * 5000);
|
||||||
|
if (areStarsShooting) {
|
||||||
|
setTimeout('newShootingStar()', nextIn);
|
||||||
|
}
|
||||||
|
}, duration);
|
||||||
|
// setTimeout('newShootingStar()', duration + nextIn);
|
||||||
}
|
}
|
||||||
|
// function endShootingStar(el) {
|
||||||
|
// el.remove();
|
||||||
|
// console.log('removed!');
|
||||||
|
// let nextIn = 4000;
|
||||||
|
// setTimeout('newShootingStar()', nextIn);
|
||||||
|
// }
|
||||||
|
|
||||||
|
newShootingStar();
|
||||||
|
|
||||||
|
// Enable/disable shooting stars
|
||||||
|
let separatorSpan = document.createElement('span');
|
||||||
|
separatorSpan.innerHTML = ' - ';
|
||||||
|
document.getElementById('shooting-stars-enable').after(separatorSpan);
|
||||||
|
document.getElementById('shooting-stars-enable').innerHTML = '⭐️Disable shooting stars⭐️';
|
||||||
|
|
||||||
document.getElementById('shooting-stars-enable').addEventListener('click', () => {
|
document.getElementById('shooting-stars-enable').addEventListener('click', () => {
|
||||||
if (processingIsOn) {
|
if (areStarsShooting) {
|
||||||
processingSketch.frameRate(0);
|
document.getElementById('shooting-stars-enable').innerHTML = '⭐️Enable shooting stars⭐️';
|
||||||
document.getElementById('shooting-stars-enable').innerHTML = 'Enable shooting stars⭐️';
|
areStarsShooting = false;
|
||||||
processingIsOn = false;
|
|
||||||
} else {
|
} else {
|
||||||
processingSketch.frameRate(24);
|
document.getElementById('shooting-stars-enable').innerHTML = '⭐️Disable shooting stars⭐️';
|
||||||
document.getElementById('shooting-stars-enable').innerHTML = 'Disable shooting stars⭐️';
|
areStarsShooting = true;
|
||||||
processingIsOn = true;
|
newShootingStar();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Enable/disable shooting stars (with P5JS background)
|
||||||
|
// if (typeof processingSketch !== 'undefined') {
|
||||||
|
// let separatorSpan = document.createElement('span');
|
||||||
|
// separatorSpan.innerHTML = ' - ';
|
||||||
|
// document.getElementById('shooting-stars-enable').after(separatorSpan);
|
||||||
|
// document.getElementById('shooting-stars-enable').innerHTML = 'Disable shooting stars⭐️';
|
||||||
|
// }
|
||||||
|
// document.getElementById('shooting-stars-enable').addEventListener('click', () => {
|
||||||
|
// if (processingIsOn) {
|
||||||
|
// processingSketch.frameRate(0);
|
||||||
|
// document.getElementById('shooting-stars-enable').innerHTML = 'Enable shooting stars⭐️';
|
||||||
|
// processingIsOn = false;
|
||||||
|
// } else {
|
||||||
|
// processingSketch.frameRate(24);
|
||||||
|
// document.getElementById('shooting-stars-enable').innerHTML = 'Disable shooting stars⭐️';
|
||||||
|
// processingIsOn = true;
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
17
js/sketch.js
17
js/sketch.js
@@ -1,6 +1,7 @@
|
|||||||
// Another possible inspiration: https://www.khanacademy.org/computer-programming/twinkle-twinkle/6280832014565376
|
// Another possible inspiration: https://www.khanacademy.org/computer-programming/twinkle-twinkle/6280832014565376
|
||||||
|
|
||||||
let sketch = function(p) {
|
let sketch = function(p) {
|
||||||
|
let svgExport = false; // To export the result to SVG
|
||||||
|
|
||||||
let bgCol = hexToRgb('#222233');
|
let bgCol = hexToRgb('#222233');
|
||||||
let starCol = [hexToRgb('#ffcdff'), hexToRgb('#804442'), hexToRgb('#ffff7d')]
|
let starCol = [hexToRgb('#ffcdff'), hexToRgb('#804442'), hexToRgb('#ffff7d')]
|
||||||
|
|
||||||
@@ -25,9 +26,13 @@ let sketch = function(p) {
|
|||||||
p.frameRate(24);
|
p.frameRate(24);
|
||||||
currentWidth = p.windowWidth;
|
currentWidth = p.windowWidth;
|
||||||
currentHeight = p.windowHeight;
|
currentHeight = p.windowHeight;
|
||||||
// p.createCanvas(currentWidth, currentHeight);
|
|
||||||
p.createCanvas(1920, 1080, p.SVG) // To export the result to SVG
|
if (svgExport) {
|
||||||
p.noLoop(); // To export the result to SVG
|
p.createCanvas(1920, 1080, p.SVG) // To export the result to SVG
|
||||||
|
p.noLoop(); // To export the result to SVG
|
||||||
|
} else {
|
||||||
|
p.createCanvas(currentWidth, currentHeight);
|
||||||
|
}
|
||||||
|
|
||||||
bgInit();
|
bgInit();
|
||||||
|
|
||||||
@@ -57,8 +62,10 @@ let sketch = function(p) {
|
|||||||
|
|
||||||
|
|
||||||
time += 1;
|
time += 1;
|
||||||
p.save(); // To export the result to SVG
|
|
||||||
|
|
||||||
|
if (svgExport) {
|
||||||
|
p.save(); // To export the result to SVG
|
||||||
|
}
|
||||||
} //End of draw()
|
} //End of draw()
|
||||||
|
|
||||||
class Stars {
|
class Stars {
|
||||||
|
3
js/vendor/modernizr-3.11.2.min.js
vendored
3
js/vendor/modernizr-3.11.2.min.js
vendored
File diff suppressed because one or more lines are too long
1
site.webmanifest
Normal file
1
site.webmanifest
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"name":"","short_name":"","icons":[{"src":"/img/icon/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/img/icon/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffff7d","background_color":"#222233","display":"standalone"}
|
Reference in New Issue
Block a user