From a68cdaa974d0c85789cd7520eb24153c0c16e246 Mon Sep 17 00:00:00 2001 From: Eugene <59817721+SKZGx@users.noreply.github.com> Date: Sat, 21 Oct 2023 13:10:14 +0300 Subject: [PATCH] modified: about.html modified: addtranslation.html new file: app.py renamed: about.css -> css/about.css renamed: addtranslation.css -> css/addtranslation.css renamed: load.css -> css/load.css renamed: notcompleted.css -> css/notcompleted.css renamed: scrollbar.css -> css/scrollbar.css renamed: search.css -> css/search.css new file: css/styles.css renamed: submited.css -> css/submited.css modified: index.html renamed: about.js -> js/about.js renamed: index.js -> js/index.js renamed: script.js -> js/script.js renamed: search.js -> js/search.js renamed: tabs.js -> js/tabs.js renamed: tabsindex.js -> js/tabsindex.js modified: mods.json new file: static/addtranslation.css new file: static/default-image.png new file: static/icon.png new file: static/script.js new file: static/style.css renamed: styles.css -> static/styles.css modified: submited.html new file: templates/editor.html --- about.html | 16 +- addtranslation.html | 14 +- app.py | 149 ++ about.css => css/about.css | 12 +- addtranslation.css => css/addtranslation.css | 0 load.css => css/load.css | 0 notcompleted.css => css/notcompleted.css | 0 scrollbar.css => css/scrollbar.css | 0 search.css => css/search.css | 0 css/styles.css | 412 ++++ submited.css => css/submited.css | 0 index.html | 22 +- about.js => js/about.js | 0 index.js => js/index.js | 0 script.js => js/script.js | 0 search.js => js/search.js | 0 tabs.js => js/tabs.js | 0 tabsindex.js => js/tabsindex.js | 0 mods.json | 1900 +++++++++--------- static/addtranslation.css | 128 ++ static/default-image.png | Bin 0 -> 4699 bytes static/icon.png | Bin 0 -> 15508 bytes static/script.js | 263 +++ static/style.css | 171 ++ styles.css => static/styles.css | 2 +- submited.html | 14 +- templates/editor.html | 78 + 27 files changed, 2196 insertions(+), 985 deletions(-) create mode 100644 app.py rename about.css => css/about.css (91%) rename addtranslation.css => css/addtranslation.css (100%) rename load.css => css/load.css (100%) rename notcompleted.css => css/notcompleted.css (100%) rename scrollbar.css => css/scrollbar.css (100%) rename search.css => css/search.css (100%) create mode 100644 css/styles.css rename submited.css => css/submited.css (100%) rename about.js => js/about.js (100%) rename index.js => js/index.js (100%) rename script.js => js/script.js (100%) rename search.js => js/search.js (100%) rename tabs.js => js/tabs.js (100%) rename tabsindex.js => js/tabsindex.js (100%) create mode 100644 static/addtranslation.css create mode 100644 static/default-image.png create mode 100644 static/icon.png create mode 100644 static/script.js create mode 100644 static/style.css rename styles.css => static/styles.css (99%) create mode 100644 templates/editor.html diff --git a/about.html b/about.html index 9d417e0..c287093 100644 --- a/about.html +++ b/about.html @@ -5,8 +5,8 @@ Спільнота українізації модів - - + + @@ -28,11 +28,11 @@ - - - - - + + + + +
@@ -91,7 +91,7 @@

Спільнота українізації модів diff --git a/addtranslation.html b/addtranslation.html index 4a9e154..c80a3bd 100644 --- a/addtranslation.html +++ b/addtranslation.html @@ -7,12 +7,12 @@ - - - - - - + + + + + + @@ -137,7 +137,7 @@

Додавання перекладу мода

