Compare commits

14 Commits

Author SHA1 Message Date
65dce05639 Scale transition
All checks were successful
Build / build (push) Successful in 6m3s
2024-02-17 15:58:07 +01:00
3d3d29304c Font size scaling controls
Some checks failed
Build / build (push) Has been cancelled
2024-02-17 15:53:36 +01:00
8ac02fd0be Song fixes 2024-02-17 12:15:59 +01:00
25ceda5dea Use dvh for song height to prevent broken scroll
All checks were successful
Build / build (push) Successful in 6m34s
2024-02-16 16:20:19 +01:00
09a4b138d1 Basic controls css and autoscroll
All checks were successful
Build / build (push) Successful in 6m42s
2024-02-16 15:59:15 +01:00
0816b0f897 Jezdím bez nehod
All checks were successful
Build / build (push) Successful in 5m44s
2024-02-13 17:50:14 +01:00
82dc1b846a Chvíle
All checks were successful
Build / build (push) Successful in 5m39s
2024-02-10 13:56:38 +01:00
d4a7fff83d Tajemství rituální obřízky 2024-02-10 00:02:48 +01:00
852a3c73bb Žlutá 2024-02-10 00:02:30 +01:00
fdc5b3e911 Optimize font rendering
All checks were successful
Build / build (push) Successful in 5m37s
2024-02-09 09:52:59 +01:00
d5cc96a647 Search input reset 2024-02-09 09:45:56 +01:00
4fe838eb2a Better colors and styling
All checks were successful
Build / build (push) Successful in 5m29s
2024-02-08 22:06:47 +01:00
78e16a9851 Add favicon 2024-02-08 14:08:40 +01:00
e35f3f5494 Add filtering
All checks were successful
Build / build (push) Successful in 5m32s
2024-02-08 13:50:24 +01:00
18 changed files with 501 additions and 48 deletions

View File

@ -2,6 +2,7 @@
{artist: Vision Days}
{columns: 2}
{c: Capo 2/3?}
{c: Bridge a sloka jsou off-beat}
{soc}

57
content/chvile/chvile.cho Normal file
View File

@ -0,0 +1,57 @@
{title: Chvíle}
{artist: Hop trop}
{columns: 2}
{diagrams: off}
{define: "Em (Am)" copy Em}
{define: "Bm (Em)" copy Bm}
{define: "Am (Dm)" copy Am}
{define: "A (D)" copy A}
{define: "C (F)" copy C}
{c: Akordy v závorce platí pro kapodastr na 7. poli}
{sov}
[Em (Am)]Mám rád ty chvíle, kdy noc už pomalu [Bm (Em)]končí,
[Am (Dm)]chvíle, co patřej' jen [Bm (Em)]těm, co neusí[Em (Am)]naj',
[Em (Am)]toulavejm bláznům, když právě s jarem se [Bm (Em)]loučí
a [Am (Dm)]za dobrý slovo ti [Bm (Em)]srdce svý na dlani [Em (Am)]daj'.
{eov}
{sov}
[Em (Am)]Mám rád ty chvíle, kdy holkám ve vočích [Bm (Em)]svítí
[Am (Dm)]slunce, když do korun [Bm (Em)]stromů začlo se [Em (Am)]drát,
[Em (Am)]stejně jak v kapičkách rosy na pavoučích [Bm (Em)]sítích,
to [Am (Dm)]najednou chce se mi [Bm (Em)]brečet a zároveň [Em (Am)]smát.
{eov}
{soc}
Ty rána s [A (D)]vůní borový [Em (Am)]smůly
měly by [A (D)]zůstat navždycky v [Em (Am)]nás,
ty rána s [C (F)]vůní sekaný [Bm (Em)]trávy
a ohně co [Am (Dm)]právě [Bm (Em)] pomalu [Em (Am)]zhas'.
{eoc}
{column_break}
{sov}
[Em (Am)]Mám rád ty chvíle, kdy kluci v duchu si [Bm (Em)]říkaj',
[Am (Dm)]jak je to nádherný, [Bm (Em)]léto před sebou [Em (Am)]mít.
[Em (Am)]Spolu si přejou, ať moc rychle dny neu[Bm (Em)]tíkaj'
a [Am (Dm)]trápení jsou někde v [Bm (Em)]dálce, a kolem je [Em (Am)]klid.
{eov}
{sov}
[Em (Am)]Mám rád ty chvíle, kdy noc už pomalu [Bm (Em)]končí,
[Am (Dm)]chvíle, co patřej' jen [Bm (Em)]těm, co neusí[Em (Am)]naj',
[Em (Am)]toulavejm bláznům, když právě s jarem se [Bm (Em)]loučí
a [Am (Dm)]za dobrý slovo ti [Bm (Em)]srdce svý na dlani [Em (Am)]daj'.
{eov}
{soc}
Ty rána s [A (D)]vůní borový [Em (Am)]smůly
měly by [A (D)]zůstat navždycky v [Em (Am)]nás,
ty rána s [C (F)]vůní sekaný [Bm (Em)]trávy
a ohně co [Am (Dm)]právě [Bm (Em)] pomalu [Em (Am)]zhas'.
{eoc}

