added files
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/instance/
|
||||||
|
/static/arts/
|
||||||
|
/static/comics/
|
||||||
|
/static/comicthumbs/
|
||||||
|
/static/items/
|
||||||
|
/static/posts/
|
||||||
|
/static/thumbnails/
|
||||||
|
/static/videos/
|
BIN
static/artberry.ico
Normal file
After Width: | Height: | Size: 100 KiB |
BIN
static/avatars/default-avatar.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
static/banners/default-banner.png
Normal file
After Width: | Height: | Size: 10 KiB |
3
static/card/like-icon.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="20" height="18" viewBox="0 0 20 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M19.1668 8.33325C19.1668 7.89122 18.9912 7.4673 18.6787 7.15474C18.3661 6.84218 17.9422 6.66658 17.5002 6.66658H12.2335L13.0335 2.85825C13.0502 2.77492 13.0585 2.68325 13.0585 2.59159C13.0585 2.24992 12.9168 1.93325 12.6918 1.70825L11.8085 0.833252L6.32516 6.31659C6.01683 6.62492 5.8335 7.04158 5.8335 7.49992V15.8333C5.8335 16.2753 6.00909 16.6992 6.32165 17.0118C6.63421 17.3243 7.05814 17.4999 7.50016 17.4999H15.0002C15.6918 17.4999 16.2835 17.0833 16.5335 16.4833L19.0502 10.6083C19.1252 10.4166 19.1668 10.2166 19.1668 9.99992V8.33325ZM0.833496 17.4999H4.16683V7.49992H0.833496V17.4999Z" fill="#3C3882"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 724 B |
3
static/card/views-icon.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="20" height="14" viewBox="0 0 20 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M10.0002 4.5C9.33712 4.5 8.70124 4.76339 8.2324 5.23223C7.76356 5.70107 7.50016 6.33696 7.50016 7C7.50016 7.66304 7.76356 8.29893 8.2324 8.76777C8.70124 9.23661 9.33712 9.5 10.0002 9.5C10.6632 9.5 11.2991 9.23661 11.7679 8.76777C12.2368 8.29893 12.5002 7.66304 12.5002 7C12.5002 6.33696 12.2368 5.70107 11.7679 5.23223C11.2991 4.76339 10.6632 4.5 10.0002 4.5ZM10.0002 11.1667C8.89509 11.1667 7.83529 10.7277 7.05388 9.94628C6.27248 9.16488 5.8335 8.10507 5.8335 7C5.8335 5.89493 6.27248 4.83512 7.05388 4.05372C7.83529 3.27232 8.89509 2.83333 10.0002 2.83333C11.1052 2.83333 12.165 3.27232 12.9464 4.05372C13.7278 4.83512 14.1668 5.89493 14.1668 7C14.1668 8.10507 13.7278 9.16488 12.9464 9.94628C12.165 10.7277 11.1052 11.1667 10.0002 11.1667ZM10.0002 0.75C5.8335 0.75 2.27516 3.34167 0.833496 7C2.27516 10.6583 5.8335 13.25 10.0002 13.25C14.1668 13.25 17.7252 10.6583 19.1668 7C17.7252 3.34167 14.1668 0.75 10.0002 0.75Z" fill="#3C3882"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.0 KiB |
955
static/css/styles.css
Normal file
@ -0,0 +1,955 @@
|
|||||||
|
@import url('https://fonts.googleapis.com/css2?family=Comfortaa:wght@300..700&display=swap');
|
||||||
|
* {
|
||||||
|
font-family: 'Comfortaa', sans-serif;
|
||||||
|
}
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
background-color: #3f3242;
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.preview-container {
|
||||||
|
margin-top: 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.preview-container img {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 300px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
#autocomplete-suggestions {
|
||||||
|
position: absolute;
|
||||||
|
top: 260px;
|
||||||
|
left: 42%;
|
||||||
|
width: 11.5%;
|
||||||
|
background-color: #86597f;
|
||||||
|
border: 1px solid #9a6fa0;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
z-index: 1000;
|
||||||
|
max-height: 250px;
|
||||||
|
overflow-y: auto;
|
||||||
|
font-family: 'Comfortaa', sans-serif;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.suggestion-item {
|
||||||
|
padding: 1px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #ffffff;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s ease, color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.suggestion-item:hover {
|
||||||
|
background-color: #3f3242;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.suggestion-item:active {
|
||||||
|
background-color: #e2e2e2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.suggestion-item:not(:last-child) {
|
||||||
|
border-bottom: 1px solid #f0f0f0;
|
||||||
|
}
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background-color: #6a4664;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
border-radius: 3px;
|
||||||
|
color:white;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 7px 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
nav .button:hover {
|
||||||
|
background-color: #9a6fa0;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color:yellow;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
label {
|
||||||
|
color:white
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
color:white;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
color:white;
|
||||||
|
}
|
||||||
|
input {
|
||||||
|
color:white;
|
||||||
|
}
|
||||||
|
.blur {
|
||||||
|
filter: blur(15px);
|
||||||
|
transition: filter 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-overlay {
|
||||||
|
display: none;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 1050;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
background: #3f3242;
|
||||||
|
padding: 20px;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 8px;
|
||||||
|
width: 300px;
|
||||||
|
z-index: 1060;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-buttons {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-button {
|
||||||
|
background: #6a4664;
|
||||||
|
color: white;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border: none;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
cursor: pointer;
|
||||||
|
margin: 0 10px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-button.cancel {
|
||||||
|
background: #6a4664;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
font-size: 18px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 400px;
|
||||||
|
outline: none;
|
||||||
|
background: #6a4664;
|
||||||
|
color: #FFFFFF;
|
||||||
|
border: none;
|
||||||
|
border-radius: 3px;
|
||||||
|
transition: .3s ease;
|
||||||
|
}
|
||||||
|
header {
|
||||||
|
margin-top: 120px;
|
||||||
|
}
|
||||||
|
.title {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.search-form {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
.input-field:focus {
|
||||||
|
background: #86597f;
|
||||||
|
border: none;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.input-field::placeholder {
|
||||||
|
color: #DDDDDD;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
background-color: #6a4664;
|
||||||
|
width: 100%;
|
||||||
|
height: 60px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 10px 45px;
|
||||||
|
text-decoration: none;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: #845e80;
|
||||||
|
}
|
||||||
|
footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
background-color: #6a4664;
|
||||||
|
width: 100%;
|
||||||
|
height: 60px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 10px 20px;
|
||||||
|
text-decoration: none;
|
||||||
|
color: white;
|
||||||
|
background-color: #845e80;
|
||||||
|
border: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
}
|
||||||
|
footer .button:hover {
|
||||||
|
background-color: #9a6fa0;
|
||||||
|
}
|
||||||
|
.pagination {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 5px 10px;
|
||||||
|
text-decoration: none;
|
||||||
|
color: white;
|
||||||
|
background-color: #6a4664;
|
||||||
|
border: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.pagination .button:hover {
|
||||||
|
background-color: #845e80;
|
||||||
|
}
|
||||||
|
.pagination .button:focus,
|
||||||
|
.pagination .button:active {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 100vh;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 20px;
|
||||||
|
gap: 15px;
|
||||||
|
}
|
||||||
|
.video-player {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.video-title {
|
||||||
|
display: flex;
|
||||||
|
margin-top: 80px;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.video-details {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
.gallery {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(5, 1fr);
|
||||||
|
gap: 10px;
|
||||||
|
margin: 20px auto;
|
||||||
|
padding: 20px;
|
||||||
|
max-width: 1200px;
|
||||||
|
}
|
||||||
|
.card {
|
||||||
|
border-radius: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #6a4664;
|
||||||
|
}
|
||||||
|
.card img {
|
||||||
|
width: 100%;
|
||||||
|
height: 200px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
.card p {
|
||||||
|
margin: 10px;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
.card:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
.comic-viewer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
gap: 20px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.comic-card {
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: transform 0.3s;
|
||||||
|
}
|
||||||
|
.comic-card:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
.comic-card img {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
.comic-card p {
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
.comicname {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.banner {
|
||||||
|
width: 100%;
|
||||||
|
height: 250px;
|
||||||
|
position: relative;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.avatar,
|
||||||
|
.banner img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
.avatar-container {
|
||||||
|
position: absolute;
|
||||||
|
top: 70%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
z-index: 1;
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 3px solid #845e80;
|
||||||
|
margin-bottom:80px;
|
||||||
|
}
|
||||||
|
.current-item-image {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 50px;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
margin: 30px 0 10px;
|
||||||
|
}
|
||||||
|
.bio {
|
||||||
|
margin-top: 65px;
|
||||||
|
padding: 1px;
|
||||||
|
background-color: #845e80;
|
||||||
|
border-radius: 10px;
|
||||||
|
max-width: 60%;
|
||||||
|
width: 80%;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-bottom:10px;
|
||||||
|
}
|
||||||
|
.bio-content {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bio h2 {
|
||||||
|
margin: 0 0 10px;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
.bio p {
|
||||||
|
font-size: 1rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.header,
|
||||||
|
body {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cookie-balance,
|
||||||
|
.home-button,
|
||||||
|
.cookie-balance,
|
||||||
|
h1 {
|
||||||
|
margin-top: 20px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.header {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.cookie-balance {
|
||||||
|
background-color: #6a4664;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.item-container {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(4, 1fr);
|
||||||
|
gap: 20px;
|
||||||
|
padding: 20px;
|
||||||
|
max-width: 1200px;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.item {
|
||||||
|
background-color: #6e4568;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 20px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
transition: transform 0.3s, box-shadow 0.3s;
|
||||||
|
}
|
||||||
|
.item:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
.comic-pages {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
margin: 20px auto;
|
||||||
|
max-width: 1200px;
|
||||||
|
}
|
||||||
|
.comic-pages img {
|
||||||
|
max-width: 90%;
|
||||||
|
height: auto;
|
||||||
|
border: 2px solid #845e80;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: transform 0.3s;
|
||||||
|
}
|
||||||
|
.comic-pages img:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
border-color: #9a6fa0;
|
||||||
|
}
|
||||||
|
.item img {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 200px;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
transition: transform 0.3s;
|
||||||
|
}
|
||||||
|
.home-button {
|
||||||
|
background-color: #6a4664;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
border-radius: 3px;
|
||||||
|
color:white;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 7px 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.home-button:hover {
|
||||||
|
background-color: #9a6fa0;
|
||||||
|
}
|
||||||
|
.item button {
|
||||||
|
background-color: #9a6fa0;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
border-radius: 3px;
|
||||||
|
color:white;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 7px 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.item-button:hover {
|
||||||
|
background-color: #6a4664;
|
||||||
|
}
|
||||||
|
.item img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
.item
|
||||||
|
{
|
||||||
|
border: none;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
.home-button:hover,
|
||||||
|
.item button:hover {
|
||||||
|
background-color: #9a6fa0;
|
||||||
|
filter: brightness(1.1);
|
||||||
|
}
|
||||||
|
.home-button {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 30px auto 20px;
|
||||||
|
padding: 12px 25px;
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
gap: 10px;
|
||||||
|
margin: 20px auto;
|
||||||
|
padding: 20px;
|
||||||
|
max-width: 1200px;
|
||||||
|
}
|
||||||
|
.profile-gallery .card {
|
||||||
|
border-radius: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #6a4664;
|
||||||
|
text-align: center;
|
||||||
|
width: 240px;
|
||||||
|
height: 210px;
|
||||||
|
}
|
||||||
|
.profile-gallery .card img {
|
||||||
|
width: 100%;
|
||||||
|
height: 200px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
.profile-gallery .card .card-title {
|
||||||
|
margin: 10px;
|
||||||
|
font-size: 1rem;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.profile-art-card {
|
||||||
|
background-color: #4a3b52;
|
||||||
|
}
|
||||||
|
.profile-art-card:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
.profile-video-card {
|
||||||
|
background-color: #3b4a52;
|
||||||
|
}
|
||||||
|
.profile-video-card:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
.profile-comic-card {
|
||||||
|
background-color: #4b523b;
|
||||||
|
}
|
||||||
|
.profile-comic-card:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
.biotext {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
color:white;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background-color: #3f3242;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background-color: #845e80;
|
||||||
|
border-radius: 10px;
|
||||||
|
border: 2px solid #3f3242;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background-color: #9a6fa0;
|
||||||
|
}
|
||||||
|
.comment {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
background-color: #6a4664;
|
||||||
|
padding: 15px;
|
||||||
|
margin: 10px 0;
|
||||||
|
border-radius: 3px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.comment .avatar {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 15px;
|
||||||
|
object-fit: cover;
|
||||||
|
border: 2px solid #845e80;
|
||||||
|
}
|
||||||
|
input[type="checkbox"]:checked {
|
||||||
|
background-color: #6a4664;
|
||||||
|
accent-color: #6a4664;
|
||||||
|
}
|
||||||
|
.comment .content {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.comment .content p {
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
.comment .content p:first-child {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.comment .content p:last-child::before {
|
||||||
|
content: "\A";
|
||||||
|
white-space: pre;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.comment .content time {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.delete-button {
|
||||||
|
background-color: #845e80;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 5px 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 4px;
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
.delete-button:hover {
|
||||||
|
background-color: #9e728f;
|
||||||
|
}
|
||||||
|
.delete-button:active {
|
||||||
|
background-color: #6e4c65;
|
||||||
|
}
|
||||||
|
.details img {
|
||||||
|
max-width: 85%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
video {
|
||||||
|
max-width: 85%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
.comments-list {
|
||||||
|
max-height: none;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
.comments-list p {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.comment .content a.username-link {
|
||||||
|
color: #ffd700;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.comment .content a.username-link:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 481px) and (max-width: 767px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 8px 14px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 8px 20px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 25px 25px;
|
||||||
|
font-size: 20px
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-field {
|
||||||
|
padding: 15px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-button {
|
||||||
|
padding: 15px 45px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 25px 35px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.profile-gallery{
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 6px 6px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 6px 12px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 15px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
padding: 10px 12px;
|
||||||
|
}
|
||||||
|
.modal-button {
|
||||||
|
padding: 10px 30px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
.login-button {
|
||||||
|
width: 150px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*iphone 14 Plus*/
|
||||||
|
@media (max-width: 430px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 12px 5px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 12px 5px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 15px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
padding: 10px 30px;
|
||||||
|
}
|
||||||
|
.modal-button {
|
||||||
|
padding: 10px 30px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
.login-button {
|
||||||
|
width: 150px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*iphone 6/7/8 Plus*/
|
||||||
|
@media (max-width: 414px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 12px 5px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 12px 5px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 15px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
padding: 10px 12px;
|
||||||
|
}
|
||||||
|
.modal-button {
|
||||||
|
padding: 10px 30px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
.login-button {
|
||||||
|
width: 150px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*iphone pixel 3*/
|
||||||
|
@media (min-width: 403px) and (max-width: 450px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 12px 4px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 12px 5px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 15px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
padding: 10px 12px;
|
||||||
|
}
|
||||||
|
.modal-button {
|
||||||
|
padding: 10px 30px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
.login-button {
|
||||||
|
width: 150px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*iphone 12*/
|
||||||
|
@media (min-width: 382px) and (max-width: 402px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 12px 2px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 12px 5px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 15px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
padding: 10px 12px;
|
||||||
|
}
|
||||||
|
.modal-button {
|
||||||
|
padding: 10px 30px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
.login-button {
|
||||||
|
width: 150px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*iphone 6/7/8/X/XR*/
|
||||||
|
@media (min-width: 372px) and (max-width: 381px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 10px 1px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 10px 1px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 15px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
padding: 10px 12px;
|
||||||
|
}
|
||||||
|
.modal-button {
|
||||||
|
padding: 10px 30px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
.login-button {
|
||||||
|
width: 150px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*iphone 4/5/SE1*/
|
||||||
|
@media (min-width: 200px) and (max-width: 371px) {
|
||||||
|
.gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
nav .button {
|
||||||
|
padding: 1px 1px;
|
||||||
|
}
|
||||||
|
footer .button {
|
||||||
|
padding: 1px 1px;
|
||||||
|
}
|
||||||
|
nav {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.pagination .button {
|
||||||
|
padding: 15px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.input-field {
|
||||||
|
padding: 10px 1px;
|
||||||
|
}
|
||||||
|
.modal-button {
|
||||||
|
padding: 10x 30px;
|
||||||
|
}
|
||||||
|
.navigation .button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.profile-gallery {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
}
|
||||||
|
.-button {
|
||||||
|
padding: 15px 25px;
|
||||||
|
}
|
||||||
|
.login-button {
|
||||||
|
width: 150px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
3
static/navbar/discord-hover.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="52" height="42" viewBox="0 0 52 42" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M44.233 4.31574C40.8974 2.76494 37.2859 1.63935 33.5239 0.989014C33.4578 0.989953 33.3947 1.01693 33.3484 1.06405C32.8969 1.88948 32.3702 2.96504 32.0191 3.79047C28.0289 3.19053 23.9711 3.19053 19.9809 3.79047C19.6298 2.94003 19.1031 1.88948 18.6266 1.06405C18.6015 1.01403 18.5262 0.989014 18.451 0.989014C14.689 1.63935 11.1026 2.76494 7.74196 4.31574C7.71688 4.31574 7.6918 4.34075 7.66673 4.36577C0.845041 14.5461 -1.03594 24.4512 -0.107988 34.2563C-0.107988 34.3063 -0.0829088 34.3563 -0.0327494 34.3814C4.4816 37.6831 8.82039 39.6841 13.109 41.0098C13.1843 41.0348 13.2595 41.0098 13.2846 40.9598C14.2878 39.5841 15.1906 38.1333 15.9681 36.6075C16.0183 36.5075 15.9681 36.4074 15.8678 36.3824C14.4382 35.8321 13.0839 35.1818 11.7547 34.4314C11.6544 34.3814 11.6544 34.2313 11.7296 34.1562C12.0055 33.9561 12.2814 33.731 12.5573 33.5309C12.6074 33.4809 12.6827 33.4809 12.7328 33.5059C21.3603 37.4329 30.6648 37.4329 39.1919 33.5059C39.2421 33.4809 39.3173 33.4809 39.3675 33.5309C39.6434 33.756 39.9192 33.9561 40.1951 34.1813C40.2954 34.2563 40.2954 34.4064 40.17 34.4564C38.8659 35.2318 37.4865 35.8571 36.057 36.4074C35.9566 36.4324 35.9316 36.5575 35.9566 36.6325C36.7592 38.1583 37.6621 39.6091 38.6402 40.9848C38.7154 41.0098 38.7907 41.0348 38.8659 41.0098C43.1796 39.6841 47.5184 37.6831 52.0327 34.3814C52.0829 34.3563 52.108 34.3063 52.108 34.2563C53.2115 22.9254 50.2772 13.0953 44.3333 4.36577C44.3082 4.34075 44.2831 4.31574 44.233 4.31574ZM17.2723 28.2782C14.689 28.2782 12.5322 25.902 12.5322 22.9754C12.5322 20.0489 14.6389 17.6727 17.2723 17.6727C19.9307 17.6727 22.0374 20.0739 22.0123 22.9754C22.0123 25.902 19.9056 28.2782 17.2723 28.2782ZM34.7528 28.2782C32.1696 28.2782 30.0128 25.902 30.0128 22.9754C30.0128 20.0489 32.1194 17.6727 34.7528 17.6727C37.4113 17.6727 39.518 20.0739 39.4929 22.9754C39.4929 25.902 37.4113 28.2782 34.7528 28.2782Z" fill="#3C3882"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
3
static/navbar/discord-icon.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="52" height="42" viewBox="0 0 52 42" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M44.2327 4.31599C40.8971 2.76518 37.2856 1.6396 33.5237 0.989258C33.4575 0.990198 33.3944 1.01717 33.3481 1.0643C32.8967 1.88973 32.37 2.96528 32.0189 3.79071C28.0287 3.19078 23.9708 3.19078 19.9806 3.79071C19.6295 2.94027 19.1028 1.88973 18.6263 1.0643C18.6012 1.01427 18.526 0.989258 18.4508 0.989258C14.6888 1.6396 11.1024 2.76518 7.74172 4.31599C7.71664 4.31599 7.69156 4.341 7.66648 4.36601C0.844797 14.5463 -1.03618 24.4514 -0.108233 34.2565C-0.108233 34.3066 -0.083153 34.3566 -0.0329935 34.3816C4.48136 37.6833 8.82015 39.6844 13.1088 41.01C13.184 41.0351 13.2593 41.01 13.2843 40.96C14.2875 39.5843 15.1904 38.1336 15.9679 36.6078C16.018 36.5077 15.9679 36.4077 15.8675 36.3826C14.438 35.8324 13.0837 35.182 11.7545 34.4316C11.6542 34.3816 11.6542 34.2315 11.7294 34.1565C12.0053 33.9564 12.2811 33.7313 12.557 33.5312C12.6072 33.4811 12.6824 33.4811 12.7326 33.5061C21.36 37.4332 30.6646 37.4332 39.1917 33.5061C39.2418 33.4811 39.3171 33.4811 39.3672 33.5312C39.6431 33.7563 39.919 33.9564 40.1949 34.1815C40.2952 34.2565 40.2952 34.4066 40.1698 34.4566C38.8657 35.232 37.4863 35.8574 36.0567 36.4077C35.9564 36.4327 35.9313 36.5577 35.9564 36.6328C36.759 38.1586 37.6618 39.6093 38.6399 40.985C38.7152 41.01 38.7904 41.0351 38.8657 41.01C43.1794 39.6844 47.5182 37.6833 52.0325 34.3816C52.0827 34.3566 52.1077 34.3066 52.1077 34.2565C53.2113 22.9257 50.2769 13.0955 44.333 4.36601C44.3079 4.341 44.2829 4.31599 44.2327 4.31599ZM17.272 28.2784C14.6888 28.2784 12.5319 25.9022 12.5319 22.9757C12.5319 20.0492 14.6386 17.6729 17.272 17.6729C19.9305 17.6729 22.0372 20.0742 22.0121 22.9757C22.0121 25.9022 19.9054 28.2784 17.272 28.2784ZM34.7526 28.2784C32.1694 28.2784 30.0125 25.9022 30.0125 22.9757C30.0125 20.0492 32.1192 17.6729 34.7526 17.6729C37.411 17.6729 39.5177 20.0742 39.4926 22.9757C39.4926 25.9022 37.411 28.2784 34.7526 28.2784Z" fill="#8784C9"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
39
static/navbar/logo.svg
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<svg width="259" height="60" viewBox="0 0 259 60" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_2027_156)">
|
||||||
|
<path d="M0 29.2287C0 36.9806 3.11741 44.415 8.66643 49.8965C14.2155 55.3779 21.7415 58.4574 29.589 58.4574C37.4365 58.4574 44.9626 55.3779 50.5117 49.8965C56.0607 44.415 59.1781 36.9806 59.1781 29.2287C59.1781 21.4768 56.0607 14.0423 50.5117 8.56088C44.9626 3.07944 37.4365 0 29.589 0C21.7415 0 14.2155 3.07944 8.66643 8.56088C3.11741 14.0423 0 21.4768 0 29.2287Z" fill="#3C3882"/>
|
||||||
|
<path d="M32.9817 30.0844C38.9837 20.3425 32.56 14.1926 30.7762 12.702C30.3873 13.8164 30.2317 15.462 30.2317 15.462C25.2408 9.7737 16.2013 10.9507 16.2013 10.9507C15.3941 17.4136 17.9782 22.2645 17.9782 22.2645C17.9782 22.2645 16.1052 22.1668 14.8166 22.7903C17.9055 27.6744 24.0397 32.7986 32.9817 30.0844Z" fill="#77B255"/>
|
||||||
|
<path d="M47.2542 47.1245V44.623C47.2542 43.8368 47.9028 43.1936 48.6957 43.1936C49.4885 43.1936 50.1372 43.8368 50.1372 44.623V53.1996C50.1372 52.4134 49.4885 51.7702 48.6957 51.7702C47.9028 51.7702 47.2542 52.4134 47.2542 53.1996V57.8453C47.2542 58.7625 46.4974 59.513 45.5724 59.513C44.6474 59.513 43.8906 58.7625 43.8906 57.8453V47.1245C43.8906 46.2073 44.6474 45.4569 45.5724 45.4569C46.4974 45.4569 47.2542 46.2073 47.2542 47.1245Z" fill="#5751B3"/>
|
||||||
|
<path d="M29.088 15.3975C29.3517 15.6009 29.7035 15.6656 30.0336 15.5613C30.4296 15.4392 30.7081 15.094 30.7427 14.69C30.7402 14.6807 30.7791 14.3105 30.859 13.8143C33.2206 16.3675 35.9452 21.3052 31.7847 28.3507C23.4789 30.6781 18.3202 25.7345 15.9467 22.5002C16.5575 22.4048 17.1478 22.4 17.4096 22.414C17.7793 22.4339 18.135 22.2577 18.3314 21.9448C18.5338 21.6353 18.5462 21.2423 18.3756 20.9188C18.3533 20.8748 16.1695 16.665 16.6252 11.0316C18.8589 10.9167 25.2022 11.0137 28.9321 15.2549C28.9784 15.3123 29.0315 15.3579 29.088 15.3975ZM30.8952 11.027C30.6435 10.8303 30.3071 10.7665 29.9907 10.8471C29.6614 10.9362 29.4007 11.1816 29.2907 11.4961C29.1841 11.8047 29.0912 12.1445 29.0137 12.4852C23.6144 8.09633 15.9077 9.02766 15.5501 9.06946C15.0864 9.12997 14.7172 9.49464 14.6578 9.95531C14.0821 14.6271 15.1713 18.4637 15.9213 20.4389C15.2652 20.5165 14.5056 20.6771 13.842 21.0015C13.5787 21.1277 13.3898 21.3586 13.3063 21.641C13.2262 21.9174 13.2684 22.2157 13.4219 22.459C15.1095 25.1346 21.5041 33.6053 32.7613 30.1946C33.0033 30.1192 33.2128 29.9626 33.3357 29.7495C39.629 19.5441 33.0773 12.8594 30.9183 11.0557C30.9192 11.0405 30.9072 11.0337 30.8952 11.027Z" fill="#1F1D44"/>
|
||||||
|
<path d="M51.7396 40.1895C52.6663 40.1895 53.4246 40.9405 53.4246 41.8584V53.5408C53.4246 54.4587 52.6663 55.2098 51.7396 55.2098C50.8129 55.2098 50.0547 54.4587 50.0547 53.5408V41.8584C50.0547 40.9405 50.8129 40.1895 51.7396 40.1895Z" fill="#5751B3"/>
|
||||||
|
<path d="M29.5863 27.7301C22.374 16.414 29.7945 9.09092 31.8591 7.312C32.3351 8.61163 32.5471 10.5383 32.5471 10.5383C38.2961 3.78155 48.9154 5.00272 48.9154 5.00272C49.9782 12.5658 47.0359 18.2984 47.0359 18.2984C47.0359 18.2984 49.23 18.151 50.7521 18.8593C47.2184 24.6398 40.1189 30.7553 29.5863 27.7301Z" fill="#77B255"/>
|
||||||
|
<path d="M33.8871 10.4423C33.5816 10.6854 33.1704 10.7675 32.7814 10.651C32.315 10.5147 31.9822 10.115 31.9343 9.64191C31.9372 9.63097 31.8849 9.1976 31.7823 8.61726C29.0594 11.6521 25.954 17.4891 30.9586 25.6763C40.7385 28.259 46.6975 22.3724 49.4221 18.5387C48.7043 18.4377 48.0121 18.4424 47.7054 18.4635C47.2724 18.4933 46.8522 18.293 46.6162 17.9296C46.3733 17.5702 46.3517 17.1096 46.5459 16.7274C46.5713 16.6755 49.0559 11.7014 48.4202 5.10467C45.7992 5.00927 38.364 5.23445 34.0673 10.2723C34.0141 10.3405 33.9527 10.3948 33.8871 10.4423ZM31.6896 5.34996C31.9813 5.11499 32.3744 5.03421 32.7469 5.12318C33.1346 5.22186 33.4446 5.50497 33.5793 5.87178C33.7098 6.23171 33.8248 6.62853 33.9218 7.02659C40.173 1.78612 49.2253 2.74264 49.6453 2.78537C50.19 2.84817 50.6294 3.26922 50.7073 3.80828C51.4664 9.27545 50.2585 13.7927 49.4148 16.1216C50.1854 16.2011 51.0789 16.376 51.8627 16.7447C52.1737 16.888 52.3993 17.1555 52.5023 17.4851C52.6012 17.8078 52.557 18.1582 52.3815 18.4461C50.4511 21.6127 43.1064 31.6562 29.8469 27.8553C29.5618 27.771 29.3134 27.5911 29.1654 27.3434C21.6033 15.4891 29.1644 7.53668 31.663 5.38403C31.6618 5.36621 31.6757 5.35808 31.6896 5.34996Z" fill="#1F1D44"/>
|
||||||
|
<path d="M60 37.6319C60 45.548 53.5069 51.9621 45.4932 51.9621C37.4795 51.9621 30.9863 45.548 30.9863 37.6319C30.9863 29.7158 37.4795 23.3018 45.4932 23.3018C53.5069 23.3018 60 29.7158 60 37.6319Z" fill="#5751B3"/>
|
||||||
|
<path d="M35.918 38.4439C35.918 46.3601 29.4248 52.7741 21.4111 52.7741C13.3974 52.7741 6.9043 46.3601 6.9043 38.4439C6.9043 30.5278 13.3974 24.1138 21.4111 24.1138C29.4248 24.1138 35.918 30.5278 35.918 38.4439Z" fill="#5751B3"/>
|
||||||
|
<path d="M50.3013 58.3356C50.3013 58.777 50.4788 59.2003 50.7948 59.5125C51.1108 59.8246 51.5393 60 51.9862 60C52.4331 60 52.8616 59.8246 53.1776 59.5125C53.4936 59.2003 53.6711 58.777 53.6711 58.3356C53.6711 57.8941 53.4936 57.4708 53.1776 57.1586C52.8616 56.8465 52.4331 56.6711 51.9862 56.6711C51.5393 56.6711 51.1108 56.8465 50.7948 57.1586C50.4788 57.4708 50.3013 57.8941 50.3013 58.3356Z" fill="#5751B3"/>
|
||||||
|
<path d="M24.2718 45.8448V43.1505C24.2718 42.3037 24.2515 41.6915 25.1098 41.6915C25.9682 41.6915 26.0061 42.3037 26.0061 43.1505V52.3882C26.0061 51.5414 25.7674 50.8255 25.1509 50.8255C24.5345 50.8255 24.2718 51.5414 24.2718 52.3882V57.3919C24.2718 58.3799 23.4525 59.1882 22.4511 59.1882C21.4497 59.1882 20.6304 58.3799 20.6304 57.3919V45.8448C20.6304 44.8569 21.4497 44.0486 22.4511 44.0486C23.4525 44.0486 24.2718 44.8569 24.2718 45.8448Z" fill="#5751B3"/>
|
||||||
|
<path d="M27.8268 38.4033C28.8282 38.4033 29.6475 39.2116 29.6475 40.1995V52.7731C29.6475 53.761 28.8282 54.5693 27.8268 54.5693C26.8254 54.5693 26.0061 53.761 26.0061 52.7731V40.1995C26.0061 39.2116 26.8254 38.4033 27.8268 38.4033Z" fill="#5751B3"/>
|
||||||
|
<path d="M34.1094 36.1705C34.1094 44.0866 27.6163 50.5007 19.6026 50.5007C11.5889 50.5007 5.0957 44.0866 5.0957 36.1705C5.0957 28.2544 11.5889 21.8403 19.6026 21.8403C27.6163 21.8403 34.1094 28.2544 34.1094 36.1705Z" fill="#5751B3"/>
|
||||||
|
<path d="M19.0931 22.4493C11.8109 22.4493 5.88486 28.3032 5.88486 35.4967C5.88486 42.6902 11.8109 48.544 19.0931 48.544C26.3753 48.544 32.3013 42.6902 32.3013 35.4967C32.3013 28.3032 26.3753 22.4493 19.0931 22.4493ZM19.0931 51.1096C10.3807 51.1096 3.2876 44.111 3.2876 35.5048C3.2876 26.8985 10.3725 19.8999 19.0931 19.8999C27.8054 19.8999 34.8986 26.8985 34.8986 35.5048C34.8903 44.111 27.8054 51.1096 19.0931 51.1096Z" fill="#1F1D44"/>
|
||||||
|
<path d="M15.0837 24.852C15.7967 24.9053 16.3352 25.5155 16.2806 26.2279C16.2266 26.9323 15.7036 26.9265 14.8535 27.3185C12.931 28.2052 12.9009 28.5975 11.729 30.0162C11.2961 30.7167 11.0573 31.2525 10.336 31.1986C9.62302 31.1453 9.08515 30.527 9.13911 29.8226C9.71701 28.1966 12.4524 25.307 15.0837 24.852Z" fill="#8784C9"/>
|
||||||
|
<path d="M17.2603 25.0068C17.2603 25.3083 17.3815 25.5974 17.5973 25.8105C17.8131 26.0237 18.1058 26.1435 18.4109 26.1435C18.7161 26.1435 19.0088 26.0237 19.2246 25.8105C19.4404 25.5974 19.5616 25.3083 19.5616 25.0068C19.5616 24.7053 19.4404 24.4162 19.2246 24.203C19.0088 23.9899 18.7161 23.8701 18.4109 23.8701C18.1058 23.8701 17.8131 23.9899 17.5973 24.203C17.3815 24.4162 17.2603 24.7053 17.2603 25.0068Z" fill="#8784C9"/>
|
||||||
|
<path d="M58.4385 35.6021C58.4385 43.5183 51.9454 49.9323 43.9317 49.9323C35.918 49.9323 29.4248 43.5183 29.4248 35.6021C29.4248 27.686 35.918 21.272 43.9317 21.272C51.9454 21.272 58.4385 27.686 58.4385 35.6021Z" fill="#5751B3"/>
|
||||||
|
<path d="M40.152 25.0954C40.865 25.1487 41.4035 25.7589 41.349 26.4713C41.295 27.1757 40.772 27.1699 39.9219 27.5619C37.9994 28.4486 37.9693 28.8409 36.7973 30.2596C36.3645 30.9601 36.1256 31.4959 35.4044 31.442C34.6914 31.3887 34.1535 30.7704 34.2075 30.066C34.7854 28.44 37.5207 25.5504 40.152 25.0954Z" fill="#8784C9"/>
|
||||||
|
<path d="M43.3397 22.4493C36.0575 22.4493 30.1314 28.3032 30.1314 35.4967C30.1314 42.6902 36.0575 48.544 43.3397 48.544C50.6219 48.544 56.5479 42.6902 56.5479 35.4967C56.5479 28.3032 50.6219 22.4493 43.3397 22.4493ZM43.3397 51.1096C34.6273 51.1096 27.5342 44.111 27.5342 35.5048C27.5342 26.8985 34.6191 19.8999 43.3397 19.8999C52.052 19.8999 59.1451 26.8985 59.1451 35.5048C59.1369 44.111 52.052 51.1096 43.3397 51.1096Z" fill="#1F1D44"/>
|
||||||
|
<path d="M42.3286 25.2504C42.3286 25.5519 42.4498 25.841 42.6656 26.0542C42.8814 26.2674 43.1741 26.3871 43.4793 26.3871C43.7845 26.3871 44.0772 26.2674 44.293 26.0542C44.5088 25.841 44.63 25.5519 44.63 25.2504C44.63 24.949 44.5088 24.6599 44.293 24.4467C44.0772 24.2335 43.7845 24.1138 43.4793 24.1138C43.1741 24.1138 42.8814 24.2335 42.6656 24.4467C42.4498 24.6599 42.3286 24.949 42.3286 25.2504Z" fill="#8784C9"/>
|
||||||
|
<path d="M43.4119 36.6169L41.7834 39.8129M41.7834 39.8129L40.1548 43.0091M41.7834 39.8129L45.0188 41.4216M41.7834 39.8129L38.5479 38.2041" stroke="#1F1D44" stroke-width="2" stroke-linecap="round"/>
|
||||||
|
<path d="M17.1107 36.6169L15.4821 39.8129M15.4821 39.8129L13.8535 43.0091M15.4821 39.8129L18.7175 41.4216M15.4821 39.8129L12.2466 38.2041" stroke="#1F1D44" stroke-width="2" stroke-linecap="round"/>
|
||||||
|
</g>
|
||||||
|
<path d="M72.04 43C71.4642 43 70.9965 42.8678 70.6366 42.6033C70.3008 42.3389 70.0969 41.9903 70.0249 41.5576C69.9529 41.1008 70.0369 40.5959 70.2768 40.043L79.7764 18.9473C80.0882 18.2501 80.4601 17.7573 80.8919 17.4688C81.3476 17.1563 81.8634 17 82.4391 17C82.9909 17 83.4827 17.1563 83.9145 17.4688C84.3702 17.7573 84.7541 18.2501 85.0659 18.9473L94.6015 40.043C94.8654 40.5959 94.9613 41.1008 94.8893 41.5576C94.8174 42.0143 94.6135 42.3749 94.2776 42.6394C93.9418 42.8798 93.498 43 92.9463 43C92.2746 43 91.7468 42.8437 91.363 42.5312C91.0032 42.1946 90.6793 41.6898 90.3914 41.0166L88.0525 35.5714L89.9956 36.8336H74.8107L76.7538 35.5714L74.4509 41.0166C74.139 41.7138 73.8151 42.2187 73.4793 42.5312C73.1435 42.8437 72.6637 43 72.04 43ZM82.3672 22.301L77.3295 34.3093L76.3939 33.1553H88.4124L87.5128 34.3093L82.4391 22.301H82.3672Z" fill="#8784C9"/>
|
||||||
|
<path d="M100.868 43C100.124 43 99.5482 42.7957 99.1404 42.387C98.7566 41.9542 98.5647 41.3652 98.5647 40.62V19.6325C98.5647 18.8632 98.7686 18.2862 99.1764 17.9015C99.5842 17.4928 100.16 17.2885 100.904 17.2885H109.576C112.358 17.2885 114.505 17.9616 116.017 19.3079C117.528 20.6301 118.284 22.4933 118.284 24.8974C118.284 26.46 117.936 27.8063 117.24 28.9362C116.568 30.0661 115.585 30.9316 114.289 31.5326C112.994 32.1336 111.423 32.4341 109.576 32.4341L109.899 31.8932H111.087C112.07 31.8932 112.922 32.1336 113.642 32.6144C114.385 33.0952 115.033 33.8525 115.585 34.8863L118.284 39.8988C118.571 40.4036 118.703 40.8964 118.679 41.3773C118.655 41.8581 118.475 42.2547 118.14 42.5673C117.804 42.8558 117.312 43 116.664 43C116.017 43 115.489 42.8678 115.081 42.6033C114.673 42.3148 114.313 41.8821 114.002 41.3051L110.367 34.5978C109.935 33.7804 109.42 33.2395 108.82 32.975C108.244 32.6865 107.501 32.5423 106.589 32.5423H103.171V40.62C103.171 41.3652 102.979 41.9542 102.595 42.387C102.211 42.7957 101.635 43 100.868 43ZM103.171 29.1165H108.784C110.439 29.1165 111.687 28.7799 112.526 28.1068C113.39 27.4096 113.822 26.3759 113.822 25.0055C113.822 23.6593 113.39 22.6496 112.526 21.9764C111.687 21.2792 110.439 20.9307 108.784 20.9307H103.171V29.1165Z" fill="#8784C9"/>
|
||||||
|
<path d="M130.95 43C130.207 43 129.631 42.7957 129.223 42.387C128.839 41.9542 128.647 41.3652 128.647 40.62V21.147H121.631C121.007 21.147 120.515 20.9787 120.155 20.6422C119.819 20.2816 119.651 19.8007 119.651 19.1997C119.651 18.5747 119.819 18.1059 120.155 17.7933C120.515 17.4568 121.007 17.2885 121.631 17.2885H140.27C140.894 17.2885 141.373 17.4568 141.709 17.7933C142.069 18.1059 142.249 18.5747 142.249 19.1997C142.249 19.8007 142.069 20.2816 141.709 20.6422C141.373 20.9787 140.894 21.147 140.27 21.147H133.253V40.62C133.253 41.3652 133.061 41.9542 132.677 42.387C132.294 42.7957 131.718 43 130.95 43Z" fill="#8784C9"/>
|
||||||
|
<path d="M147.326 42.7115C146.534 42.7115 145.923 42.5072 145.491 42.0985C145.083 41.6657 144.879 41.0527 144.879 40.2594V19.7406C144.879 18.9473 145.083 18.3463 145.491 17.9376C145.923 17.5049 146.534 17.2885 147.326 17.2885H155.962C157.737 17.2885 159.248 17.5529 160.496 18.0818C161.743 18.6107 162.691 19.368 163.339 20.3537C164.01 21.3393 164.346 22.5173 164.346 23.8877C164.346 25.4263 163.902 26.7245 163.015 27.7822C162.127 28.84 160.916 29.5492 159.38 29.9098V29.3689C161.156 29.6334 162.535 30.3065 163.518 31.3884C164.502 32.4702 164.994 33.8766 164.994 35.6075C164.994 37.8673 164.226 39.6223 162.691 40.8724C161.18 42.0985 159.068 42.7115 156.358 42.7115H147.326ZM149.305 39.2136H155.782C157.413 39.2136 158.613 38.9011 159.38 38.276C160.148 37.6269 160.532 36.6653 160.532 35.3911C160.532 34.0929 160.148 33.1313 159.38 32.5062C158.613 31.8812 157.413 31.5687 155.782 31.5687H149.305V39.2136ZM149.305 28.0707H155.17C156.754 28.0707 157.929 27.7702 158.697 27.1692C159.488 26.5442 159.884 25.6306 159.884 24.4286C159.884 23.2265 159.488 22.325 158.697 21.724C157.929 21.0989 156.754 20.7864 155.17 20.7864H149.305V28.0707Z" fill="#8784C9"/>
|
||||||
|
<path d="M172.1 42.7115C171.308 42.7115 170.696 42.5072 170.264 42.0985C169.857 41.6657 169.653 41.0527 169.653 40.2594V19.7406C169.653 18.9473 169.857 18.3463 170.264 17.9376C170.696 17.5049 171.308 17.2885 172.1 17.2885H184.946C185.545 17.2885 186.001 17.4448 186.313 17.7573C186.649 18.0698 186.817 18.5146 186.817 19.0915C186.817 19.6926 186.649 20.1614 186.313 20.4979C186.001 20.8104 185.545 20.9667 184.946 20.9667H174.079V27.9626H184.154C184.778 27.9626 185.245 28.1188 185.557 28.4313C185.869 28.7439 186.025 29.2006 186.025 29.8017C186.025 30.4027 185.869 30.8595 185.557 31.172C185.245 31.4845 184.778 31.6408 184.154 31.6408H174.079V39.0333H184.946C185.545 39.0333 186.001 39.1896 186.313 39.5021C186.649 39.8146 186.817 40.2714 186.817 40.8724C186.817 41.4734 186.649 41.9302 186.313 42.2427C186.001 42.5553 185.545 42.7115 184.946 42.7115H172.1Z" fill="#8784C9"/>
|
||||||
|
<path d="M193.426 43C192.682 43 192.107 42.7957 191.699 42.387C191.315 41.9542 191.123 41.3652 191.123 40.62V19.6325C191.123 18.8632 191.327 18.2862 191.735 17.9015C192.143 17.4928 192.718 17.2885 193.462 17.2885H202.134C204.917 17.2885 207.064 17.9616 208.575 19.3079C210.086 20.6301 210.842 22.4933 210.842 24.8974C210.842 26.46 210.494 27.8063 209.799 28.9362C209.127 30.0661 208.143 30.9316 206.848 31.5326C205.552 32.1336 203.981 32.4341 202.134 32.4341L202.458 31.8932H203.645C204.629 31.8932 205.481 32.1336 206.2 32.6144C206.944 33.0952 207.592 33.8525 208.143 34.8863L210.842 39.8988C211.13 40.4036 211.262 40.8964 211.238 41.3773C211.214 41.8581 211.034 42.2547 210.698 42.5673C210.362 42.8558 209.87 43 209.223 43C208.575 43 208.047 42.8678 207.64 42.6033C207.232 42.3148 206.872 41.8821 206.56 41.3051L202.926 34.5978C202.494 33.7804 201.978 33.2395 201.378 32.975C200.803 32.6865 200.059 32.5423 199.147 32.5423H195.729V40.62C195.729 41.3652 195.537 41.9542 195.153 42.387C194.77 42.7957 194.194 43 193.426 43ZM195.729 29.1165H201.342C202.998 29.1165 204.245 28.7799 205.085 28.1068C205.948 27.4096 206.38 26.3759 206.38 25.0055C206.38 23.6593 205.948 22.6496 205.085 21.9764C204.245 21.2792 202.998 20.9307 201.342 20.9307H195.729V29.1165Z" fill="#8784C9"/>
|
||||||
|
<path d="M218.094 43C217.351 43 216.775 42.7957 216.367 42.387C215.983 41.9542 215.791 41.3652 215.791 40.62V19.6325C215.791 18.8632 215.995 18.2862 216.403 17.9015C216.811 17.4928 217.387 17.2885 218.13 17.2885H226.802C229.585 17.2885 231.732 17.9616 233.243 19.3079C234.755 20.6301 235.51 22.4933 235.51 24.8974C235.51 26.46 235.162 27.8063 234.467 28.9362C233.795 30.0661 232.811 30.9316 231.516 31.5326C230.221 32.1336 228.649 32.4341 226.802 32.4341L227.126 31.8932H228.314C229.297 31.8932 230.149 32.1336 230.868 32.6144C231.612 33.0952 232.26 33.8525 232.811 34.8863L235.51 39.8988C235.798 40.4036 235.93 40.8964 235.906 41.3773C235.882 41.8581 235.702 42.2547 235.366 42.5673C235.03 42.8558 234.539 43 233.891 43C233.243 43 232.716 42.8678 232.308 42.6033C231.9 42.3148 231.54 41.8821 231.228 41.3051L227.594 34.5978C227.162 33.7804 226.646 33.2395 226.047 32.975C225.471 32.6865 224.727 32.5423 223.816 32.5423H220.397V40.62C220.397 41.3652 220.205 41.9542 219.822 42.387C219.438 42.7957 218.862 43 218.094 43ZM220.397 29.1165H226.011C227.666 29.1165 228.913 28.7799 229.753 28.1068C230.617 27.4096 231.048 26.3759 231.048 25.0055C231.048 23.6593 230.617 22.6496 229.753 21.9764C228.913 21.2792 227.666 20.9307 226.011 20.9307H220.397V29.1165Z" fill="#8784C9"/>
|
||||||
|
<path d="M248.527 43C247.783 43 247.207 42.7957 246.799 42.387C246.416 41.9542 246.224 41.3532 246.224 40.5839V29.6214L247.195 32.3981L238.523 20.1734C238.211 19.7406 238.067 19.2839 238.091 18.8031C238.139 18.2982 238.343 17.8775 238.703 17.5409C239.063 17.1803 239.567 17 240.214 17C240.694 17 241.126 17.1202 241.51 17.3606C241.918 17.601 242.302 17.9736 242.661 18.4785L249.102 27.638H248.095L254.572 18.4785C254.956 17.9496 255.327 17.577 255.687 17.3606C256.047 17.1202 256.491 17 257.019 17C257.642 17 258.122 17.1683 258.458 17.5049C258.818 17.8174 258.998 18.2141 258.998 18.6949C259.022 19.1757 258.854 19.6805 258.494 20.2094L249.894 32.3981L250.83 29.6214V40.5839C250.83 42.1946 250.062 43 248.527 43Z" fill="#8784C9"/>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_2027_156">
|
||||||
|
<rect width="60" height="60" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 17 KiB |
3
static/navbar/search-hover.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M6.5 13C4.68333 13 3.146 12.3707 1.888 11.112C0.63 9.85333 0.000667196 8.316 5.29101e-07 6.5C-0.000666138 4.684 0.628667 3.14667 1.888 1.888C3.14733 0.629333 4.68467 0 6.5 0C8.31533 0 9.853 0.629333 11.113 1.888C12.373 3.14667 13.002 4.684 13 6.5C13 7.23333 12.8833 7.925 12.65 8.575C12.4167 9.225 12.1 9.8 11.7 10.3L17.3 15.9C17.4833 16.0833 17.575 16.3167 17.575 16.6C17.575 16.8833 17.4833 17.1167 17.3 17.3C17.1167 17.4833 16.8833 17.575 16.6 17.575C16.3167 17.575 16.0833 17.4833 15.9 17.3L10.3 11.7C9.8 12.1 9.225 12.4167 8.575 12.65C7.925 12.8833 7.23333 13 6.5 13ZM6.5 11C7.75 11 8.81267 10.5627 9.688 9.688C10.5633 8.81333 11.0007 7.75067 11 6.5C10.9993 5.24933 10.562 4.187 9.688 3.313C8.814 2.439 7.75133 2.00133 6.5 2C5.24867 1.99867 4.18633 2.43633 3.313 3.313C2.43967 4.18967 2.002 5.252 2 6.5C1.998 7.748 2.43567 8.81067 3.313 9.688C4.19033 10.5653 5.25267 11.0027 6.5 11Z" fill="#3C3882"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1018 B |
3
static/navbar/search-icon.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M6.5 13C4.68333 13 3.146 12.3707 1.888 11.112C0.63 9.85333 0.000667196 8.316 5.29101e-07 6.5C-0.000666138 4.684 0.628667 3.14667 1.888 1.888C3.14733 0.629333 4.68467 0 6.5 0C8.31533 0 9.853 0.629333 11.113 1.888C12.373 3.14667 13.002 4.684 13 6.5C13 7.23333 12.8833 7.925 12.65 8.575C12.4167 9.225 12.1 9.8 11.7 10.3L17.3 15.9C17.4833 16.0833 17.575 16.3167 17.575 16.6C17.575 16.8833 17.4833 17.1167 17.3 17.3C17.1167 17.4833 16.8833 17.575 16.6 17.575C16.3167 17.575 16.0833 17.4833 15.9 17.3L10.3 11.7C9.8 12.1 9.225 12.4167 8.575 12.65C7.925 12.8833 7.23333 13 6.5 13ZM6.5 11C7.75 11 8.81267 10.5627 9.688 9.688C10.5633 8.81333 11.0007 7.75067 11 6.5C10.9993 5.24933 10.562 4.187 9.688 3.313C8.814 2.439 7.75133 2.00133 6.5 2C5.24867 1.99867 4.18633 2.43633 3.313 3.313C2.43967 4.18967 2.002 5.252 2 6.5C1.998 7.748 2.43567 8.81067 3.313 9.688C4.19033 10.5653 5.25267 11.0027 6.5 11Z" fill="#8784C9"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1018 B |
3
static/navbar/translate-hover.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16.0988 0.703613V3.80463H13.2326C12.3258 3.80463 11.3246 4.24728 10.4872 5.0933C9.64978 5.93931 8.73978 7.19438 7.29503 9.25836C5.84377 11.3316 5.03558 12.5844 4.53158 13.1475C4.02758 13.7105 4.10865 13.6622 3.37512 13.6622H0.5V16.1265H3.37512C4.47642 16.1265 5.58412 15.6662 6.36703 14.7917C7.14995 13.9171 7.8889 12.7056 9.31273 10.6715C10.7431 8.62818 11.6524 7.41888 12.2379 6.82735C12.8234 6.23583 12.8486 6.26901 13.2327 6.26901H16.0988V9.5048L20.5 5.10483L16.0988 0.703613ZM0.5 3.80461V6.269H3.37512C4.10865 6.269 4.02758 6.21941 4.53158 6.78241C4.85585 7.14465 5.39003 7.91285 6.05642 8.881C6.14673 8.75145 6.1893 8.68898 6.28488 8.5524C6.64788 8.03383 6.9776 7.56595 7.28218 7.13923C7.38818 6.99073 7.47698 6.87358 7.57742 6.73491C7.12707 6.08426 6.752 5.56823 6.36703 5.1382C5.58412 4.26363 4.47642 3.80461 3.37512 3.80461H0.5ZM16.0988 10.4957V13.6621H13.2326C12.8486 13.6621 12.8234 13.6941 12.2379 13.1025C11.8506 12.7112 11.3021 12.0176 10.5744 11.0232C10.4864 11.148 10.4152 11.2468 10.3228 11.3787C9.81332 12.1066 9.46203 12.6318 9.09322 13.1757C9.61647 13.8686 10.0619 14.4069 10.4872 14.8365C11.3245 15.6826 12.3258 16.1265 13.2327 16.1265H16.0988V19.2968L20.5 14.8969L16.0988 10.4957Z" fill="#3C3882"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
3
static/navbar/translate-icon.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16.0988 0.703613V3.80463H13.2326C12.3258 3.80463 11.3246 4.24728 10.4872 5.0933C9.64978 5.93931 8.73978 7.19438 7.29503 9.25836C5.84377 11.3316 5.03558 12.5844 4.53158 13.1475C4.02758 13.7105 4.10865 13.6622 3.37512 13.6622H0.5V16.1265H3.37512C4.47642 16.1265 5.58412 15.6662 6.36703 14.7917C7.14995 13.9171 7.8889 12.7056 9.31273 10.6715C10.7431 8.62818 11.6524 7.41888 12.2379 6.82735C12.8234 6.23583 12.8486 6.26901 13.2327 6.26901H16.0988V9.5048L20.5 5.10483L16.0988 0.703613ZM0.5 3.80461V6.269H3.37512C4.10865 6.269 4.02758 6.21941 4.53158 6.78241C4.85585 7.14465 5.39003 7.91285 6.05642 8.881C6.14673 8.75145 6.1893 8.68898 6.28488 8.5524C6.64788 8.03383 6.9776 7.56595 7.28218 7.13923C7.38818 6.99073 7.47698 6.87358 7.57742 6.73491C7.12707 6.08426 6.752 5.56823 6.36703 5.1382C5.58412 4.26363 4.47642 3.80461 3.37512 3.80461H0.5ZM16.0988 10.4957V13.6621H13.2326C12.8486 13.6621 12.8234 13.6941 12.2379 13.1025C11.8506 12.7112 11.3021 12.0176 10.5744 11.0232C10.4864 11.148 10.4152 11.2468 10.3228 11.3787C9.81332 12.1066 9.46203 12.6318 9.09322 13.1757C9.61647 13.8686 10.0619 14.4069 10.4872 14.8365C11.3245 15.6826 12.3258 16.1265 13.2327 16.1265H16.0988V19.2968L20.5 14.8969L16.0988 10.4957Z" fill="#8784C9"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
3
static/navbar/tray-icon.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5 5.5L0.23686 0.25L9.76314 0.250001L5 5.5Z" fill="#8784C9"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 172 B |
3
static/navbar/video-icon.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="34" height="24" viewBox="0 0 34 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M33.6562 2.96875V20.9062C33.6562 21.5859 33.3863 22.2376 32.9057 22.7182C32.4251 23.1988 31.7734 23.4688 31.0938 23.4688H2.90625C2.22663 23.4688 1.57485 23.1988 1.09429 22.7182C0.613727 22.2376 0.34375 21.5859 0.34375 20.9062V2.96875C0.34375 2.28913 0.613727 1.63735 1.09429 1.15679C1.57485 0.676227 2.22663 0.40625 2.90625 0.40625H31.0938C31.7734 0.40625 32.4251 0.676227 32.9057 1.15679C33.3863 1.63735 33.6562 2.28913 33.6562 2.96875ZM22.7656 11.9375C22.7656 11.7316 22.7159 11.5288 22.6208 11.3462C22.5258 11.1636 22.3881 11.0066 22.2195 10.8885L15.8132 6.4041C15.6213 6.26962 15.3961 6.19038 15.1622 6.175C14.9283 6.15961 14.6947 6.20868 14.4868 6.31686C14.2789 6.42503 14.1046 6.58817 13.9829 6.78852C13.8613 6.98886 13.7969 7.21874 13.7969 7.45312V16.4219C13.7969 16.6563 13.8613 16.8861 13.9829 17.0865C14.1046 17.2868 14.2789 17.45 14.4868 17.5581C14.6947 17.6663 14.9283 17.7154 15.1622 17.7C15.3961 17.6846 15.6213 17.6054 15.8132 17.4709L22.2195 12.9865C22.3881 12.8684 22.5258 12.7114 22.6208 12.5288C22.7159 12.3462 22.7656 12.1434 22.7656 11.9375Z" fill="#8784C9"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
29
templates/auth.html
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{% block title %}{{ title }}{% endblock %}</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title"><a href="{{url_for('index')}}" style="color:white;">🫐artberry🫐</a></h1>
|
||||||
|
<h2 class="{% if title == 'Login' %}login-title{% else %}register-title{% endif %}">{{ title }}</h2>
|
||||||
|
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
|
||||||
|
<div class="link-container">
|
||||||
|
{% if title == 'Register' %}
|
||||||
|
<span class="link-text">Already have an account?</span>
|
||||||
|
<a href="{{ url_for('login') }}" class="button">Login</a>
|
||||||
|
{% elif title == 'Login' %}
|
||||||
|
<span class="link-text">Don't have an account?</span>
|
||||||
|
<a href="{{ url_for('register') }}" class="button">Register</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
79
templates/card.html
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Navbar</title>
|
||||||
|
<head>
|
||||||
|
<body>
|
||||||
|
{% include 'navbar.html' %}
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
background-color: #05040A;
|
||||||
|
}
|
||||||
|
@import url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap');
|
||||||
|
.card {
|
||||||
|
width: 353px;
|
||||||
|
height: auto;
|
||||||
|
position: absolute;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
font-family: Nunito, sans-serif;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
.card-cover {
|
||||||
|
width: 353px;
|
||||||
|
height: 180px;
|
||||||
|
background: #1D1C2E;
|
||||||
|
}
|
||||||
|
.card-info {
|
||||||
|
width: 353px;
|
||||||
|
height: 59px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
.card-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.card-stats {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
.stat {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
.card-text {
|
||||||
|
font-family: 'Nunito';
|
||||||
|
font-size: 14px;
|
||||||
|
color: #8784C9;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-cover"></div>
|
||||||
|
<div class="card-info">
|
||||||
|
<div class="card-header">
|
||||||
|
<span class="card-title" style="color: #3C3882;">Netwide Assembler</span>
|
||||||
|
<div class="card-stats">
|
||||||
|
<div class="stat">
|
||||||
|
<img src="{{ url_for('static', filename='card/like-icon.svg') }}" alt="Лайк" width="20" height="20">
|
||||||
|
<span style="color: #8784C9;">1344</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat">
|
||||||
|
<img src="{{ url_for('static', filename='card/views-icon.svg') }}" alt="Просмотры" width="20" height="20">
|
||||||
|
<span style="color: #8784C9;">321132</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="card-text" style="font-family: Nunito, sans-serif;">The Netwide Assembler, NASM, is an 80x86 and x86-64 assembler designed for portability and
|
||||||
|
modularity. It supports a range of object file formats, including Linux and *BSD a.out, ELF, Mach-O,
|
||||||
|
16-bit and 32-bit .obj (OMF) format, COFF (including its Win32 and Win64 variants.)</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</head>
|
||||||
|
</html>
|
52
templates/comic_edit.html
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@400;500;700&display=swap">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/comic_edit.css') }}">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
<title>🫐comic edit - artberry🫐</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Edit Comic: {{ comic.name }}</h1>
|
||||||
|
<form class="upload-form" method="POST" action="{{ url_for('comic_edit', comic_id=comic.id) }}" enctype="multipart/form-data">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<h2>Add a New Page:</h2>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="new_page">Select a File:</label>
|
||||||
|
<input type="file" name="new_page" accept="image/*" required class="file-input">
|
||||||
|
</div>
|
||||||
|
<button type="submit" name="action" value="add">Add Page</button>
|
||||||
|
</form>
|
||||||
|
<div class="page-controls">
|
||||||
|
<h2>Existing Pages:</h2>
|
||||||
|
<ul>
|
||||||
|
{% for page in comic_pages %}
|
||||||
|
<li>
|
||||||
|
<img src="{{ url_for('static', filename='comics/' + comic.name + '/' + page) }}" alt="Comic Page {{ loop.index }}">
|
||||||
|
<h3>Page {{ loop.index }}</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<form method="POST" action="{{ url_for('comic_edit', comic_id=comic.id) }}" class="form-group">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<input type="hidden" name="page" value="{{ page }}">
|
||||||
|
<button type="submit" name="action" value="delete">Delete</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<form method="POST" action="{{ url_for('comic_edit', comic_id=comic.id) }}" enctype="multipart/form-data" class="form-group">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<label for="new_page_update">Replace with:</label>
|
||||||
|
<input type="file" name="new_page" accept="image/*" required class="file-input">
|
||||||
|
<button type="submit" name="action" value="update">Replace</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<a href="{{ url_for('comics') }}" class="back-link">Return to Comics List</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
59
templates/comic_upload.html
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>🫐comic upload - artberry🫐</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/comic_upload.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@400&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Upload Comic</h1>
|
||||||
|
<form class="upload-comic-form" method="POST" action="{{ url_for('comic_upload') }}" enctype="multipart/form-data">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="title">Comic Name:</label>
|
||||||
|
<input type="text" name="title" class="input-field" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="thumbnail">Thumbnail:</label>
|
||||||
|
<input type="file" name="thumbnail" class="file-input" accept="image/*" required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tags">Tags:</label>
|
||||||
|
<input type="text" name="tags" class="input-field" placeholder="Enter tags, separated by commas">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="pages">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Page 1:</label>
|
||||||
|
<input type="file" name="pages[]" class="file-input" accept="image/*" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="button" type="button" onclick="addPage()">Add Page:</button>
|
||||||
|
<button type="submit" class="button">Upload Comic:</button>
|
||||||
|
</form>
|
||||||
|
<script>
|
||||||
|
let pageCount = 1;
|
||||||
|
const maxPages = 64;
|
||||||
|
|
||||||
|
function addPage() {
|
||||||
|
if (pageCount >= maxPages) {
|
||||||
|
alert(`You cant add more than ${maxPages} pages!`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pageCount++;
|
||||||
|
const newPage = document.createElement("div");
|
||||||
|
newPage.classList.add("form-group");
|
||||||
|
newPage.innerHTML = `<label>Page ${pageCount}:</label><input type="file" name="pages[]" class="file-input" accept="image/*" required>`;
|
||||||
|
document.getElementById("pages").appendChild(newPage);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
21
templates/comics.html
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
{% extends "content.html" %}
|
||||||
|
|
||||||
|
{% block title %}🫐comics - artberry🫐{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<section class="gallery">
|
||||||
|
{% for comic in comics %}
|
||||||
|
<div class="card comic-card">
|
||||||
|
<a href="{{ url_for('view', content_type='comic', id=comic.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='comicthumbs/' + comic.comic_thumbnail_file) }}" alt="Comic Thumbnail">
|
||||||
|
</a>
|
||||||
|
<p>{{ comic.name }}</p>
|
||||||
|
<p>{{ comic.cookie_votes }} 🍪</p>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p>No comics found</p>
|
||||||
|
{% endfor %}
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
240
templates/content.html
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{% block title %}🫐artberry🫐{% endblock %}</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
{% if extra_css %}
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename=extra_css) }}">
|
||||||
|
{% endif %}
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<nav class="nav">
|
||||||
|
<div class="nav-buttons">
|
||||||
|
{% if content_type == 'art' %}
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<a href="{{ url_for('upload') }}" class="button">Upload</a>
|
||||||
|
{% endif %}
|
||||||
|
<a href="{{ url_for('videos') }}" class="button">Videos</a>
|
||||||
|
<a href="{{ url_for('comics') }}" class="button">Comics</a>
|
||||||
|
{% elif content_type == 'video' %}
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<a href="{{ url_for('upload_video') }}" class="button">Upload</a>
|
||||||
|
{% endif %}
|
||||||
|
<a href="{{ url_for('index') }}" class="button">Arts</a>
|
||||||
|
<a href="{{ url_for('comics') }}" class="button">Comics</a>
|
||||||
|
{% elif content_type == 'comic' %}
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<a href="{{ url_for('comic_upload') }}" class="button">Upload</a>
|
||||||
|
{% endif %}
|
||||||
|
<a href="{{ url_for('index') }}" class="button">Arts</a>
|
||||||
|
<a href="{{ url_for('videos') }}" class="button">Videos</a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<a href="{{ url_for('logout') }}" class="button">Logout</a>
|
||||||
|
<a href="{{ url_for('shop') }}" class="button">{{ user_cookies }} 🍪</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ url_for('register') }}" class="button">Register</a>
|
||||||
|
<a href="{{ url_for('login') }}" class="button">Login</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<header class="header">
|
||||||
|
<h1 class="title"><a href="{{url_for('index')}}" style="color:white;">🫐artberry🫐</a></h1>
|
||||||
|
<form method="GET"
|
||||||
|
action="{{ search_url if search_url else url_for(request.endpoint, pub_type=pub_type, username=username) }}"
|
||||||
|
class="search-form">
|
||||||
|
<input type="text" name="search" id="search-input" placeholder="Search by tags"
|
||||||
|
class="input-field search-field" autocomplete="off">
|
||||||
|
<button type="submit" class="button search-button">Search</button>
|
||||||
|
</form>
|
||||||
|
<div id="autocomplete-suggestions" class="autocomplete-suggestions"></div>
|
||||||
|
</form>
|
||||||
|
</header>
|
||||||
|
<section class="content" id="content">
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
{% if content_type == 'art' or content_type == 'video' or content_type == 'comic' %}
|
||||||
|
<div class="{{ content_type }}-details">
|
||||||
|
<h2>{{ content.title }}</h2>
|
||||||
|
{% if content_type == 'art' %}
|
||||||
|
<img src="{{ url_for('static', filename='uploads/' + content.filename) }}" alt="{{ content.title }}"
|
||||||
|
class="art-image" loading="lazy" width="800" height="600">
|
||||||
|
{% elif content_type == 'video' %}
|
||||||
|
<video controls class="video-player">
|
||||||
|
<source src="{{ url_for('static', filename='uploads/videos/' + content.filename) }}" type="video/mp4">
|
||||||
|
Your browser does not support the video tag.
|
||||||
|
</video>
|
||||||
|
{% elif content_type == 'comic' %}
|
||||||
|
<div class="comic-pages">
|
||||||
|
{% for page in content.pages %}
|
||||||
|
<img src="{{ url_for('static', filename='uploads/comics/' + content.name + '/' + page) }}"
|
||||||
|
alt="Comic Page {{ loop.index }}" class="comic-page">
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<p>Uploaded by: <a href="{{ url_for('profile', username=content.username) }}">{{ content.username }}</a></p>
|
||||||
|
<p>Description: {{ content.description }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="vote-section">
|
||||||
|
<p>Votes: {{ content.cookie_votes }} 🍪</p>
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<form action="{{ url_for('vote_content', content_type=content_type, content_id=content.id) }}"
|
||||||
|
method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="button">Vote</button>
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<p>You need to <a href="{{ url_for('login') }}">log in</a> to vote.</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
<p>Unknown content type.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="comments-section">
|
||||||
|
<h3>Comments</h3>
|
||||||
|
{% if comments %}
|
||||||
|
<ul class="comments-list">
|
||||||
|
{% for comment in comments %}
|
||||||
|
<li>
|
||||||
|
<img src="{{ url_for('static', filename='avatars/' + avatars[comment.username]) }}" alt="Avatar"
|
||||||
|
class="comment-avatar">
|
||||||
|
<strong>{{ comment.username }}</strong>: {{ comment.comment_text }}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>No comments yet. Be the first to comment!</p>
|
||||||
|
{% endif %}
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<form method="POST" class="comment-form">
|
||||||
|
<textarea name="comment" placeholder="Write your comment..." maxlength="44" required
|
||||||
|
class="input-textarea"></textarea>
|
||||||
|
<button type="submit" class="button">Post Comment</button>
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<p>You need to <a href="{{ url_for('login') }}">log in</a> to comment.</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{% if pagination %}
|
||||||
|
<div class="pagination">
|
||||||
|
{% if pagination.has_prev %}
|
||||||
|
<a href="{{ url_for(request.endpoint, page=pagination.prev_num, search=request.args.get('search')) }}"
|
||||||
|
class="button">«</a>
|
||||||
|
{% endif %}
|
||||||
|
{% for page in pagination.iter_pages() %}
|
||||||
|
{% if page %}
|
||||||
|
<a href="{{ url_for(request.endpoint, page=page, search=request.args.get('search')) }}" class="button"
|
||||||
|
style="{% if page == pagination.page %}color: yellow;{% endif %}">
|
||||||
|
{{ page }}
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if pagination.has_next %}
|
||||||
|
<a href="{{ url_for(request.endpoint, page=pagination.next_num, search=request.args.get('search')) }}"
|
||||||
|
class="button">»</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<p>
|
||||||
|
<a href="{{ url_for('privacy_policy') }}" class="button">Privacy</a>
|
||||||
|
<a href="{{ url_for('terms_of_use') }}" class="button">TOS</a>
|
||||||
|
<a href="{{ url_for('publication_rules') }}" class="button">Pub Rules</a>
|
||||||
|
<a href="https://discord.gg/yRFyPjceWj" target="_blank" class="button" rel="noopener noreferrer">Discord</a>
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<div class="modal-overlay" id="ageVerificationModal">
|
||||||
|
<div class="modal-content">
|
||||||
|
<p>By clicking "Yes", you agree that you are of legal age according to your state/city/province/country.</p>
|
||||||
|
<div class="modal-buttons">
|
||||||
|
<button class="modal-button" id="yesButton">Yes</button>
|
||||||
|
<button class="modal-button cancel" id="noButton">No</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var modal = document.getElementById('ageVerificationModal');
|
||||||
|
var body = document.body;
|
||||||
|
var content = document.getElementById('content');
|
||||||
|
|
||||||
|
if (document.cookie.indexOf('ageVerified=true') !== -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
modal.style.display = 'flex';
|
||||||
|
content.classList.add('blur');
|
||||||
|
|
||||||
|
document.getElementById('yesButton').addEventListener('click', function () {
|
||||||
|
modal.style.display = 'none';
|
||||||
|
content.classList.remove('blur');
|
||||||
|
document.cookie = "ageVerified=true; path=/; max-age=31536000";
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
document.getElementById('noButton').addEventListener('click', function () {
|
||||||
|
window.location.href = 'https://www.google.com/search?q=cats';
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
document.getElementById('search-input').addEventListener('input', function () {
|
||||||
|
var query = this.value;
|
||||||
|
|
||||||
|
if (query.length < 2) {
|
||||||
|
document.getElementById('autocomplete-suggestions').innerHTML = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch(`/autocomplete?search=${encodeURIComponent(query)}`)
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
var suggestionsContainer = document.getElementById('autocomplete-suggestions');
|
||||||
|
suggestionsContainer.innerHTML = '';
|
||||||
|
|
||||||
|
if (data.length > 0) {
|
||||||
|
data.forEach(function (suggestion) {
|
||||||
|
var suggestionElement = document.createElement('div');
|
||||||
|
suggestionElement.classList.add('suggestion-item');
|
||||||
|
suggestionElement.textContent = suggestion;
|
||||||
|
suggestionElement.addEventListener('click', function () {
|
||||||
|
var searchInput = document.getElementById('search-input');
|
||||||
|
var currentValue = searchInput.value;
|
||||||
|
|
||||||
|
var tags = currentValue.split(',').map(tag => tag.trim());
|
||||||
|
tags[tags.length - 1] = suggestion;
|
||||||
|
|
||||||
|
searchInput.value = tags.join(', ');
|
||||||
|
|
||||||
|
suggestionsContainer.innerHTML = '';
|
||||||
|
});
|
||||||
|
suggestionsContainer.appendChild(suggestionElement);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => console.error('Error fetching autocomplete data:', error));
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
16
templates/error.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Error {{ error_code }}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Error {{ error_code }}</h1>
|
||||||
|
<p class="error-message">{{ error_message }}</p>
|
||||||
|
<p>:(</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
29
templates/image_edit.html
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>🫐Edit tags - artberry🫐</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h2>Edit image tags:</h2>
|
||||||
|
|
||||||
|
<div class="image-preview">
|
||||||
|
<img src="{{ image_preview_url }}" alt="Image preview" width="300">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('image_edit', id=image.id) }}">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tags">Tags</label>
|
||||||
|
{{ form.tags(class="input-field") }}
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="button">{{ form.submit.label }}</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<a href="{{ url_for('view', content_type='art', id=image.id) }}" class="button">Cancel</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
16
templates/index.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{% extends "content.html" %}
|
||||||
|
|
||||||
|
{% block title %}🫐arts - artberry🫐{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<section class="gallery">
|
||||||
|
{% for image in images %}
|
||||||
|
<div class="card">
|
||||||
|
<a href="{{ url_for('view', content_type='art', id=image.id) }}" class="card-link">
|
||||||
|
<img src="{{ url_for('static', filename='arts/' + image.image_file) }}" alt="Art Image" class="art-image">
|
||||||
|
<p>{{ image.cookie_votes }} 🍪</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
35
templates/login.html
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{% extends "auth.html" %}
|
||||||
|
{% block title %}🫐login - artberry🫐{% endblock %}
|
||||||
|
{% set action = 'login' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<form method="POST" action="{{ url_for(action) }}">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
|
||||||
|
{% for field, errors in form.errors.items() %}
|
||||||
|
<ul>
|
||||||
|
{% for error in errors %}
|
||||||
|
<li><strong>{{ field.label }}:</strong> {{ error }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<label for="{{ form.username.id }}">{{ form.username.label.text }}</label>
|
||||||
|
{{ form.username(class="input-field", placeholder="Enter username") }}<br>
|
||||||
|
|
||||||
|
<label for="{{ form.password.id }}">{{ form.password.label.text }}</label>
|
||||||
|
{{ form.password(class="input-field", placeholder="Enter password") }}<br>
|
||||||
|
|
||||||
|
<div class="recaptcha-container">
|
||||||
|
{{ form.recaptcha.label }}
|
||||||
|
{{ form.recaptcha() }}<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ form.submit(class="login-button button", value="Login") }}
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="link-container">
|
||||||
|
<span class="link-text">Don't have an account?</span>
|
||||||
|
<a href="{{ url_for('register') }}" class="button">Register</a>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
308
templates/navbar.html
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Navbar</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="navbar">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/logo.svg') }}" alt="Логотип" class="logo">
|
||||||
|
<div class="search-container">
|
||||||
|
<div class="search-icon-container">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/search-icon.svg') }}" alt="Поиск" class="search-icon">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/search-hover.svg') }}" alt="Поиск (hover)"
|
||||||
|
class="search-hover-icon">
|
||||||
|
</div>
|
||||||
|
<input type="text" placeholder="Поиск" class="search-input" onfocus="this.placeholder=''" onblur="this.placeholder='Поиск'">
|
||||||
|
<div class="icon-container">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/video-icon.svg') }}" alt="Видео" class="video-icon">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/tray-icon.svg') }}" alt="Поднос" class="tray-icon">
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<div class="dropdown-item">Пункт 1</div>
|
||||||
|
<div class="dropdown-item">Пункт 2</div>
|
||||||
|
<div class="dropdown-item">Пункт 3</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="translate-btn">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/translate-icon.svg') }}" alt="Перевод"
|
||||||
|
class="translate-icon">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/translate-hover.svg') }}" alt="Перевод (hover)"
|
||||||
|
class="translate-hover-icon">
|
||||||
|
</div>
|
||||||
|
<nav class="menu">
|
||||||
|
<a href="#">ВИДЕО</a>
|
||||||
|
<a href="#">АРТЫ</a>
|
||||||
|
<a href="#">МАНГА</a>
|
||||||
|
<a href="#">ГИФКИ</a>
|
||||||
|
</nav>
|
||||||
|
<div class="auth-container">
|
||||||
|
<div class="discord-icon-container">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/discord-icon.svg') }}" alt="Discord"
|
||||||
|
class="discord-icon">
|
||||||
|
<img src="{{ url_for('static', filename='navbar/discord-hover.svg') }}" alt="Discord Hover"
|
||||||
|
class="discord-hover-icon">
|
||||||
|
</div>
|
||||||
|
<button class="login-btn">ВОЙТИ</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
@import url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap');
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #05040A;
|
||||||
|
}
|
||||||
|
.navbar {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 1500px;
|
||||||
|
height: 120px;
|
||||||
|
background: #05040A;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 20px;
|
||||||
|
gap: 20px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
width: 307px;
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
.search-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 452.5px;
|
||||||
|
height: 27px;
|
||||||
|
border: 1px solid #8784C9;
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 15px;
|
||||||
|
background: #05040A;
|
||||||
|
position: relative;
|
||||||
|
transition: border-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.search-icon-container {
|
||||||
|
position: relative;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.search-icon,
|
||||||
|
.search-hover-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
.search-hover-icon {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.search-container:hover .search-hover-icon,
|
||||||
|
.search-container:focus-within .search-hover-icon {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-container:hover .search-icon,
|
||||||
|
.search-container:focus-within .search-icon {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-input {
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
flex-grow: 1;
|
||||||
|
font-size: 16px;
|
||||||
|
height: 24px;
|
||||||
|
color: #8784C9;
|
||||||
|
background-color: #05040A;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-container:hover {
|
||||||
|
border-color: #3C3882;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-container:focus-within {
|
||||||
|
border-color: #3C3882;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.video-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
.tray-icon {
|
||||||
|
width: 11px;
|
||||||
|
height: 7px;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
.translate-btn {
|
||||||
|
position: relative;
|
||||||
|
width: 23px;
|
||||||
|
height: 27px;
|
||||||
|
border: 1px solid #8784C9;
|
||||||
|
border-radius: 10px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: #05040A;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 15px;
|
||||||
|
transition: border-color 0.3s ease, transform 0.3s ease, opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
.translate-icon,
|
||||||
|
.translate-hover-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
.translate-hover-icon {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.translate-btn:hover .translate-hover-icon {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.translate-btn:hover .translate-icon {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.translate-btn:hover {
|
||||||
|
border-color: #3C3882;
|
||||||
|
}
|
||||||
|
.overlay-icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
.menu {
|
||||||
|
display: flex;
|
||||||
|
font-family: Nunito, sans-serif;
|
||||||
|
gap: 22px;
|
||||||
|
width: 519.5px;
|
||||||
|
height: 22px;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding-left: 60px;
|
||||||
|
padding-right: 60px;
|
||||||
|
}
|
||||||
|
.menu a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #8784C9;
|
||||||
|
font-size: 16px;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
.menu a:hover {
|
||||||
|
color: #3C3882;
|
||||||
|
}
|
||||||
|
.auth-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.discord-icon-container {
|
||||||
|
position: relative;
|
||||||
|
width: 42px;
|
||||||
|
height: 42px;
|
||||||
|
}
|
||||||
|
.discord-icon,
|
||||||
|
.discord-hover-icon {
|
||||||
|
width: 42px;
|
||||||
|
height: 42px;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
.discord-hover-icon {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.discord-icon-container:hover .discord-hover-icon {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.discord-icon-container:hover .discord-icon {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.login-btn {
|
||||||
|
width: 87px;
|
||||||
|
height: 42px;
|
||||||
|
border-radius: 20px;
|
||||||
|
background: #8784C9;
|
||||||
|
border: 1px solid #8784C9;
|
||||||
|
padding: 10px 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-family: Nunito, sans-serif;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 21.82px;
|
||||||
|
letter-spacing: 0%;
|
||||||
|
color: #05040A;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-left: 10px;
|
||||||
|
transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.login-btn:hover {
|
||||||
|
background-color: #3C3882;
|
||||||
|
color: #05040A;
|
||||||
|
border-color: #3C3882;
|
||||||
|
}
|
||||||
|
.dropdown-menu {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
right: 0;
|
||||||
|
background: #05040A;
|
||||||
|
border: 1px solid #3C3882;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||||
|
display: none;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 150px;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
.dropdown-item {
|
||||||
|
padding: 10px 15px;
|
||||||
|
font-size: 14px;
|
||||||
|
border-radius:4px;
|
||||||
|
color: #8784C9;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background 0.3s ease, color 0.3s ease;
|
||||||
|
}
|
||||||
|
.dropdown-item:hover {
|
||||||
|
background: #3C3882;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const iconContainer = document.querySelector('.icon-container');
|
||||||
|
const dropdownMenu = document.querySelector('.dropdown-menu');
|
||||||
|
|
||||||
|
iconContainer.addEventListener('click', function (event) {
|
||||||
|
dropdownMenu.style.display = dropdownMenu.style.display === 'block' ? 'none' : 'block';
|
||||||
|
event.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('click', function () {
|
||||||
|
dropdownMenu.style.display = 'none';
|
||||||
|
});
|
||||||
|
|
||||||
|
dropdownMenu.addEventListener('click', function (event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
164
templates/panel.html
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Админ Панель</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Админ Панель</h1>
|
||||||
|
<h2>Управление Артами</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Файл</th>
|
||||||
|
<th>Пользователь</th>
|
||||||
|
<th>Теги</th>
|
||||||
|
<th>Действия</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for art in arts %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ art.id }}</td>
|
||||||
|
<td>{{ art.image_file }}</td>
|
||||||
|
<td>{{ art.username }}</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_update_tags', content_type='art', content_id=art.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="text" name="tags" value="{{ art.tags }}">
|
||||||
|
<button type="submit">Обновить</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_delete_content', content_type='art', content_id=art.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" onclick="return confirm('Вы уверены, что хотите удалить этот арт?')">Удалить</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<h2>Управление Комментариями</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Текст комментария</th>
|
||||||
|
<th>Пользователь</th>
|
||||||
|
<th>Дата</th>
|
||||||
|
<th>Действия</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for comment in comments %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ comment.id }}</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_update_comment', comment_id=comment.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<textarea name="comment_text">{{ comment.comment_text }}</textarea>
|
||||||
|
<button type="submit">Обновить</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
<td>{{ comment.username }}</td>
|
||||||
|
<td>{{ comment.comment_date }}</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_delete_comment', comment_id=comment.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" onclick="return confirm('Вы уверены, что хотите удалить этот комментарий?')">Удалить</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<h2>Управление Видео</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Название</th>
|
||||||
|
<th>Пользователь</th>
|
||||||
|
<th>Теги</th>
|
||||||
|
<th>Описание</th>
|
||||||
|
<th>Действия</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for video in videos %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ video.id }}</td>
|
||||||
|
<td>{{ video.video_name }}</td>
|
||||||
|
<td>{{ video.username }}</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_update_video', content_id=video.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="text" name="tags" value="{{ video.tags }}">
|
||||||
|
<button type="submit">Обновить теги</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_update_video', content_id=video.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="text" name="video_name" value="{{ video.video_name }}" placeholder="Новое название">
|
||||||
|
<textarea name="description" placeholder="Новое описание">{{ video.description }}</textarea>
|
||||||
|
<button type="submit">Обновить видео</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_delete_content', content_type='video', content_id=video.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" onclick="return confirm('Вы уверены, что хотите удалить это видео?')">Удалить</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<h2>Управление Пользователями</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Имя пользователя</th>
|
||||||
|
<th>IP-адрес</th>
|
||||||
|
<th>Дата создания</th>
|
||||||
|
<th>Печеньки</th>
|
||||||
|
<th>Действия</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for user in users %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ user.id }}</td>
|
||||||
|
<td>{{ user.username }}</td>
|
||||||
|
<td>{{ user.ip_address }}</td>
|
||||||
|
<td>{{ user.creation_date }}</td>
|
||||||
|
<td>{{ user_cookies[user.id] if user.id in user_cookies else 0 }}</td>
|
||||||
|
<td>
|
||||||
|
<form action="{{ url_for('admin_update_user', user_id=user.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="text" name="username" placeholder="Новый юзернейм" value="{{ user.username }}">
|
||||||
|
<input type="password" name="password" placeholder="Новый пароль">
|
||||||
|
<button type="submit">Обновить</button>
|
||||||
|
</form>
|
||||||
|
<form action="{{ url_for('admin_update_cookies', user_id=user.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="number" name="cookies" value="{{ user_cookies[user.id] if user.id in user_cookies else 0 }}">
|
||||||
|
<button type="submit">Обновить печеньки</button>
|
||||||
|
</form>
|
||||||
|
<form action="{{ url_for('admin_delete_user', user_id=user.id) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" onclick="return confirm('Вы уверены, что хотите удалить этого пользователя?')">Удалить</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
89
templates/post.html
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<title>{{ username }} posts</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>{{ username }} Posts</h1>
|
||||||
|
|
||||||
|
{% if posts %}
|
||||||
|
<div class="posts">
|
||||||
|
{% for post in posts %}
|
||||||
|
<div class="post">
|
||||||
|
<p class="post-date"><strong>{{ post.post_date.strftime('%Y-%m-%d %H:%M') }}</strong></p>
|
||||||
|
<p class="post-text">{{ post.text }}</p>
|
||||||
|
|
||||||
|
{% if post.media_file %}
|
||||||
|
<div class="post-media">
|
||||||
|
<img src="{{ url_for('static', filename='posts/' + post.media_file) }}"
|
||||||
|
alt="{{ 'GIF' if post.media_file.endswith('.gif') else 'Image' }}"
|
||||||
|
class="{{ 'gif' if post.media_file.endswith('.gif') else 'image' }}">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if post.username == current_user.username %}
|
||||||
|
<form action="{{ url_for('delete_post', post_id=post.id) }}" method="POST" style="display:inline;">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="button" onclick="return confirmDelete()">Delete</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<section class="comments">
|
||||||
|
<h2>Comments</h2>
|
||||||
|
<div class="comments-list">
|
||||||
|
{% for comment in post.comments %}
|
||||||
|
<div class="comment">
|
||||||
|
<a href="{{ url_for('profile', username=comment.username) }}">
|
||||||
|
<img src="{{ url_for('static', filename='avatars/' + (avatars.get(comment.username) if avatars.get(comment.username) else 'default_avatar.png')) }}"
|
||||||
|
alt="Avatar of {{ comment.username }}" class="avatar">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a href="{{ url_for('profile', username=comment.username) }}" class="username-link">
|
||||||
|
<strong>{{ comment.username }}</strong>
|
||||||
|
</a>
|
||||||
|
({{ comment.comment_date.strftime('%Y-%m-%d %H:%M') }}):
|
||||||
|
</p>
|
||||||
|
<p style="margin-top: 10px;">{{ comment.comment_text }}</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{% if comment.username == current_user.username %}
|
||||||
|
<form action="{{ url_for('delete_comment', comment_id=comment.id) }}" method="POST" style="display:inline;">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="delete-button" onclick="return confirm('Are you sure you want to delete this comment?')">Delete</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p>No comments yet. Be the first to comment!</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<form action="{{ url_for('add_comment', username=current_user.username, post_id=post.id) }}" method="POST" class="comment-form">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<textarea name="comment_text" rows="3" maxlength="200" class="input-field" placeholder="Write a comment..." required></textarea>
|
||||||
|
<button type="submit" class="button">Post Comment</button>
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<p>You need to <a href="{{ url_for('login') }}">log in</a> to post a comment.</p>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p class="no-posts">{{ username }} hasn't posted yet.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<a href="{{ url_for('profile', username=username) }}" class="button">Back to Profile</a>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function confirmDelete() {
|
||||||
|
return confirm('Are you sure you want to delete this post?');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
33
templates/privacy_policy.html
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Privacy Policy</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Privacy Policy</h1>
|
||||||
|
<p>We value your privacy and are committed to keeping user data to a minimum. This privacy policy explains the information we collect, why we collect it, and how it is used.</p>
|
||||||
|
|
||||||
|
<h2>Information Collection</h2>
|
||||||
|
<p>• We do not collect any personal information, such as names, email addresses, or other identifiers, beyond what is necessary for site functionality.</p>
|
||||||
|
<p>• The only information we gather is the user’s IP address, which is stored solely for anti-bot protection purposes.</p>
|
||||||
|
<p>• We do not track user activities, browsing history, or any other data outside of what is required to operate the site securely.</p>
|
||||||
|
|
||||||
|
<h2>Use of Collected Data</h2>
|
||||||
|
<p>• IP addresses are used exclusively to detect and prevent automated (bot) traffic to ensure the site remains accessible for legitimate users.</p>
|
||||||
|
<p>• No data is shared with third parties, sold, or used for advertising purposes.</p>
|
||||||
|
|
||||||
|
<h2>Data Storage</h2>
|
||||||
|
<p>• Any data collected is stored securely and is only retained for as long as needed to perform anti-bot functions.</p>
|
||||||
|
<p>• Once data is no longer necessary, it is removed from our system.</p>
|
||||||
|
|
||||||
|
<h2>Third-Party Links</h2>
|
||||||
|
<p>• Our site may contain links to third-party content, but we are not responsible for the privacy practices of other websites.</p>
|
||||||
|
<p>• We encourage users to review the privacy policies of any third-party sites they visit.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
132
templates/profile.html
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
<title>🫐{{ user.username }} profile - artberry🫐</title>
|
||||||
|
<style>
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="banner">
|
||||||
|
<img src="{{ url_for('static', filename='banners/' + (user.banner_file if user.banner_file else 'default-banner.png')) }}"
|
||||||
|
alt="User Banner">
|
||||||
|
|
||||||
|
<div class="avatar-container">
|
||||||
|
<img class="avatar"
|
||||||
|
src="{{ url_for('static', filename='avatars/' + (user.avatar_file if user.avatar_file else 'default-avatar.png')) }}"
|
||||||
|
alt="User Avatar">
|
||||||
|
|
||||||
|
{% if current_item %}
|
||||||
|
|
||||||
|
<img id="currentItem" src="{{ url_for('static', filename=current_item.item_path) }}" alt="Current Item"
|
||||||
|
class="current-item-image">
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bio">
|
||||||
|
<p class="biotext">{{ user.username }}</p>
|
||||||
|
<p class="biotext">{{ user.bio }}</p>
|
||||||
|
</div>
|
||||||
|
<a href="{{ url_for('index') }}" class="button">Mainpage</a>
|
||||||
|
<a href="{{ url_for('user_posts', username=user.username) }}" class="button">Posts</a>
|
||||||
|
{% if is_current_user %}
|
||||||
|
<a href="{{ url_for('profile_edit') }}" class="button">Edit Profile</a>
|
||||||
|
<a href="{{ url_for('upload_post') }}" class="button">Upload Post</a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated and current_user.username != user.username %}
|
||||||
|
{% if not subscribed %}
|
||||||
|
<form action="{{ url_for('subscribe', author_id=user.id) }}" method="post">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="button">Subscribe</button>
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<form action="{{ url_for('unsubscribe', author_id=user.id) }}" method="post">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="button">Unsubscribe</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<h2>Latest Popular Arts</h2>
|
||||||
|
{% if arts %}
|
||||||
|
<a href="{{ url_for('user_pubs', pub_type='arts', username=user.username) }}" class="button">
|
||||||
|
View All Arts ({{ total_arts }})
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
<section class="profile-gallery">
|
||||||
|
{% if arts %}
|
||||||
|
{% for art in arts %}
|
||||||
|
<div class="card profile-art-card">
|
||||||
|
<a href="{{ url_for('view', content_type='art', id=art.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='arts/' + art.image_file) }}" alt="User Art">
|
||||||
|
<div class="card-title">{{ art.name }}</div>
|
||||||
|
<div class="cookie-votes">Cookies: {{ art.cookie_votes }}</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<p>No published arts.</p>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h2>Latest Popular Videos</h2>
|
||||||
|
{% if videos %}
|
||||||
|
<a href="{{ url_for('user_pubs', pub_type='videos', username=user.username) }}" class="button">
|
||||||
|
View All Videos ({{ total_videos }})
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
<section class="profile-gallery">
|
||||||
|
{% if videos %}
|
||||||
|
{% for video in videos %}
|
||||||
|
<div class="card profile-video-card">
|
||||||
|
<a href="{{ url_for('view', content_type='video', id=video.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='thumbnails/' + video.video_thumbnail_file) }}"
|
||||||
|
alt="Video Thumbnail">
|
||||||
|
<div class="card-title">{{ video.video_name }}</div>
|
||||||
|
<div class="cookie-votes">Cookies: {{ video.cookie_votes }}</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<p>No published videos.</p>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<h2>Latest Popular Comics</h2>
|
||||||
|
{% if comics %}
|
||||||
|
<a href="{{ url_for('user_pubs', pub_type='comics', username=user.username) }}" class="button">
|
||||||
|
View All Comics ({{ total_comics }})
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
<section class="profile-gallery">
|
||||||
|
{% if comics %}
|
||||||
|
{% for comic in comics %}
|
||||||
|
<div class="card profile-comic-card">
|
||||||
|
<a href="{{ url_for('view', content_type='comic', id=comic.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='comicthumbs/' + comic.comic_thumbnail_file) }}"
|
||||||
|
alt="Comic Thumbnail">
|
||||||
|
<div class="card-title">{{ comic.name }}</div>
|
||||||
|
<div class="cookie-votes">Cookies: {{ comic.cookie_votes }}</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<p>No published comics.</p>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
79
templates/profile_edit.html
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
<title>🫐 Profile Edit - Artberry 🫐</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Edit Profile</h2>
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('profile_edit') }}" enctype="multipart/form-data">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="hidden" name="section" value="avatar_banner">
|
||||||
|
|
||||||
|
<label>Avatar:</label>
|
||||||
|
<input type="file" name="avatar" accept="image/*"><br>
|
||||||
|
<label>Banner:</label>
|
||||||
|
<input type="file" name="banner" accept="image/*"><br>
|
||||||
|
|
||||||
|
<button type="submit" class="button">Save Avatar & Banner</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('profile_edit') }}">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="hidden" name="section" value="decoration">
|
||||||
|
|
||||||
|
<h2>Your Decorations</h2>
|
||||||
|
<label for="selected_item">Select Decoration:</label>
|
||||||
|
<select name="selected_item">
|
||||||
|
<option value="">Select a decoration</option>
|
||||||
|
{% for user_item in user_items %}
|
||||||
|
<option value="{{ user_item.item.id }}">{{ user_item.item.item_path }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select><br>
|
||||||
|
|
||||||
|
<button type="submit" class="button">Save Decoration</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('profile_edit') }}">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="hidden" name="section" value="username">
|
||||||
|
|
||||||
|
<h2>Change Username</h2>
|
||||||
|
<label>New Username:</label>
|
||||||
|
<input type="text" class="input-field" name="new_username" maxlength="20"><br>
|
||||||
|
<button type="submit" class="button">Change Username</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('profile_edit') }}">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="hidden" name="section" value="bio">
|
||||||
|
|
||||||
|
<h2>About Me</h2>
|
||||||
|
<textarea name="bio" class="input-field" maxlength="32">{{ user.bio }}</textarea><br>
|
||||||
|
<button type="submit" class="button">Update Bio</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('profile_edit') }}" enctype="multipart/form-data">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="hidden" name="section" value="create_post">
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('profile_edit') }}">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<input type="hidden" name="section" value="password">
|
||||||
|
|
||||||
|
<h2>Change Password</h2>
|
||||||
|
<label>Current Password:</label>
|
||||||
|
<input type="password" class="input-field" name="current_password"><br>
|
||||||
|
<label>New Password:</label>
|
||||||
|
<input type="password" class="input-field" name="new_password"><br>
|
||||||
|
<label>Confirm New Password:</label>
|
||||||
|
<input type="password" class="input-field" name="confirm_new_password"><br>
|
||||||
|
<button type="submit" class="button">Change Password</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
34
templates/publication_rules.html
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>🫐 Publication Rules - Artberry 🫐</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Publication Rules</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>Guidelines for Publishing Content</h2>
|
||||||
|
<p>To maintain a safe and respectful environment, all users must follow these rules when publishing content:</p>
|
||||||
|
|
||||||
|
<h1>Content Restrictions</h1>
|
||||||
|
<p>• Artwork with watermarks, links to external sites (e.g., Patreon, social media), or any form of censorship is strictly prohibited.</p>
|
||||||
|
<p>• Submissions must feature only human-like characters. Non-human characters, minors, or characters appearing underage are not allowed.</p>
|
||||||
|
<p>• Content depicting extreme or disturbing themes, including violent or offensive genres, is not permitted.</p>
|
||||||
|
|
||||||
|
<h1>Community Standards</h1>
|
||||||
|
<p>• All submissions must be original and should not violate any copyright or intellectual property rights.</p>
|
||||||
|
<p>• Respect the work of other creators and ensure that all content meets the community’s standards of respect and appropriateness.</p>
|
||||||
|
<p>• Use appropriate tags and descriptions for your content to help others find and understand your work.</p>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
31
templates/register.html
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
{% extends "auth.html" %}
|
||||||
|
{% block title %}🫐register - artberry🫐{% endblock %}
|
||||||
|
{% set action = 'register' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<form method="POST" action="{{ url_for(action) }}">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
|
||||||
|
<label for="{{ form.username.id }}">{{ form.username.label.text }}</label>
|
||||||
|
{{ form.username(class="input-field", placeholder="Enter username") }}<br>
|
||||||
|
|
||||||
|
<label for="{{ form.password.id }}">{{ form.password.label.text }}</label>
|
||||||
|
{{ form.password(class="input-field", placeholder="Enter password") }}<br>
|
||||||
|
|
||||||
|
<label for="{{ form.confirm_password.id }}">{{ form.confirm_password.label.text }}</label>
|
||||||
|
{{ form.confirm_password(class="input-field", placeholder="Repeat password") }}<br>
|
||||||
|
|
||||||
|
<div class="recaptcha-container">
|
||||||
|
{{ form.recaptcha.label }}
|
||||||
|
{{ form.recaptcha() }}<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ form.submit(class="login-button button", value="Register") }}
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="link-container">
|
||||||
|
<span class="link-text">Already have an account?</span>
|
||||||
|
<a href="{{ url_for('login') }}" class="button">Login</a>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
39
templates/shop.html
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>🫐shop - artberry🫐</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<h1>Welcome to the Shop!</h1>
|
||||||
|
<div class="cookie-balance">
|
||||||
|
<span>You have {{ user_cookies }} cookies 🍪</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="item-container">
|
||||||
|
{% for item in items %}
|
||||||
|
<div class="item">
|
||||||
|
<img src="{{ url_for('static', filename=item.item_path) }}" alt="Item {{ item.id }}">
|
||||||
|
<form action="{{ url_for('buy_item', item_id=item.id) }}" method="post">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
{% if item.id in user_item_ids %}
|
||||||
|
<button type="button" disabled>You already have this item</button>
|
||||||
|
{% elif user_cookies < item.price %}
|
||||||
|
<button type="button" disabled>Not enough cookies ({{ item.price }})</button>
|
||||||
|
{% else %}
|
||||||
|
<button type="submit">Buy item for {{ item.price }} 🍪</button>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
<a href="{{ url_for('index') }}" class="home-button">MainPage</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
40
templates/terms_of_use.html
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>🫐 Terms of Service - Artberry 🫐</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Terms of Service</h1>
|
||||||
|
<p>By accessing or using Artberry, you agree to comply with these Terms of Service.</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>Prohibited Actions</h2>
|
||||||
|
<p>• Unauthorized copying, mirroring, or redistributing any part of the site or its content is strictly prohibited.</p>
|
||||||
|
<p>• Exploiting or attempting to exploit vulnerabilities or flaws in the website’s security to harm, disable, or manipulate the site, its data, or its users is not allowed.</p>
|
||||||
|
<p>• Circumventing security measures or using automated tools, such as bots, scripts, or scraping software, to interact with the site in unauthorized ways is prohibited.</p>
|
||||||
|
<p>• Any effort to disrupt site functionality, alter the user experience, or perform denial-of-service attacks will result in immediate termination of access.</p>
|
||||||
|
|
||||||
|
<h2>Content Guidelines</h2>
|
||||||
|
<p>• Users must adhere to all <a href="{{ url_for('publication_rules') }}">Publication Rules</a>. Posting of illegal content, non-compliant images, or other prohibited material is not allowed.</p>
|
||||||
|
<p>• Users are solely responsible for the content they publish on Artberry. Artberry reserves the right to remove or restrict access to any content that it deems harmful, offensive, or in violation of these Terms of Service.</p>
|
||||||
|
|
||||||
|
<h2>Liability Disclaimer</h2>
|
||||||
|
<p>• Artberry provides a platform for users to share artwork. We are not responsible for any content posted by users, nor do we endorse or verify any user-submitted content.</p>
|
||||||
|
<p>• Artberry is not liable for any misuse of the platform or for any damages resulting from unauthorized or harmful activities conducted by users.</p>
|
||||||
|
<p>• Users agree to use the platform at their own risk, acknowledging that Artberry disclaims all liability related to content hosted on the site and any user interactions that may occur.</p>
|
||||||
|
|
||||||
|
<h2>Compliance with Laws</h2>
|
||||||
|
<p>• Users are required to comply with all applicable local, state, national, and international laws while using Artberry.</p>
|
||||||
|
<p>• Artberry reserves the right to report any illegal activity conducted on the platform if necessary.</p>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
63
templates/upload.html
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Upload Art</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Upload Art</h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<form method="POST" action="{{ url_for('upload') }}" enctype="multipart/form-data" class="upload-form">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="image_file">{{ form.image_file.label }}</label>
|
||||||
|
{{ form.image_file(class="file-input", id="imageInput") }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tags">{{ form.tags.label }}</label>
|
||||||
|
{{ form.tags(placeholder="tag1, tag2", class="input-field") }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.recaptcha() }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>
|
||||||
|
{{ form.agree_with_rules() }}
|
||||||
|
I agree with the <a href="{{ url_for('publication_rules') }}" target="_blank">publication rules</a>.
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="preview-container hidden" id="previewContainer">
|
||||||
|
<p>Image Preview:</p>
|
||||||
|
<img id="imagePreview" src="" alt="Image preview will appear here">
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="button">{{ form.submit.label }}</button>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
<script>
|
||||||
|
document.getElementById('imageInput').addEventListener('change', function(event) {
|
||||||
|
const file = event.target.files[0];
|
||||||
|
const previewContainer = document.getElementById('previewContainer');
|
||||||
|
const previewImage = document.getElementById('imagePreview');
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = function(e) {
|
||||||
|
previewImage.src = e.target.result;
|
||||||
|
previewContainer.classList.remove('hidden');
|
||||||
|
};
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
} else {
|
||||||
|
previewImage.src = '';
|
||||||
|
previewContainer.classList.add('hidden');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
25
templates/upload_post.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
<title>🫐 Upload Post - Artberry 🫐</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>Create New Post</h2>
|
||||||
|
<form method="POST" action="{{ url_for('upload_post') }}" enctype="multipart/form-data">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
|
||||||
|
<label for="post_text">Post Text:</label><br>
|
||||||
|
<textarea id="post_text" name="post_text" class="input-field" placeholder="Write your post..." maxlength="128" required></textarea><br>
|
||||||
|
|
||||||
|
<label for="post_media">Upload Media (Image/GIF):</label><br>
|
||||||
|
<input type="file" id="post_media" name="post_media" accept="image/*,image/gif"><br>
|
||||||
|
|
||||||
|
<button type="submit" class="button">Publish Post</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
59
templates/upload_video.html
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Upload Video</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/upload_video.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Upload Video</h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<form method="POST" action="{{ url_for('upload_video') }}" enctype="multipart/form-data" class="upload-video-form">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="video_file">{{ form.video_file.label }}</label>
|
||||||
|
{{ form.video_file(class="file-input") }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="thumbnail">{{ form.thumbnail.label }}</label>
|
||||||
|
{{ form.thumbnail(class="file-input") }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="name">{{ form.name.label }}</label>
|
||||||
|
{{ form.name(placeholder="Video name", class="input-field") }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tags">{{ form.tags.label }}</label>
|
||||||
|
{{ form.tags(placeholder="tag1, tag2", class="input-field") }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="description">{{ form.description.label }}</label>
|
||||||
|
{{ form.description(placeholder="Write a description...", class="input-field") }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.recaptcha() }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>
|
||||||
|
{{ form.agree_with_rules() }}
|
||||||
|
I agree with the <a href="{{ url_for('publication_rules') }}" target="_blank">publication rules</a>.
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="button">{{ form.submit.label }}</button>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
104
templates/user_pubs.html
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>🫐{{ pub_type | capitalize }} - {{ username }} - Artberry🫐</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<div class="nav-buttons">
|
||||||
|
<a class="button" href="{{ url_for('index') }}" class="nav-button">MainPage</a>
|
||||||
|
<a class="button" href="{{ url_for('profile', username=username) }}" class="nav-button">Profile</a>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<header>
|
||||||
|
<h1>{{ pub_type | capitalize }} by {{ username }}</h1>
|
||||||
|
<form method="GET" action="{{ search_url if search_url else url_for(request.endpoint, pub_type=pub_type, username=username) }}" class="search-form">
|
||||||
|
<input type="text" name="search" id="search-input" placeholder="Search by tags" class="input-field search-field" autocomplete="off">
|
||||||
|
<button type="submit" class="button search-button">Search</button>
|
||||||
|
</form>
|
||||||
|
<div id="autocomplete-suggestions" class="autocomplete-suggestions"></div>
|
||||||
|
</form>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section class="gallery">
|
||||||
|
{% for item in items %}
|
||||||
|
<div class="card {% if pub_type == 'videos' %}video-card{% elif pub_type == 'comics' %}comic-card{% elif pub_type == 'arts' %}art-card{% endif %}">
|
||||||
|
|
||||||
|
{% if pub_type == 'arts' %}
|
||||||
|
<a href="{{ url_for('view', content_type='art', id=item.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='arts/' + item.image_file) }}" alt="Art Image" class="art-image">
|
||||||
|
</a>
|
||||||
|
{% elif pub_type == 'videos' %}
|
||||||
|
<a href="{{ url_for('view', content_type='video', id=item.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='thumbnails/' + item.video_thumbnail_file) }}" alt="Video Thumbnail" class="video-thumbnail">
|
||||||
|
</a>
|
||||||
|
<p class="video-title">{{ item.video_name }}</p>
|
||||||
|
{% elif pub_type == 'comics' %}
|
||||||
|
<a href="{{ url_for('view', content_type='comic', id=item.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='comicthumbs/' + item.comic_thumbnail_file) }}" alt="Comic Thumbnail" class="comic-thumbnail">
|
||||||
|
</a>
|
||||||
|
<p>{{ item.name }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div class="pagination">
|
||||||
|
{% if pagination.has_prev %}
|
||||||
|
<a class="button" href="{{ url_for('user_pubs', pub_type=pub_type, username=username, page=pagination.prev_num, search=search_query) }}">« Previous</a>
|
||||||
|
{% endif %}
|
||||||
|
{% for page in pagination.iter_pages() %}
|
||||||
|
{% if page %}
|
||||||
|
<a class="button" href="{{ url_for('user_pubs', pub_type=pub_type, username=username, page=page, search=search_query) }}">{{ page }}</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if pagination.has_next %}
|
||||||
|
<a class="button" href="{{ url_for('user_pubs', pub_type=pub_type, username=username, page=pagination.next_num, search=search_query) }}">Next »</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
document.getElementById('search-input').addEventListener('input', function() {
|
||||||
|
var query = this.value;
|
||||||
|
|
||||||
|
if (query.length < 2) {
|
||||||
|
document.getElementById('autocomplete-suggestions').innerHTML = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch(`/autocomplete?search=${encodeURIComponent(query)}`)
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
var suggestionsContainer = document.getElementById('autocomplete-suggestions');
|
||||||
|
suggestionsContainer.innerHTML = '';
|
||||||
|
|
||||||
|
if (data.length > 0) {
|
||||||
|
data.forEach(function(suggestion) {
|
||||||
|
var suggestionElement = document.createElement('div');
|
||||||
|
suggestionElement.classList.add('suggestion-item');
|
||||||
|
suggestionElement.textContent = suggestion;
|
||||||
|
suggestionElement.addEventListener('click', function() {
|
||||||
|
var searchInput = document.getElementById('search-input');
|
||||||
|
var currentValue = searchInput.value;
|
||||||
|
|
||||||
|
var tags = currentValue.split(',').map(tag => tag.trim());
|
||||||
|
tags[tags.length - 1] = suggestion;
|
||||||
|
|
||||||
|
searchInput.value = tags.join(', ');
|
||||||
|
|
||||||
|
suggestionsContainer.innerHTML = '';
|
||||||
|
});
|
||||||
|
suggestionsContainer.appendChild(suggestionElement);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => console.error('Error fetching autocomplete data:', error));
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
45
templates/video_edit.html
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>🫐Edit video - artberry🫐</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h2>Edit video: {{ video.video_name }}</h2>
|
||||||
|
|
||||||
|
<form method="POST" action="{{ url_for('video_edit', id=video.id) }}" enctype="multipart/form-data">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="video_name">Название видео</label>
|
||||||
|
{{ form.video_name(class="input-field") }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="video_thumbnail">Обложка видео</label>
|
||||||
|
{{ form.video_thumbnail(class="file-input") }}
|
||||||
|
{% if video.video_thumbnail_file %}
|
||||||
|
<img src="{{ url_for('static', filename='thumbnails/' + video.video_thumbnail_file) }}" alt="Thumbnail preview" style="display: flex;aligin: center;">
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="description">Description:</label>
|
||||||
|
{{ form.description(class="input-field") }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tags">Tags:</label>
|
||||||
|
{{ form.tags(class="input-field") }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="button">{{ form.submit.label }}</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<a href="{{ url_for('view', content_type='video', id=video.id) }}" class="button">Cancel</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
27
templates/videos.html
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{% extends "content.html" %}
|
||||||
|
|
||||||
|
{% block title %}🫐videos - artberry🫐{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<section class="gallery">
|
||||||
|
{% for video in videos %}
|
||||||
|
<div class="card video-card">
|
||||||
|
<a href="{{ url_for('view', content_type='video', id=video.id) }}">
|
||||||
|
<img src="{{ url_for('static', filename='thumbnails/' + video.video_thumbnail_file) }}" alt="Video Thumbnail" class="video-thumbnail">
|
||||||
|
</a>
|
||||||
|
<p class="video-title">{{ video.video_name }}</p>
|
||||||
|
|
||||||
|
<p>{{ video.cookie_votes }} 🍪</p>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div class="pagination">
|
||||||
|
{% if pagination.has_prev %}
|
||||||
|
<a href="{{ url_for('videos', page=pagination.prev_num, search=search_query) }}" class="button">Previous</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if pagination.has_next %}
|
||||||
|
<a href="{{ url_for('videos', page=pagination.next_num, search=search_query) }}" class="button">Next</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
150
templates/view.html
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>🫐Content View - Artberry🫐</title>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@300&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='artberry.ico') }}" type="image/x-icon">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<div class="nav-buttons">
|
||||||
|
<a href="{{ url_for('index') }}" class="button">Arts</a>
|
||||||
|
<a href="{{ url_for('videos') }}" class="button">Videos</a>
|
||||||
|
<a href="{{ url_for('comics') }}" class="button">Comics</a>
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
{% if content_type == 'art' %}
|
||||||
|
<a href="{{ url_for('upload') }}" class="button">Upload</a>
|
||||||
|
{% elif content_type == 'video' %}
|
||||||
|
<a href="{{ url_for('upload_video') }}" class="button">Upload</a>
|
||||||
|
{% elif content_type == 'comic' %}
|
||||||
|
<a href="{{ url_for('comic_upload') }}" class="button">Upload</a>
|
||||||
|
{% endif %}
|
||||||
|
<a href="{{ url_for('shop') }}" class="button">{{ user_cookies }} 🍪</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{% if content_type == 'art' %}
|
||||||
|
<h1>Image</h1>
|
||||||
|
<div class="details">
|
||||||
|
<img src="{{ url_for('static', filename='arts/' + content.image_file) }}" alt="Art Image">
|
||||||
|
<p><strong>Author:</strong> <a href="{{ url_for('profile', username=content.username) }}">{{ content.username }}</a></p>
|
||||||
|
<p><strong>Publication Date:</strong> {{ content.publication_date }}</p>
|
||||||
|
<p><strong>Tags:</strong>
|
||||||
|
{% for tag in content.tags.split(',') %}
|
||||||
|
<a href="{{ url_for('index', search=tag.strip()) }}" class="tag-link">{{ tag.strip() }}</a>{% if not loop.last %}, {% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% elif content_type == 'video' %}
|
||||||
|
<h1>Video</h1>
|
||||||
|
<div class="video-details">
|
||||||
|
<video controls>
|
||||||
|
<source src="{{ url_for('static', filename='videos/' + content.video_file) }}" type="video/mp4">
|
||||||
|
Ваш браузер не поддерживает элемент video.
|
||||||
|
</video>
|
||||||
|
<p><strong>Author:</strong> <a href="{{ url_for('profile', username=content.username) }}">{{ content.username }}</a></p>
|
||||||
|
<p><strong>Publication Date:</strong> {{ content.publication_date }}</p>
|
||||||
|
<p>Description: {{ content.description }}</p>
|
||||||
|
<p><strong>Tags:</strong>
|
||||||
|
{% for tag in content.tags.split(',') %}
|
||||||
|
<a href="{{ url_for('videos', search=tag.strip()) }}" class="tag-link">{{ tag.strip() }}</a>{% if not loop.last %}, {% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% elif content_type == 'comic' %}
|
||||||
|
<h1>{{ content.name }}</h1>
|
||||||
|
<div class="comic-pages">
|
||||||
|
{% if comic_pages %}
|
||||||
|
{% for page in comic_pages %}
|
||||||
|
<img src="{{ url_for('static', filename='comics/' + content.comic_folder + '/' + page) }}" alt="Page {{ loop.index }}">
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<p>No pages available for this comic.</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="vote-section">
|
||||||
|
<p>Votes: {{ content.cookie_votes }} 🍪</p>
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<form action="{{ url_for('vote_' + content_type, **{'image_id' if content_type == 'art' else 'video_id' if content_type == 'video' else 'comic_id': content.id}) }}" method="POST">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="button">Vote</button>
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<p>You need to <a href="{{ url_for('login') }}">log in</a> to vote.</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated and current_user.username == content.username %}
|
||||||
|
<form method="POST" action="{{ url_for('delete', content_type=content_type, content_id=content.id) }}">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="button" onclick="return confirm('Are you sure you want to delete this content?');">Delete</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if content_type != 'comic' %}
|
||||||
|
<section class="comments">
|
||||||
|
<h2>Comments</h2>
|
||||||
|
<div class="comments-list">
|
||||||
|
{% for comment in comments %}
|
||||||
|
<div class="comment">
|
||||||
|
<a href="{{ url_for('profile', username=comment.username) }}">
|
||||||
|
<img src="{{ url_for('static', filename='avatars/' + (avatars[comment.username] if avatars.get(comment.username) else 'default_avatar.png')) }}"
|
||||||
|
alt="Avatar of {{ comment.username }}" class="avatar">
|
||||||
|
{% if current_user.is_authenticated and comment.username == current_user.username %}
|
||||||
|
<form class="button" action="{{ url_for('delete_comment', comment_id=comment.id) }}" method="POST" style="display:inline;">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<button type="submit" class="delete-button" onclick="return confirm('Are you sure you want to delete this comment?')">Delete</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
</a>
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a href="{{ url_for('profile', username=comment.username) }}" class="username-link">
|
||||||
|
<strong>{{ comment.username }}</strong>
|
||||||
|
</a>
|
||||||
|
({{ comment.comment_date.strftime('%Y-%m-%d %H:%M') }}):
|
||||||
|
</p>
|
||||||
|
<p style="margin-top: 10px;">{{ comment.comment_text }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p>No comments yet. Be the first to comment!</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated %}
|
||||||
|
<form method="POST" action="{{ url_for('view', content_type=content_type, id=content.id) }}" class="comment-form">
|
||||||
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||||
|
<textarea name="comment" class="input-field" placeholder="Add a comment..." rows="3" maxlength="44" required></textarea>
|
||||||
|
<button type="submit" class="button">Post Comment</button>
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<p>You need to <a href="{{ url_for('login') }}">log in</a> to post a comment.</p>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
{% endif %}
|
||||||
|
{% if content_type != 'comic' %}
|
||||||
|
<div class="navigation">
|
||||||
|
<a href="{{ url_for('view', content_type=content_type, id=prev_content.id, page=request.args.get('page', 1)) }}" class="button">← Prev</a>
|
||||||
|
<a href="{{ url_for('view', content_type=content_type, id=random_content.id, page=request.args.get('page', 1)) }}" class="button">Random</a>
|
||||||
|
<a href="{{ url_for('view', content_type=content_type, id=next_content.id, page=request.args.get('page', 1)) }}" class="button">Next →</a>
|
||||||
|
|
||||||
|
{% if current_user.is_authenticated and content.username == current_user.username %}
|
||||||
|
{% if content_type == 'art' %}
|
||||||
|
<a href="{{ url_for('image_edit', id=content.id) }}" class="button">Edit Art</a>
|
||||||
|
{% elif content_type == 'video' %}
|
||||||
|
<a href="{{ url_for('video_edit', id=content.id) }}" class="button">Edit Video</a>
|
||||||
|
{% elif content_type == 'comic' %}
|
||||||
|
<a href="{{ url_for('comic_edit', id=content.id) }}" class="button">Edit Comic</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</body>
|
||||||
|
</html>
|