diff --git a/app.py b/app.py new file mode 100644 index 0000000..3e51e84 --- /dev/null +++ b/app.py @@ -0,0 +1,149 @@ +from flask import Flask, render_template, request, jsonify +import json +import urllib.parse +from jinja2 import Environment +from colorama import Fore, Style # Додайте імпорт кольорових стилів +import sys +sys.stdout.reconfigure(encoding='utf-8') + + +app = Flask(__name__) +app.debug = True + +# Зчитування даних з JSON файлу +data_file = "mods.json" # Шлях до вашого JSON-файлу + +def read_data_from_file(): + try: + with open(data_file, 'r', encoding='utf-8') as file: + data = json.load(file) + return data + except FileNotFoundError: + return [] + +def save_data_to_file(data): + with open(data_file, 'w', encoding='utf-8') as file: + json.dump(data, file, ensure_ascii=False, indent=4) + +# Додавання фільтра urlparse до Jinja2 +def urlparse(url): + from urllib.parse import urlparse + netloc = urlparse(url).netloc + if netloc.startswith("www."): + netloc = netloc[4:] # Видаляємо "www." з початку + if netloc.endswith(".com"): + netloc = netloc[:-4] # Видаляємо ".com" з кінця + return netloc + +app.jinja_env.filters['urlparse'] = urlparse + +@app.route('/') +def editor(): + data = read_data_from_file() + return render_template('editor.html', data=data) + +@app.route('/delete_card', methods=['POST']) +def delete_card_handler(): + data = request.get_json() # Отримання даних з POST-запиту у форматі JSON + card_title = data.get('title') + + if card_title is not None: + print(f'{Fore.YELLOW}Стараємось видалити картку: {card_title}{Style.RESET_ALL}') + data = read_data_from_file() + for card in data: + if 'title' in card and card['title'] == card_title: + data.remove(card) + save_data_to_file(data) + print(f'{Fore.GREEN}Видалено картку: {card_title}{Style.RESET_ALL}') # Повідомлення про видалену картку у консоль + return '', 204 # Успішна відповідь без тіла + + return f'{Fore.RED}Картку не знайдено{Style.RESET_ALL}', 404 + +@app.route('/add_card', methods=['POST']) +def add_card(): + data = request.get_json() # Отримання даних з POST-запиту у форматі JSON + new_title = data.get('title') + new_description = data.get('description') + new_image = data.get('image') + new_author = data.get('author') + new_verified = data.get('verified') + new_completed = data.get('completed') + new_link = data.get('link') + + print(f'{Fore.GREEN}Додано нову картку: {new_title} з даними {data}{Style.RESET_ALL}') # Повідомлення про додану картку у консоль + + if not new_title: + return f'{Fore.RED}Помилка: Запис не має заголовку.{Style.RESET_ALL}', 400 + + data = read_data_from_file() + + # Перевірка, чи не існує картки з таким же title + for card in data: + if card['title'] == new_title: + return f'{Fore.RED}Картка з таким заголовком вже існує{Style.RESET_ALL}', 400 + + # Генерування нового унікального 'id' + new_id = len(data) + 1 + + new_card = { + 'title': new_title, + 'description': new_description, + 'image': new_image, + 'verified': new_verified, + 'author': new_author, + 'completed': new_completed, + 'link': new_link + } + + data.append(new_card) + save_data_to_file(data) + return jsonify(new_card) + +@app.route('/edit_card', methods=['POST']) +def edit_card(): + if request.content_type != 'application/json': + return f'{Fore.RED}Непідтримуваний тип медіа{Style.RESET_ALL}', 415 + + data = request.get_json() + card_title = data.get('title') + + if card_title is not None: + print(f'{Fore.YELLOW}Стараємось оновити: {card_title}{Style.RESET_ALL}') + new_title = urllib.parse.unquote(data.get('newTitle', '')) + new_description = urllib.parse.unquote(data.get('newDescription', '')) + new_image = urllib.parse.unquote(data.get('newImage', '')) + new_author = urllib.parse.unquote(data.get('newAuthor', '')) + new_verified = data.get('newVerified', False) + new_completed = data.get('newCompleted', False) + new_link = urllib.parse.unquote(data.get('newLink', '')) + + data = read_data_from_file() + + updated = False + updated_card = None + + for card in data: + if 'title' in card and card['title'] == card_title: + card['title'] = new_title + card['description'] = new_description + card['image'] = new_image + card['author'] = new_author + card['verified'] = new_verified + card['completed'] = new_completed + card['link'] = new_link + updated = True + updated_card = card + break + + if updated: + save_data_to_file(data) + print(f'{Fore.GREEN}Оновлено картку: {new_title}{Style.RESET_ALL}') + return jsonify(updated_card) # Повернення зміненої картки у відповіді + else: + return f'{Fore.RED}Картку не знайдено{Style.RESET_ALL}', 404 + else: + return f'{Fore.RED}Некоректні дані{Style.RESET_ALL}', 400 + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/about.css b/css/about.css similarity index 91% rename from about.css rename to css/about.css index 17a85ae..97762a0 100644 --- a/about.css +++ b/css/about.css @@ -125,25 +125,25 @@ .dona{ - background-image: url(images/Donatello.png); + background-image: url(/images/Donatello.png); } .mono{ - background-image: url(images/monobank.png); + background-image: url(/images/monobank.png); } .mas{ - background-image: url(images/socials/mastodon.png); + background-image: url(/images/socials/mastodon.png); } .tel{ - background-image: url(images/socials/telegram.png); + background-image: url(/images/socials/telegram.png); } .sky{ - background-image: url(images/socials/bluesky.png); + background-image: url(/images/socials/bluesky.png); } .twi{ - background-image: url(images/socials/twitter.png); + background-image: url(/images/socials/twitter.png); } .dona, .mono, .mas,.tel,.sky,.twi{ diff --git a/addtranslation.css b/css/addtranslation.css similarity index 100% rename from addtranslation.css rename to css/addtranslation.css diff --git a/load.css b/css/load.css similarity index 100% rename from load.css rename to css/load.css diff --git a/notcompleted.css b/css/notcompleted.css similarity index 100% rename from notcompleted.css rename to css/notcompleted.css diff --git a/scrollbar.css b/css/scrollbar.css similarity index 100% rename from scrollbar.css rename to css/scrollbar.css diff --git a/search.css b/css/search.css similarity index 100% rename from search.css rename to css/search.css diff --git a/css/styles.css b/css/styles.css new file mode 100644 index 0000000..735bbe7 --- /dev/null +++ b/css/styles.css @@ -0,0 +1,412 @@ +/* styles.css */ + + +html { +background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' version='1.1' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:svgjs='http://svgjs.dev/svgjs' width='1920' height='1080' preserveAspectRatio='none' viewBox='0 0 1920 1080'%3e%3cg mask='url(%26quot%3b%23SvgjsMask1094%26quot%3b)' fill='none'%3e%3crect width='1920' height='1080' x='0' y='0' fill='rgba(29%2c 27%2c 30%2c 1)'%3e%3c/rect%3e%3cpath d='M0%2c579.374C132.675%2c582.193%2c282.681%2c684.748%2c389.173%2c605.564C497.375%2c525.109%2c431.768%2c345.289%2c482.71%2c220.446C530.499%2c103.331%2c686.497%2c28.864%2c675.929%2c-97.184C665.434%2c-222.355%2c520.746%2c-285.341%2c432.784%2c-375.01C350.933%2c-458.449%2c287.44%2c-564.94%2c177.675%2c-605.105C64.819%2c-646.401%2c-60.128%2c-631.328%2c-175.465%2c-597.577C-290.876%2c-563.805%2c-405.547%2c-510.066%2c-477.178%2c-413.477C-546.693%2c-319.741%2c-536.762%2c-194.933%2c-559.024%2c-80.376C-582.625%2c41.071%2c-643.998%2c159.948%2c-611.826%2c279.411C-577.52%2c406.795%2c-497.142%2c531.177%2c-378.689%2c589.251C-262.966%2c645.987%2c-128.854%2c576.636%2c0%2c579.374' fill='%23131214'%3e%3c/path%3e%3cpath d='M1920 1626.1100000000001C2020.182 1615.431 2073.234 1504.6779999999999 2156.045 1447.2939999999999 2235.003 1392.5810000000001 2351.838 1382.743 2395.031 1296.939 2438.321 1210.943 2393.478 1108.997 2373.782 1014.756 2355.2889999999998 926.2719999999999 2331.556 841.515 2283.806 764.76 2229.118 676.852 2169.262 589.9780000000001 2078.5190000000002 540.135 1975.08 483.31899999999996 1852.025 429.74300000000005 1739.68 465.88800000000003 1627.593 501.95000000000005 1565.378 620.363 1508.5810000000001 723.504 1460.07 811.598 1462.675 913.049 1439.5430000000001 1010.921 1413.603 1120.674 1320.011 1230.062 1364.35 1333.757 1408.56 1437.149 1549.721 1448.961 1649.234 1501.32 1739.001 1548.551 1819.137 1636.862 1920 1626.1100000000001' fill='%23272429'%3e%3c/path%3e%3c/g%3e%3cdefs%3e%3cmask id='SvgjsMask1094'%3e%3crect width='1920' height='1080' fill='white'%3e%3c/rect%3e%3c/mask%3e%3c/defs%3e%3c/svg%3e"); +background-color: #1d1b1e; +background-size: cover!important; +} +@media (max-width: 768px) { + html{ + background-size: cover!important; + } + body { + font-size: 16px; + + } + .header { + padding-bottom: 20px; + } + .mobile-only { + display: block!important; /* Показувати меню на мобільних пристроях */ + position: fixed; /* Фіксована позиція */ + bottom: -2px; /* Внизу екрану */ + left: 0; /* Лівий край екрану */ + background-color: #131214; /* Колір фону меню */ + width: 90%; /* 100% ширина екрану */ + padding: 40px; /* Відступи */ + text-align: center; /* Вирівнювання тексту по центру */ + z-index: 50; /* Вищий індекс ніж в інших елементів */ + color: white; + box-shadow: 1px -8px 35px 20px rgba(0,0,0,0.10); + -webkit-box-shadow: 1px -8px 35px 20px rgba(0,0,0,0.10); + -moz-box-shadow: 1px -8px 35px 20px rgba(0,0,0,0.10); + border-radius: 19px 19px 0px 0px; + -webkit-border-radius: 19px 19px 0px 0px; + -moz-border-radius: 19px 19px 0px 0px; + } + .addbutton{ + display: block!important; /* Показувати меню на мобільних пристроях */ + position: fixed; /* Фіксована позиція */ + bottom: 8px; /* Внизу екрану */ + z-index: 100; + + } + .search-container{ + display: flex; + justify-content: center; + align-items: center; + margin-top: 10px!important; + margin-bottom: 40px; + flex-wrap: wrap; + } + .search-container button{ + margin-top: 10px; + } + + + + .footer{ + height: 170px; + } + +} + +@media (max-width: 443px){ + .search-container #searchbtn{ + width: 100%; + margin: 20px 20px; + + } +} + +.tabs{ + margin: 0px!important; +} + +.mobile-only { + display: none; + } + +body { + justify-content: center; + margin: 0; + padding: 0; + +} + +#notcompleted{ + cursor: default; +} + +.header { + color: #dbe1f8; + text-align: center; + padding-bottom: 40px; + display: flex; + flex-direction: column; /* Змінюємо напрямок розташування на стовбчик */ + align-items: center; /* Вирівнювання по вертикалі */ + font-family: 'Nunito', sans-serif; +} + +.headertext{ + display:block; + +} + +.header .header-content { + text-align: center; /* Вирівнювання тексту по центру */ +} + +.header img { + max-width: 100px; /* Змініть розмір зображення за потреби */ + margin-right: 10px; /* Додайте відступ між зображенням і текстом */ +} + +.header h1 { + font-size: 24px; + margin: 0; /* Видаліть зовнішній відступ від заголовка */ +} + + +.image{ + min-width: 200px; + min-height: 200px; + +} + + +.item { + width: 250px; + margin: 10px; + padding: 10px; + padding-top: 24px; + display: inline-block; + vertical-align: middle; + text-align: center; + background-color: #2b2222; + border-radius: 30px; + position: relative; + min-height: 0px; + box-shadow: 0px 0px 13px 0px rgba(0,0,0,0.28); + -webkit-box-shadow: 0px 0px 13px 0px rgba(0,0,0,0.28); + -moz-box-shadow: 0px 0px 13px 0px rgba(0,0,0,0.28); + + +} +#verified{ + border: 3px solid #297e4c; +} + + + +.image-container { + width: 100%; + height: 200px; + display: flex; + justify-content: center; + align-items: flex-start; +} + +.image { + border-radius: 15px; + width: 200px; + height: 200px; + background-size:cover; + +} + + +.title { + min-height: 48px; + font-size: 20px; + margin-top: 10px; + color: #dbe1f8; + font-family: 'Rubik', sans-serif; + font-weight: 200; + display: flex; + justify-content: center; + align-items: center; +} + +.description { + min-height: 85px; + min-width: 190px; + font-size: 16px; + margin-top: 5px; + padding: 20px; + border-radius: 15px; + background-color: #7e292a; + font-family: 'Ubuntu', sans-serif; + color: #dbe1f8; + position: relative; + cursor: default; + display: inline-block; + max-width: 250px; + text-align: end; +} + +.popup { + cursor: default; + + display: none; + position: absolute; + background-color: #7e292a; + color: #dbe1f8; + padding: 20px; + border-radius: 15px; + z-index: 2; + width: 210px; + max-height: none; /* Змінено на "none" замість "0" */ + overflow: hidden; + white-space: normal; + transition: max-height 0.3s, padding 0.3s; + bottom: calc(21% + 3px); + font-family: 'Ubuntu', sans-serif; + font-size: 16px; +} + +.description, .popup{ + text-align: left; + +} + + + +.tabs { + display: flex; + justify-content: center; /* Ця властивість центрує елементи горизонтально */ +} + +.tab { + background-color: #7e292a; + color: #dbe1f8; + border: none; + padding: 30px 20px; + border-radius: 30px; + margin: 10px 10px; +} + +.tab.active { + background-color: #ffb3b0; /* Змініть на бажаний колір фону */ + color: #601216; /* Змініть на бажаний колір тексту */ + cursor: default; +} + +.tab:hover:not(.active) { + background-color: #c57976; /* Змініть на бажаний колір фону */ + color: #601216; /* Змініть на бажаний колір тексту */ + -webkit-box-shadow: 0px 0px 25px 4px rgba(0,0,0,0.42); + -moz-box-shadow: 0px 0px 25px 4px rgba(0,0,0,0.42); + box-shadow: 0px 0px 25px 4px rgba(0,0,0,0.42); + cursor: pointer; +} + +.author{ + color: #969aa8; + text-align: center; + opacity: 50%; + margin-top: -10px; + font-family: 'Noto Serif', serif; +} + +.tab, #searchbtn, .addbutton, #show-more-button, .soc-button{ + font-size: 17px; + font-family: 'Rubik', sans-serif!important; + font-weight: 200!important; +} + +.translation-button { + text-decoration: none; + flex: 1; + text-align: center; + background-color: #7e292a; + color: #dbe1f8; + padding: 20px 10px; + border-radius: 20px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; /* Додайте цей рядок для центрування тексту по горизонталі */ + font-family: 'Rubik', sans-serif; + font-weight: 200; + letter-spacing: 1px; +} + +.translation-button:hover { + background-color: #c57976; /* Колір фону кнопки при наведенні */ + color: #601216; /* Колір тексту кнопки при наведенні */ +} + +.translation-icon { + margin-right: 5px; /* Відстань між іконкою і текстом */ +} + +.button-container{ + display: flex; + justify-content: center; + align-items: center; + margin-top: 40px; + margin-bottom: 40px; +} + +.notcompleted{ + background: linear-gradient(135deg, + rgba(126, 113, 41,.3)0%, + rgba(126, 113, 41,.3) 25%, + rgba(197, 186, 118,.3) 25%, + rgba(197, 186, 118,.3) 50%, + rgba(126, 113, 41,.3) 50%, + rgba(126, 113, 41,.3) 75%, + rgba(197, 186, 118,.3) 75%, + rgba(197, 186, 118,.3) 100%); +} + +.notcompleted:hover{ + background: linear-gradient(135deg, + rgba(126, 113, 41,.3)0%, + rgba(126, 113, 41,.3) 25%, + rgba(197, 186, 118,.3) 25%, + rgba(197, 186, 118,.3) 50%, + rgba(126, 113, 41,.3) 50%, + rgba(126, 113, 41,.3) 75%, + rgba(197, 186, 118,.3) 75%, + rgba(197, 186, 118,.3) 100%); + + color: white; +} + + +.footer { + color: #dbe1f8; + text-align: center; + padding: 10px; + bottom: 0; + width: 100%; + opacity: 40%; + font-family: 'Rubik', sans-serif; + font-weight: 200; + +} + +.footer a { + color: #dbe1f8; + text-decoration: none; + margin-left: 10px; +} + +.footer a:hover { + text-decoration: underline; +} + + +body, html { + margin: 0; + padding: 0; + height: 100%; + overflow-x: hidden; +} + +.custom-tooltip { + position: absolute; + background-color: #1d1b1e; + color: #e6e6e6; + padding: 15px; + border-radius: 15px; + z-index: 999; + left: -50%; + top: -10px; + transform: translateX(-28%) translateY(-54%); + font-family: 'Ubuntu', sans-serif; + font-size: 16px; +} + + +.custom-tooltip .tooltip-content { + /* Стилі для вмісту підказки */ + max-width: 200px; /* Обмежити ширину тексту до 200 пікселів */ + overflow: auto; /* Додати прокручування, якщо текст не поміщається */ + white-space: normal; /* Дозволити перенос тексту */ + word-wrap: break-word; /* Розділити слова, якщо вони не вміщаються */ +} + + + +.concon{ + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 40px; +} + +.container { + max-width: 960px; + margin: 20px auto; + display: flex; + flex-wrap: wrap; /* Змінюємо розміщення на згорнуту обгортку */ + justify-content: center; +} + +.container-content { + margin: 10px; + padding: 10px; + text-align: center; + border-radius: 30px; + position: relative; +} + +.div{ + display: flex; + flex-wrap: wrap; /* Змінюємо розміщення на згорнуту обгортку */ + justify-content: center; +} diff --git a/submited.css b/css/submited.css similarity index 100% rename from submited.css rename to css/submited.css diff --git a/index.html b/index.html index 2b4ecc1..27eba0d 100644 --- a/index.html +++ b/index.html @@ -7,11 +7,11 @@ - - - - - + + + + + @@ -41,8 +41,8 @@ - - + +
@@ -111,7 +111,7 @@

