Files
masha_site/index.html
2025-09-22 21:22:25 +03:00

646 lines
19 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Маша Дергачева</title>
<meta
name="description"
content="Личная страница: о себе, проекты, заметки, контакты."
/>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Manrope:wght@300..800&display=swap"
rel="stylesheet"
/>
<style>
:root {
--bg: 255 255 255;
--fg: 19 22 31;
--muted: 101 115 126;
--accent: 123 97 255;
--card: 248 249 252;
--shadow: 0 20px 60px rgba(0, 0, 0, 0.08);
}
:root.dark {
--bg: 9 11 15;
--fg: 238 241 246;
--muted: 148 161 178;
--accent: 134 96 255;
--card: 16 20 27;
--shadow: 0 16px 50px rgba(0, 0, 0, 0.45);
}
@media (prefers-color-scheme: dark) {
:root:not(.light) {
--bg: 9 11 15;
--fg: 238 241 246;
--muted: 148 161 178;
--accent: 134 96 255;
--card: 16 20 27;
--shadow: 0 16px 50px rgba(0, 0, 0, 0.45);
}
}
* {
box-sizing: border-box;
}
html,
body {
height: 100%;
}
body {
margin: 0;
font-family:
Manrope,
system-ui,
-apple-system,
Segoe UI,
Roboto,
Ubuntu,
Cantarell,
Noto Sans,
sans-serif;
background: rgb(var(--bg));
color: rgb(var(--fg));
letter-spacing: 0.1px;
}
a {
color: rgb(var(--fg));
text-decoration: none;
}
.container {
width: 100%;
max-width: 1100px;
margin: 0 auto;
padding: 0 20px;
}
.header {
position: sticky;
top: 0;
background: rgba(var(--bg), 0.7);
backdrop-filter: saturate(180%) blur(12px);
border-bottom: 1px solid rgba(127, 127, 127, 0.08);
z-index: 50;
}
.header-inner {
display: flex;
align-items: center;
justify-content: space-between;
height: 64px;
}
.logo {
display: flex;
gap: 10px;
align-items: center;
font-weight: 800;
font-size: 18px;
}
.logo-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: linear-gradient(
135deg,
rgb(var(--accent)) 0%,
rgba(255, 138, 255, 1) 100%
);
box-shadow: 0 0 24px rgba(134, 96, 255, 0.6);
}
.nav {
display: flex;
gap: 18px;
font-weight: 600;
}
.theme {
display: inline-flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
border-radius: 12px;
border: 1px solid rgba(127, 127, 127, 0.18);
background: rgba(127, 127, 127, 0.06);
cursor: pointer;
transition: transform 0.15s ease;
}
.theme:active {
transform: scale(0.96);
}
.hero {
position: relative;
overflow: hidden;
}
.hero-gradient {
position: absolute;
inset: -30% -30% auto -30%;
height: 70vh;
filter: blur(60px);
background:
radial-gradient(
800px 400px at 20% 20%,
rgba(134, 96, 255, 0.2),
transparent
),
radial-gradient(
600px 300px at 80% 10%,
rgba(255, 138, 255, 0.18),
transparent
),
radial-gradient(
700px 300px at 50% 60%,
rgba(96, 200, 255, 0.16),
transparent
);
}
.hero-inner {
padding: 96px 0 40px;
position: relative;
}
.kicker {
display: inline-flex;
gap: 10px;
align-items: center;
padding: 8px 12px;
border-radius: 999px;
border: 1px solid rgba(127, 127, 127, 0.18);
background: rgba(127, 127, 127, 0.06);
font-size: 14px;
font-weight: 600;
}
.kicker .dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: rgb(var(--accent));
}
.h1 {
font-size: 56px;
line-height: 1.05;
margin: 18px 0 14px;
font-weight: 800;
letter-spacing: -0.5px;
}
.subtitle {
font-size: 18px;
line-height: 1.6;
color: rgb(var(--muted));
max-width: 680px;
}
.cta {
display: flex;
gap: 12px;
margin-top: 26px;
flex-wrap: wrap;
}
.btn {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 14px 18px;
border-radius: 14px;
font-weight: 800;
letter-spacing: 0.3px;
}
.btn-primary {
background: linear-gradient(
135deg,
rgb(var(--accent)) 0%,
rgba(255, 138, 255, 1) 100%
);
color: #fff;
box-shadow: 0 12px 30px rgba(134, 96, 255, 0.35);
}
.btn-ghost {
border: 1px solid rgba(127, 127, 127, 0.18);
background: rgba(127, 127, 127, 0.06);
}
.grid {
display: grid;
gap: 18px;
}
.cards {
grid-template-columns: repeat(12, 1fr);
}
.card {
grid-column: span 12;
background: rgb(var(--card));
border: 1px solid rgba(127, 127, 127, 0.14);
border-radius: 20px;
box-shadow: var(--shadow);
padding: 22px;
}
.card h3 {
margin: 0 0 8px;
font-size: 18px;
}
.card p {
margin: 0;
color: rgb(var(--muted));
line-height: 1.6;
}
.section {
padding: 40px 0;
}
.section h2 {
margin: 0 0 14px;
font-size: 28px;
}
.badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 999px;
border: 1px solid rgba(127, 127, 127, 0.18);
background: rgba(127, 127, 127, 0.06);
font-weight: 700;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgb(var(--muted));
}
.split {
display: grid;
gap: 18px;
}
.footer {
padding: 36px 0;
color: rgb(var(--muted));
font-size: 14px;
}
.avatar {
width: 96px;
height: 96px;
border-radius: 22px;
object-fit: cover;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
border: 3px solid rgba(255, 255, 255, 0.6);
}
.card-link {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
}
.card-link svg {
flex: 0 0 auto;
}
.input {
width: 100%;
padding: 14px 16px;
border-radius: 14px;
border: 1px solid rgba(127, 127, 127, 0.18);
background: rgba(127, 127, 127, 0.04);
color: rgb(var(--fg));
outline: none;
}
.row {
display: flex;
gap: 12px;
flex-wrap: wrap;
}
@media (min-width: 640px) {
.h1 {
font-size: 64px;
}
.split {
grid-template-columns: 1.2fr 0.8fr;
}
.card {
padding: 24px;
}
}
@media (min-width: 900px) {
.card {
grid-column: span 6;
}
.card.span-4 {
grid-column: span 4;
}
.card.span-8 {
grid-column: span 8;
}
}
</style>
</head>
<body>
<header class="header">
<div class="container header-inner">
<a class="logo" href="#top"
><span class="logo-dot"></span>Маша Дергачева</a
>
<nav class="nav">
<a href="#about">О себе</a>
<a href="#projects">Проекты</a>
<a href="#notes">Заметки</a>
<a href="#contacts">Контакты</a>
<button class="theme" id="theme" aria-label="Переключить тему">
<svg
id="sun"
width="18"
height="18"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="4"></circle>
<path
d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"
></path>
</svg>
<svg
id="moon"
width="18"
height="18"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
style="display: none"
>
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
</button>
</nav>
</div>
</header>
<section class="hero" id="top">
<div class="hero-gradient"></div>
<div class="container hero-inner">
<div class="kicker"><span class="dot"></span> Личная страница</div>
<h1 class="h1">Привет, я Маша</h1>
<p class="subtitle">
Здесь будет краткая фраза о себе: что люблю, чем занимаюсь и что ищу.
Например: пишу заметки, делаю маленькие проекты и учусь новому каждый
день.
</p>
<div class="cta">
<a class="btn btn-primary" href="#projects">Смотреть проекты</a>
<a class="btn btn-ghost" href="#contacts">Связаться</a>
</div>
</div>
</section>
<section class="section" id="about">
<div class="container split">
<div>
<h2>О себе</h2>
<p class="subtitle">
Коротко о том, кто я, откуда и чем интересуюсь. Можно упомянуть
любимые дисциплины, увлечения и цели на год. Достаточно нескольких
предложений, без лишней воды.
</p>
<div class="row" style="margin-top: 16px">
<span class="badge">Учусь и исследую</span>
<span class="badge">Пишу тексты</span>
<span class="badge">Делаю проекты</span>
</div>
</div>
<div
style="
display: flex;
justify-content: flex-end;
align-items: flex-start;
"
>
<img
class="avatar"
src="https://images.unsplash.com/photo-1544005313-94ddf0286df2?q=80&w=400&auto=format&fit=crop"
alt="Аватар"
/>
</div>
</div>
</section>
<section class="section" id="projects">
<div class="container">
<h2>Проекты</h2>
<div class="grid cards">
<a class="card span-4" href="#">
<div class="card-link">
<div>
<h3>Мини‑сайт</h3>
<p>
Лёгкий лэндинг на чистом HTML/CSS. Анимации, адаптив, тёмная
тема.
</p>
</div>
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 17L17 7" />
<path d="M7 7h10v10" />
</svg>
</div>
</a>
<a class="card span-4" href="#">
<div class="card-link">
<div>
<h3>Заметки</h3>
<p>Подборки мыслей и небольших эссе. Пишу просто и по делу.</p>
</div>
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 17L17 7" />
<path d="M7 7h10v10" />
</svg>
</div>
</a>
<a class="card span-4" href="#">
<div class="card-link">
<div>
<h3>Фото‑истории</h3>
<p>Маленькие визуальные нарративы из путешествий и будней.</p>
</div>
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 17L17 7" />
<path d="M7 7h10v10" />
</svg>
</div>
</a>
<a class="card span-8" href="#">
<div class="card-link">
<div>
<h3>Эксперимент</h3>
<p>
Интерактивная штука: генеративный фон, мини‑игра или
визуализация. Пространство для творчества.
</p>
</div>
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 17L17 7" />
<path d="M7 7h10v10" />
</svg>
</div>
</a>
<a class="card span-4" href="#">
<div class="card-link">
<div>
<h3>Список чтения</h3>
<p>
Книги и статьи, которые мне понравились. Короткие заметки и
оценки.
</p>
</div>
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 17L17 7" />
<path d="M7 7h10v10" />
</svg>
</div>
</a>
</div>
</div>
</section>
<section class="section" id="notes">
<div class="container">
<h2>Заметки</h2>
<div class="grid cards">
<a class="card" href="#">
<h3>Как начать личный сайт</h3>
<p>Мини‑гайд: чем наполнить, как вести и не забросить.</p>
</a>
<a class="card" href="#">
<h3>О внимании</h3>
<p>
Наблюдения о том, почему важно скучать и как это помогает идеям.
</p>
</a>
</div>
</div>
</section>
<section class="section" id="contacts">
<div class="container">
<h2>Контакты</h2>
<div class="grid" style="gap: 14px; max-width: 720px">
<div class="card">
<div class="row">
<input
class="input"
id="email"
value="hi@masha-dergacheva.рф"
readonly
/>
<button class="btn btn-ghost" id="copy">Скопировать</button>
</div>
</div>
<div class="card">
<div class="row">
<a
class="btn btn-primary"
href="https://t.me/username"
target="_blank"
rel="noopener noreferrer"
>Телеграм</a
>
<a class="btn btn-ghost" href="mailto:hi@masha-dergacheva.рф"
>Почта</a
>
<a class="btn btn-ghost" href="#">Instagram*</a>
</div>
<p class="subtitle" style="margin-top: 10px">
*Социальная сеть может быть признана экстремистской на территории
некоторых стран.
</p>
</div>
</div>
</div>
</section>
<footer class="footer">
<div
class="container"
style="
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
flex-wrap: wrap;
"
>
<div>© <span id="year"></span> маша-дергачева.рф</div>
<div>Светлая/тёмная тема, адаптив, без сборок</div>
</div>
</footer>
<script>
const root = document.documentElement;
const saved = localStorage.getItem("theme");
if (saved === "dark") {
root.classList.add("dark");
} else if (saved === "light") {
root.classList.add("light");
}
const btn = document.getElementById("theme");
const sun = document.getElementById("sun");
const moon = document.getElementById("moon");
function sync() {
const dark = root.classList.contains("dark");
sun.style.display = dark ? "none" : "block";
moon.style.display = dark ? "block" : "none";
}
btn.addEventListener("click", () => {
const preferDark = root.classList.contains("dark");
root.classList.toggle("dark", !preferDark);
root.classList.toggle("light", preferDark);
localStorage.setItem("theme", !preferDark ? "dark" : "light");
sync();
});
sync();
document.getElementById("year").textContent = new Date().getFullYear();
const copy = document.getElementById("copy");
copy.addEventListener("click", async () => {
const v = document.getElementById("email").value;
try {
await navigator.clipboard.writeText(v);
copy.textContent = "Скопировано";
setTimeout(() => (copy.textContent = "Скопировать"), 1600);
} catch (e) {
copy.textContent = "Ошибка";
}
});
</script>
</body>
</html>