6
content/chvile/index.md Normal file
View File

@ -0,0 +1,6 @@
+++
title = "Chvíle"
[taxonomies]
category = ["classic"]
artist = ["Hop trop"]
+++

View File

@ -1,7 +1,10 @@
{title: Jaro na Aljašce}
{artist: K. T. O.}
{transpose: 5}
{columns: 2}
{c: Původně od G, transpozice o 5}
{sov}
Až [G]jaro na Aljašku [C]zavítá k [G]nám,
[G]hromadu zlata já [A]za zimu [D]mám,
@ -29,6 +32,8 @@ když [G]jaro na Aljašku [C]zavítá k [G]nám?
[G]šampaňský víno tu [A]sám budu [D]pít,
s [G]partnery svými tu [C]zůstanu [G]sám,
až [G]jaro na Aljašku [C]zavítá k [G]nám.
{eov}
{sov}
Až [G]jaro na Aljašku [C]zavítá k [G]nám.
{eov}

View File

@ -0,0 +1,6 @@
+++
title = "Jezdím bez nehod"
[taxonomies]
category = ["classic"]
artist = ["Milan Chladil"]
+++

View File

@ -0,0 +1,63 @@
{title: Jezdím bez nehod}
{artist: Milan Chladil}
{columns: 2}
{c: Capo 3?}
{sob}
[G] [Am] [D] [G]
{eob}
{sov}
Dva roky [G]jezdím bez nehod,
s větrem se honím o [Am]závod.
Na moje [D]obutí je spolehnutí
a motor má vždy [D7]správný [G]chod.
{eov}
{sov}
Asfalt mi [G]šumí pod koly,
kličkuji mezi výmo[Am]ly,
řítím se [D]jako drak, však vždycky jen tak,
jak předpisy mi [D7]dovo[G]lí.
{eov}
{soc}
Tak já [C]pádím (on pádí)
cestou [G]necestou, (vždy svěží)
v pět v [D]Dejvicích (v pět v Dejvicích),
v Brně [G]před šestou (to [G7]stěží).
Však jak [C]říkám (jak říká),
není [G]náhodou (jen náhodou),
že se [A]nesetkám s neho[D]dou.
{eoc}
{column_break}
{sov}
Bez nehod [G]jezdit dovedu,
tak vedu stroj svůj kupře[Am]du.
Vždy stejnou [D]rychlostí a bez starostí
jen díky svému [D7]mope[G]du.
{eov}
{sob}
[G] [Am] [D] [G]
{eob}
{soc}
Tak já [C]pádím (on pádí)
cestou [G]necestou, (vždy svěží)
v pět v [D]Dejvicích (v pět v Dejvicích),
v Brně [G]před šestou (to [G7]stěží).
Však jak [C]říkám (jak říká),
není [G]náhodou (jen náhodou),
že se [A]nesetkám s neho[D]dou.
{eoc}
{sov}
Bez nehod [G]jezdit dovedu,
tak vedu stroj svůj kupře[Am]du.
Vždy stejnou [D]rychlostí a bez starostí
jen díky svému [D7]mope[G]du.
{eov}