Спільнота українізації модів

© 2023 Спільнота українізації модів

-

Створено в Україні для українців

+

Створено в Києві з 💜

NOT AN OFFICIAL MINECRAFT PRODUCT. NOT APPROVED BY OR ASSOCIATED WITH MOJANG.

@@ -121,10 +121,10 @@

Спільнота українізації модів

- + - - + + \ No newline at end of file diff --git a/about.js b/js/about.js similarity index 100% rename from about.js rename to js/about.js diff --git a/index.js b/js/index.js similarity index 100% rename from index.js rename to js/index.js diff --git a/script.js b/js/script.js similarity index 100% rename from script.js rename to js/script.js diff --git a/search.js b/js/search.js similarity index 100% rename from search.js rename to js/search.js diff --git a/tabs.js b/js/tabs.js similarity index 100% rename from tabs.js rename to js/tabs.js diff --git a/tabsindex.js b/js/tabsindex.js similarity index 100% rename from tabsindex.js rename to js/tabsindex.js diff --git a/mods.json b/mods.json index fe2327b..dcc79d2 100644 --- a/mods.json +++ b/mods.json @@ -1,946 +1,956 @@ -[{ - "title": "Apotheosis", - "description": "Можливості варіюються від простих змін, таких як вища цукрова тростина, до масштабних капітальних ремонтів основних систем, таких як зачарування.", - "image": "https://media.forgecdn.net/avatars/806/643/638174667713250064.png", - "verified": true, - "author": "", - "completed": true, - "link": "https://www.curseforge.com/minecraft/mc-mods/apotheosis" -}, -{ - "title": "Gobber2", - "description": "Мод Gobber призначений для того, щоб зробити гру в Minecraft більш захоплюючою, надаючи покращену броню, інструменти та зброю.", - "image": "https://media.forgecdn.net/avatars/265/418/637229299628778865.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Immersive Engineering", - "description": "технічний мод з певним шармом, заснований на ідеях та концепціях. Загалом, це про технології, натхненні реалізмом.", - "image": "https://media.forgecdn.net/avatars/334/842/637469274508716717.png", - "verified": true, - "author": "", - "completed": true, - "link": "https://www.curseforge.com/minecraft/mc-mods/immersive-engineering" -}, -{ - "title": "Spice of Life: SPE", - "description": "Цей мод додає переваги від вживання різноманітної їжі у Minecraft. Він відстежує ваш раціон і дає вам атрибути або ефекти на основі вашої оцінки різноманітності.", - "image": "https://media.forgecdn.net/avatars/570/46/637930919653071925.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "delightful", - "description": "Налаштовуваний аддон Farmer's Delight з функціями сумісності та захоплюючими новими продуктами.", - "image": "https://cdn.modrinth.com/data/JtSnhtNJ/707d7697b315dd6dfc84648c893bf3e057bb3e34.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "End's Delight", - "description": "End's Delight - це аддон-мод для Farmer's Delight, заснований на додаванні кулінарного контенту з предметів Енду!", - "image": "https://cdn.modrinth.com/data/yHN0njMr/8b215554e49c51cb5bb5ded435263d2078e0829e.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Framed Compacting Drawers", - "description": "Це аддон-мод до Storage Drawers, який додає безмежно велику кількість нових ящиків до гри.", - "image": "https://media.forgecdn.net/avatars/264/387/637226486288344415.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Frozen Delight", - "description": "Frozen Delight - це просте, але якісне доповнення для Farmer's Delight, яке робить його більш сумісним з Frozen Up!", - "image": "https://media.forgecdn.net/avatars/807/186/638176014809459782.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Frozen Up", - "description": "мод, який додає купу нових можливостей, зберігаючи при цьому класичний стиль Minecraft. Він додає нових чарівних пухнастих рептилій: чилу, пінгвінів, північних оленів, оновлює іглу та багато іншого!", - "image": "https://media.forgecdn.net/avatars/595/853/637971166121370460.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Ore Excavation", - "description": "Дозволяє гравцям видобувати цілі жили руди, рубати цілі дерева або виконувати будь-які інші дії з інструментами за один раз. ", - "image": "https://media.forgecdn.net/avatars/50/412/636090834615920242.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Rotten Creatures", - "description": "Мод, який має на меті додати до Minecraft багато нових чудових зомбі-мобів!", - "image": "https://cdn.modrinth.com/data/5Zusp48B/47a8369c7bc216fdc69e2ab709d5c0a7b9f8e255.jpeg", - "verified": true, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Nether's Exoticism", - "description": "Додає 5 екзотичних фруктів, які існують в реальному житті, кожен біом Nether отримує фрукт.", - "image": "https://cdn.modrinth.com/data/3e4LaIlU/37235ed4c98620770a66e50018669b6bdfa00388.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Nether's Delight", - "description": "Використовуючи передові мисливські техніки та кулінарні навички, ви зможете приготувати безліч огидних страв і покритих мохом закусок, і навіть трохи довше прожити в Незері!", - "image": "https://cdn.modrinth.com/data/Vv0RM7WN/bcc7b753ece2584ea956888971a98dc7f3045319.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Nether's Cruelty", - "description": "Nether's Cruelty - це невеликий аддон до Nether's Exotism, який додає нову їжу в мод. Єдина зміна, яку додає цей мод - це нова їжа, Стейк Молоха, який грабують 2 з 3 Молохів (мобів, доданих у Nether's Exoticism).", - "image": "https://media.forgecdn.net/avatars/614/184/637997323156423195.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "The One Probe", - "description": "TOP, альтернатива WAILA, яка показує інформацію про те, на що ви дивитеся (істоти, блоки, предмети)", - "image": "https://cdn.modrinth.com/data/Eyw0UxEx/ca066fbe30ebf9357896ae53711b86460159aedf.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Storage Drawers", - "description": "Ящики для зберігання запозичили ідеї від Jabba та Bibliocraft, що дозволило створити високофункціональне, компактне та естетичне рішення для зберігання.", - "image": "https://media.forgecdn.net/avatars/10/842/635468327818431130.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Applied Energistics 2", - "description": "Applied Energistics 2 (AE2) - це комплексний мод для Minecraft, який представляє унікальний підхід до управління внутрішньоігровими запасами.", - "image": "https://cdn.modrinth.com/data/XxWD5pD3/icon.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Bartering Station", - "description": "Станція обміну додає один абсолютно новий блок утиліти: Покладіть туди всі свої золоті злитки, і вони будуть віддані свиням у цьому районі. Все добро, яке вони повернуть, буде автоматично зібрано в блоці станції.", - "image": "https://cdn.modrinth.com/data/EOig9U0j/320cbe8a7409ef0b4928ee174b32b70860eb44a1.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Chunk Loaders", - "description": "Мод на простий завантажувач чанків, маж декілька різних рівнів, можна обрати який саме чанк завантажити інтерфейсом мапи в блоці.", - "image": "https://cdn.modrinth.com/data/t1VgucWo/icon.png", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Catalogue", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Magnum Torch(by Fuzs)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Create : Misc & Things", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Create Central Kitchen", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Create Enchantment Industry", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Create Slice & Dice", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Create Stuff & Additions", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Create: Crystal Clear", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Cultural Delights", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Configured", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Farmer's Respite(little bit)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Crafting Station", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "It Takes a Pillage", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "More Villagers", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "FTB Quests", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "FTB Chunks", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "FTB Teams", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Refined Storage", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Building Gadgets(Direwolf20)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Keymap", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Crafting Tweaks", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "AE2 Tools", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "AE2 Additions", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Ae2 Things", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "AE2 WTLIB", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Another Furniture(little bit)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Create Confectionery", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Energy Meter", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Integrated Dungeons and Structures", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Immersive Posts", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Item Locks", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "KeyMap(by nEinjerjar)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Ma Enchants", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Patchouli", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Slice and dice", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Sophisticated Backpacks", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Tesseract (by SuperMartijn642)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Tool Complement", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Trading Post(by Fuzs)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Trashcans(by SuperMartijn642)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "CreateDeco", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "tools complement", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "terrestria", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Advanced Reborn", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Kibe", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "packpack mod", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "VC Gliders", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Simple radio", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Simple redio", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Seasons extra", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Artifacts", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Charm", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Naturalist", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Iron CHest", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Seasons fabric", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "seasons hud", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "added tools complement", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "tiered", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "purecoppertools", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "paladins", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "numismatic-overhaul", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "nametags", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "hardcorerevival", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "environmentz", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "cinderscapes", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "chronopyre", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Blockrunner", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "spell_engine", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "botania", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "beautify", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "backpacked", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "itemalchemy", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "tokenablefurnaces", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "skylorlib", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "cloth-config2", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "RelicEX", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "PlayerEX", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "MapFrontiers", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "WizardsEX", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Charm", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "xercapaint (Joy of Painting)", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "universal graves", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "forgotten graves", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "Charm of undying", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "patchouli", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -}, -{ - "title": "expandeddelight", - "description": "", - "image": "", - "verified": false, - "author": "", - "completed": true, - "link": "" -} +[ + { + "title": "Apotheosis", + "description": "Можливості варіюються від простих змін, таких як вища цукрова тростина, до масштабних капітальних ремонтів основних систем, таких як зачарування.", + "image": "https://media.forgecdn.net/avatars/806/643/638174667713250064.png", + "verified": true, + "author": "Команда СУМ", + "completed": true, + "link": "https://www.curseforge.com/minecraft/mc-mods/apotheosis" + }, + { + "title": "Gobber 2", + "description": "Мод Gobber призначений для того, щоб зробити гру в Minecraft більш захоплюючою, надаючи покращену броню, інструменти та зброю.", + "image": "https://media.forgecdn.net/avatars/265/418/637229299628778865.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "Immersive Engineering", + "description": "технічний мод з певним шармом, заснований на ідеях та концепціях. Загалом, це про технології, натхненні реалізмом.", + "image": "https://media.forgecdn.net/avatars/334/842/637469274508716717.png", + "verified": true, + "author": "", + "completed": true, + "link": "https://www.curseforge.com/minecraft/mc-mods/immersive-engineering" + }, + { + "title": "Spice of Life: SPE", + "description": "Цей мод додає переваги від вживання різноманітної їжі у Minecraft. Він відстежує ваш раціон і дає вам атрибути або ефекти на основі вашої оцінки різноманітності.", + "image": "https://media.forgecdn.net/avatars/570/46/637930919653071925.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "delightful", + "description": "Налаштовуваний аддон Farmer's Delight з функціями сумісності та захоплюючими новими продуктами.", + "image": "https://cdn.modrinth.com/data/JtSnhtNJ/707d7697b315dd6dfc84648c893bf3e057bb3e34.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "End's Delight", + "description": "End's Delight - це аддон-мод для Farmer's Delight, заснований на додаванні кулінарного контенту з предметів Енду!", + "image": "https://cdn.modrinth.com/data/yHN0njMr/8b215554e49c51cb5bb5ded435263d2078e0829e.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Framed Compacting Drawers", + "description": "Це аддон-мод до Storage Drawers, який додає безмежно велику кількість нових ящиків до гри.", + "image": "https://media.forgecdn.net/avatars/264/387/637226486288344415.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Frozen Delight", + "description": "Frozen Delight - це просте, але якісне доповнення для Farmer's Delight, яке робить його більш сумісним з Frozen Up!", + "image": "https://media.forgecdn.net/avatars/807/186/638176014809459782.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Frozen Up", + "description": "мод, який додає купу нових можливостей, зберігаючи при цьому класичний стиль Minecraft. Він додає нових чарівних пухнастих рептилій: чилу, пінгвінів, північних оленів, оновлює іглу та багато іншого!", + "image": "https://media.forgecdn.net/avatars/595/853/637971166121370460.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Ore Excavation", + "description": "Дозволяє гравцям видобувати цілі жили руди, рубати цілі дерева або виконувати будь-які інші дії з інструментами за один раз. ", + "image": "https://media.forgecdn.net/avatars/50/412/636090834615920242.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Rotten Creatures", + "description": "Мод, який має на меті додати до Minecraft багато нових чудових зомбі-мобів!", + "image": "https://cdn.modrinth.com/data/5Zusp48B/47a8369c7bc216fdc69e2ab709d5c0a7b9f8e255.jpeg", + "verified": true, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Nether's Exoticism", + "description": "Додає 5 екзотичних фруктів, які існують в реальному житті, кожен біом Nether отримує фрукт.", + "image": "https://cdn.modrinth.com/data/3e4LaIlU/37235ed4c98620770a66e50018669b6bdfa00388.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Nether's Delight", + "description": "Використовуючи передові мисливські техніки та кулінарні навички, ви зможете приготувати безліч огидних страв і покритих мохом закусок, і навіть трохи довше прожити в Незері!", + "image": "https://cdn.modrinth.com/data/Vv0RM7WN/bcc7b753ece2584ea956888971a98dc7f3045319.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Nether's Cruelty", + "description": "Nether's Cruelty - це невеликий аддон до Nether's Exotism, який додає нову їжу в мод. Єдина зміна, яку додає цей мод - це нова їжа, Стейк Молоха, який грабують 2 з 3 Молохів (мобів, доданих у Nether's Exoticism).", + "image": "https://media.forgecdn.net/avatars/614/184/637997323156423195.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "The One Probe", + "description": "TOP, альтернатива WAILA, яка показує інформацію про те, на що ви дивитеся (істоти, блоки, предмети)", + "image": "https://cdn.modrinth.com/data/Eyw0UxEx/ca066fbe30ebf9357896ae53711b86460159aedf.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Storage Drawers", + "description": "Ящики для зберігання запозичили ідеї від Jabba та Bibliocraft, що дозволило створити високофункціональне, компактне та естетичне рішення для зберігання.", + "image": "https://media.forgecdn.net/avatars/10/842/635468327818431130.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Applied Energistics 2", + "description": "Applied Energistics 2 (AE2) - це комплексний мод для Minecraft, який представляє унікальний підхід до управління внутрішньоігровими запасами.", + "image": "https://cdn.modrinth.com/data/XxWD5pD3/icon.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Bartering Station", + "description": "Станція обміну додає один абсолютно новий блок утиліти: Покладіть туди всі свої золоті злитки, і вони будуть віддані свиням у цьому районі. Все добро, яке вони повернуть, буде автоматично зібрано в блоці станції.", + "image": "https://cdn.modrinth.com/data/EOig9U0j/320cbe8a7409ef0b4928ee174b32b70860eb44a1.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Chunk Loaders", + "description": "Мод на простий завантажувач чанків, маж декілька різних рівнів, можна обрати який саме чанк завантажити інтерфейсом мапи в блоці.", + "image": "https://cdn.modrinth.com/data/t1VgucWo/icon.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Catalogue", + "description": "Порт оригінального мода, але модифікований та адаптований спеціально для Fabric. Каталог містить меню, яке відображає список усіх встановлених модифікацій, до якого можна отримати доступ з головного меню або з гри. ", + "image": "https://media.forgecdn.net/avatars/871/331/638288815121260754.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "Magnum Torch(by Fuzs)", + "description": "Магнітний смолоскип додає три види дуже потужних смолоскипів, які не дають мобам нереститися на величезній території. Запобігатимуться лише природні нерестилища, тому, наприклад, нерестилища та рейди все ще працюватимуть, як і раніше.", + "image": "https://media.forgecdn.net/avatars/511/74/637828965575792853.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "Create : Misc & Things", + "description": "додає корисні, будівельні та веселі дрібнички, які чудово вписуються візуально до моду Create.", + "image": "https://media.forgecdn.net/avatars/873/437/638293470247022480.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "Create Central Kitchen", + "description": "мод, який пропонує більше інструментів та методів для автоматизації приготування їжі для інших модів у Create. ", + "image": "https://media.forgecdn.net/avatars/770/583/638109213062028041.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "Create Enchantment Industry", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Create Slice & Dice", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Create Stuff & Additions", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Create: Crystal Clear", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Cultural Delights", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Configured", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Farmer's Respite(little bit)", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Crafting Station", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "It Takes a Pillage", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "More Villagers", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "FTB Quests", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "FTB Chunks", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "FTB Teams", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Refined Storage", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Building Gadgets(Direwolf20)", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Keymap", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Crafting Tweaks", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "AE2 Tools", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "AE2 Additions", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Ae2 Things", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "AE2 WTLIB", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Another Furniture(little bit)", + "description": "немає опису", + "image": "static/default-image.png", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Create Confectionery", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Energy Meter", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Integrated Dungeons and Structures", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Immersive Posts", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Item Locks", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "KeyMap(by nEinjerjar)", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Ma Enchants", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Patchouli", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Slice and dice", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Sophisticated Backpacks", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Tesseract (by SuperMartijn642)", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Tool Complement", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Trading Post(by Fuzs)", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Trashcans(by SuperMartijn642)", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "CreateDeco", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "tools complement", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "terrestria", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Advanced Reborn", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Kibe", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "packpack mod", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "VC Gliders", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Simple radio", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Simple redio", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Seasons extra", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Artifacts", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Charm", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Naturalist", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Iron CHest", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Seasons fabric", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "seasons hud", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "added tools complement", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "tiered", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "purecoppertools", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "paladins", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "numismatic-overhaul", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "nametags", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "hardcorerevival", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "environmentz", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "cinderscapes", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "chronopyre", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Blockrunner", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "spell_engine", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "botania", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "beautify", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "backpacked", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "itemalchemy", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "tokenablefurnaces", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "skylorlib", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "cloth-config2", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "RelicEX", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "PlayerEX", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "MapFrontiers", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "WizardsEX", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Charm", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "xercapaint (Joy of Painting)", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "universal graves", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "forgotten graves", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "Charm of undying", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "patchouli", + "description": "", + "image": "", + "verified": false, + "author": "", + "completed": true, + "link": "" + }, + { + "title": "expandeddelight", + "description": "", + "image": "static/default-image.png", + "verified": false, + "author": "Команда СУМ", + "completed": true, + "link": "" + }, + { + "title": "Spectum", + "description": "Магічний мод, що базується на розвитку та дослідженні, де ви комбінуєте кольори для створення магічних інструментів і машин, з кінцевою метою дізнатися, що лежить під колись непроникною підлогою Bedrock.", + "image": "https://cdn.modrinth.com/data/3rc31Hgo/70ab94a9c980769dd3f2d17850aef9f6df497ab7.png", + "verified": false, + "author": "", + "completed": false, + "link": "" + } ] \ No newline at end of file diff --git a/static/addtranslation.css b/static/addtranslation.css new file mode 100644 index 0000000..76d5a5a --- /dev/null +++ b/static/addtranslation.css @@ -0,0 +1,128 @@ +p{ + min-height: 160px; +} + +input{ + width: 100%; + margin: 5px 0; +} + +.addinputp, .edit-button, .site-linka{ + width: 70%!important; + margin-left: 8px; + background-color: #7e292a; + border: none; + border-radius: 10px; + padding: 20px 0; + justify-content: center; + text-align: center; + color: white; +} + +input::placeholder{ + color:white; +} + +.checks{ + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-content: center; + align-items: center; +} + +input{ + margin-left: 8px; + background-color: #7e292a; + border: none; + border-radius: 10px; + padding: 20px 0; + justify-content: center; + text-align: center; + color: white; + margin: 3px 0; +} + +.edit-button{ + margin-bottom: 20px; +} + +.edit-button{ + padding: 20px 10px!important; +} + +span{ + margin-bottom: 10px; +} + +/* Звичайний стан посилань */ +a { + text-decoration: none; /* Вимкнути підкреслення тексту */ + color: white; /* Білий колір тексту */ +} + +/* Стан посилань при наведенні */ +a:hover { + text-decoration: none; /* Вимкнути підкреслення тексту при наведенні */ + color: white; /* Зберегти білий колір тексту при наведенні */ +} +.site-link{ + width: 100%; + display: flex; + align-content: flex-start; + flex-wrap: nowrap; + justify-content: center; + flex-direction: row; +} + +.site-linka{ + display: flex; +} +.edit-button, .site-linka{ + width: 251px!important; +} + +.editbuttons{ + display: flex; + align-items: center; + align-content: center; + flex-wrap: nowrap; + justify-content: center; + flex-direction: row; + padding: 10px; + +} + +.checks{ + margin: 5px 0; +} + +.editbuttons button, .sorting{ + width: 100px!important; + padding: 10px; + margin: 5px; + background-color:#7e292a; + color: white; + border: none; + border-radius: 10px; +} + +.smallicon{ + font-size: 30px!important; +} + + +.cancel-button:hover, .save-button:hover, .sorting:hover{ + background-color: #c57976; + +} + +.sortcont{ + display: flex; + align-items: center; + align-content: center; + flex-wrap: nowrap; + justify-content: center; + flex-direction: row; + padding: 10px; +} \ No newline at end of file diff --git a/static/default-image.png b/static/default-image.png new file mode 100644 index 0000000000000000000000000000000000000000..54029cc131b3fd6f9a63748df1ff2ba48fc191fb GIT binary patch literal 4699 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 E12(D!!vFvP literal 0 HcmV?d00001 diff --git a/static/script.js b/static/script.js new file mode 100644 index 0000000..b5a2fc4 --- /dev/null +++ b/static/script.js @@ -0,0 +1,263 @@ +$(document).ready(function () { + $('.edit-button').click(function () { + const cardDiv = $(this).closest('.card'); + const form = cardDiv.find('.form'); + form.toggle(); + const cardTitle = cardDiv.data('title'); + form.find('.new-title').val(cardTitle); + }); + + $('.site-link').each(function () { + const fullLink = $(this).attr('href'); + if (fullLink) { + const hostname = new URL(fullLink).hostname; + $(this).text(hostname); + } + }); + + function deleteCard(cardDiv) { + const cardTitle = cardDiv.data('title'); + if (confirm(`Видалити запис "${cardTitle}"? Дані запису видаляться назавжди.`)) { + $.ajax({ + type: 'POST', + url: '/delete_card', + data: JSON.stringify({ title: cardTitle }), + contentType: 'application/json', + success: function () { + cardDiv.remove(); + }, + }); + } + } + + function saveUpdatedCard(cardDiv, form) { + const cardTitle = cardDiv.data('title'); + const cardTitleElement = cardDiv.find('h3'); + const cardDescriptionElement = cardDiv.find('p'); + const cardImageElement = cardDiv.find('.imageitem'); + const cardAuthorElement = cardDiv.find('.author'); + const cardVerifiedElement = cardDiv.find('.ver'); + const cardCompletedElement = cardDiv.find('.ove'); + const cardLinkElement = cardDiv.find('.site-linka'); + + let newTitle = form.find('.new-title').val(); + let newDescription = form.find('.new-description').val(); + let newImage = form.find('.new-image').val(); + let newAuthor = form.find('.new-author').val(); + let newVerified = form.find('.new-verified').prop('checked'); + let newCompleted = form.find('.new-completed').prop('checked'); + let newLink = form.find('.new-link').val(); + + const currentLink = cardLinkElement.attr('href') || ''; + + const isDataChanged = + newTitle !== cardTitleElement.text() || + newDescription !== cardDescriptionElement.text() || + newImage !== cardImageElement.attr('src') || + newAuthor !== cardAuthorElement.text() || + newVerified !== cardVerifiedElement.text().includes('Так') || + newCompleted !== cardCompletedElement.text().includes('Так') || + newLink !== currentLink; + + if (!isDataChanged) { + form.hide(); + return; + } + + const formData = { + title: cardTitle, + }; + + if (newTitle) { + formData.newTitle = encodeURIComponent(newTitle); + } + if (newDescription) { + formData.newDescription = encodeURIComponent(newDescription); + } + if (newImage) { + formData.newImage = encodeURIComponent(newImage); + } + if (newAuthor) { + formData.newAuthor = encodeURIComponent(newAuthor); + } + if (newVerified) { + formData.newVerified = newVerified; + } + if (newCompleted) { + formData.newCompleted = newCompleted; + } + if (newLink && newLink !== '#') { + formData.newLink = encodeURIComponent(newLink); + } + + $.ajax({ + type: 'POST', + url: '/edit_card', + data: JSON.stringify(formData), + contentType: 'application/json', + success: function (response) { + form.hide(); + if (formData.newTitle) { + cardTitleElement.text(decodeURIComponent(response.title)); + } + if (formData.newDescription) { + cardDescriptionElement.text(decodeURIComponent(response.description)); + } + if (formData.newImage) { + cardImageElement.attr('src', decodeURIComponent(response.image)); + } + if (formData.newAuthor) { + cardAuthorElement.text(decodeURIComponent(response.author)); + } + if (formData.newVerified) { + cardVerifiedElement.text('Офіційно: ' + (response.verified ? 'Так' : 'Ні')); + } + if (formData.newCompleted) { + cardCompletedElement.text('Завершено: ' + (response.completed ? 'Так' : 'Ні')); + } + if (formData.newLink) { + cardLinkElement.attr('href', decodeURIComponent(response.link)); + } + }, + }); + } + + + $('.save-button').click(function () { + const cardDiv = $(this).closest('.card'); + const form = cardDiv.find('.form'); + saveUpdatedCard(cardDiv, form); + }); + + $('.cancel-button').click(function () { + const form = $(this).closest('.form'); + form.hide(); + }); + + $('.add-button').click(function () { + const newTitle = $('#new-title').val(); + const newDescription = $('#new-description').val(); + const newImage = $('#new-image').val(); + const newAuthor = $('#new-author').val(); + const newLink = $('#new-link').val(); + const newVerified = $('#new-verified').prop('checked'); + const newCompleted = $('#new-completed').prop('checked'); + + const titleRegex = /^[^0-9!@#$%^&*()][A-Za-zА-Яа-яЁёҐґЄєЇїІі0-9\s]*$/; + + if (!titleRegex.test(newTitle)) { + alert('Помилка: Заголовок повинен починатися не з цифри чи спеціального символу.'); + return; + } + + const formData = JSON.stringify({ + title: newTitle, + description: newDescription, + image: newImage, + verified: newVerified, + author: newAuthor, + completed: newCompleted, + link: newLink, + }); + + $.ajax({ + type: 'POST', + url: '/add_card', + data: formData, + contentType: 'application/json', + success: function (response) { + const newCardHtml = ` + + `; + const newCard = $(newCardHtml); + $('.card-container').append(newCard); + + newCard.find('.delete-button').click(function () { + deleteCard(newCard); + }); + newCard.find('.edit-button').click(function () { + editCard(newCard); + }); + + $('#new-title').val(''); + $('#new-description').val(''); + $('#new-image').val(''); + $('#new-author').val(''); + $('#new-link').val(''); + $('#new-verified').prop('checked', false); + $('#new-completed').prop('checked', false); + }, + }); + }); + + function editCard(card) { + const form = card.find('.form'); + form.show(); + const cardTitle = card.data('title'); + const currentTitle = card.find('h3').text(); + const currentDescription = card.find('p').text(); + const currentImage = card.find('.imageitem').attr('src'); + const currentAuthor = card.find('.author').text(); + const currentVerified = card.find('.ver').text().includes('Так'); + const currentCompleted = card.find('.ove').text().includes('Так'); + const currentLink = card.find('.link').find('a').attr('href'); + + form.find('.new-title').val(currentTitle); + form.find('.new-description').val(currentDescription); + form.find('.new-image').val(currentImage); + form.find('.new-author').val(currentAuthor); + form.find('.new-verified').prop('checked', currentVerified); + form.find('.new-completed').prop('checked', currentCompleted); + form.find('.new-link').val(currentLink); + } + + $('.edit-button').click(function () { + editCard($(this).closest('.card')); + }); + + + + function sortCardsAZ() { + const cardContainer = $('.card-container'); + const cards = cardContainer.find('.card').get(); + cards.sort(function (a, b) { + const titleA = $(a).data('title').toLowerCase(); + const titleB = $(b).data('title').toLowerCase(); + return titleA.localeCompare(titleB); + }); + cardContainer.empty(); + $.each(cards, function (i, card) { + cardContainer.append(card); + }); + } + + function sortCardsZA() { + const cardContainer = $('.card-container'); + const cards = cardContainer.find('.card').get(); + cards.sort(function (a, b) { + const titleA = $(a).data('title').toLowerCase(); + const titleB = $(b).data('title').toLowerCase(); + return titleB.localeCompare(titleA); + }); + cardContainer.empty(); + $.each(cards, function (i, card) { + cardContainer.append(card); + }); + } + + $('#sort-az-button').click(sortCardsAZ); + $('#sort-za-button').click(sortCardsZA); + + function setupCardButtons() { + // Add event handlers for any dynamically added card buttons + $('.card-container .delete-button').click(function () { + deleteCard($(this).closest('.card')); + }); + + $('.card-container .edit-button').click(function () { + editCard($(this).closest('.card')); + }); + } + + setupCardButtons(); +}); diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..b773a09 --- /dev/null +++ b/static/style.css @@ -0,0 +1,171 @@ + + + +.dialog { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 999; + justify-content: center!important; + align-items: center!important; +} + +.imageitem{ + height: 200px; + width: 200px; + margin-bottom: 20px; + border-radius: 20px; +} + +.dialog-content { + background: #fff; + padding: 20px; + border-radius: 5px; + text-align: center; +} + + +body { + background-color: #1d1b1e; + font-family: Arial, sans-serif; + color: white; + margin: 0; + padding: 0; +} + +.container { + max-width: 960px; + margin: 0 auto; + padding: 20px; +} + +.card-container, .card { + display: flex!important; + justify-content: center; + flex-direction: row; + flex-wrap: wrap; + align-content: flex-start; + align-items: flex-start; +} + + +.card { + display: flex!important; + width: 280px; + background-color: #2b2222; + border: 1px solid #7e292a; + border-radius: 10px; + margin: 10px; + padding: 20px; + display: inline-block; + text-align: left; + min-height: 450px!important; + flex-direction: column; + justify-content: flex-start; + align-items: center; + align-content: center; + flex-wrap: nowrap; +} +.delete-button{ + width: 50%!important; + margin-bottom: 5px; +} + +.add-button, .delete-button{ + background-color: #7e292a; + font-family: 'Ubuntu', sans-serif; + color: #dbe1f8; + border: none; + height: 60px; + width: 60px; + align-items: center; + align-content: center; + border-radius: 20px; +} + + +.card h3 { + margin: 0; +} + +.edit-button { + background-color: #7e292a; + color: white; + border: none; + padding: 5px 10px; + border-radius: 10px; + cursor: pointer; +} + +.edit-button:hover, .add-button:hover, .delete-button:hover, .site-linka:hover { + background-color: #c57976; +} + + +/* Додані стилі для центрування */ + +.dialog h3 { + margin: 0; +} + +.dialog input { + width: 100%; + padding: 5px; + margin: 5px 0; +} + +.dialog button { + background-color: #7e292a; + color: white; + border: none; + padding: 5px 10px; + border-radius: 5px; + cursor: pointer; +} + +.dialog button:hover { + background-color: #c57976; +} + +.adddiv{ + border: 1px solid #7e292a; + display: flex!important; + justify-content: center; + flex-direction: column; + flex-wrap: wrap; + align-content: center; + align-items: center; + background-color: #2b2222; + padding: 50px 0; + font-family: 'Ubuntu', sans-serif; + color: #dbe1f8; + height: 300px; + width: 200px; + display: flex; + justify-content: center; + align-items: center; + position: fixed; + bottom: 35%; + right: 20px; + cursor: pointer; + z-index: 1000; + border-radius: 20px; + box-shadow: -7px -6px 21px 0px rgba(0,0,0,0.75); +-webkit-box-shadow: -7px -6px 21px 0px rgba(0,0,0,0.75); +-moz-box-shadow: -7px -6px 21px 0px rgba(0,0,0,0.75); +} + + +.addbutttt{ + display: flex!important; + justify-content: center; + flex-direction: column; + flex-wrap: wrap; + align-content: center; + align-items: center; + +} \ No newline at end of file diff --git a/styles.css b/static/styles.css similarity index 99% rename from styles.css rename to static/styles.css index 02a6e59..80b3d50 100644 --- a/styles.css +++ b/static/styles.css @@ -35,7 +35,7 @@ background-size: cover!important; -webkit-border-radius: 19px 19px 0px 0px; -moz-border-radius: 19px 19px 0px 0px; } - .addbutton{ + .addbutton, .delete-button{ display: block!important; /* Показувати меню на мобільних пристроях */ position: fixed; /* Фіксована позиція */ bottom: 8px; /* Внизу екрану */ diff --git a/submited.html b/submited.html index adaf484..bbdefa1 100644 --- a/submited.html +++ b/submited.html @@ -7,12 +7,12 @@ - - - - - - + + + + + + @@ -65,7 +65,7 @@

Спільнота українізації модів

© 2023 Спільнота українізації модів

-

Створено в Україні для українців

+

Створено в Києві з 💜

NOT AN OFFICIAL MINECRAFT PRODUCT. NOT APPROVED BY OR ASSOCIATED WITH MOJANG.

diff --git a/templates/editor.html b/templates/editor.html new file mode 100644 index 0000000..e1061dc --- /dev/null +++ b/templates/editor.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + +
+ +
+ + +
+
+ {% for card in data %} +
+ + немає зображення +

{{ card.title }}

+

{{ card.description }}

+ Офіційно: {{ 'Так' if card.verified else 'Ні' }} + Завершено: {{ 'Так' if card.completed else 'Ні' }} + Автор: {{ card.author or 'Команда СУМ'}} + Посилання: {{card.link|urlparse or 'немає' }} + + + +
+ + {% endfor %} +
+
+
+ +
+
+ + + + + +
+ Офіційно +
+
+ Завершено +
+
+
+ + + + +
+ + +