diff --git a/css/main.css b/css/main.css index 6869f9c..4af0a75 100644 --- a/css/main.css +++ b/css/main.css @@ -141,6 +141,10 @@ a:any-link:focus-visible { outline: rgba(var(--text-color), 1) 0.1rem solid; } +.button { + background-color: rgba(var(--text-color), 0.06); +} + sm-button { --border-radius: 0.3rem; } @@ -304,8 +308,13 @@ ul { .button__icon { height: 1.2rem; width: 1.2rem; +} +.button__icon--left { margin-right: 0.5rem; } +.button__icon--right { + margin-left: 0.5rem; +} .page-layout { position: relative; @@ -687,11 +696,8 @@ ul { margin-bottom: 1rem; } -#advance_search_switch { - justify-self: flex-start; -} -#advance_search_switch h4 { - margin-left: 1rem; +#filters_bar { + padding: 0.5rem 0; } sm-option { @@ -709,25 +715,51 @@ sm-option { .filter-option { display: inline-flex; margin: 0 0.5rem 0.8rem 0; + -webkit-tap-highlight-color: transparent; } -.filter-option input[type=radio] { +.filter-option input { display: none; } -.filter-option input[type=radio]:checked ~ .option-text { +.filter-option input:checked ~ .option-text { color: rgba(255, 255, 255, 0.9); background-color: var(--accent-color); border: solid var(--accent-color) thin; } .filter-option .option-text { - font-weight: 500; cursor: pointer; + font-weight: 500; + font-size: 0.95rem; user-select: none; border-radius: 0.3rem; - padding: 0.5rem 0.8rem; + padding: 0.3rem 0.6rem; + transition: background-color 0.3s; color: rgba(var(--text-color), 0.8); border: solid rgba(var(--text-color), 0.2) thin; } +#filters_bar { + display: grid; + gap: 1rem; + margin-top: 1rem; + align-items: flex-start; + grid-template-columns: minmax(0, 1fr) auto; +} + +.selected-filter { + user-select: none; + cursor: pointer; + display: inline-flex; + align-items: center; + padding: 0.4rem 0.5rem; + margin: 0 0.5rem 0.8rem 0; + border: solid rgba(var(--text-color), 0.2) thin; + border-radius: 0.3rem; +} +.selected-filter .icon { + height: 1.2rem; + width: 1.2rem; +} + #page_selector strip-option, #search_page_selector strip-option { --border-radius: 0.3rem; diff --git a/css/main.min.css b/css/main.min.css index 1995f12..5734533 100644 --- a/css/main.min.css +++ b/css/main.min.css @@ -1 +1 @@ -a,button{color:inherit}a.button:any-link,button{position:relative;display:inline-flex;padding:.5rem .6rem;font-weight:500;-webkit-tap-highlight-color:transparent;cursor:pointer}a,a.button:any-link{text-decoration:none}.hide,.ripple{pointer-events:none}*{padding:0;margin:0;box-sizing:border-box;font-family:Inter,sans-serif}:root{font-size:clamp(1rem,1.2vmax,3rem)}body,html{height:100%;scroll-behavior:smooth}body{--accent-color:#304FFE;--light-shade:rgba(var(--text-color), 0.06);--text-color:17,17,17;--text-color-light:100,100,100;--foreground-color:255,255,255;--background-color:#F6f6f6;--error-color:red;--green:#00843b;color:rgba(var(--text-color),1);background:var(--background-color);display:flex;flex-direction:column}body[data-theme=dark]{--accent-color:#2353FF;--green:#13ff5a;--text-color:240,240,240;--text-color-light:170,170,170;--foreground-color:20,20,20;--background-color:#0a0a0a;--error-color:rgb(255, 106, 106)}main{flex:1}.full-bleed{grid-column:1/4}.h1{font-size:2.5rem}.h2,.page__title{font-size:2rem}.h3{font-size:1.4rem}.h4{font-size:1rem}.h5{font-size:.8rem}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}p{font-size:.8;max-width:60ch;line-height:1.7;color:rgba(var(--text-color),.8)}img{object-fit:cover}a:focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color),1) inset}button{overflow:hidden;align-items:center;background:0 0;outline:0;font-size:.9rem;border-radius:.2rem;border:none}button:focus-visible{outline:solid rgba(var(--text-color),1)}a.button:any-link{align-items:center;background:0 0;outline:0;font-size:.8rem;border-radius:.3rem;align-self:flex-start;color:rgba(var(--text-color),.7);background-color:rgba(var(--text-color),.06)}a.button:any-link .icon{margin-right:.3rem;height:1.2rem}a:any-link:focus-visible{outline:solid rgba(var(--text-color),1)}sm-button{--border-radius:0.3rem}ul{list-style:none}.hide{opacity:0}.hide-completely{display:none!important}.no-transformations{transform:none!important}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.flex{display:flex}.grid{display:grid}.flow-column{grid-auto-flow:column}.gap-0-5{gap:.5rem}.gap-1{gap:1rem}.gap-1-5{gap:1.5rem}.gap-2{gap:2rem}.gap-3{gap:3rem}.text-align-right{text-align:right}.align-start{align-items:flex-start}.align-center{align-items:center}.text-center{text-align:center}.justify-start{justify-content:start}.justify-center{justify-content:center}.justify-right{margin-left:auto}.align-self-center{align-self:center}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.ripple{position:absolute;border-radius:50%;transform:scale(0);background:rgba(var(--text-color),.16)}#torrent_download_button,.button--primary,.torrent-type-icon{background-color:var(--accent-color)}.interact{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:transparent}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)~.empty-state{display:none}.icon{width:1.5rem;height:1.5rem;fill:rgba(var(--text-color),.9)}.button__icon{height:1.2rem;width:1.2rem;margin-right:.5rem}.page-layout{position:relative;display:grid;grid-template-columns:1rem minmax(0,1fr) 1rem}.page-layout>*{grid-column:2/3}.popup__header{display:grid;gap:.5rem;width:100%;padding:1rem 1.5rem;align-items:center;grid-template-columns:auto 1fr}.popup__header__close{padding:.5rem;cursor:pointer}.button--primary{color:#fff;font-weight:500;padding:.5rem 1.2rem}.auto-grid-2{gap:2rem;grid-template-columns:1fr}#error_page,#loading_page{position:relative;display:grid;height:100%;place-content:center;justify-items:center}#main_header{position:relative;display:flex;padding:1rem;align-items:center;justify-content:space-between;grid-template-columns:repeat(3,1fr)}#main_header__logo{height:1.8rem;width:1.8rem}.theme-switcher{position:relative;justify-self:flex-end;width:1.5rem;height:1.5rem;cursor:pointer;-webkit-tap-highlight-color:transparent}.theme-switcher .icon{position:absolute;transition:transform .6s}.theme-switcher__checkbox{display:none}.theme-switcher__checkbox:checked~.moon-icon{transform:scale(0) rotate(90deg)}.theme-switcher__checkbox:not(:checked)~.sun-icon{transform:scale(0) rotate(-90deg)}.page{padding-bottom:3rem}#search_section{position:relative;display:grid;gap:.5rem 0;padding:4rem 0;justify-items:center}.app-icon{height:3rem;width:3rem}.app-icon-loader{fill:none;stroke-width:2;justify-self:center;stroke-dasharray:202;margin:2rem 0;stroke:rgba(var(--text-color),1);animation:stroke-anim 2s infinite alternate}@keyframes stroke-anim{0%{stroke-dashoffset:202}100%{stroke-dashoffset:0}}.app-name{font-weight:500;margin-bottom:1rem;font-size:.9rem;color:rgba(var(--text-color),.7)}.search-container{position:relative;margin-bottom:1rem;width:min(28rem,100%)}.search-torrent{--border-radius:2rem;--background:rgba(var(--text-color), 0.06)}.search-torrent .icon{height:1.2rem;fill:rgba(var(--text-color),.7)}.search-suggestions-container{top:100%;position:absolute;z-index:1;width:100%;border-radius:1rem;margin-top:.5rem;box-shadow:0 .5rem 1rem -.5rem rgba(0,0,0,.2);background-color:rgba(var(--foreground-color),1)}.search-suggestions-container:not(:empty){padding:.5rem 0}.search-suggestion{display:flex;cursor:pointer;font-weight:700;font-size:.9rem;padding:.8rem 1rem;color:rgba(var(--text-color),.8);outline:0}.search-suggestion:active,.search-suggestion:focus{outline:0;border:0}.search-suggestion:focus,.search-suggestion:focus-visible{outline:transparent;background-color:rgba(var(--text-color),.1)}.search-suggestion span{font-weight:450}.search-suggestion pre{white-space:pre-wrap}.torrent-container{padding:1.5rem 0;display:grid;gap:.5rem;padding-bottom:4rem}.torrent-card{display:grid;gap:0 1rem;align-items:center;grid-template-columns:1fr auto;padding:1rem;border-radius:.3rem;-webkit-tap-highlight-color:transparent;background-color:rgba(var(--text-color),.06)}.torrent-card .torrent-info{gap:0 1rem;grid-template-columns:auto 1fr;grid-template-areas:"torrent-icon ." "torrent-icon ."}.torrent-card .torrent-type-icon{padding:.8rem}.torrent-card__icon{grid-area:torrent-icon}.torrent-card__icon .icon{height:1.4rem;width:1.4rem}.torrent-card__title{font-weight:600;font-size:1.1rem;margin-bottom:.5rem}.torrent-card__tags,.torrent-card__uploader{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:.85rem;color:rgba(var(--text-color),.7)}.torrent-card__download-button{justify-self:flex-end;align-self:flex-start;background-color:rgba(var(--text-color),.1)}.torrent-card__download-button .icon{height:1.4rem;margin-right:.5rem}.progress-indicator{position:relative;justify-self:flex-end;height:2.3rem;padding:0 .6rem}.progress-percent{font-size:.9rem;font-weight:500;color:rgba(var(--text-color),.8);width:9ch;text-align:right}.placeholder-loader,.progress-loader{height:1.2rem;width:1.2rem;fill:none;padding:.1rem;stroke-width:12;overflow:visible}.progress-loader{stroke-dasharray:201;stroke-dashoffset:201;transform:rotate(-90deg);stroke:var(--accent-color);transition:stroke-dashoffset .3s;z-index:1}.placeholder-loader{position:absolute;stroke:rgba(var(--text-color),.1)}.torrent-preview{display:grid;justify-content:center}.torrent-preview__info-section{display:flex;flex-direction:column;align-content:flex-start}.torrent-type-icon{display:flex;padding:1rem;border-radius:50%;align-items:center;justify-content:center;align-self:flex-start;aspect-ratio:1/1;flex-shrink:0}.torrent-type-icon .icon{fill:#fff}#torrent_type_icon{align-self:center;justify-self:center;padding:2rem;margin:3rem 0 4rem;background-color:rgba(var(--text-color),.06)}#torrent_type_icon .icon{height:3rem;width:3rem;fill:rgba(var(--text-color),.3)}#torrent_tags,#torrent_uploader{display:flex;width:100%;font-size:.85rem;margin-bottom:.5rem;color:rgba(var(--text-color),.8)}#torrent_name{line-height:1.1;font-size:1.8rem;margin-bottom:2rem}#torrent_description{font-size:1rem;color:rgba(var(--text-color),.8)}#torrent_uploader{font-weight:500;margin:1.5rem 0 1rem;width:auto;border-radius:1.5rem;padding:.3rem .8rem;align-self:flex-start;background-color:rgba(var(--text-color),.1)}#download_container{display:flex;align-items:center;height:3rem;margin-top:2rem}#torrent_download_button{align-self:flex-start;color:#fff;flex-shrink:0;padding:.7rem;justify-content:center}#torrent_download_button .icon{fill:#fff;margin-right:.5rem}#torrent_index_tx{padding:.4rem;font-size:.9rem;border-radius:.5rem;align-self:flex-start;border:var(--accent-color) solid thin}#torrent_index_tx .icon{height:1.2rem;margin-right:.5rem}#advance_search_section{align-items:flex-start;padding:1rem 0;margin-bottom:1rem}#advance_search_switch{justify-self:flex-start}#advance_search_switch h4{margin-left:1rem}sm-option{font-size:.9rem}#filter_popup{--width:min(32rem, 100%)}.option-selector{padding:1rem 0}.filter-option{display:inline-flex;margin:0 .5rem .8rem 0}.filter-option input[type=radio]{display:none}.filter-option input[type=radio]:checked~.option-text{color:rgba(255,255,255,.9);background-color:var(--accent-color);border:var(--accent-color) solid thin}.filter-option .option-text{font-weight:500;cursor:pointer;user-select:none;border-radius:.3rem;padding:.5rem .8rem;color:rgba(var(--text-color),.8);border:rgba(var(--text-color),.2) solid thin}#page_selector strip-option,#search_page_selector strip-option{--border-radius:0.3rem;--active-option-color:white;--active-option-backgroud-color:var(--accent-color)}#main_footer{padding:2rem 0;background-color:rgba(var(--text-color),.06)}@media only screen and (max-width:640px){.popup__header{padding:0 1.5rem 0 .5rem}.torrent-card{grid-template-columns:1fr}.torrent-card__icon{margin:0}.torrent-card__title{font-size:.95rem}.torrent-card__tags,.torrent-card__uploader{font-size:.7rem}.torrent-card .progress-indicator,.torrent-card__download-button{margin-top:1rem}#torrent_tags{font-size:.8rem}#loader_container,#torrent_download_button{width:100%;justify-content:center}}@media only screen and (min-width:640px){.popup__header{padding:1.5rem 1.5rem 0 .5rem}#main_header,.torrent-card{padding:1.5rem}.auto-grid-2{grid-template-columns:1fr 1fr}.page-layout{grid-template-columns:1fr 90vw 1fr}.page__title{font-size:3rem}#filter_popup{--min-height:80vh}.torrent-preview{gap:3rem}#torrent_name{font-size:4rem;max-width:16ch}}@media only screen and (min-width:1280px){.page-layout{grid-template-columns:1fr 80vw 1fr}}@media (any-hover:hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color),.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color),.5)}.search-suggestion:hover{background-color:rgba(var(--text-color),.1)}} \ No newline at end of file +a,a.button:any-link{text-decoration:none}*{padding:0;margin:0;box-sizing:border-box;font-family:Inter,sans-serif}a.button:any-link,button{display:inline-flex;padding:.5rem .6rem;position:relative;font-weight:500;cursor:pointer}:root{font-size:clamp(1rem,1.2vmax,3rem)}body,html{height:100%;scroll-behavior:smooth}body{--accent-color:#304FFE;--light-shade:rgba(var(--text-color), 0.06);--text-color:17,17,17;--text-color-light:100,100,100;--foreground-color:255,255,255;--background-color:#F6f6f6;--error-color:red;--green:#00843b;color:rgba(var(--text-color),1);background:var(--background-color);display:flex;flex-direction:column}body[data-theme=dark]{--accent-color:#2353FF;--green:#13ff5a;--text-color:240,240,240;--text-color-light:170,170,170;--foreground-color:20,20,20;--background-color:#0a0a0a;--error-color:rgb(255, 106, 106)}main{flex:1}.full-bleed{grid-column:1/4}.h1{font-size:2.5rem}.h2,.page__title{font-size:2rem}.h3{font-size:1.4rem}.h4{font-size:1rem}.h5{font-size:.8rem}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}p{font-size:.8;max-width:60ch;line-height:1.7;color:rgba(var(--text-color),.8)}img{object-fit:cover}a{color:inherit}a:focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color),1) inset}button{overflow:hidden;align-items:center;background:0 0;outline:0;color:inherit;font-size:.9rem;border-radius:.2rem;-webkit-tap-highlight-color:transparent;border:none}.torrent-card,a.button:any-link{border-radius:.3rem;-webkit-tap-highlight-color:transparent}button:focus-visible{outline:solid rgba(var(--text-color),1)}a.button:any-link{align-items:center;background:0 0;outline:0;font-size:.8rem;align-self:flex-start;color:rgba(var(--text-color),.7);background-color:rgba(var(--text-color),.06)}a.button:any-link .icon{margin-right:.3rem;height:1.2rem}a:any-link:focus-visible{outline:solid rgba(var(--text-color),1)}.button{background-color:rgba(var(--text-color),.06)}sm-button{--border-radius:0.3rem}ul{list-style:none}.hide{opacity:0;pointer-events:none}.hide-completely{display:none!important}.no-transformations{transform:none!important}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.flex{display:flex}.grid{display:grid}.flow-column{grid-auto-flow:column}.gap-0-5{gap:.5rem}.gap-1{gap:1rem}.gap-1-5{gap:1.5rem}.gap-2{gap:2rem}.gap-3{gap:3rem}.text-align-right{text-align:right}.align-start{align-items:flex-start}.align-center{align-items:center}.text-center{text-align:center}.justify-start{justify-content:start}.justify-center{justify-content:center}.justify-right{margin-left:auto}.align-self-center{align-self:center}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.ripple{position:absolute;border-radius:50%;transform:scale(0);background:rgba(var(--text-color),.16);pointer-events:none}.button--primary,.torrent-type-icon{background-color:var(--accent-color)}.interact{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:transparent}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)~.empty-state{display:none}.icon{width:1.5rem;height:1.5rem;fill:rgba(var(--text-color),.9)}.button__icon{height:1.2rem;width:1.2rem}.button__icon--left{margin-right:.5rem}.button__icon--right{margin-left:.5rem}.page-layout{position:relative;display:grid;grid-template-columns:1rem minmax(0,1fr) 1rem}.page-layout>*{grid-column:2/3}.popup__header{display:grid;gap:.5rem;width:100%;padding:1rem 1.5rem;align-items:center;grid-template-columns:auto 1fr}.popup__header__close{padding:.5rem;cursor:pointer}.button--primary{color:#fff;font-weight:500;padding:.5rem 1.2rem}.auto-grid-2{gap:2rem;grid-template-columns:1fr}#error_page,#loading_page{position:relative;display:grid;height:100%;place-content:center;justify-items:center}#main_header{position:relative;display:flex;padding:1rem;align-items:center;justify-content:space-between;grid-template-columns:repeat(3,1fr)}.theme-switcher,.torrent-card__download-button{justify-self:flex-end}#main_header__logo{height:1.8rem;width:1.8rem}.theme-switcher{position:relative;width:1.5rem;height:1.5rem;cursor:pointer;-webkit-tap-highlight-color:transparent}.theme-switcher .icon{position:absolute;transition:transform .6s}.theme-switcher__checkbox{display:none}.theme-switcher__checkbox:checked~.moon-icon{transform:scale(0) rotate(90deg)}.theme-switcher__checkbox:not(:checked)~.sun-icon{transform:scale(0) rotate(-90deg)}.page{padding-bottom:3rem}#search_section{position:relative;display:grid;gap:.5rem 0;padding:4rem 0;justify-items:center}.app-icon{height:3rem;width:3rem}.app-icon-loader{fill:none;stroke-width:2;justify-self:center;stroke-dasharray:202;margin:2rem 0;stroke:rgba(var(--text-color),1);animation:stroke-anim 2s infinite alternate}@keyframes stroke-anim{0%{stroke-dashoffset:202}100%{stroke-dashoffset:0}}.app-name{font-weight:500;margin-bottom:1rem;font-size:.9rem;color:rgba(var(--text-color),.7)}.search-container{position:relative;margin-bottom:1rem;width:min(28rem,100%)}.search-torrent{--border-radius:2rem;--background:rgba(var(--text-color), 0.06)}.search-torrent .icon{height:1.2rem;fill:rgba(var(--text-color),.7)}.search-suggestions-container{top:100%;position:absolute;z-index:1;width:100%;border-radius:1rem;margin-top:.5rem;box-shadow:0 .5rem 1rem -.5rem rgba(0,0,0,.2);background-color:rgba(var(--foreground-color),1)}.search-suggestions-container:not(:empty){padding:.5rem 0}.search-suggestion{display:flex;cursor:pointer;font-weight:700;font-size:.9rem;padding:.8rem 1rem;color:rgba(var(--text-color),.8);outline:0}.search-suggestion:active,.search-suggestion:focus{outline:0;border:0}.search-suggestion:focus,.search-suggestion:focus-visible{outline:transparent;background-color:rgba(var(--text-color),.1)}.search-suggestion span{font-weight:450}.search-suggestion pre{white-space:pre-wrap}.torrent-container{padding:1.5rem 0;display:grid;gap:.5rem;padding-bottom:4rem}.torrent-card{display:grid;gap:0 1rem;align-items:center;grid-template-columns:1fr auto;padding:1rem;background-color:rgba(var(--text-color),.06)}#torrent_uploader,.torrent-card__download-button{background-color:rgba(var(--text-color),.1);align-self:flex-start}.torrent-card .torrent-info{gap:0 1rem;grid-template-columns:auto 1fr;grid-template-areas:"torrent-icon ." "torrent-icon ."}.torrent-card .torrent-type-icon{padding:.8rem}.torrent-card__icon{grid-area:torrent-icon}.torrent-card__icon .icon{height:1.4rem;width:1.4rem}.torrent-card__title{font-weight:600;font-size:1.1rem;margin-bottom:.5rem}.torrent-card__tags,.torrent-card__uploader{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:.85rem;color:rgba(var(--text-color),.7)}.torrent-card__download-button .icon{height:1.4rem;margin-right:.5rem}.progress-indicator{position:relative;justify-self:flex-end;height:2.3rem;padding:0 .6rem}.progress-percent{font-size:.9rem;font-weight:500;color:rgba(var(--text-color),.8);width:9ch;text-align:right}.placeholder-loader,.progress-loader{height:1.2rem;width:1.2rem;fill:none;padding:.1rem;stroke-width:12;overflow:visible}.progress-loader{stroke-dasharray:201;stroke-dashoffset:201;transform:rotate(-90deg);stroke:var(--accent-color);transition:stroke-dashoffset .3s;z-index:1}.placeholder-loader{position:absolute;stroke:rgba(var(--text-color),.1)}.torrent-preview{display:grid;justify-content:center}.torrent-preview__info-section{display:flex;flex-direction:column;align-content:flex-start}.torrent-type-icon{display:flex;padding:1rem;border-radius:50%;align-items:center;justify-content:center;align-self:flex-start;aspect-ratio:1/1;flex-shrink:0}.torrent-type-icon .icon{fill:#fff}#torrent_type_icon{align-self:center;justify-self:center;padding:2rem;margin:3rem 0 4rem;background-color:rgba(var(--text-color),.06)}#torrent_type_icon .icon{height:3rem;width:3rem;fill:rgba(var(--text-color),.3)}#torrent_tags,#torrent_uploader{display:flex;width:100%;font-size:.85rem;margin-bottom:.5rem;color:rgba(var(--text-color),.8)}#torrent_name{line-height:1.1;font-size:1.8rem;margin-bottom:2rem}#torrent_description{font-size:1rem;color:rgba(var(--text-color),.8)}#torrent_uploader{font-weight:500;margin:1.5rem 0 1rem;width:auto;border-radius:1.5rem;padding:.3rem .8rem}#download_container{display:flex;align-items:center;height:3rem;margin-top:2rem}#torrent_download_button{align-self:flex-start;color:#fff;flex-shrink:0;padding:.7rem;justify-content:center;background-color:var(--accent-color)}#torrent_download_button .icon{fill:#fff;margin-right:.5rem}#torrent_index_tx{padding:.4rem;font-size:.9rem;border-radius:.5rem;align-self:flex-start;border:var(--accent-color) solid thin}#torrent_index_tx .icon{height:1.2rem;margin-right:.5rem}#advance_search_section{align-items:flex-start;padding:1rem 0;margin-bottom:1rem}#filters_bar{padding:.5rem 0}sm-option{font-size:.9rem}#filter_popup{--width:min(32rem, 100%)}.option-selector{padding:1rem 0}.filter-option{display:inline-flex;margin:0 .5rem .8rem 0;-webkit-tap-highlight-color:transparent}.filter-option input{display:none}.filter-option input:checked~.option-text{color:rgba(255,255,255,.9);background-color:var(--accent-color);border:var(--accent-color) solid thin}.filter-option .option-text{cursor:pointer;font-weight:500;font-size:.95rem;user-select:none;border-radius:.3rem;padding:.3rem .6rem;transition:background-color .3s;color:rgba(var(--text-color),.8);border:rgba(var(--text-color),.2) solid thin}#filters_bar{display:grid;gap:1rem;margin-top:1rem;align-items:flex-start;grid-template-columns:minmax(0,1fr) auto}.selected-filter{user-select:none;cursor:pointer;display:inline-flex;align-items:center;padding:.4rem .5rem;margin:0 .5rem .8rem 0;border:rgba(var(--text-color),.2) solid thin;border-radius:.3rem}.selected-filter .icon{height:1.2rem;width:1.2rem}#page_selector strip-option,#search_page_selector strip-option{--border-radius:0.3rem;--active-option-color:white;--active-option-backgroud-color:var(--accent-color)}#main_footer{padding:2rem 0;background-color:rgba(var(--text-color),.06)}@media only screen and (max-width:640px){.popup__header{padding:0 1.5rem 0 .5rem}.torrent-card{grid-template-columns:1fr}.torrent-card__icon{margin:0}.torrent-card__title{font-size:.95rem}.torrent-card__tags,.torrent-card__uploader{font-size:.7rem}.torrent-card .progress-indicator,.torrent-card__download-button{margin-top:1rem}#torrent_tags{font-size:.8rem}#loader_container,#torrent_download_button{width:100%;justify-content:center}}@media only screen and (min-width:640px){.popup__header{padding:1.5rem 1.5rem 0 .5rem}#main_header,.torrent-card{padding:1.5rem}.auto-grid-2{grid-template-columns:1fr 1fr}.page-layout{grid-template-columns:1fr 90vw 1fr}.page__title{font-size:3rem}#filter_popup{--min-height:80vh}.torrent-preview{gap:3rem}#torrent_name{font-size:4rem;max-width:16ch}}@media only screen and (min-width:1280px){.page-layout{grid-template-columns:1fr 80vw 1fr}}@media (any-hover:hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color),.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color),.5)}.search-suggestion:hover{background-color:rgba(var(--text-color),.1)}} \ No newline at end of file diff --git a/css/main.scss b/css/main.scss index 2bfcba7..01b8adf 100644 --- a/css/main.scss +++ b/css/main.scss @@ -124,6 +124,9 @@ a.button:any-link{ a:any-link:focus-visible{ outline: rgba(var(--text-color), 1) 0.1rem solid; } +.button{ + background-color: rgba(var(--text-color), 0.06); +} sm-button{ --border-radius: 0.3rem; } @@ -254,7 +257,12 @@ ul{ .button__icon{ height: 1.2rem; width: 1.2rem; - margin-right: 0.5rem; + &--left{ + margin-right: 0.5rem; + } + &--right{ + margin-left: 0.5rem; + } } .page-layout{ @@ -434,7 +442,6 @@ ul{ display: grid; gap: 0.5rem; padding-bottom: 4rem; - // grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr)); } .torrent-card{ display: grid; @@ -611,11 +618,10 @@ ul{ padding: 1rem 0; margin-bottom: 1rem; } -#advance_search_switch{ - justify-self: flex-start; - h4{ - margin-left: 1rem; - } + + +#filters_bar{ + padding: 0.5rem 0; } sm-option{ font-size: 0.9rem; @@ -631,24 +637,48 @@ sm-option{ .filter-option{ display: inline-flex; margin: 0 0.5rem 0.8rem 0; - input[type="radio"]{ + -webkit-tap-highlight-color: transparent; + input{ display: none; } - input[type="radio"]:checked ~ .option-text{ + input:checked ~ .option-text{ color: rgba(255, 255, 255, 0.9); background-color: var(--accent-color); border: solid var(--accent-color) thin; } .option-text{ - font-weight: 500; cursor: pointer; + font-weight: 500; + font-size: 0.95rem; user-select: none; border-radius: 0.3rem; - padding: 0.5rem 0.8rem; + padding: 0.3rem 0.6rem; + transition: background-color 0.3s; color: rgba(var(--text-color), 0.8); border: solid rgba(var(--text-color), 0.2) thin; } } +#filters_bar{ + display: grid; + gap: 1rem; + margin-top: 1rem; + align-items: flex-start; + grid-template-columns: minmax(0, 1fr) auto; +} +.selected-filter{ + user-select: none; + cursor: pointer; + display: inline-flex; + align-items: center; + padding: 0.4rem 0.5rem; + margin: 0 0.5rem 0.8rem 0; + border: solid rgba(var(--text-color), 0.2) thin; + border-radius: 0.3rem; + .icon{ + height: 1.2rem; + width: 1.2rem; + } +} #page_selector, #search_page_selector{ diff --git a/index.html b/index.html index 691b587..7f9b77a 100644 --- a/index.html +++ b/index.html @@ -36,6 +36,8 @@

Category

+

Tags

+
@@ -157,11 +159,18 @@

-
+
+
+ +
@@ -871,14 +880,28 @@ filterOption(obj){ const {content, groupName, value} = obj const option = create('label', { - className: 'filter-option' + className: 'filter-option interact' }) option.innerHTML = ` - +
${content}
` return option + }, + selectedFilter(obj){ + const {content, type} = obj + const option = create('div', { + className: 'selected-filter interact' + }) + option.dataset.type = type + option.dataset.value = content + + option.innerHTML = ` +
${content}
+ + ` + return option } } function getIcon(type) { @@ -930,67 +953,64 @@ } function pushParams() { - let params = '' - for (let prop in filteredSearch) { - if (prop !== 'isActive' && filteredSearch[prop] && filteredSearch[prop] !== '') { - params += `${prop}=${filteredSearch[prop]}&` - } - } - if (params.slice(-1) === '&') { - params = params.slice(0, -1) - } - history.pushState(null, null, `?${params}#search`) + history.pushState(null, null, `?query=${filteredSearch.query}#search`) } let filteredSearch = { active: false, query: '', - category: '' + category: '', + tags: new Set() } let lastQuery = '' - let lastCategory = '' async function renderSearchResult(searchKey, shouldFilter = false) { - debugger - if (lastQuery !== searchKey || shouldFilter || filteredSearch.category !== lastCategory) { - if (shouldFilter) { - searchKey = getRef('advance_torrent_search').value.trim() !== '' ? getRef('advance_torrent_search').value.trim() : lastQuery - } - filteredSearch['query'] = searchKey - let result - if (filteredSearch.isActive) { - result = await getFilteredTorrents(['type'], filteredSearch.category) - result = await getFilteredTorrents(['name', 'filename', 'tags'], searchKey, {torrents: result}) - } - else { - result = await getFilteredTorrents(['name', 'filename', 'tags'], searchKey) - } - if (result.length) { - getRef('result_for').innerHTML = `Showing results for ${searchKey}` - } - else { - getRef('result_for').innerHTML = `No results for ${searchKey}` - } - - getRef('search_result').innerHTML = `` - getRef('search_page_selector').innerHTML = `` - if(result.length > 20){ - const pages = Math.round(result.length / 20) - getRef('search_page_selector').append(createPageButtons(pages)) - getRef('search_result').append(renderTorrents(result.slice(0, 20))) - } - else{ - getRef('search_result').append(renderTorrents(result)) - } - - lastQuery = searchKey - lastCategory = filteredSearch.category + if (shouldFilter) { + searchKey = getRef('advance_torrent_search').value.trim() !== '' ? getRef('advance_torrent_search').value.trim() : lastQuery } + filteredSearch['query'] = searchKey + let result + if (filteredSearch.isActive) { + if(filteredSearch.category && filteredSearch.tags.size){ + result = await getFilteredTorrents(['type'], filteredSearch.category) + result = await getFilteredTorrents(['tags'], [...filteredSearch.tags].join('/'), {torrents: result}) + } + else if(filteredSearch.category){ + result = await getFilteredTorrents(['type'], filteredSearch.category) + } + else if(filteredSearch.tags.size){ + result = await getFilteredTorrents(['tags'], [...filteredSearch.tags].join('/')) + } + result = await getFilteredTorrents(['name', 'filename', 'tags'], searchKey, {torrents: result}) + } + else { + result = await getFilteredTorrents(['name', 'filename', 'tags'], searchKey) + } + if (result.length) { + getRef('result_for').innerHTML = `Showing results for ${searchKey}` + } + else { + getRef('result_for').innerHTML = `No results for ${searchKey}` + } + + getRef('search_result').innerHTML = `` + getRef('search_page_selector').innerHTML = `` + if(result.length > 20){ + const pages = Math.round(result.length / 20) + getRef('search_page_selector').append(createPageButtons(pages)) + getRef('search_result').append(renderTorrents(result.slice(0, 20))) + } + else{ + getRef('search_result').append(renderTorrents(result)) + } + + lastQuery = searchKey } const categories = ['movie', 'tv series', 'video', 'music', 'software', 'game', 'image', 'audio', 'misc'] + const allTags = ['action', 'adventure', 'comedy', 'crime', 'drama', 'fantacy', 'horror', 'mystery', 'romance', 'sci-fi', 'sport', 'thriller', 'western'] - function renderOptions(list, options){ + function renderOptions(list, options = {}){ const {groupName} = options const frag = document.createDocumentFragment() list.forEach(item => { @@ -1016,23 +1036,10 @@ if(currentpage !== page){ getRef('category_selector').innerHTML = '' getRef('category_selector').append(renderOptions(categories, {groupName: 'category-selector'})) + getRef('tags_selector').innerHTML = '' + getRef('tags_selector').append(renderOptions(allTags)) } - if (params.query) { - if (params.category) { - filteredSearch = { - isActive: true, - ...params - } - const selectedCategory = getRef('category_selector').querySelector(`[value="${filteredSearch.category}"]`) - if(selectedCategory){ - selectedCategory.checked = true - } - } - else{ - resetFilter() - } - renderSearchResult(params.query) - } + renderSearchResult(params.query) break; case 'torrent': currentTorrent = await getDataFromIDB(parseInt(params.id)) @@ -1099,12 +1106,12 @@ } async function showCategoryTorrents(category) { - const result = await getFilteredTorrents(['type'], category) + const result = await getFilteredTorrents(['type'], category, {limit: 20}) getRef('browser_category_torrents').innerHTML = `` getRef('page_selector').innerHTML = '' if (result.length) { - getRef('browser_category_torrents').append(renderTorrents(result.slice(0, 20))) + getRef('browser_category_torrents').append(renderTorrents(result.reverse().slice(0, 20))) const pages = Math.round(result.length / 20) getRef('page_selector').append(createPageButtons(pages)) @@ -1152,7 +1159,9 @@ const searchKey = e.target.value.trim() renderSearchResult(searchKey) pushParams() - showPage('search') + if(e.target.id === 'search_torrent'){ + showPage('search') + } e.target.value = '' break; case 'ArrowDown': @@ -1225,9 +1234,6 @@ renderSearchSuggestions(searchKey, true) }, 100) }) - getRef('category_selector').addEventListener('change', e => { - filteredSearch.category = e.target.value - }) getRef('browse_category_selector').addEventListener('change', e => { showCategoryTorrents(e.detail.value) }) @@ -1241,12 +1247,11 @@ setTimeout(() => { getRef('browser_category_torrents').scrollIntoView({ behavior: 'smooth', block: 'start' }) getRef('browser_category_torrents').innerHTML = `` - getRef('browser_category_torrents').append(renderTorrents(result.slice(startIndex, endIndex))) + getRef('browser_category_torrents').append(renderTorrents(result.reverse().slice(startIndex, endIndex))) }, 200); }) getRef('search_page_selector').addEventListener('change', async e => { - const result = await getFilteredTorrents(['name', 'filename', 'tags'], lastQuery) - console.log(result.length , result.length/20) + const result = await getFilteredTorrents(['name', 'filename', 'tags'], lastQuery, {limit: 20}) const startIndex = parseInt(e.detail.value) * 20 const endIndex = ((parseInt(e.detail.value) * 20) + 30) < result.length ? (parseInt(e.detail.value) * 20) + 20 : result.length @@ -1257,17 +1262,71 @@ }, 200); }) function addFilter(){ - if(filteredSearch.category){ - filteredSearch.isActive = true + const selectedCategory = getRef('category_selector').querySelector('input:checked') + if(selectedCategory){ + filteredSearch.category = selectedCategory.value } + filteredSearch['tags'].clear() + getRef('tags_selector').querySelectorAll('input:checked').forEach(tag => { + filteredSearch['tags'].add(tag.value) + }) + if(filteredSearch.category || filteredSearch.tags.size){ + filteredSearch.isActive = true + getRef('filters_bar').classList.remove('hide-completely') + } + else{ + getRef('filters_bar').classList.add('hide-completely') + } + renderSelectedFilters() renderSearchResult('', true); - pushParams(); + getRef('filter_popup').hide() } function resetFilter(){ filteredSearch.isActive = false filteredSearch.category = undefined getRef('filter_form').reset() + const selectedCategory = getRef('category_selector').querySelector('input:checked') + if(selectedCategory){ + selectedCategory.checked = false + } + filteredSearch['tags'].clear() + getRef('tags_selector').querySelectorAll('input:checked').forEach(tag => { + tag.checked = false + }) + getRef('selected_filters_container').innerHTML = '' + getRef('filters_bar').classList.add('hide-completely') + renderSearchResult('', true); } + function renderSelectedFilters(){ + getRef('selected_filters_container').innerHTML = '' + const frag = document.createDocumentFragment() + if(filteredSearch.category){ + frag.append(render.selectedFilter({content: filteredSearch.category, type: 'category'})) + } + filteredSearch.tags.forEach(tag => { + frag.append(render.selectedFilter({content: tag, type: 'tag'})) + }) + getRef('selected_filters_container').append(frag) + } + getRef('selected_filters_container').addEventListener('click', e => { + if(e.target.closest('.selected-filter')){ + const target = e.target.closest('.selected-filter') + if(target.dataset.type === 'category'){ + filteredSearch.category = undefined + getRef('category_selector').querySelector('input:checked').checked = false + } + else{ + filteredSearch.tags.delete(target.dataset.value) + getRef('tags_selector').querySelector(`input[value="${target.dataset.value}"]`).checked = false + } + target.remove() + if(!filteredSearch.category && !filteredSearch.tags.size){ + filteredSearch.isActive = false + getRef('filters_bar').classList.add('hide-completely') + } + } + renderSearchResult('', true); + })