View File

@ -0,0 +1,6 @@
+++
title = "Tajemství rituální obřízky"
[taxonomies]
category = ["mixtape"]
artist = ["Morčata na útěku"]
+++

View File

@ -0,0 +1,58 @@
{title: Tajemství rituální obřízky}
{artist: Morčata na útěku}
{album: Jsme trochu jiný}
{columns: 2}
{sov}
[F]Náš rabín mě řekl "už seš [C]velkej chlap",
[Am]vzal mě kolem ramen za pin[G]ďoura chňap.
[F]Nabrousil si velkej vostrej [C]sekáček
a [Am]sloupnul ho tak snadno [G]jak Libereckej [F]špekáček.[C]
{eov}
{sob}
[Am] [G] [F] [C] [Am] [G]
{eob}
{sov}
[F]Moje teta tvoje teta [C]svazačka,
[Am]říká se jim baba vobře[G]zavačka.
S [F]modlitbičkou na rtech v rytmu [C]dechovky
[Am]vobšvicnou ti ho víčkem vod [G]plechovky.
{eov}
{soc}
[F]Když chtějí být chlapi bez své [C]kůžičky,
[Am]tak si na to vezmou velký [G]nužtičky.
[F]Co je na tom že to není [C]žádnej modní hit.
[Am]Holej jako prst ho prostě [G]musíš mít.
{eoc}
{sov}
[F]Vem si kudlu hoď šulina [C]na špalek
a [Am]nepoškoď si svůj močovej [G]kanálek.
[F]Představ si to jak když krájíš [C]slaninu
a [Am]uhňápni tu hnusnou [G]přebytečnou tkaninu.
{eov}
{column_break}
{soc}
[F]Když chtějí být chlapi bez své [C]kůžičky,
[Am]tak si na to vezmou velký [G]nužtičky.
[F]Nedá se nic dělat, naro[C]dil ses jako žid,
[Am]holej jako prst ho prostě [G]musíš mít.
{eoc}
{sov}
[F]Je to jako jarní vánek [C]na poli.
[Am]Trošičku to štípne ale [G]nebolí.
[F]Bez kůžičky změní se ti [C]celej svět.
[Am]Všichni chlapci ti to budou [G]závidět.
{eov}
{soc}
[F]Když chtějí být chlapi bez své [C]kůžičky,
[Am]tak si na to vezmou velký [G]nužtičky.
[F]Vem na to sekeru pilu [C]nebo zubní nit.
[Am]Holej jako prst ho prostě [G]musíš mít.
{eoc}

6
content/zluta/index.md Normal file
View File

@ -0,0 +1,6 @@
+++
title = "Žlutá"
[taxonomies]
category = ["mixtape"]
artist = ["Morčata na útěku"]
+++

53
content/zluta/zluta.cho Normal file
View File

