perf(web): embed static files and templates

This commit is contained in:
2025-01-07 19:21:53 +03:00
parent 6ed054d56a
commit 02fb86049d
49 changed files with 27 additions and 7 deletions
+75
View File
@@ -0,0 +1,75 @@
<!DOCTYPE html>
<html lang="en">
<head>
{{ template "head" . }}
<title>Авторизация | SkazaNull</title>
</head>
<body class="min-h-screen bg-gray-50 flex flex-col items-center justify-center py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-xl w-full space-y-8 bg-white p-10 rounded-lg shadow-lg">
<div class="text-center">
<i class="fas fa-quote-left text-4xl text-custom mb-4"></i>
<h2 class="mt-6 text-3xl font-bold font-[&#39;Playfair_Display&#39;] text-gray-900">Категорически приветствую!</h2>
<p class="mt-2 text-sm text-gray-600 font-[&#39;Inter&#39;]">&#34;Пацанский веб-сервис для пацанских цитат&#34;</p>
</div>
<div id="error" class="hidden mt-4 p-4 rounded-md bg-red-50 border border-red-200 animate-fade-in"
style="position: relative; transition: all 0.3s ease-in-out;">
<p class="text-sm text-red-600 font-[&#39;Inter&#39;]">
<div class="flex items-center">
<i class="fas fa-exclamation-circle text-red-500 mr-2"></i>
<span class="text-sm text-red-600 font-[&#34;Inter&#34;]" id="error-message">
Упс, чёто пошло не так...
</span>
</div>
</p>
<button class="absolute top-2 right-2 text-red-400 hover:text-red-600" onclick="this.parentElement.style.display='none'">
<i class="fas fa-times"></i>
</button>
</div>
<form class="mt-8 space-y-6" id="auth" action="/api/auth" method="POST">
<div class="space-y-5">
<div>
<label for="login" class="block text-sm font-medium text-gray-700 font-[&#39;Inter&#39;]">
Электронная почта
</label>
<div class="mt-1 relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-envelope text-gray-400"></i>
</div>
<input id="login" name="login" type="login" required placeholder="Логин"
class="!rounded-button appearance-none block w-full pl-10 pr-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#39;Inter&#39;]" />
</div>
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 font-[&#39;Inter&#39;]">
Пароль
</label>
<div class="mt-1 relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-lock text-gray-400"></i>
</div>
<input id="password" name="password" type="password" required placeholder="Пароль"
class="!rounded-button appearance-none block w-full pl-10 pr-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#39;Inter&#39;]" />
</div>
</div>
</div>
<div>
<button type="submit"
class="!rounded-button group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium text-white bg-custom hover:bg-custom/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-custom font-[&#39;Inter&#39;]">
Войти
</button>
</div>
</form>
<div class="text-center">
<p class="text-xs text-gray-500 font-[&#39;Inter&#39;]">
<i class="fas fa-quote-right text-custom mr-1"></i>
&copy; Masahiko AMANO (H1K0), 2025—present
<i class="fas fa-quote-left text-custom ml-1"></i>
</p>
</div>
</div>
<script src="/static/js/auth.js"></script>
</body>
</html>
+28
View File
@@ -0,0 +1,28 @@
{{ define "head" }}
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon" sizes="57x57" href="/static/images/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/static/images/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/static/images/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/static/images/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/static/images/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/static/images/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/static/images/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/static/images/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/static/images/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/static/images/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/static/images/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/images/favicon-16x16.png">
<link rel="manifest" href="/skazanull.webmanifest">
<meta name="msapplication-TileColor" content="#8B6D5C">
<meta name="msapplication-TileImage" content="/static/images/ms-icon-144x144.png">
<meta name="theme-color" content="#8B6D5C">
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&amp;family=Inter:wght@400;500;600&amp;display=swap" rel="stylesheet" />
<link href="/static/css/font-awesome.6.4.0.min.css" rel="stylesheet"/>
<link href="/static/css/tailwind-custom.css" rel="stylesheet"/>
<link href="/static/css/skazanull.css" rel="stylesheet"/>
<script src="/static/js/tailwind.3.4.5.es"></script>
<script src="/static/js/tailwind-config.min.js" data-color="#000000" data-border-radius="small"></script>
<script src="/static/js/jquery-3.6.0.min.js"></script>
{{ end }}
+152
View File
@@ -0,0 +1,152 @@
<!DOCTYPE html>
<html lang="en">
<head>
{{ template "head" . }}
<title>Цитаты | SkazaNull</title>
</head>
<body class="min-h-screen bg-gray-50 flex flex-col items-center justify-center py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-4xl w-full space-y-8 bg-white p-10 rounded-lg shadow-lg">
<div class="text-center">
<i class="fas fa-quote-left text-4xl text-custom mb-4"></i>
<h2 class="mt-6 text-3xl font-bold font-[&#39;Playfair_Display&#39;] text-gray-900">Пацанские цитаты</h2>
<p class="mt-2 text-sm text-gray-600 font-[&#39;Inter&#39;]">Читайте и угорайте :)</p>
</div>
<div id="error" class="hidden mt-4 p-4 rounded-md bg-red-50 border border-red-200">
<p id="error-message" class="text-sm text-red-600 font-[&#39;Inter&#39;]"></p>
</div>
<div class="mb-6 flex justify-between items-center flex-wrap gap-4">
<div class="flex flex-wrap gap-4">
<input type="text" id="input-search" placeholder="Поиск цитат..." class="px-4 py-2 border rounded-lg" />
<select id="input-sorting" class="px-4 py-2 border rounded-lg" style="padding-right: 3.5rem;">
<option value="-datetime">По дате ↑</option>
<option value="+datetime">По дате ↓</option>
<option value="+author">По автору А</option>
<option value="-author">По автору Я-А</option>
<option value="+text">По тексту А</option>
<option value="-text">По тексту Я-А</option>
<option value="+creator.name">По цитатору А</option>
<option value="-creator.name">По цитатору Я-А</option>
<option value="random">Рандом Рандомыч</option>
</select>
<button class="text-gray-600 hover:text-blue-500" id="btn-refresh">
<i class="fas fa-refresh"></i>
</button>
</div>
<button class="bg-custom text-white px-4 py-2 rounded-lg hover:bg-custom/90" id="btn-add-open">Добавить цитату</button>
</div>
<hr>
<div id="block-quotes" class="space-y-4">
<img id="block-quotes-loader" src="/static/images/loader.gif" alt="Loading..." class="loader">
</div>
<hr>
<div class="mt-6 flex justify-center gap-2">
<button id="btn-page-first" class="hidden px-3 py-1 border rounded-lg hover:bg-gray-50">1</button>
<div id="pages-prev" class="hidden px-3 py-1 border rounded-lg hover:bg-gray-50">...</div>
<button id="btn-page-prev" class="hidden px-3 py-1 border rounded-lg hover:bg-gray-50">1</button>
<button id="btn-page-curr" class="px-3 py-1 border rounded-lg bg-custom text-white">2</button>
<button id="btn-page-next" class="hidden px-3 py-1 border rounded-lg hover:bg-gray-50">3</button>
<div id="pages-next" class="hidden px-3 py-1 border rounded-lg hover:bg-gray-50">...</div>
<button id="btn-page-last" class="hidden px-3 py-1 border rounded-lg hover:bg-gray-50">10</button>
</div>
<a href="/settings" class="block fas fa-gear text-gray-800" style="text-align: center;"> Настройки</a>
<div class="text-center mt-8">
<p class="text-xs text-gray-500 font-[&#39;Inter&#39;]">
<i class="fas fa-quote-right text-custom mr-1"></i>
&copy; Masahiko AMANO (H1K0), 2025—present
<i class="fas fa-quote-left text-custom ml-1"></i>
</p>
</div>
</div>
<div id="quote-creator" class="hidden quote-form flex flex-col items-center justify-center">
<div class="max-w-4xl w-full mt-8 p-6">
<div class="max-w-4xl w-full space-y-8 bg-white p-10 rounded-lg shadow-lg">
<h3 class="text-xl font-bold font-[&#39;Playfair_Display&#39;] text-gray-900 mb-4">Создать цитату</h3>
<div id="quote-creator-error" class="hidden mt-4 p-4 rounded-md bg-red-50 border border-red-200">
<p id="quote-creator-error-message" class="text-sm text-red-600 font-[&#39;Inter&#39;]"></p>
</div>
<form id="quote-create" class="space-y-4">
<div>
<label for="new-quote-text" class="block text-sm font-medium text-gray-700 font-[&#39;Inter&#39;]">
Цитата
</label>
<textarea id="new-quote-text" name="text" rows="3" placeholder="Сказанная цитата может быть сказана тем, кто её сказанул." required
class="!rounded-button mt-1 block w-full px-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#39;Inter&#39;]"></textarea>
</div>
<div>
<label for="new-quote-author" class="block text-sm font-medium text-gray-700 font-[&#39;Inter&#39;]">
Автор
</label>
<input type="text" id="new-quote-author" name="author" placeholder="Узбекс" required
class="!rounded-button mt-1 block w-full px-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#39;Inter&#39;]" />
</div>
<div>
<label for="new-quote-datetime" class="block text-sm font-medium text-gray-700 font-[&#39;Inter&#39;]">
Дата и время
</label>
<input type="datetime-local" id="new-quote-datetime" name="datetime" step="1"
class="!rounded-button mt-1 block w-full px-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#39;Inter&#39;]" />
</div>
<div class="flex justify-end space-x-3">
<button type="button" id="btn-add-close"
class="!rounded-button px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-custom font-[&#39;Inter&#39;]">
Отмена
</button>
<button type="submit"
class="!rounded-button px-4 py-2 text-sm font-medium text-white bg-custom hover:bg-custom/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-custom font-[&#39;Inter&#39;]">
Создать
</button>
</div>
</form>
</div>
</div>
</div>
<div id="quote-editor" class="hidden quote-form flex flex-col items-center justify-center">
<div class="max-w-4xl w-full mt-8 p-6">
<div class="max-w-4xl w-full space-y-8 bg-white p-10 rounded-lg shadow-lg">
<h3 class="text-xl font-bold font-[&#34;Playfair_Display&#34;] text-gray-900 mb-4">Редактировать цитату</h3>
<div id="quote-editor-error" class="hidden mt-4 p-4 rounded-md bg-red-50 border border-red-200">
<p id="quote-editor-error-message" class="text-sm text-red-600 font-[&#39;Inter&#39;]"></p>
</div>
<form id="quote-update" class="space-y-4">
<div>
<label for="edit-quote-text" class="block text-sm font-medium text-gray-700 font-[&#34;Inter&#34;]">
Цитата
</label>
<textarea id="edit-quote-text" name="text" rows="3" placeholder="Сказанная цитата может быть сказана тем, кто её сказанул." required
class="!rounded-button mt-1 block w-full px-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#34;Inter&#34;]"></textarea>
</div>
<div>
<label for="edit-quote-author" class="block text-sm font-medium text-gray-700 font-[&#34;Inter&#34;]">
Автор
</label>
<input type="text" id="edit-quote-author" name="author" placeholder="Узбекс" required
class="!rounded-button mt-1 block w-full px-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#34;Inter&#34;]" />
</div>
<div>
<label for="edit-quote-datetime" class="block text-sm font-medium text-gray-700 font-[&#34;Inter&#34;]">
Дата и время
</label>
<input type="datetime-local" id="edit-quote-datetime" name="datetime" step="1"
class="!rounded-button mt-1 block w-full px-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#34;Inter&#34;]" />
</div>
<div class="flex justify-end space-x-3">
<button type="button" id="btn-edit-close"
class="!rounded-button px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-custom font-[&#34;Inter&#34;]">
Отмена
</button>
<button type="submit"
class="!rounded-button px-4 py-2 text-sm font-medium text-white bg-custom hover:bg-custom/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-custom font-[&#34;Inter&#34;]">
Сохранить
</button>
</div>
</form>
</div>
</div>
</div>
<script src="/static/js/utils.js"></script>
<script src="/static/js/quotes.js"></script>
</body>
</html>
+101
View File
@@ -0,0 +1,101 @@
<!DOCTYPE html>
<html lang="en">
<head>
{{ template "head" . }}
<title>Настройки | SkazaNull</title>
</head>
<body class="min-h-screen bg-gray-50 flex flex-col items-center justify-center py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-lg w-full space-y-8 bg-white p-10 rounded-lg shadow-lg">
<div class="text-center">
<i class="fas fa-quote-left text-4xl text-custom mb-4"></i>
<h2 class="mt-6 text-3xl font-bold font-[&#39;Playfair_Display&#39;] text-gray-900">
Настройки юзверя
</h2>
<p class="mt-2 text-sm text-gray-600 font-[&#39;Inter&#39;]">
Изменяй и властвуй
</p>
</div>
<div id="error" class="hidden mt-4 p-4 rounded-md bg-red-50 border border-red-200">
<p id="error-message" class="text-sm text-red-600 font-[&#39;Inter&#39;]"></p>
</div>
<div id="success" class="hidden mt-4 p-4 rounded-md bg-green-50 border border-green-200">
<p id="success-message" class="text-sm text-green-600 font-[&#39;Inter&#39;]">Юзверь обновлен!</p>
</div>
<form id="user-update" class="mt-8 space-y-6" action="/api/auth" method="PATCH">
<div class="space-y-5">
<div><label class="block text-sm font-medium text-gray-700 font-[&#34;Inter&#34;]">Имя юзверя</label>
<div class="mt-1 relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-user text-gray-400"></i>
</div>
<input type="text" id="input-name" name="name" placeholder="Например, &quot;Центробек&quot;"
class="!rounded-button appearance-none block w-full pl-10 pr-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#34;Inter&#34;]" />
</div>
</div>
<div class="mt-4">
<label class="block text-sm font-medium text-gray-700 font-[&#34;Inter&#34;]">
Логин (то, что при авторизации используется)
</label>
<div class="mt-1 relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-at text-gray-400"></i>
</div>
<input type="login" id="input-login" name="login" placeholder="Например, &quot;centrobeque&quot;"
class="!rounded-button appearance-none block w-full pl-10 pr-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#34;Inter&#34;]" />
</div>
</div>
<div class="mt-4">
<label class="block text-sm font-medium text-gray-700 font-[&#34;Inter&#34;]">
Пароль
</label>
<div class="mt-1 relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-lock text-gray-400"></i>
</div>
<input type="password" id="input-password" name="password" placeholder="Например, &quot;uzbeki_sila!&quot;"
class="!rounded-button appearance-none block w-full pl-10 pr-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#34;Inter&#34;]" />
</div>
</div>
<div class="mt-4">
<label class="block text-sm font-medium text-gray-700 font-[&#34;Inter&#34;]">
Telegram ID
</label>
<div class="mt-1 relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fab fa-telegram text-gray-400"></i>
</div>
<input type="number" id="input-tgid" name="telegram_id" placeholder="Здесь должны быть ТОЛЬКО цифры"
class="!rounded-button appearance-none block w-full pl-10 pr-3 py-2 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-custom focus:border-custom sm:text-sm font-[&#34;Inter&#34;]" />
</div>
</div>
</div>
<div class="flex items-center justify-between">
<div class="flex justify-between w-full">
<button type="submit"
class="!rounded-button px-6 py-2 text-sm font-medium text-white bg-custom hover:bg-custom/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-custom font-[&#34;Inter&#34;]">
Сохранить изменения
</button>
<button type="button" id="btn-logout"
class="!rounded-button px-6 py-2 text-sm font-medium text-white bg-red-600 hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 font-[&#34;Inter&#34;]">
Выйти
</button>
</div>
</div>
</form>
<hr>
<a href="/quotes" class="block fas fa-book text-gray-800" style="text-align: center;"> К цитатам</a>
<div class="text-center">
<p class="text-xs text-gray-500 font-[&#39;Inter&#39;]">
<i class="fas fa-quote-right text-custom mr-1"></i>
&copy; Masahiko AMANO (H1K0), 2025—present
<i class="fas fa-quote-left text-custom ml-1"></i>
</p>
</div>
</div>
<script src="/static/js/utils.js"></script>
<script src="/static/js/settings.js"></script>
</body>
</html>