205 lines
9.8 KiB
HTML
205 lines
9.8 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>Семейные задачи</title>
|
||
<script src="https://cdn.tailwindcss.com"></script>
|
||
<script>
|
||
tailwind.config = {
|
||
theme: {
|
||
extend: {
|
||
colors: {
|
||
ink: '#0F1218',
|
||
accent: '#00E5FF',
|
||
'accent-50': '#E8FCFF',
|
||
muted: '#5B6573',
|
||
line: '#F2F4F7',
|
||
},
|
||
fontFamily: {
|
||
sans: ['-apple-system','BlinkMacSystemFont','Segoe UI','Inter','system-ui','sans-serif'],
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
<link rel="stylesheet" href="style.css">
|
||
</head>
|
||
<body class="bg-line text-ink font-sans min-h-screen">
|
||
|
||
<!-- Экран онбординга (первый запуск) -->
|
||
<div id="onboard" class="hidden min-h-screen flex items-center justify-center p-5">
|
||
<div class="w-full max-w-lg bg-white rounded-2xl shadow-xl p-7">
|
||
<div class="text-center mb-6">
|
||
<div class="text-5xl mb-3">👨👩👧👦</div>
|
||
<h1 class="text-2xl font-extrabold">Создайте семейный аккаунт</h1>
|
||
<p class="text-muted mt-2 text-sm">Добавьте членов семьи — каждый сможет заходить под своим именем и ставить задачи друг другу.</p>
|
||
</div>
|
||
|
||
<label class="block text-sm font-semibold mb-1">Название семьи</label>
|
||
<input id="ob-family" class="field mb-5" placeholder="Напр. Семья Ивановых">
|
||
|
||
<label class="block text-sm font-semibold mb-1">Члены семьи</label>
|
||
<div id="ob-members" class="space-y-2 mb-3"></div>
|
||
<button id="ob-add-member" class="text-sm font-semibold text-ink underline">+ добавить члена семьи</button>
|
||
|
||
<div class="bg-accent-50 rounded-xl p-3 text-xs text-muted mt-5">
|
||
Данные хранятся в этом браузере. Лучше всего пользоваться с одного общего семейного устройства — тогда все увидят одни и те же задачи.
|
||
</div>
|
||
|
||
<button id="ob-create" class="btn-primary w-full mt-5">Создать и войти</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Основное приложение -->
|
||
<div id="app" class="hidden min-h-screen flex flex-col">
|
||
|
||
<!-- Шапка -->
|
||
<header class="bg-ink text-white sticky top-0 z-20">
|
||
<div class="max-w-6xl mx-auto px-4 py-3 flex items-center gap-3">
|
||
<div class="text-2xl">📋</div>
|
||
<div class="flex-1 min-w-0">
|
||
<div id="hd-family" class="font-bold leading-tight truncate">Семья</div>
|
||
<div class="text-xs text-white/50 leading-tight">Семейные задачи и расписание</div>
|
||
</div>
|
||
<button id="hd-new" class="btn-primary text-sm hidden sm:inline-flex">+ Новая задача</button>
|
||
<button id="hd-new-m" class="btn-primary text-sm sm:hidden !px-3">+</button>
|
||
|
||
<!-- Кто я (вход) -->
|
||
<div class="relative">
|
||
<button id="hd-user" class="flex items-center gap-2 bg-white/10 hover:bg-white/20 rounded-full pl-1 pr-3 py-1 transition">
|
||
<span id="hd-avatar" class="avatar w-8 h-8 text-base">?</span>
|
||
<span id="hd-name" class="text-sm font-semibold max-w-[90px] truncate">—</span>
|
||
<svg width="12" height="12" viewBox="0 0 24 24" class="opacity-60"><path fill="currentColor" d="M7 10l5 5 5-5z"/></svg>
|
||
</button>
|
||
<div id="hd-menu" class="hidden absolute right-0 mt-2 w-60 bg-white text-ink rounded-xl shadow-2xl p-2 z-30">
|
||
<div class="px-3 py-2 text-xs text-muted font-semibold">Войти как…</div>
|
||
<div id="hd-user-list" class="max-h-72 overflow-auto"></div>
|
||
<div class="border-t border-line mt-1 pt-1">
|
||
<button id="hd-manage" class="w-full text-left px-3 py-2 rounded-lg hover:bg-line text-sm font-semibold">⚙️ Управление семьёй</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Навигация -->
|
||
<nav class="max-w-6xl mx-auto px-2 flex gap-1 overflow-x-auto">
|
||
<button data-view="mine" class="navtab">✅ Мои задачи</button>
|
||
<button data-view="assigned" class="navtab">📤 Я поручил</button>
|
||
<button data-view="all" class="navtab">🗂 Все задачи</button>
|
||
<button data-view="schedule" class="navtab">📅 Расписание</button>
|
||
<button data-view="family" class="navtab">👨👩👧 Семья</button>
|
||
</nav>
|
||
</header>
|
||
|
||
<!-- Контент -->
|
||
<main id="main" class="flex-1 max-w-6xl w-full mx-auto px-4 py-6"></main>
|
||
|
||
<footer class="text-center text-xs text-muted py-5">
|
||
Данные хранятся локально в этом браузере · семейный таск-менеджер
|
||
</footer>
|
||
</div>
|
||
|
||
<!-- Модалка задачи -->
|
||
<div id="modal" class="hidden fixed inset-0 z-40 bg-black/50 flex items-end sm:items-center justify-center p-0 sm:p-4">
|
||
<div class="bg-white w-full sm:max-w-lg sm:rounded-2xl rounded-t-2xl shadow-2xl max-h-[92vh] overflow-auto">
|
||
<div class="sticky top-0 bg-white border-b border-line px-5 py-3 flex items-center justify-between">
|
||
<h3 id="modal-title" class="font-bold text-lg">Новая задача</h3>
|
||
<button id="modal-close" class="text-2xl leading-none text-muted hover:text-ink px-2">×</button>
|
||
</div>
|
||
<div class="p-5 space-y-4">
|
||
<div>
|
||
<label class="block text-sm font-semibold mb-1">Что нужно сделать *</label>
|
||
<input id="f-title" class="field" placeholder="Напр. Купить молоко">
|
||
</div>
|
||
<div>
|
||
<label class="block text-sm font-semibold mb-1">Подробности</label>
|
||
<textarea id="f-note" class="field" rows="2" placeholder="Комментарий (необязательно)"></textarea>
|
||
</div>
|
||
<div class="grid grid-cols-2 gap-3">
|
||
<div>
|
||
<label class="block text-sm font-semibold mb-1">Кому *</label>
|
||
<select id="f-assignee" class="field"></select>
|
||
</div>
|
||
<div>
|
||
<label class="block text-sm font-semibold mb-1">Срок</label>
|
||
<input id="f-date" type="date" class="field">
|
||
</div>
|
||
</div>
|
||
<div class="grid grid-cols-2 gap-3">
|
||
<div>
|
||
<label class="block text-sm font-semibold mb-1">Время</label>
|
||
<input id="f-time" type="time" class="field">
|
||
</div>
|
||
<div>
|
||
<label class="block text-sm font-semibold mb-1">Важность</label>
|
||
<select id="f-priority" class="field">
|
||
<option value="low">🟢 Низкая</option>
|
||
<option value="medium" selected>🟡 Средняя</option>
|
||
<option value="high">🔴 Высокая</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="text-xs text-muted bg-line rounded-lg p-3">
|
||
От кого: <span id="f-from" class="font-semibold text-ink">—</span>
|
||
</div>
|
||
<div id="f-history" class="hidden text-xs text-muted border-t border-line pt-3">
|
||
<div class="font-semibold mb-1">История:</div>
|
||
<div id="f-history-list" class="space-y-1"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sticky bottom-0 bg-white border-t border-line px-5 py-3 flex gap-2">
|
||
<button id="modal-delete" class="hidden btn-danger">Удалить</button>
|
||
<button id="modal-save" class="btn-primary flex-1">Сохранить</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Модалка "перенести на дату" -->
|
||
<div id="postpone-modal" class="hidden fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4">
|
||
<div class="bg-white rounded-2xl shadow-2xl p-5 w-full max-w-xs">
|
||
<h3 class="font-bold text-lg mb-3">Перенести на</h3>
|
||
<input id="pp-date" type="date" class="field mb-4">
|
||
<div class="flex gap-2">
|
||
<button id="pp-cancel" class="btn-ghost flex-1">Отмена</button>
|
||
<button id="pp-ok" class="btn-primary flex-1">Перенести</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Модалка управления семьёй -->
|
||
<div id="family-modal" class="hidden fixed inset-0 z-40 bg-black/50 flex items-end sm:items-center justify-center p-0 sm:p-4">
|
||
<div class="bg-white w-full sm:max-w-lg sm:rounded-2xl rounded-t-2xl shadow-2xl max-h-[92vh] overflow-auto">
|
||
<div class="sticky top-0 bg-white border-b border-line px-5 py-3 flex items-center justify-between">
|
||
<h3 class="font-bold text-lg">⚙️ Управление семьёй</h3>
|
||
<button id="fm-close" class="text-2xl leading-none text-muted hover:text-ink px-2">×</button>
|
||
</div>
|
||
<div class="p-5 space-y-4">
|
||
<div>
|
||
<label class="block text-sm font-semibold mb-1">Название семьи</label>
|
||
<input id="fm-name" class="field">
|
||
</div>
|
||
<div>
|
||
<div class="flex items-center justify-between mb-1">
|
||
<label class="text-sm font-semibold">Члены семьи</label>
|
||
<button id="fm-add" class="text-sm font-semibold text-ink underline">+ добавить</button>
|
||
</div>
|
||
<div id="fm-list" class="space-y-2"></div>
|
||
</div>
|
||
<div class="bg-line rounded-lg p-3 text-xs text-muted">
|
||
Если удалить члена семьи, его задачи станут «без исполнителя». Имя при входе можно сменить в любой момент.
|
||
</div>
|
||
</div>
|
||
<div class="sticky bottom-0 bg-white border-t border-line px-5 py-3">
|
||
<button id="fm-save" class="btn-primary w-full">Сохранить</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Тост -->
|
||
<div id="toast" class="hidden fixed bottom-5 left-1/2 -translate-x-1/2 z-50 bg-ink text-white px-5 py-3 rounded-full shadow-2xl text-sm font-semibold"></div>
|
||
|
||
<script src="app.js"></script>
|
||
</body>
|
||
</html>
|