@ -0,0 +1,53 @@
{title: Žlutá}
{artist: Morčata na útěku}
{album: Tradice z krabice}
{columns: 2}
[G] [D] [C] [D] [Am] [G] [D]
{sov}
[G]Žlutý je [D]pivo, který [C]denně pijem,[D]
[G]žlutá je [D]moč kterou na [C]patník chčijem,[D]
[G]žlutý je [D]slunko, který [C]vypálí zrak,[D]
žlutá je [F]krutá, [C]už je to [G]tak!
{eov}
{sov}
[G]Žlutý jsou [D]prošlý [C]šunkový [D]rolky,
[G]žlutý jsou [D]prej i [C]na Hokajdu [D]holky,
[G]žlutý má [D]hadry aj [C]Dan Neko[D]nečný,
krásně [F]žlutý je žluklý li[C]kér va[G]ječný.
{eov}
{soc}
Žlutej je [C]pes, ve kterém zpívá starej Hejmovic [G]kluk
i tohle je [F]jeho [C]skladba a [F]nám je to [G]fuk,
žlutej je [C]Pták Čau, kterýho rozjezdil [G]vlak,
žlutá je [F]krutá! [C]Už je to [G]tak.
{eoc}
{column_break}
{sov}
[G]Žlutej je [D]ožralej [C]školník [D]Willie,
[G]žlutý jsou [D]prej i jeho [C]igelitky z [D]Billy
[G]vlaky a [D]autobusy [C]Študent A[D]gency
moje [F]játra, se žlouten[C]kou malí ko[G]jenci.
{eov}
{soc}
Jako [C]zahrada když flákneš kosou do kuřá[G]tek,
žlutý [F]jsou fleky na [C]trenclích, jetej [F]karbaná[G]tek,
žlutý je [C]slunko, který vypálí [G]zrak,
žlutá je [F]krutá! [C]Už je to [G]tak!
{eoc}
{sob}
[F] [C] [F] [Am7] [G] [D]
{eob}
{soc}
Žlutej je [C]pes, ve kterém zpívá starej Hejmovic [G]kluk
i tohle je [F]jeho [C]skladba a [F]nám je to [G]fuk,
žlutej je [C]Pták Čau, kterýho rozjezdil [G]vlak,
žlutá je [F]krutá! [C]Už je to [G]tak.
{eoc}

1
sass/_fonts.scss Normal file
View File

@ -0,0 +1 @@
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,400;0,600;1,400;1,600&display=swap');

View File

@ -1,11 +1,17 @@
@import "fonts";
$col-white: #fff;
$col-black: #181818;
$col-black: #2e3440;
body {
margin: 0;
background-color: $col-white;
color: $col-black;
background-color: $col-black;
color: $col-white;
font-family: "Noto Sans", Tahoma, Geneva, Verdana, sans-serif;
text-rendering: geometricPrecision;
transform-origin: 0 0;
transition: transform ease-out .25s;
}
table {
@ -13,7 +19,7 @@ table {
}
.song {
padding: 2em;
padding: 1em 0 0 1em;
}
.title {
@ -40,7 +46,7 @@ table {
display: block;
height: 100%;
width: 2px;
background-color: $col-black;
background-color: $col-white;
}
}
@ -53,22 +59,22 @@ table {
.comment {
display: inline-block;
padding: .25em .5em;
background-color: #bbb;
color: $col-black;
background-color: #4c566a;
color: $col-white;
}
@media (prefers-color-scheme: dark) {
@media (prefers-color-scheme: light) {
body {
background-color: $col-black;
color: $col-white;
background-color: $col-white;
color: $col-black;
}
.chorus:before {
background-color: $col-white;
background-color: $col-black;
}
.comment {
background-color: #585858;
color: $col-white;
background-color: #d8dee9;
color: $col-black;
}
}

View File

@ -1,3 +1,5 @@
@import "fonts";
$width-mobile: 900px;
* {
@ -7,6 +9,15 @@ $width-mobile: 900px;
body {
margin: 0;
padding: 0;
background-color: #2e3440;
color: #fff;
font-family: "Noto Sans", Tahoma, Geneva, Verdana, sans-serif;
text-rendering: geometricPrecision;
@media (prefers-color-scheme: light) {
background-color: #fff;
color: #2e3440;
}
}
main.songs {
@ -23,7 +34,7 @@ main.songs {
.filters {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
grid-template-columns: 1fr 1fr 1fr 1fr;
gap: 1em;
margin: 1em 0;
@ -32,21 +43,64 @@ main.songs {
&.hidden { display: none }
&>* {
border: 1px solid #aaa;
border-radius: .5em;
padding: .5em 1em;
font-size: 1em;
box-shadow: rgba(15, 17, 21, 0.5) 0px 3px 6px 0px;
background-color: #3b4252;
color: inherit;
@media (prefers-color-scheme: light) {
background-color: #fff;
color: #2e3440;
}
}
form {
grid-column: 1 / 3;
display: flex;
overflow: hidden;
input {
font-size: inherit;
border: 0;
background-color: inherit;
color: inherit;
}
input[type="search"] {
flex-grow: 1;
padding: .75em 1em;
}
input[type="reset"] {
cursor: pointer;
width: 3em;
padding: 0;
background-size: auto 1.5em;
background-position: center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(160,163,170,1)'%3E%3Cpath d='M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 20C16.4183 20 20 16.4183 20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20ZM12 10.5858L14.8284 7.75736L16.2426 9.17157L13.4142 12L16.2426 14.8284L14.8284 16.2426L12 13.4142L9.17157 16.2426L7.75736 14.8284L10.5858 12L7.75736 9.17157L9.17157 7.75736L12 10.5858Z'%3E%3C/path%3E%3C/svg%3E");
}
}
&>.button {
font-weight: bold;
text-align: center;
cursor: pointer;
user-select: none;
padding: .75em 1em;
&.selected {
border-color: #333;
box-shadow: rgba(0, 0, 0, 0.2) 0 0 10px;
color: #fff;
&[data-category="mixtape"] { background-color: #bf616a }
&[data-category="classic"] { background-color: #5e81ac }
}
}
@media only screen and (max-width: $width-mobile) {
grid-template-columns: 1fr 1fr;
}
}
.song-list {
@ -57,25 +111,26 @@ main.songs {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1em;
padding: .5em;
padding-left: 1em;
border-radius: .5em;
box-shadow: rgba(0, 0, 0, 0.2) 0 0 10px;
box-shadow: rgba(15, 17, 21, 0.5) 0px 3px 6px 0px;
border-left: .7em solid #000;
background-color: #3b4252;
&.hidden { display: none }
&.mixtape { border-color: #654575 }
&.classic { border-color: #a55d05 }
&.mixtape { border-color: #bf616a }
&.classic { border-color: #5e81ac }
.meta {
display: flex;
flex-direction: column;
justify-content: center;
.title {
font-weight: bold;
}
.title { font-weight: bold }
.artist { font-size: .8em }
}
.links {
@ -83,8 +138,8 @@ main.songs {
gap: .5em;
&>* {
height: 3em;
width: 3em;
height: 2.75em;
width: 2.75em;
background-position: center;
background-repeat: no-repeat;
background-size: auto 1.5em;
@ -92,22 +147,90 @@ main.songs {
}
.html {
background-color: #335872;
background-color: #5e81ac;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(255,255,255,1)'%3E%3Cpath d='M16 2L21 7V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5447 3 21.0082V2.9918C3 2.44405 3.44495 2 3.9934 2H16ZM17.6569 12L14.1213 8.46447L12.7071 9.87868L14.8284 12L12.7071 14.1213L14.1213 15.5355L17.6569 12ZM6.34315 12L9.87868 15.5355L11.2929 14.1213L9.17157 12L11.2929 9.87868L9.87868 8.46447L6.34315 12Z'%3E%3C/path%3E%3C/svg%3E");
}
.pdf {
background-color: #67503a;
background-color: #bf616a;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(255,255,255,1)'%3E%3Cpath d='M3.9985 2C3.44749 2 3 2.44405 3 2.9918V21.0082C3 21.5447 3.44476 22 3.9934 22H20.0066C20.5551 22 21 21.5489 21 20.9925L20.9997 7L16 2H3.9985ZM10.5 7.5H12.5C12.5 9.98994 14.6436 12.6604 17.3162 13.5513L16.8586 15.49C13.7234 15.0421 10.4821 16.3804 7.5547 18.3321L6.3753 16.7191C7.46149 15.8502 8.50293 14.3757 9.27499 12.6534C10.0443 10.9373 10.5 9.07749 10.5 7.5ZM11.1 13.4716C11.3673 12.8752 11.6043 12.2563 11.8037 11.6285C12.2754 12.3531 12.8553 13.0182 13.5102 13.5953C12.5284 13.7711 11.5666 14.0596 10.6353 14.4276C10.8 14.1143 10.9551 13.7948 11.1 13.4716Z'%3E%3C/path%3E%3C/svg%3E");
}
}
@media (prefers-color-scheme: light) {
background-color: #fff;
color: #2e3440;
}
}
}
}
iframe.song {
display: block;
width: 100%;
min-height: 100vh;
border: 0;
main.song {
height: 100dvh;
display: flex;
flex-direction: column;
max-width: 50em;
margin: 0 auto;
iframe {
flex-grow: 1;
display: block;
width: 100%;
padding-left: .5em;
border: 0;
}
.controls {
display: flex;
justify-content: center;
gap: 2em;
background-color: #3b4252;
section {
display:flex;
&.font-size>.button:hover, &.font-size>.button.active { background-color: #bf616a }
&.transpose>.button:hover, &.transpose>.button.active { background-color: #5e81ac }
&.autoscroll>.button.active { background-color: #d08770 }
.button{
display: grid;
align-items: center;
justify-items: center;
height: 2.5em;
width: 2.5em;
cursor: pointer;
background-position: center;
background-size: 1.5em;
background-repeat: no-repeat;
&.icon-add {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(255,255,255,1)'%3E%3Cpath d='M11 11V5H13V11H19V13H13V19H11V13H5V11H11Z'%3E%3C/path%3E%3C/svg%3E");
}
&.icon-subtract {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(255,255,255,1)'%3E%3Cpath d='M5 11V13H19V11H5Z'%3E%3C/path%3E%3C/svg%3E");
}
&.icon-font-size {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(255,255,255,1)'%3E%3Cpath d='M11.246 15H4.75416L2.75416 20H0.600098L7.0001 4H9.0001L15.4001 20H13.246L11.246 15ZM10.446 13L8.0001 6.88516L5.55416 13H10.446ZM21.0001 12.5351V12H23.0001V20H21.0001V19.4649C20.4118 19.8052 19.7287 20 19.0001 20C16.791 20 15.0001 18.2091 15.0001 16C15.0001 13.7909 16.791 12 19.0001 12C19.7287 12 20.4118 12.1948 21.0001 12.5351ZM19.0001 18C20.1047 18 21.0001 17.1046 21.0001 16C21.0001 14.8954 20.1047 14 19.0001 14C17.8955 14 17.0001 14.8954 17.0001 16C17.0001 17.1046 17.8955 18 19.0001 18Z'%3E%3C/path%3E%3C/svg%3E");
}
&.icon-transpose {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(255,255,255,1)'%3E%3Cpath d='M12 13.5351V3H20V5H14V17C14 19.2091 12.2091 21 10 21C7.79086 21 6 19.2091 6 17C6 14.7909 7.79086 13 10 13C10.7286 13 11.4117 13.1948 12 13.5351ZM10 19C11.1046 19 12 18.1046 12 17C12 15.8954 11.1046 15 10 15C8.89543 15 8 15.8954 8 17C8 18.1046 8.89543 19 10 19Z'%3E%3C/path%3E%3C/svg%3E");
}
&.icon-scroll {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='rgba(255,255,255,1)'%3E%3Cpath d='M12 10.0858L7.20712 5.29291L5.79291 6.70712L12 12.9142L18.2071 6.70712L16.7929 5.29291L12 10.0858ZM18 17L6.00001 17L6.00001 15L18 15V17Z'%3E%3C/path%3E%3C/svg%3E");
}
}
}
@media only screen and (max-width: $width-mobile) {
gap: 1em;
}
// This is removed via JS to prevent displaying the controls
// on browsers wih JavaScript disabled.
.hidden {
display: none;
}
}
}

BIN
static/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -1,6 +1,7 @@
const filters = document.querySelector(".filters");
const buttons = Array.from(filters.querySelectorAll(".button"));
const search = document.querySelector("input[type='text']");
const filters = document.querySelector(".filters");
const buttons = Array.from(filters.querySelectorAll(".button"));
const search = document.querySelector("input[type='search']");
const form = document.querySelector("form");
const songList = document.querySelector(".song-list");
let selectedCategory = null;
@ -12,7 +13,7 @@ function buttonToggle(clickedButton) {
selectedCategory = button.dataset.category;
} else {
button.classList.remove("selected");
selectedCategory = null;
if (button.dataset.category == selectedCategory) selectedCategory = null;
}
});
filterSongs();
@ -29,7 +30,9 @@ function filterSongs() {
}
// Event listeners
search.addEventListener("keyup", filterSongs);
search.addEventListener("input", filterSongs);
// Filtering happens before the reset itself without this timeout
form.addEventListener("reset", () => setTimeout(filterSongs, 0));
buttons.forEach(button => button.addEventListener("click", () => buttonToggle(button)));
// Normalize song titles

View File

@ -0,0 +1,35 @@
const controls = document.querySelector(".controls");
const song = document.querySelector("iframe.song").contentWindow;
// Autoscroll
var scroll;
function pageScroll() {
song.scrollBy(0, 1);
scroll = setTimeout(pageScroll, 80);
}
document.querySelector("#autoscroll").addEventListener("click", function() {
if (this.classList.contains("active")) {
clearTimeout(scroll);
} else {
pageScroll();
}
this.classList.toggle("active");
});
// Scaling
function pageScale(value) {
if (value === 0) {
song.document.body.style.transform = "scale(1)";
return;
}
const currentScale = parseFloat(song.document.body.style.transform.split("scale(")[1]) || 1;
song.document.body.style.transform = "scale(" + (currentScale + value) + ")";
}
controls.querySelector("#font-size-increase").addEventListener("click", () => pageScale(0.1));
controls.querySelector("#font-size-decrease").addEventListener("click", () => pageScale(-0.1));
controls.querySelector("#font-size-reset").addEventListener("click", () => pageScale(0));
// Display the controls on JS-enabled browsers
window.addEventListener("load", () => controls.classList.remove = "hidden");

View File

@ -6,15 +6,18 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{{ config.title }}{% endblock %}</title>
<link rel="stylesheet" href="{{ get_url(path="/style.css") }}">
<link rel="icon" href="favicon.svg">
<link rel="icon" type="image/png" href="{{ get_url(path="/favicon.png") }}">
</head>
<body>
{% block content %}
<main class="songs">
<section class="filters">
<input type="text" placeholder="Hledat">
<div class="button" data-category="classic">classic</div>
<div class="button" data-category="mixtape">mixtape</div>
<form>
<input type="search" placeholder="Hledat">
<input type="reset" value="">
</form>
<div class="button" data-category="classic">Classic</div>
<div class="button" data-category="mixtape">Mixtape</div>
</section>
<section class="song-list">
{% for song in section.pages %}

View File

@ -1,8 +1,29 @@
{% extends "index.html" %}
{% block content %}
{% for asset in page.assets %}
{% if asset is matching(page.slug~"[.](html)$") %}
<iframe class="song" src="{{ asset }}"></iframe>
{% endif %}
{% endfor %}
<main class="song">
{% for asset in page.assets %}
{% if asset is matching(page.slug~"[.](html)$") %}
<iframe class="song" src="{{ asset }}"></iframe>
<nav class="controls hidden">
<section class="font-size">
<div class="button icon-subtract" id="font-size-decrease"></div>
<div class="button icon-font-size" id="font-size-reset"></div>
<div class="button icon-add" id="font-size-increase"></div>
</section>
<section class="transpose">
<div class="button icon-subtract" id="transpose-decrease"></div>
<div class="button icon-transpose" id="transpose-reset"></div>
<div class="button icon-add" id="transpose-increase"></div>
</section>
<section class="autoscroll">
<div class="button icon-scroll" id="autoscroll"></div>
</section>
</nav>
{% endif %}
{% endfor %}
</main>
{% endblock %}
{% block script %}
<script src="{{ get_url(path="/js/song-controls.js") }}"></script>
{% endblock %}