Initial commit
This commit is contained in:
commit
01e0debd76
15 files changed
+2383
No files matched your search
@@ -0,0 +1,102 @@
|
||||
<!doctype html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Страница не найдена — RedGifs Video Downloader</title>
|
||||
<meta name="description" content="Такой страницы нет.">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta name="theme-color" content="#070a0f">
|
||||
<meta name="color-scheme" content="dark">
|
||||
<!--
|
||||
Self-contained on purpose: GitHub Pages serves this file for a missing path at
|
||||
ANY depth, so neither relative nor root-absolute asset links can be trusted.
|
||||
Everything below is inlined, and the home link is derived from the URL.
|
||||
-->
|
||||
<style>
|
||||
:root { color-scheme: dark; }
|
||||
* { box-sizing: border-box; }
|
||||
body {
|
||||
margin: 0;
|
||||
min-height: 100vh;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
padding: 40px 22px;
|
||||
background:
|
||||
radial-gradient(760px 460px at 76% -6%, rgba(240, 68, 104, 0.22), transparent 62%),
|
||||
radial-gradient(680px 420px at 8% 10%, rgba(166, 108, 255, 0.12), transparent 60%),
|
||||
linear-gradient(178deg, #0b0f17 0%, #070a0f 68%);
|
||||
color: #f4f7fb;
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
|
||||
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
text-align: center;
|
||||
}
|
||||
b {
|
||||
display: block;
|
||||
font-size: clamp(76px, 15vw, 148px);
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.05em;
|
||||
line-height: 1;
|
||||
background: linear-gradient(140deg, #ff8aa3, #f04468 55%, #bf254c);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
}
|
||||
h1 { margin: 16px 0 10px; font-size: clamp(22px, 3.4vw, 32px); font-weight: 800; letter-spacing: -0.02em; }
|
||||
p { margin: 0 0 28px; color: #a3aec1; }
|
||||
a {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 9px;
|
||||
padding: 12px 22px;
|
||||
border-radius: 13px;
|
||||
background: linear-gradient(135deg, #ff5a7c 0%, #f04468 52%, #bf254c 100%);
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
text-decoration: none;
|
||||
box-shadow: 0 14px 38px rgba(240, 68, 104, 0.28);
|
||||
transition: transform 160ms cubic-bezier(.22,1,.36,1), filter 160ms ease;
|
||||
}
|
||||
a:hover { transform: translateY(-2px); filter: brightness(1.08); }
|
||||
a svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
|
||||
@media (prefers-reduced-motion: reduce) { a { transition: none; } }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<main>
|
||||
<b>404</b>
|
||||
<h1 id="title">Страница не найдена</h1>
|
||||
<p id="text">Ссылка не работает или страница переехала.</p>
|
||||
<a id="home" href="/">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M19 12H5"/><path d="m11 6-6 6 6 6"/></svg>
|
||||
<span id="cta">Вернуться на главную</span>
|
||||
</a>
|
||||
</main>
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
// On a github.io project page the site root is /<repo>/, not /.
|
||||
var host = location.hostname;
|
||||
var seg = location.pathname.split('/').filter(Boolean);
|
||||
var isProjectPage = /\.github\.io$/i.test(host) && seg.length > 0;
|
||||
document.getElementById('home').setAttribute('href', isProjectPage ? '/' + seg[0] + '/' : '/');
|
||||
|
||||
// Match the language preference chosen on the rest of the site.
|
||||
var lang = null;
|
||||
try { lang = localStorage.getItem('rgvd-lang'); } catch (err) { lang = null; }
|
||||
if (lang !== 'ru' && lang !== 'en') {
|
||||
lang = (navigator.language || '').toLowerCase().indexOf('ru') === 0 ? 'ru' : 'en';
|
||||
}
|
||||
if (lang === 'en') {
|
||||
document.documentElement.setAttribute('lang', 'en');
|
||||
document.title = 'Page not found — RedGifs Video Downloader';
|
||||
document.getElementById('title').textContent = 'Page not found';
|
||||
document.getElementById('text').textContent = 'The link is broken or the page has moved.';
|
||||
document.getElementById('cta').textContent = 'Back to the overview';
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,14 @@
|
||||
# RedGifs Video Downloader — сайт-витрина
|
||||
|
||||
Статическая страница-презентация расширения **RedGifs Video Downloader**.
|
||||
Без сборки, без зависимостей и без бэкенда: HTML, CSS и один файл JavaScript.
|
||||
|
||||
**Сайт:** https://redgifs.extension.lonarpgproxy.space/
|
||||
**Само расширение:** https://github.com/OwnerLink/redgifs-video-downloader
|
||||
**Скачать сборку:** https://github.com/OwnerLink/redgifs-video-downloader/releases/latest
|
||||
|
||||
## Лицензия
|
||||
|
||||
Материалы сайта относятся к проекту RedGifs Video Downloader,
|
||||
© 2026 RedGifs Video Downloader, все права защищены. Условия — в
|
||||
[LICENSE расширения](https://github.com/OwnerLink/redgifs-video-downloader/blob/main/LICENSE).
|
||||
@@ -0,0 +1,979 @@
|
||||
/* ==========================================================================
|
||||
RedGifs Video Downloader — showcase site
|
||||
Palette mirrors the extension UI (popup.css / content.js)
|
||||
========================================================================== */
|
||||
|
||||
:root {
|
||||
--bg: #070a0f;
|
||||
--bg-soft: #0c1017;
|
||||
--surface: #101623;
|
||||
--surface-2: #131b29;
|
||||
--line: rgba(255, 255, 255, 0.08);
|
||||
--line-strong: rgba(255, 255, 255, 0.14);
|
||||
|
||||
--text: #f4f7fb;
|
||||
--muted: #a3aec1;
|
||||
--dim: #748096;
|
||||
|
||||
--pink: #f04468;
|
||||
--pink-soft: #ff7895;
|
||||
--pink-deep: #bf254c;
|
||||
--green: #20b879;
|
||||
--green-soft: #35d596;
|
||||
--orange: #ff9c45;
|
||||
--purple: #a66cff;
|
||||
--cyan: #31d7ff;
|
||||
|
||||
--radius-s: 10px;
|
||||
--radius: 16px;
|
||||
--radius-l: 22px;
|
||||
|
||||
--shadow: 0 18px 46px rgba(0, 0, 0, 0.45);
|
||||
--shadow-pink: 0 14px 38px rgba(240, 68, 104, 0.28);
|
||||
|
||||
--maxw: 1160px;
|
||||
--ease: cubic-bezier(0.22, 1, 0.36, 1);
|
||||
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
scroll-padding-top: 88px;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
|
||||
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.62;
|
||||
overflow-x: hidden;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
/* Ambient background glow */
|
||||
body::before {
|
||||
content: "";
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: -1;
|
||||
pointer-events: none;
|
||||
background:
|
||||
radial-gradient(900px 520px at 78% -8%, rgba(240, 68, 104, 0.20), transparent 62%),
|
||||
radial-gradient(760px 480px at 6% 8%, rgba(166, 108, 255, 0.12), transparent 60%),
|
||||
radial-gradient(900px 620px at 50% 108%, rgba(32, 184, 121, 0.08), transparent 62%),
|
||||
linear-gradient(178deg, #0b0f17 0%, #070a0f 68%);
|
||||
}
|
||||
|
||||
img { max-width: 100%; display: block; }
|
||||
a { color: inherit; text-decoration: none; }
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
margin: 0;
|
||||
line-height: 1.18;
|
||||
letter-spacing: -0.02em;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
p { margin: 0; }
|
||||
|
||||
code, kbd, .mono {
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas,
|
||||
"Liberation Mono", monospace;
|
||||
font-size: 0.88em;
|
||||
}
|
||||
|
||||
:focus-visible {
|
||||
outline: 2px solid var(--pink-soft);
|
||||
outline-offset: 3px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.wrap {
|
||||
width: 100%;
|
||||
max-width: var(--maxw);
|
||||
margin-inline: auto;
|
||||
padding-inline: 22px;
|
||||
}
|
||||
|
||||
.visually-hidden {
|
||||
position: absolute;
|
||||
width: 1px; height: 1px;
|
||||
margin: -1px; padding: 0;
|
||||
overflow: hidden;
|
||||
clip: rect(0 0 0 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* ============================ Skip link ============================ */
|
||||
|
||||
.skip-link {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: -60px;
|
||||
transform: translateX(-50%);
|
||||
z-index: 200;
|
||||
padding: 10px 18px;
|
||||
border-radius: 0 0 12px 12px;
|
||||
background: var(--pink);
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
transition: top 160ms var(--ease);
|
||||
}
|
||||
.skip-link:focus { top: 0; }
|
||||
|
||||
/* ============================ Header ============================ */
|
||||
|
||||
.site-header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
backdrop-filter: blur(16px);
|
||||
-webkit-backdrop-filter: blur(16px);
|
||||
background: rgba(8, 11, 17, 0.72);
|
||||
border-bottom: 1px solid transparent;
|
||||
transition: border-color 220ms ease, background 220ms ease;
|
||||
}
|
||||
.site-header.is-stuck {
|
||||
border-bottom-color: var(--line);
|
||||
background: rgba(8, 11, 17, 0.92);
|
||||
}
|
||||
|
||||
.site-header .wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 18px;
|
||||
height: 68px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.brand {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 11px;
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.015em;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
.brand img { width: 32px; height: 32px; border-radius: 9px; }
|
||||
.brand span { font-size: 15px; white-space: nowrap; }
|
||||
.brand small {
|
||||
display: block;
|
||||
font-size: 10.5px;
|
||||
font-weight: 600;
|
||||
color: var(--dim);
|
||||
letter-spacing: 0.06em;
|
||||
text-transform: uppercase;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin-inline-start: auto;
|
||||
}
|
||||
.nav a {
|
||||
padding: 8px 12px;
|
||||
border-radius: 9px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: var(--muted);
|
||||
transition: color 150ms ease, background 150ms ease;
|
||||
}
|
||||
.nav a:hover { color: var(--text); background: rgba(255, 255, 255, 0.06); }
|
||||
|
||||
.header-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.lang-switch {
|
||||
display: inline-flex;
|
||||
padding: 3px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 999px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
}
|
||||
.lang-switch button {
|
||||
padding: 5px 11px;
|
||||
border: 0;
|
||||
border-radius: 999px;
|
||||
background: transparent;
|
||||
color: var(--dim);
|
||||
font: inherit;
|
||||
font-size: 12px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.04em;
|
||||
cursor: pointer;
|
||||
transition: color 150ms ease, background 150ms ease;
|
||||
}
|
||||
.lang-switch button:hover { color: var(--text); }
|
||||
.lang-switch button[aria-pressed="true"] {
|
||||
background: linear-gradient(135deg, var(--pink), var(--pink-deep));
|
||||
color: #fff;
|
||||
box-shadow: 0 4px 14px rgba(240, 68, 104, 0.34);
|
||||
}
|
||||
|
||||
.nav-toggle {
|
||||
display: none;
|
||||
width: 40px; height: 40px;
|
||||
place-items: center;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 11px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
color: var(--text);
|
||||
cursor: pointer;
|
||||
}
|
||||
.nav-toggle svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
|
||||
|
||||
/* ============================ Buttons ============================ */
|
||||
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 9px;
|
||||
padding: 12px 20px;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 13px;
|
||||
font-size: 14.5px;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.01em;
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
transition: transform 160ms var(--ease), box-shadow 160ms ease,
|
||||
filter 160ms ease, background 160ms ease, border-color 160ms ease;
|
||||
}
|
||||
.btn svg { width: 18px; height: 18px; flex: 0 0 auto; }
|
||||
.btn:hover { transform: translateY(-2px); }
|
||||
.btn:active { transform: translateY(0); }
|
||||
|
||||
.btn-primary {
|
||||
background: linear-gradient(135deg, #ff5a7c 0%, var(--pink) 52%, var(--pink-deep) 100%);
|
||||
color: #fff;
|
||||
box-shadow: var(--shadow-pink);
|
||||
}
|
||||
.btn-primary:hover { filter: brightness(1.08); box-shadow: 0 18px 44px rgba(240, 68, 104, 0.4); }
|
||||
|
||||
.btn-ghost {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
border-color: var(--line-strong);
|
||||
color: var(--text);
|
||||
}
|
||||
.btn-ghost:hover { background: rgba(255, 255, 255, 0.09); border-color: rgba(255, 255, 255, 0.24); }
|
||||
|
||||
.btn-sm { padding: 9px 15px; font-size: 13px; border-radius: 11px; }
|
||||
|
||||
/* ============================ Section shell ============================ */
|
||||
|
||||
.section { padding: 96px 0; position: relative; }
|
||||
.section-tight { padding: 68px 0; }
|
||||
|
||||
.section-head {
|
||||
max-width: 720px;
|
||||
margin-bottom: 46px;
|
||||
}
|
||||
.section-head.center { margin-inline: auto; text-align: center; }
|
||||
|
||||
.eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 16px;
|
||||
padding: 6px 13px;
|
||||
border: 1px solid rgba(240, 68, 104, 0.34);
|
||||
border-radius: 999px;
|
||||
background: rgba(240, 68, 104, 0.10);
|
||||
color: var(--pink-soft);
|
||||
font-size: 11.5px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.12em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.eyebrow::before {
|
||||
content: "";
|
||||
width: 6px; height: 6px;
|
||||
border-radius: 50%;
|
||||
background: var(--pink);
|
||||
box-shadow: 0 0 10px var(--pink);
|
||||
}
|
||||
|
||||
.section h2 {
|
||||
font-size: clamp(27px, 3.6vw, 40px);
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
.section-head p {
|
||||
color: var(--muted);
|
||||
font-size: 16.5px;
|
||||
}
|
||||
|
||||
.grad-text {
|
||||
background: linear-gradient(100deg, #ff8aa3 0%, var(--pink) 46%, #ff5a7c 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
/* ============================ Hero ============================ */
|
||||
|
||||
.hero { padding: 76px 0 84px; position: relative; }
|
||||
|
||||
.hero-grid {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) minmax(0, 1.02fr);
|
||||
gap: 56px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.hero-badges {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
margin-bottom: 22px;
|
||||
}
|
||||
.pill {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
padding: 6px 12px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 999px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
color: var(--muted);
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
}
|
||||
.pill svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.pill-pink { border-color: rgba(240, 68, 104, 0.4); background: rgba(240, 68, 104, 0.12); color: var(--pink-soft); }
|
||||
.pill-green { border-color: rgba(32, 184, 121, 0.4); background: rgba(32, 184, 121, 0.12); color: var(--green-soft); }
|
||||
|
||||
.hero h1 {
|
||||
font-size: clamp(38px, 6.2vw, 66px);
|
||||
letter-spacing: -0.035em;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.hero h1 .line { display: block; }
|
||||
|
||||
.hero-lead {
|
||||
max-width: 540px;
|
||||
color: var(--muted);
|
||||
font-size: 17.5px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.hero-cta {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
margin-bottom: 26px;
|
||||
}
|
||||
|
||||
.hero-meta {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 8px 18px;
|
||||
color: var(--dim);
|
||||
font-size: 13px;
|
||||
}
|
||||
.hero-meta strong { color: var(--muted); font-weight: 700; }
|
||||
|
||||
/* Hero art */
|
||||
.hero-art { position: relative; }
|
||||
.hero-art-frame {
|
||||
position: relative;
|
||||
border: 1px solid var(--line-strong);
|
||||
border-radius: var(--radius-l);
|
||||
overflow: hidden;
|
||||
background: var(--surface);
|
||||
box-shadow: var(--shadow), 0 0 0 1px rgba(240, 68, 104, 0.10);
|
||||
}
|
||||
.hero-art-frame img { width: 100%; height: auto; }
|
||||
.hero-glow {
|
||||
position: absolute;
|
||||
inset: 8% 12% 4%;
|
||||
z-index: -1;
|
||||
border-radius: 50%;
|
||||
background: radial-gradient(closest-side, rgba(240, 68, 104, 0.34), transparent 78%);
|
||||
filter: blur(52px);
|
||||
}
|
||||
|
||||
/* ============================ Stats strip ============================ */
|
||||
|
||||
.stats {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
gap: 1px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
background: var(--line);
|
||||
}
|
||||
.stat {
|
||||
padding: 26px 22px;
|
||||
background: rgba(13, 18, 27, 0.9);
|
||||
text-align: center;
|
||||
}
|
||||
.stat b {
|
||||
display: block;
|
||||
font-size: clamp(24px, 3vw, 32px);
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.03em;
|
||||
background: linear-gradient(140deg, #fff, #b9c3d4);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
}
|
||||
.stat span { display: block; margin-top: 4px; font-size: 13px; color: var(--dim); }
|
||||
|
||||
/* ============================ Feature cards ============================ */
|
||||
|
||||
.cards {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(272px, 1fr));
|
||||
gap: 18px;
|
||||
}
|
||||
|
||||
.card {
|
||||
position: relative;
|
||||
padding: 26px 24px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
background: linear-gradient(168deg, rgba(19, 27, 41, 0.9), rgba(11, 15, 23, 0.9));
|
||||
transition: transform 240ms var(--ease), border-color 240ms ease, box-shadow 240ms ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
.card::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset-inline: 0;
|
||||
top: 0;
|
||||
height: 1px;
|
||||
background: linear-gradient(90deg, transparent, rgba(240, 68, 104, 0.6), transparent);
|
||||
opacity: 0;
|
||||
transition: opacity 240ms ease;
|
||||
}
|
||||
.card:hover {
|
||||
transform: translateY(-4px);
|
||||
border-color: rgba(240, 68, 104, 0.34);
|
||||
box-shadow: 0 18px 40px rgba(0, 0, 0, 0.42);
|
||||
}
|
||||
.card:hover::before { opacity: 1; }
|
||||
|
||||
.card-icon {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 44px; height: 44px;
|
||||
margin-bottom: 16px;
|
||||
border: 1px solid rgba(240, 68, 104, 0.32);
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(140deg, rgba(240, 68, 104, 0.24), rgba(191, 37, 76, 0.14));
|
||||
color: var(--pink-soft);
|
||||
}
|
||||
.card-icon svg {
|
||||
width: 21px; height: 21px;
|
||||
fill: none;
|
||||
stroke: currentColor;
|
||||
stroke-width: 1.9;
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
.card-icon.green { border-color: rgba(32,184,121,.32); background: linear-gradient(140deg, rgba(32,184,121,.22), rgba(21,150,101,.12)); color: var(--green-soft); }
|
||||
.card-icon.purple { border-color: rgba(166,108,255,.32); background: linear-gradient(140deg, rgba(166,108,255,.22), rgba(120,70,200,.12)); color: #c3a0ff; }
|
||||
.card-icon.cyan { border-color: rgba(49,215,255,.3); background: linear-gradient(140deg, rgba(49,215,255,.2), rgba(20,120,160,.12)); color: #7fe4ff; }
|
||||
.card-icon.orange { border-color: rgba(255,156,69,.32); background: linear-gradient(140deg, rgba(255,156,69,.22), rgba(232,107,33,.12)); color: var(--orange); }
|
||||
|
||||
.card h3 { font-size: 16.5px; margin-bottom: 8px; }
|
||||
.card p { color: var(--muted); font-size: 14.5px; line-height: 1.6; }
|
||||
|
||||
/* ============================ Split / showcase ============================ */
|
||||
|
||||
.split {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
|
||||
gap: 52px;
|
||||
align-items: center;
|
||||
}
|
||||
.split.reverse .split-media { order: -1; }
|
||||
|
||||
.checklist { display: grid; gap: 14px; margin: 26px 0 0; padding: 0; }
|
||||
.checklist li {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
list-style: none;
|
||||
color: var(--muted);
|
||||
font-size: 15px;
|
||||
}
|
||||
.check-mark {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
flex: 0 0 22px;
|
||||
width: 22px; height: 22px;
|
||||
margin-top: 2px;
|
||||
border-radius: 7px;
|
||||
background: rgba(32, 184, 121, 0.16);
|
||||
color: var(--green-soft);
|
||||
}
|
||||
.check-mark svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.checklist strong { color: var(--text); font-weight: 700; }
|
||||
|
||||
/* ============================ Popup mock ============================ */
|
||||
|
||||
/* Flow layout, not absolute chips: the chips sit above and below the card so
|
||||
they can never cover it, at any column width. */
|
||||
.mock-stage {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
padding: 28px 20px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius-l);
|
||||
background:
|
||||
radial-gradient(circle at 82% 4%, rgba(240, 68, 104, 0.16), transparent 46%),
|
||||
linear-gradient(160deg, rgba(19, 27, 41, 0.8), rgba(9, 12, 18, 0.9));
|
||||
overflow: hidden;
|
||||
}
|
||||
.mock-stage::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background-image:
|
||||
linear-gradient(rgba(255,255,255,.028) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(255,255,255,.028) 1px, transparent 1px);
|
||||
background-size: 34px 34px;
|
||||
mask-image: radial-gradient(circle at 50% 40%, #000 30%, transparent 76%);
|
||||
-webkit-mask-image: radial-gradient(circle at 50% 40%, #000 30%, transparent 76%);
|
||||
}
|
||||
|
||||
.popup-mock {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 372px;
|
||||
padding: 18px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.09);
|
||||
border-radius: 18px;
|
||||
background:
|
||||
radial-gradient(circle at 100% 0, rgba(255, 69, 103, 0.2), transparent 38%),
|
||||
linear-gradient(155deg, #121824 0%, #090c12 72%);
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
|
||||
.mock-head { display: flex; align-items: center; gap: 11px; margin-bottom: 17px; }
|
||||
.mock-mark {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 40px; height: 40px;
|
||||
flex: 0 0 40px;
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(135deg, #ff5a7c, var(--pink-deep));
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.02em;
|
||||
box-shadow: 0 7px 20px rgba(240, 68, 104, 0.34);
|
||||
}
|
||||
.mock-head h4 { font-size: 13.5px; }
|
||||
.mock-head p { font-size: 10.5px; color: var(--dim); }
|
||||
.mock-gear {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 36px; height: 36px;
|
||||
margin-inline-start: auto;
|
||||
flex: 0 0 36px;
|
||||
border: 1px solid rgba(255, 111, 142, 0.6);
|
||||
border-radius: 11px;
|
||||
background: linear-gradient(135deg, rgba(240, 68, 104, 0.34), rgba(191, 37, 76, 0.24));
|
||||
color: #fff;
|
||||
}
|
||||
.mock-gear svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
|
||||
|
||||
.mock-panel {
|
||||
padding: 13px;
|
||||
margin-bottom: 11px;
|
||||
border: 1px solid rgba(240, 68, 104, 0.34);
|
||||
border-radius: 13px;
|
||||
background: rgba(15, 21, 31, 0.96);
|
||||
}
|
||||
.mock-label { display: block; margin-bottom: 6px; color: #c7cfdb; font-size: 10.5px; font-weight: 800; }
|
||||
.mock-input {
|
||||
padding: 8px 10px;
|
||||
border: 1px solid #344157;
|
||||
border-radius: 9px;
|
||||
background: #0c1119;
|
||||
color: var(--text);
|
||||
font-size: 11px;
|
||||
}
|
||||
.mock-input.focus { border-color: var(--pink); box-shadow: 0 0 0 3px rgba(240, 68, 104, 0.13); }
|
||||
|
||||
.mock-check { display: flex; gap: 9px; align-items: flex-start; margin-top: 11px; }
|
||||
.mock-box {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
flex: 0 0 15px;
|
||||
width: 15px; height: 15px;
|
||||
margin-top: 2px;
|
||||
border: 1px solid #3c4a61;
|
||||
border-radius: 5px;
|
||||
background: #0c1119;
|
||||
}
|
||||
.mock-box.on { border-color: var(--pink); background: var(--pink); }
|
||||
.mock-box svg { width: 9px; height: 9px; fill: none; stroke: #fff; stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.mock-check strong { display: block; font-size: 11.5px; }
|
||||
.mock-check small { display: block; color: var(--dim); font-size: 10px; line-height: 1.45; }
|
||||
|
||||
.mock-preview {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 10px;
|
||||
margin-top: 13px;
|
||||
padding: 9px 11px;
|
||||
border: 1px dashed rgba(255, 255, 255, 0.14);
|
||||
border-radius: 10px;
|
||||
font-size: 10.5px;
|
||||
}
|
||||
.mock-preview span { color: var(--dim); }
|
||||
.mock-preview strong { color: var(--green-soft); font-weight: 700; }
|
||||
|
||||
.mock-progress { margin-top: 12px; padding: 11px 13px; border: 1px solid var(--line); border-radius: 12px; background: rgba(12, 17, 25, 0.9); }
|
||||
.mock-progress-head { display: flex; justify-content: space-between; font-size: 11px; color: var(--muted); margin-bottom: 8px; }
|
||||
.mock-progress-head b { color: var(--green-soft); }
|
||||
.mock-track { height: 7px; border-radius: 999px; background: rgba(255, 255, 255, 0.08); overflow: hidden; }
|
||||
.mock-bar {
|
||||
height: 100%;
|
||||
width: 68%;
|
||||
border-radius: 999px;
|
||||
background: linear-gradient(90deg, var(--green), var(--green-soft));
|
||||
box-shadow: 0 0 14px rgba(53, 213, 150, 0.5);
|
||||
animation: barPulse 2.6s var(--ease) infinite;
|
||||
}
|
||||
@keyframes barPulse {
|
||||
0%, 100% { width: 62%; }
|
||||
50% { width: 88%; }
|
||||
}
|
||||
|
||||
.mock-foot { margin-top: 13px; color: var(--dim); font-size: 10.5px; text-align: center; }
|
||||
|
||||
/* Chips flanking the mock */
|
||||
.mock-chip {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
max-width: 100%;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 9px 13px;
|
||||
border: 1px solid var(--line-strong);
|
||||
border-radius: 12px;
|
||||
background: rgba(14, 19, 29, 0.94);
|
||||
box-shadow: var(--shadow);
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
backdrop-filter: blur(8px);
|
||||
}
|
||||
.mock-chip svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.mock-chip-a { align-self: flex-start; color: var(--green-soft); border-color: rgba(32,184,121,.4); animation: float1 7s ease-in-out infinite; }
|
||||
.mock-chip-b { align-self: flex-end; color: var(--orange); border-color: rgba(255,156,69,.4); animation: float2 8s ease-in-out infinite; }
|
||||
/* Small drift only — the gap in .mock-stage absorbs it without touching the card. */
|
||||
@keyframes float1 { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-5px); } }
|
||||
@keyframes float2 { 0%,100% { transform: translateY(0); } 50% { transform: translateY(5px); } }
|
||||
|
||||
/* ============================ Steps ============================ */
|
||||
|
||||
.steps {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
|
||||
gap: 18px;
|
||||
}
|
||||
.step {
|
||||
position: relative;
|
||||
padding: 26px 22px 24px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
background: rgba(13, 18, 27, 0.72);
|
||||
transition: border-color 220ms ease, transform 220ms var(--ease);
|
||||
}
|
||||
.step:hover { border-color: rgba(240, 68, 104, 0.3); transform: translateY(-3px); }
|
||||
.step-num {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 34px; height: 34px;
|
||||
margin-bottom: 15px;
|
||||
border-radius: 11px;
|
||||
background: linear-gradient(135deg, var(--pink), var(--pink-deep));
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
font-weight: 800;
|
||||
box-shadow: 0 6px 18px rgba(240, 68, 104, 0.3);
|
||||
}
|
||||
.step h3 { font-size: 15.5px; margin-bottom: 7px; }
|
||||
.step p { color: var(--muted); font-size: 14px; }
|
||||
.step code {
|
||||
display: inline-block;
|
||||
margin-top: 9px;
|
||||
padding: 4px 9px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 7px;
|
||||
background: rgba(0, 0, 0, 0.35);
|
||||
color: var(--pink-soft);
|
||||
}
|
||||
|
||||
/* ============================ Formats ============================ */
|
||||
|
||||
.formats-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
||||
gap: 14px;
|
||||
margin-bottom: 22px;
|
||||
}
|
||||
.format {
|
||||
padding: 20px 18px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 14px;
|
||||
background: rgba(13, 18, 27, 0.72);
|
||||
text-align: center;
|
||||
transition: border-color 200ms ease, background 200ms ease;
|
||||
}
|
||||
.format:hover { border-color: rgba(240, 68, 104, 0.34); background: rgba(240, 68, 104, 0.06); }
|
||||
.format b { display: block; font-size: 17px; letter-spacing: -0.01em; }
|
||||
.format span { display: block; margin-top: 5px; color: var(--dim); font-size: 12.5px; }
|
||||
|
||||
.notice {
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
padding: 18px 20px;
|
||||
border: 1px solid rgba(255, 156, 69, 0.3);
|
||||
border-radius: 14px;
|
||||
background: rgba(255, 156, 69, 0.07);
|
||||
}
|
||||
.notice.legal { border-color: rgba(240, 68, 104, 0.34); background: rgba(240, 68, 104, 0.07); }
|
||||
.notice.legal .notice-icon { color: var(--pink-soft); }
|
||||
.notice-icon { flex: 0 0 22px; color: var(--orange); }
|
||||
.notice-icon svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.notice h4 { font-size: 14.5px; margin-bottom: 5px; }
|
||||
.notice p { color: var(--muted); font-size: 14px; }
|
||||
|
||||
/* ============================ Table ============================ */
|
||||
|
||||
.table-wrap {
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
overflow-x: auto;
|
||||
background: rgba(13, 18, 27, 0.72);
|
||||
}
|
||||
/* min-width keeps the two columns readable; it must stay under the width of the
|
||||
split column on desktop (~530px) so the table does not scroll needlessly. */
|
||||
table { width: 100%; border-collapse: collapse; min-width: 430px; }
|
||||
th, td { padding: 13px 16px; text-align: left; border-bottom: 1px solid var(--line); font-size: 14px; }
|
||||
th { color: var(--dim); font-size: 11.5px; font-weight: 800; letter-spacing: 0.09em; text-transform: uppercase; background: rgba(255,255,255,.02); }
|
||||
tbody tr:last-child td { border-bottom: 0; }
|
||||
tbody tr { transition: background 160ms ease; }
|
||||
tbody tr:hover { background: rgba(255, 255, 255, 0.025); }
|
||||
td code { color: var(--pink-soft); background: rgba(240, 68, 104, 0.1); padding: 3px 8px; border-radius: 6px; white-space: nowrap; }
|
||||
td:last-child { color: var(--muted); }
|
||||
|
||||
/* ============================ FAQ ============================ */
|
||||
|
||||
.faq { display: grid; gap: 12px; max-width: 860px; margin-inline: auto; }
|
||||
.faq details {
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 14px;
|
||||
background: rgba(13, 18, 27, 0.72);
|
||||
transition: border-color 200ms ease, background 200ms ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
.faq details[open] { border-color: rgba(240, 68, 104, 0.3); background: rgba(19, 27, 41, 0.8); }
|
||||
.faq summary {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
padding: 18px 22px;
|
||||
font-size: 15.5px;
|
||||
font-weight: 700;
|
||||
cursor: pointer;
|
||||
list-style: none;
|
||||
}
|
||||
.faq summary::-webkit-details-marker { display: none; }
|
||||
.faq summary::after {
|
||||
content: "";
|
||||
width: 9px; height: 9px;
|
||||
margin-inline-start: auto;
|
||||
flex: 0 0 9px;
|
||||
border-right: 2px solid var(--pink-soft);
|
||||
border-bottom: 2px solid var(--pink-soft);
|
||||
transform: rotate(45deg) translate(-2px, -2px);
|
||||
transition: transform 240ms var(--ease);
|
||||
}
|
||||
.faq details[open] summary::after { transform: rotate(-135deg) translate(-3px, -3px); }
|
||||
.faq .faq-body { padding: 0 22px 20px; color: var(--muted); font-size: 14.5px; }
|
||||
.faq .faq-body p + p { margin-top: 10px; }
|
||||
|
||||
/* ============================ CTA ============================ */
|
||||
|
||||
.cta-box {
|
||||
position: relative;
|
||||
padding: 56px 44px;
|
||||
border: 1px solid rgba(240, 68, 104, 0.3);
|
||||
border-radius: var(--radius-l);
|
||||
background:
|
||||
radial-gradient(circle at 15% 0%, rgba(240, 68, 104, 0.22), transparent 54%),
|
||||
radial-gradient(circle at 92% 100%, rgba(166, 108, 255, 0.16), transparent 52%),
|
||||
linear-gradient(160deg, rgba(19, 27, 41, 0.94), rgba(9, 12, 18, 0.94));
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
.cta-box h2 { font-size: clamp(26px, 3.4vw, 38px); margin-bottom: 14px; }
|
||||
.cta-box p { max-width: 560px; margin: 0 auto 28px; color: var(--muted); font-size: 16px; }
|
||||
.cta-actions { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; }
|
||||
.cta-note { margin-top: 20px; font-size: 13px; color: var(--dim); }
|
||||
|
||||
/* ============================ Footer ============================ */
|
||||
|
||||
.site-footer {
|
||||
border-top: 1px solid var(--line);
|
||||
padding: 52px 0 34px;
|
||||
background: rgba(6, 9, 13, 0.6);
|
||||
}
|
||||
.footer-grid {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1.5fr) repeat(2, minmax(0, 1fr));
|
||||
gap: 40px;
|
||||
margin-bottom: 36px;
|
||||
}
|
||||
.footer-brand p { margin-top: 14px; max-width: 360px; color: var(--dim); font-size: 13.5px; }
|
||||
.footer-col h5 {
|
||||
margin: 0 0 14px;
|
||||
color: var(--dim);
|
||||
font-size: 11.5px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.footer-col ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
|
||||
.footer-col a { color: var(--muted); font-size: 14px; transition: color 150ms ease; }
|
||||
.footer-col a:hover { color: var(--pink-soft); }
|
||||
|
||||
.footer-bottom {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px 24px;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding-top: 26px;
|
||||
border-top: 1px solid var(--line);
|
||||
color: var(--dim);
|
||||
font-size: 12.5px;
|
||||
}
|
||||
.footer-bottom a { color: var(--muted); }
|
||||
.footer-bottom a:hover { color: var(--pink-soft); }
|
||||
|
||||
/* ============================ Reveal animation ============================ */
|
||||
|
||||
.reveal {
|
||||
opacity: 0;
|
||||
transform: translateY(22px);
|
||||
transition: opacity 620ms var(--ease), transform 620ms var(--ease);
|
||||
}
|
||||
.reveal.is-visible { opacity: 1; transform: none; }
|
||||
|
||||
/* ============================ Legal / doc pages ============================ */
|
||||
|
||||
.doc { padding: 56px 0 96px; }
|
||||
.doc-inner { max-width: 800px; margin-inline: auto; }
|
||||
.doc h1 { font-size: clamp(30px, 4.4vw, 44px); margin-bottom: 12px; }
|
||||
.doc .doc-meta { color: var(--dim); font-size: 13.5px; margin-bottom: 36px; }
|
||||
.doc h2 { font-size: 21px; margin: 38px 0 12px; }
|
||||
.doc p { color: var(--muted); margin-bottom: 14px; }
|
||||
.doc ul { color: var(--muted); padding-inline-start: 22px; margin: 0 0 16px; display: grid; gap: 8px; }
|
||||
.doc a { color: var(--pink-soft); text-decoration: underline; text-underline-offset: 3px; }
|
||||
.doc code { color: var(--pink-soft); background: rgba(240, 68, 104, 0.1); padding: 2px 7px; border-radius: 6px; }
|
||||
.back-link { display: inline-flex; align-items: center; gap: 8px; margin-bottom: 26px; color: var(--muted); font-size: 14px; font-weight: 600; }
|
||||
.back-link:hover { color: var(--pink-soft); }
|
||||
.back-link svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
|
||||
|
||||
/* 404 */
|
||||
.notfound { display: grid; place-items: center; min-height: 66vh; text-align: center; padding: 60px 0; }
|
||||
.notfound b {
|
||||
display: block;
|
||||
font-size: clamp(72px, 14vw, 140px);
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.05em;
|
||||
line-height: 1;
|
||||
background: linear-gradient(140deg, #ff8aa3, var(--pink) 55%, var(--pink-deep));
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
}
|
||||
.notfound h1 { font-size: clamp(24px, 3.4vw, 34px); margin: 14px 0 10px; }
|
||||
.notfound p { color: var(--muted); margin-bottom: 26px; }
|
||||
|
||||
/* ============================ Responsive ============================ */
|
||||
|
||||
@media (max-width: 980px) {
|
||||
.hero-grid { grid-template-columns: 1fr; gap: 44px; }
|
||||
.hero-lead { max-width: none; }
|
||||
.split { grid-template-columns: 1fr; gap: 36px; }
|
||||
.split.reverse .split-media { order: 0; }
|
||||
.stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }
|
||||
.footer-brand { grid-column: 1 / -1; }
|
||||
}
|
||||
|
||||
@media (max-width: 760px) {
|
||||
.nav-toggle { display: grid; }
|
||||
.nav {
|
||||
position: absolute;
|
||||
inset-inline: 0;
|
||||
top: 64px;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
gap: 2px;
|
||||
padding: 10px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 16px;
|
||||
background: rgba(10, 14, 21, 0.98);
|
||||
box-shadow: var(--shadow);
|
||||
backdrop-filter: blur(18px);
|
||||
}
|
||||
.nav:not(.is-open) { display: none; }
|
||||
.nav a { padding: 11px 14px; font-size: 15px; }
|
||||
.header-actions { margin-inline-start: auto; }
|
||||
.section { padding: 68px 0; }
|
||||
.cta-box { padding: 40px 22px; }
|
||||
.hero { padding: 48px 0 60px; }
|
||||
}
|
||||
|
||||
@media (max-width: 460px) {
|
||||
.brand span { font-size: 13.5px; }
|
||||
.hero-cta { flex-direction: column; align-items: stretch; }
|
||||
.hero-cta .btn { width: 100%; }
|
||||
.stats { grid-template-columns: 1fr; }
|
||||
.wrap { padding-inline: 16px; }
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
html { scroll-behavior: auto; }
|
||||
*, *::before, *::after {
|
||||
animation-duration: 0.001ms !important;
|
||||
animation-iteration-count: 1 !important;
|
||||
transition-duration: 0.001ms !important;
|
||||
}
|
||||
.reveal { opacity: 1; transform: none; }
|
||||
}
|
||||
|
||||
@media print {
|
||||
body::before, .site-header, .hero-art, .cta-actions { display: none !important; }
|
||||
body { background: #fff; color: #000; }
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
@@ -0,0 +1,24 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="RedGifs Video Downloader">
|
||||
<defs>
|
||||
<linearGradient id="surface" x1="20" y1="15" x2="108" y2="116" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#ff5a7c"/>
|
||||
<stop offset="0.55" stop-color="#ee3e67"/>
|
||||
<stop offset="1" stop-color="#c9234d"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="shine" x1="31" y1="17" x2="81" y2="86" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#ffffff" stop-opacity="0.24"/>
|
||||
<stop offset="1" stop-color="#ffffff" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow" x="-20%" y="-20%" width="140%" height="150%">
|
||||
<feDropShadow dx="0" dy="5" stdDeviation="5" flood-color="#350814" flood-opacity="0.36"/>
|
||||
</filter>
|
||||
</defs>
|
||||
<rect x="7" y="5" width="114" height="114" rx="32" fill="url(#surface)" filter="url(#shadow)"/>
|
||||
<rect x="8.5" y="6.5" width="111" height="111" rx="30.5" fill="none" stroke="#ff9caf" stroke-width="3" stroke-opacity="0.72"/>
|
||||
<path d="M22 44C30 21 49 10 72 10c15 0 28 5 38 14C91 19 64 24 43 43c-10 9-17 20-22 32-3-10-3-21 1-31Z" fill="url(#shine)"/>
|
||||
<g fill="none" stroke="#ffffff" stroke-width="10" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M64 30v48"/>
|
||||
<path d="m45 61 19 19 19-19"/>
|
||||
<path d="M39 96h50"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.4 MiB |
@@ -0,0 +1,252 @@
|
||||
/* ==========================================================================
|
||||
RedGifs Video Downloader — showcase site behaviour
|
||||
No dependencies, no network calls, no tracking.
|
||||
========================================================================== */
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var STORAGE_KEY = 'rgvd-lang';
|
||||
|
||||
/* ------------------------------------------------------- repository --
|
||||
ONE place to point the site at the public download location.
|
||||
|
||||
While the release repository is private, every link below 404s for
|
||||
visitors who are not signed in as its owner. Change REPO_URL once and
|
||||
all nine links follow: data-link="release" -> latest release,
|
||||
data-link="repo" -> repository root, data-link="license" -> LICENSE.
|
||||
|
||||
The hrefs stay in the HTML as well, so the links still work with
|
||||
JavaScript disabled; this only rewrites them when REPO_URL differs.
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
var REPO_URL = 'https://github.com/OwnerLink/redgifs-video-downloader';
|
||||
|
||||
function initLinks() {
|
||||
var targets = {
|
||||
repo: REPO_URL,
|
||||
release: REPO_URL + '/releases/latest',
|
||||
license: REPO_URL + '/blob/main/LICENSE'
|
||||
};
|
||||
|
||||
var nodes = document.querySelectorAll('[data-link]');
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
var href = targets[nodes[i].getAttribute('data-link')];
|
||||
if (href) nodes[i].setAttribute('href', href);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- i18n --
|
||||
Russian is authored directly in the markup. English lives in the
|
||||
data-en / data-en-alt / data-en-label attributes and is swapped in on
|
||||
demand. The original Russian is cached in data-ru on first switch.
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
var PAGE_META = {
|
||||
ru: {
|
||||
title: document.title,
|
||||
description: metaContent('description')
|
||||
},
|
||||
en: {
|
||||
title: document.documentElement.getAttribute('data-en-title') || '',
|
||||
description: document.documentElement.getAttribute('data-en-description') || ''
|
||||
}
|
||||
};
|
||||
|
||||
function metaContent(name) {
|
||||
var el = document.querySelector('meta[name="' + name + '"]');
|
||||
return el ? el.getAttribute('content') : '';
|
||||
}
|
||||
|
||||
function setMetaContent(name, value) {
|
||||
var el = document.querySelector('meta[name="' + name + '"]');
|
||||
if (el && value) el.setAttribute('content', value);
|
||||
}
|
||||
|
||||
function swapAttribute(el, enAttr, targetAttr, ruAttr, lang) {
|
||||
var en = el.getAttribute(enAttr);
|
||||
if (!en) return;
|
||||
if (!el.hasAttribute(ruAttr)) {
|
||||
el.setAttribute(ruAttr, el.getAttribute(targetAttr) || '');
|
||||
}
|
||||
el.setAttribute(targetAttr, lang === 'en' ? en : el.getAttribute(ruAttr));
|
||||
}
|
||||
|
||||
function applyLanguage(lang) {
|
||||
var isEn = lang === 'en';
|
||||
|
||||
document.documentElement.setAttribute('lang', isEn ? 'en' : 'ru');
|
||||
document.documentElement.setAttribute('data-lang', lang);
|
||||
|
||||
// Text / markup content
|
||||
var nodes = document.querySelectorAll('[data-en]');
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
var el = nodes[i];
|
||||
if (!el.hasAttribute('data-ru')) {
|
||||
el.setAttribute('data-ru', el.innerHTML);
|
||||
}
|
||||
// Both sides are authored in this repository, never user input.
|
||||
el.innerHTML = isEn ? el.getAttribute('data-en') : el.getAttribute('data-ru');
|
||||
}
|
||||
|
||||
// Accessible names that are not text content
|
||||
var alts = document.querySelectorAll('[data-en-alt]');
|
||||
for (var a = 0; a < alts.length; a++) {
|
||||
swapAttribute(alts[a], 'data-en-alt', 'alt', 'data-ru-alt', lang);
|
||||
}
|
||||
|
||||
var labels = document.querySelectorAll('[data-en-label]');
|
||||
for (var b = 0; b < labels.length; b++) {
|
||||
swapAttribute(labels[b], 'data-en-label', 'aria-label', 'data-ru-label', lang);
|
||||
}
|
||||
|
||||
// Document metadata
|
||||
if (PAGE_META[lang] && PAGE_META[lang].title) {
|
||||
document.title = PAGE_META[lang].title;
|
||||
}
|
||||
if (PAGE_META[lang] && PAGE_META[lang].description) {
|
||||
setMetaContent('description', PAGE_META[lang].description);
|
||||
}
|
||||
|
||||
// Switch buttons
|
||||
var buttons = document.querySelectorAll('[data-set-lang]');
|
||||
for (var c = 0; c < buttons.length; c++) {
|
||||
buttons[c].setAttribute(
|
||||
'aria-pressed',
|
||||
buttons[c].getAttribute('data-set-lang') === lang ? 'true' : 'false'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function storedLanguage() {
|
||||
var stored = null;
|
||||
try {
|
||||
stored = window.localStorage.getItem(STORAGE_KEY);
|
||||
} catch (err) {
|
||||
stored = null;
|
||||
}
|
||||
if (stored === 'ru' || stored === 'en') return stored;
|
||||
|
||||
var nav = (navigator.language || '').toLowerCase();
|
||||
var list = navigator.languages || [];
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
if (String(list[i]).toLowerCase().indexOf('ru') === 0) return 'ru';
|
||||
}
|
||||
return nav.indexOf('ru') === 0 ? 'ru' : 'en';
|
||||
}
|
||||
|
||||
function initLanguage() {
|
||||
var buttons = document.querySelectorAll('[data-set-lang]');
|
||||
if (!buttons.length) return;
|
||||
|
||||
applyLanguage(storedLanguage());
|
||||
|
||||
for (var i = 0; i < buttons.length; i++) {
|
||||
buttons[i].addEventListener('click', function () {
|
||||
var lang = this.getAttribute('data-set-lang');
|
||||
applyLanguage(lang);
|
||||
try {
|
||||
window.localStorage.setItem(STORAGE_KEY, lang);
|
||||
} catch (err) {
|
||||
/* private mode — the choice simply is not remembered */
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------- header -- */
|
||||
|
||||
function initHeader() {
|
||||
var header = document.getElementById('siteHeader');
|
||||
if (!header) return;
|
||||
|
||||
var ticking = false;
|
||||
function update() {
|
||||
header.classList.toggle('is-stuck', window.scrollY > 8);
|
||||
ticking = false;
|
||||
}
|
||||
window.addEventListener('scroll', function () {
|
||||
if (!ticking) {
|
||||
ticking = true;
|
||||
window.requestAnimationFrame(update);
|
||||
}
|
||||
}, { passive: true });
|
||||
update();
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------- mobile nav -- */
|
||||
|
||||
function initNav() {
|
||||
var toggle = document.getElementById('navToggle');
|
||||
var nav = document.getElementById('primaryNav');
|
||||
if (!toggle || !nav) return;
|
||||
|
||||
function close() {
|
||||
nav.classList.remove('is-open');
|
||||
toggle.setAttribute('aria-expanded', 'false');
|
||||
}
|
||||
|
||||
toggle.addEventListener('click', function () {
|
||||
var open = nav.classList.toggle('is-open');
|
||||
toggle.setAttribute('aria-expanded', open ? 'true' : 'false');
|
||||
});
|
||||
|
||||
nav.addEventListener('click', function (event) {
|
||||
if (event.target.closest('a')) close();
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function (event) {
|
||||
if (event.key === 'Escape') close();
|
||||
});
|
||||
|
||||
document.addEventListener('click', function (event) {
|
||||
if (!nav.classList.contains('is-open')) return;
|
||||
if (nav.contains(event.target) || toggle.contains(event.target)) return;
|
||||
close();
|
||||
});
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------- reveal -- */
|
||||
|
||||
function initReveal() {
|
||||
var items = document.querySelectorAll('.reveal');
|
||||
if (!items.length) return;
|
||||
|
||||
var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||
if (reduced || !('IntersectionObserver' in window)) {
|
||||
for (var i = 0; i < items.length; i++) items[i].classList.add('is-visible');
|
||||
return;
|
||||
}
|
||||
|
||||
var observer = new IntersectionObserver(function (entries) {
|
||||
entries.forEach(function (entry) {
|
||||
if (!entry.isIntersecting) return;
|
||||
entry.target.classList.add('is-visible');
|
||||
observer.unobserve(entry.target);
|
||||
});
|
||||
}, { rootMargin: '0px 0px -8% 0px', threshold: 0.08 });
|
||||
|
||||
for (var j = 0; j < items.length; j++) {
|
||||
// Stagger siblings a little so grids cascade instead of popping.
|
||||
var delay = (j % 4) * 70;
|
||||
items[j].style.transitionDelay = delay + 'ms';
|
||||
observer.observe(items[j]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- boot -- */
|
||||
|
||||
function boot() {
|
||||
initLinks();
|
||||
initLanguage();
|
||||
initHeader();
|
||||
initNav();
|
||||
initReveal();
|
||||
}
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', boot);
|
||||
} else {
|
||||
boot();
|
||||
}
|
||||
})();
|
||||
+710
@@ -0,0 +1,710 @@
|
||||
<!doctype html>
|
||||
<html lang="ru" data-lang="ru"
|
||||
data-en-title="RedGifs Video Downloader — local downloader for Chromium"
|
||||
data-en-description="A local Chromium extension for saving RedGIFS videos the user is permitted to keep. Download button on the cards, local HLS assembly, no account, no analytics, no telemetry.">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>RedGifs Video Downloader — локальный загрузчик для Chromium</title>
|
||||
<meta name="description" content="Локальное расширение Chromium для сохранения разрешённых пользователю видео с RedGIFS. Кнопка загрузки прямо на карточках, локальная сборка HLS, без аккаунта, аналитики и телеметрии.">
|
||||
<meta name="theme-color" content="#070a0f">
|
||||
<meta name="color-scheme" content="dark">
|
||||
<meta name="robots" content="index, follow">
|
||||
|
||||
<link rel="canonical" href="https://redgifs.extension.lonarpgproxy.space/">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32.png">
|
||||
<link rel="icon" type="image/svg+xml" href="assets/img/icon.svg">
|
||||
<link rel="apple-touch-icon" href="assets/img/icon-128.png">
|
||||
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="RedGifs Video Downloader">
|
||||
<meta property="og:title" content="RedGifs Video Downloader — локальный загрузчик для Chromium">
|
||||
<meta property="og:description" content="Кнопка загрузки прямо на карточках RedGIFS, локальная сборка MP4, GIF и HLS. Без аккаунта, аналитики и телеметрии.">
|
||||
<meta property="og:url" content="https://redgifs.extension.lonarpgproxy.space/">
|
||||
<meta property="og:image" content="https://redgifs.extension.lonarpgproxy.space/assets/img/release-preview.png">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="RedGifs Video Downloader">
|
||||
<meta name="twitter:description" content="Локальный загрузчик видео для Chromium. Без аккаунта, аналитики и телеметрии.">
|
||||
<meta name="twitter:image" content="https://redgifs.extension.lonarpgproxy.space/assets/img/release-preview.png">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap">
|
||||
<link rel="stylesheet" href="assets/css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a class="skip-link" href="#main" data-en="Skip to content">К основному содержимому</a>
|
||||
|
||||
<!-- ============================ HEADER ============================ -->
|
||||
<header class="site-header" id="siteHeader">
|
||||
<div class="wrap">
|
||||
<a class="brand" href="./" aria-label="RedGifs Video Downloader">
|
||||
<img src="assets/img/icon-128.png" alt="" width="32" height="32">
|
||||
<span>
|
||||
RedGifs Video Downloader
|
||||
<small>v0.6.23 · Manifest V3</small>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="nav" id="primaryNav" aria-label="Основная навигация" data-en-label="Main navigation">
|
||||
<a href="#features" data-en="Features">Возможности</a>
|
||||
<a href="#interface" data-en="Interface">Интерфейс</a>
|
||||
<a href="#install" data-en="Install">Установка</a>
|
||||
<a href="#privacy" data-en="Privacy">Приватность</a>
|
||||
<a href="#faq" data-en="FAQ">Вопросы</a>
|
||||
</nav>
|
||||
|
||||
<div class="header-actions">
|
||||
<div class="lang-switch" role="group" aria-label="Язык / Language">
|
||||
<button type="button" data-set-lang="ru" aria-pressed="true">RU</button>
|
||||
<button type="button" data-set-lang="en" aria-pressed="false">EN</button>
|
||||
</div>
|
||||
<a class="btn btn-primary btn-sm" href="https://github.com/OwnerLink/redgifs-video-downloader/releases/latest" data-link="release" rel="noopener">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><path d="m7 11 5 5 5-5"/><path d="M4 20h16"/></svg>
|
||||
<span data-en="Download">Скачать</span>
|
||||
</a>
|
||||
<button class="nav-toggle" id="navToggle" type="button" aria-expanded="false" aria-controls="primaryNav" aria-label="Меню" data-en-label="Menu">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 7h16"/><path d="M4 12h16"/><path d="M4 17h16"/></svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main">
|
||||
|
||||
<!-- ============================ HERO ============================ -->
|
||||
<section class="hero">
|
||||
<div class="wrap hero-grid">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-badges">
|
||||
<span class="pill pill-pink">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12"/><path d="m7 11 5 5 5-5"/><path d="M4 20h16"/></svg>
|
||||
<span data-en="Version 0.6.23">Версия 0.6.23</span>
|
||||
</span>
|
||||
<span class="pill pill-green">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3 4 6v6c0 5 3.4 8.4 8 9 4.6-.6 8-4 8-9V6l-8-3Z"/><path d="m9 12 2 2 4-4"/></svg>
|
||||
<span data-en="No telemetry">Без телеметрии</span>
|
||||
</span>
|
||||
<span class="pill" data-en="Chromium · Manifest V3">Chromium · Manifest V3</span>
|
||||
</div>
|
||||
|
||||
<h1 data-en="<span class="line">Save your</span><span class="line grad-text">RedGIFS videos</span><span class="line">locally</span>">
|
||||
<span class="line">Сохраняйте свои</span>
|
||||
<span class="line grad-text">видео с RedGIFS</span>
|
||||
<span class="line">локально</span>
|
||||
</h1>
|
||||
|
||||
<p class="hero-lead" data-en="A Chromium extension that puts a download button right on the video cards, assembles MP4, GIF and HLS on your own device and never talks to a developer server. No account, no analytics, no telemetry.">
|
||||
Расширение для Chromium добавляет кнопку загрузки прямо на карточки роликов,
|
||||
собирает MP4, GIF и HLS на вашем устройстве и не обращается ни к какому серверу
|
||||
разработчика. Без аккаунта, без аналитики, без телеметрии.
|
||||
</p>
|
||||
|
||||
<div class="hero-cta">
|
||||
<a class="btn btn-primary" href="https://github.com/OwnerLink/redgifs-video-downloader/releases/latest" data-link="release" rel="noopener">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><path d="m7 11 5 5 5-5"/><path d="M4 20h16"/></svg>
|
||||
<span data-en="Download the release">Скачать релиз</span>
|
||||
</a>
|
||||
<a class="btn btn-ghost" href="#install">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg>
|
||||
<span data-en="How to install">Как установить</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="hero-meta">
|
||||
<span data-en="Manual install from GitHub Release">Ручная установка из GitHub Release</span>
|
||||
<span aria-hidden="true">·</span>
|
||||
<span><strong data-en="Not in the Chrome Web Store">Не в Chrome Web Store</strong></span>
|
||||
<span aria-hidden="true">·</span>
|
||||
<span data-en="18+ only">Только 18+</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hero-art reveal">
|
||||
<div class="hero-glow" aria-hidden="true"></div>
|
||||
<div class="hero-art-frame">
|
||||
<img src="assets/img/release-preview.png"
|
||||
alt="Интерфейс RedGifs Video Downloader: карточки роликов с кнопками загрузки, панель настроек и уведомление о завершении"
|
||||
data-en-alt="RedGifs Video Downloader interface: video cards with download buttons, settings panel and a completion notification"
|
||||
width="1671" height="941" fetchpriority="high">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ STATS ============================ -->
|
||||
<section class="section-tight">
|
||||
<div class="wrap">
|
||||
<div class="stats reveal">
|
||||
<div class="stat"><b>0</b><span data-en="analytics requests">запросов аналитики</span></div>
|
||||
<div class="stat"><b>4</b><span data-en="supported formats">поддерживаемых формата</span></div>
|
||||
<div class="stat"><b>100%</b><span data-en="local processing">локальной обработки</span></div>
|
||||
<div class="stat"><b>2</b><span data-en="allowed hosts">разрешённых хоста</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ FEATURES ============================ -->
|
||||
<section class="section" id="features">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<span class="eyebrow" data-en="Features">Возможности</span>
|
||||
<h2 data-en="Everything the download needs — and nothing else">Всё, что нужно для загрузки, и ничего лишнего</h2>
|
||||
<p data-en="The extension works inside the page you already opened. It finds the video, picks the best available stream and hands the finished file to the browser download manager.">
|
||||
Расширение работает внутри уже открытой страницы: находит ролик, выбирает лучший
|
||||
доступный поток и передаёт готовый файл менеджеру загрузок браузера.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="cards">
|
||||
<article class="card reveal">
|
||||
<div class="card-icon">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 8v8"/><path d="m8.5 12.5 3.5 3.5 3.5-3.5"/></svg>
|
||||
</div>
|
||||
<h3 data-en="A button on every card">Кнопка на каждой карточке</h3>
|
||||
<p data-en="A round pink download button appears on recognised cards — in the feed, on profiles, in niches and in fullscreen view.">
|
||||
Круглая розовая кнопка загрузки появляется на распознанных карточках — в ленте,
|
||||
в профилях, в нишах и в полноэкранном просмотре.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon purple">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="5" width="18" height="14" rx="3"/><path d="m10 9 5 3-5 3Z"/></svg>
|
||||
</div>
|
||||
<h3 data-en="Automatic HD selection">Автоматический выбор HD</h3>
|
||||
<p data-en="HD MP4 is preferred, with fallbacks when it is unavailable. For HLS the stream with the highest available resolution is chosen.">
|
||||
Приоритет отдаётся HD MP4, при его недоступности используются резервные варианты.
|
||||
Для HLS выбирается поток наибольшего доступного разрешения.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon green">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="3"/><path d="M3 10h18"/><path d="m8.5 15 2 2 4.5-4.5"/></svg>
|
||||
</div>
|
||||
<h3 data-en="Local assembly">Локальная сборка</h3>
|
||||
<p data-en="MP4, GIF and HLS are processed in the browser through an offscreen document. No third-party server, no upload of your media anywhere.">
|
||||
MP4, GIF и HLS обрабатываются в браузере через offscreen-документ. Сторонний сервер
|
||||
не используется, медиа никуда не выгружается.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon cyan">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 17h16"/><path d="M6 13h12"/><path d="M4 17v2"/><path d="M20 17v2"/><circle cx="12" cy="7" r="3"/></svg>
|
||||
</div>
|
||||
<h3 data-en="Live progress">Наглядный прогресс</h3>
|
||||
<p data-en="One notification shows the current stage, a green progress bar and a five-second countdown once the file is written.">
|
||||
Единое уведомление показывает текущий этап, зелёную полосу прогресса и пятисекундный
|
||||
обратный отсчёт после записи файла.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon green">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="m8 12.5 2.5 2.5L16 9.5"/></svg>
|
||||
</div>
|
||||
<h3 data-en="Already-downloaded marks">Отметка скачанного</h3>
|
||||
<p data-en="Finished videos are remembered by their stable RedGIFS ID and the button turns green — so you never grab the same clip twice.">
|
||||
Завершённые ролики запоминаются по стабильному RedGIFS ID, и кнопка становится
|
||||
зелёной — один и тот же клип не скачивается дважды.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon orange">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20 11a8 8 0 1 0-.6 4"/><path d="M20 5v6h-6"/></svg>
|
||||
</div>
|
||||
<h3 data-en="One-click re-download">Повторная загрузка</h3>
|
||||
<p data-en="Hovering a green check reveals an orange re-download action for the cases where you need the file again.">
|
||||
При наведении на зелёную галочку появляется оранжевая кнопка повторной загрузки —
|
||||
на случай, если файл нужен снова.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2.5h8a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"/></svg>
|
||||
</div>
|
||||
<h3 data-en="Tidy file names and folders">Понятные имена и папки</h3>
|
||||
<p data-en="File names come from the real video title, and files can be grouped into a custom subfolder and per-profile folders.">
|
||||
Имена файлов берутся из настоящего названия ролика, а сами файлы можно раскладывать
|
||||
по своей подпапке и по папкам профилей.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon purple">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="6.5"/><path d="m16 16 4.5 4.5"/></svg>
|
||||
</div>
|
||||
<h3 data-en="Fallback scanner">Резервный сканер</h3>
|
||||
<p data-en="If a button did not appear, the popup can scan the visible videos on the page and show them with previews.">
|
||||
Если кнопка не появилась, popup умеет просканировать видимые ролики на странице
|
||||
и показать их с превью.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="card reveal">
|
||||
<div class="card-icon cyan">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 3h8l1 3h3v14H4V6h3Z"/><circle cx="12" cy="13" r="4"/></svg>
|
||||
</div>
|
||||
<h3 data-en="Redacted diagnostics">Очищенная диагностика</h3>
|
||||
<p data-en="Diagnostics are off by default. When enabled, the exported log has tokens, cookies, query strings and hashes stripped or replaced.">
|
||||
Диагностика по умолчанию выключена. При включении из экспортируемого журнала
|
||||
удаляются токены, cookie, query-параметры и hash.
|
||||
</p>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ INTERFACE / POPUP MOCK ============================ -->
|
||||
<section class="section" id="interface">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<span class="eyebrow" data-en="Interface">Интерфейс</span>
|
||||
<h2 data-en="Settings that stay out of the way">Настройки, которые не мешают</h2>
|
||||
<p data-en="The popup opens compact. Everything you rarely touch is hidden behind the gear, and the resulting save path is previewed live.">
|
||||
Popup открывается компактным. Всё, к чему обращаются редко, спрятано под шестерёнкой,
|
||||
а итоговый путь сохранения показывается сразу.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="split">
|
||||
<div class="split-copy">
|
||||
<h3 style="font-size:20px;margin-bottom:10px" data-en="Your library, your structure">Ваша библиотека — ваша структура</h3>
|
||||
<p style="color:var(--muted)" data-en="Pick a subfolder inside Downloads, optionally split files by profile, and decide whether the browser should ask where to save each file.">
|
||||
Выберите подпапку внутри «Загрузок», при желании разложите файлы по профилям
|
||||
и решите, должен ли браузер спрашивать место сохранения для каждого файла.
|
||||
</p>
|
||||
|
||||
<ul class="checklist">
|
||||
<li>
|
||||
<span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span>
|
||||
<span data-en="<strong>Subfolder inside Downloads</strong> — a relative path such as <code>Video/RedGifs</code>."><strong>Подпапка внутри «Загрузок»</strong> — относительный путь, например <code>Видео/RedGifs</code>.</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span>
|
||||
<span data-en="<strong>Group by profile</strong> — adds the author name taken from the URL or the card metadata."><strong>Группировка по профилям</strong> — добавляет имя автора из URL или метаданных карточки.</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span>
|
||||
<span data-en="<strong>Always ask where to save</strong> — turns on the native browser dialog."><strong>Всегда спрашивать место сохранения</strong> — включает системный диалог браузера.</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span>
|
||||
<span data-en="<strong>Path preview</strong> — shows the exact destination before the first download."><strong>Предпросмотр пути</strong> — показывает точное место сохранения ещё до первой загрузки.</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p style="margin-top:22px;color:var(--dim);font-size:13.5px" data-en="The actual root folder is defined by the browser download settings — Chromium extensions cannot write outside the directory the browser allows.">
|
||||
Фактическая корневая папка определяется настройками загрузок браузера: расширения
|
||||
Chromium не могут писать за пределы разрешённого каталога.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="split-media reveal">
|
||||
<div class="mock-stage">
|
||||
<span class="mock-chip mock-chip-a">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="m8 12.5 2.5 2.5L16 9.5"/></svg>
|
||||
<span data-en="Download complete">Загрузка завершена</span>
|
||||
</span>
|
||||
<div class="popup-mock" role="img"
|
||||
aria-label="Схематичное изображение окна расширения с настройками сохранения и полосой прогресса"
|
||||
data-en-label="Schematic view of the extension popup with save settings and a progress bar">
|
||||
<div class="mock-head">
|
||||
<div class="mock-mark">RG</div>
|
||||
<div>
|
||||
<h4>RedGifs Video Downloader</h4>
|
||||
<p data-en="Direct download, no account">Прямая загрузка без аккаунта</p>
|
||||
</div>
|
||||
<div class="mock-gear">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1A1.7 1.7 0 0 0 8.9 19a1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1A1.7 1.7 0 0 0 5 8.9a1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H9.5a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9v.1a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z"/></svg>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mock-panel">
|
||||
<span class="mock-label" data-en="Subfolder inside Downloads">Подпапка внутри «Загрузок»</span>
|
||||
<div class="mock-input focus">Видео/RedGifs</div>
|
||||
|
||||
<div class="mock-check">
|
||||
<span class="mock-box on"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span>
|
||||
<span>
|
||||
<strong data-en="Group by profile">Группировать по профилям</strong>
|
||||
<small data-en="Create a subfolder named after the author.">Создавать подпапку с именем автора ролика.</small>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="mock-check">
|
||||
<span class="mock-box"></span>
|
||||
<span>
|
||||
<strong data-en="Always ask where to save">Всегда спрашивать место сохранения</strong>
|
||||
<small data-en="The browser shows its native dialog for every file.">Браузер покажет системный диалог для каждого файла.</small>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="mock-preview">
|
||||
<span data-en="Path preview">Пример пути</span>
|
||||
<strong>Downloads/RedGifs/profile/video.mp4</strong>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mock-progress">
|
||||
<div class="mock-progress-head">
|
||||
<span data-en="Assembling HLS segments…">Сборка HLS-сегментов…</span>
|
||||
<b>68%</b>
|
||||
</div>
|
||||
<div class="mock-track"><div class="mock-bar"></div></div>
|
||||
</div>
|
||||
|
||||
<p class="mock-foot" data-en="Saving to Downloads/RedGifs">Сохранение в «Загрузки/RedGifs»</p>
|
||||
</div>
|
||||
|
||||
<span class="mock-chip mock-chip-b">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20 11a8 8 0 1 0-.6 4"/><path d="M20 5v6h-6"/></svg>
|
||||
<span data-en="Re-download">Скачать снова</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ INSTALL ============================ -->
|
||||
<section class="section" id="install">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<span class="eyebrow" data-en="Install">Установка</span>
|
||||
<h2 data-en="Four steps from the archive to the first download">Четыре шага от архива до первой загрузки</h2>
|
||||
<p data-en="The extension is distributed manually as an unpacked release. Publishing to the Chrome Web Store is not planned because of store rules for extensions whose main function relates to adult sites.">
|
||||
Расширение распространяется вручную распакованным релизом. Публикация в Chrome Web Store
|
||||
не планируется из-за правил магазина для расширений, основная функция которых относится
|
||||
к сайтам с контентом для взрослых.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="steps">
|
||||
<article class="step reveal">
|
||||
<div class="step-num">1</div>
|
||||
<h3 data-en="Download and unpack">Скачайте и распакуйте</h3>
|
||||
<p data-en="Take the ZIP from the latest GitHub Release and unpack it into a permanent folder — do not delete it afterwards.">
|
||||
Возьмите ZIP из последнего GitHub Release и распакуйте его в постоянную папку —
|
||||
удалять её после установки нельзя.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="step reveal">
|
||||
<div class="step-num">2</div>
|
||||
<h3 data-en="Open the extensions page">Откройте страницу расширений</h3>
|
||||
<p data-en="Works in Chrome, Chromium, Brave, Edge and other compatible browsers.">
|
||||
Подходит Chrome, Chromium, Brave, Edge и другие совместимые браузеры.
|
||||
</p>
|
||||
<code>chrome://extensions</code>
|
||||
</article>
|
||||
|
||||
<article class="step reveal">
|
||||
<div class="step-num">3</div>
|
||||
<h3 data-en="Enable Developer mode">Включите режим разработчика</h3>
|
||||
<p data-en="The toggle sits in the top-right corner of the extensions page.">
|
||||
Переключатель находится в правом верхнем углу страницы расширений.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="step reveal">
|
||||
<div class="step-num">4</div>
|
||||
<h3 data-en="Load unpacked">Загрузите распакованное</h3>
|
||||
<p data-en="Pick the unpacked folder — the one that directly contains manifest.json.">
|
||||
Выберите распакованную папку — ту, внутри которой лежит manifest.json.
|
||||
</p>
|
||||
<code>manifest.json</code>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="notice legal" style="margin-top:26px">
|
||||
<span class="notice-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 9v4"/><path d="M12 17h.01"/><path d="M10.3 3.9 2.4 17.5A2 2 0 0 0 4.1 20.5h15.8a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg></span>
|
||||
<div>
|
||||
<h4 data-en="Unofficial project, 18+ only">Неофициальный проект, только 18+</h4>
|
||||
<p data-en="This project is not affiliated with RedGIFS, Google or GitHub. Use it only for content you created yourself or have explicit permission from the rights holder to save. RedGIFS terms may restrict downloading; complying with them is the user's responsibility.">
|
||||
Проект не связан с RedGIFS, Google или GitHub. Используйте его только для материалов,
|
||||
которые вы создали сами либо получили явное разрешение сохранить. Условия RedGIFS могут
|
||||
ограничивать скачивание контента, и ответственность за их соблюдение несёт пользователь.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ FORMATS ============================ -->
|
||||
<section class="section" id="formats">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<span class="eyebrow" data-en="Formats">Форматы</span>
|
||||
<h2 data-en="What the downloader can assemble">Что загрузчик умеет собирать</h2>
|
||||
</div>
|
||||
|
||||
<div class="formats-grid">
|
||||
<div class="format reveal"><b>MP4</b><span data-en="direct download">прямая загрузка</span></div>
|
||||
<div class="format reveal"><b>GIF</b><span data-en="direct download">прямая загрузка</span></div>
|
||||
<div class="format reveal"><b>HLS</b><span data-en="highest available stream">лучший доступный поток</span></div>
|
||||
<div class="format reveal"><b>AES-128 HLS</b><span data-en="decrypted locally">расшифровка на устройстве</span></div>
|
||||
</div>
|
||||
|
||||
<div class="notice">
|
||||
<span class="notice-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 8v5"/><path d="M12 16h.01"/></svg></span>
|
||||
<div>
|
||||
<h4 data-en="Limits worth knowing">Ограничения, о которых стоит знать</h4>
|
||||
<p data-en="SAMPLE-AES and DRM are neither supported nor bypassed. Very large HLS videos may need a noticeable amount of RAM, because segments are assembled locally.">
|
||||
SAMPLE-AES и DRM не поддерживаются и не обходятся. Очень большие HLS-ролики могут
|
||||
потребовать заметный объём оперативной памяти, поскольку сегменты собираются локально.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ PRIVACY ============================ -->
|
||||
<section class="section" id="privacy">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<span class="eyebrow" data-en="Privacy">Приватность</span>
|
||||
<h2 data-en="Nothing leaves your browser">Ничего не покидает ваш браузер</h2>
|
||||
<p data-en="The project has no developer-operated server. Network access is limited to RedGIFS and its subdomains.">
|
||||
У проекта нет сервера разработчика. Сетевой доступ ограничен RedGIFS и его поддоменами.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="split reverse">
|
||||
<div class="split-media reveal">
|
||||
<div class="table-wrap">
|
||||
<table>
|
||||
<caption class="visually-hidden" data-en="Browser permissions and their purpose">Разрешения браузера и их назначение</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-en="Permission">Разрешение</th>
|
||||
<th data-en="Purpose">Назначение</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>activeTab</code>, <code>scripting</code></td>
|
||||
<td data-en="Detecting videos and drawing the UI on the open RedGIFS tab">Обнаружение роликов и интерфейс на открытой вкладке RedGIFS</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>downloads</code></td>
|
||||
<td data-en="Handing the finished file to the browser download manager">Передача готового файла менеджеру загрузок браузера</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>offscreen</code></td>
|
||||
<td data-en="Local Blob/HLS assembly outside the popup lifecycle">Локальная сборка Blob/HLS вне жизненного цикла popup</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>storage</code></td>
|
||||
<td data-en="Settings, downloaded-ID history and temporary diagnostics">Настройки, история скачанных ID и временная диагностика</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>tabs</code></td>
|
||||
<td data-en="Linking the popup and the service worker to the open tab">Связь popup и service worker с открытой вкладкой</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>redgifs.com</code></td>
|
||||
<td data-en="Fetching permitted media and metadata from RedGIFS only">Получение разрешённых медиа и метаданных только с RedGIFS</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="split-copy">
|
||||
<ul class="checklist" style="margin-top:0">
|
||||
<li><span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span><span data-en="Video is processed locally in the browser.">Видео обрабатывается локально в браузере.</span></li>
|
||||
<li><span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span><span data-en="No account and no email are required.">Аккаунт и email не требуются.</span></li>
|
||||
<li><span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span><span data-en="No analytics and no telemetry are collected.">Аналитика и телеметрия не собираются.</span></li>
|
||||
<li><span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span><span data-en="Settings and downloaded IDs stay in extension storage.">Настройки и история скачанных ID хранятся в хранилище расширения.</span></li>
|
||||
<li><span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span><span data-en="A diagnostic log is created only on the user's command.">Диагностический журнал создаётся только по команде пользователя.</span></li>
|
||||
<li><span class="check-mark"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 13 4 4L19 7"/></svg></span><span data-en="Sensitive headers, tokens, cookies and query parameters are redacted.">Заголовки, токены, cookie и query-параметры вычищаются из логов.</span></li>
|
||||
</ul>
|
||||
|
||||
<a class="btn btn-ghost" style="margin-top:26px" href="privacy.html">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 4 6v6c0 5 3.4 8.4 8 9 4.6-.6 8-4 8-9V6l-8-3Z"/></svg>
|
||||
<span data-en="Read the privacy policy">Политика приватности</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ FAQ ============================ -->
|
||||
<section class="section" id="faq">
|
||||
<div class="wrap">
|
||||
<div class="section-head center">
|
||||
<span class="eyebrow" data-en="FAQ">Вопросы</span>
|
||||
<h2 data-en="Frequently asked">Частые вопросы</h2>
|
||||
</div>
|
||||
|
||||
<div class="faq">
|
||||
<details open>
|
||||
<summary data-en="Why is it not in the Chrome Web Store?">Почему расширения нет в Chrome Web Store?</summary>
|
||||
<div class="faq-body">
|
||||
<p data-en="Store rules restrict extensions whose main function relates to adult sites, so the project is distributed manually as an unpacked release from GitHub.">
|
||||
Правила магазина ограничивают расширения, основная функция которых относится к сайтам
|
||||
с контентом для взрослых, поэтому проект распространяется вручную распакованным
|
||||
релизом с GitHub.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary data-en="The download button did not appear. What now?">Кнопка загрузки не появилась. Что делать?</summary>
|
||||
<div class="faq-body">
|
||||
<p data-en="Open the extension popup and run the fallback scan of the visible videos. In the infinite feed new cards are processed as you scroll, so give the page a moment after loading.">
|
||||
Откройте popup расширения и запустите резервное сканирование видимых роликов.
|
||||
В бесконечной ленте новые карточки обрабатываются по мере прокрутки, поэтому дайте
|
||||
странице немного времени после загрузки.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary data-en="Where exactly do the files end up?">Куда именно попадают файлы?</summary>
|
||||
<div class="faq-body">
|
||||
<p data-en="Into your browser Downloads folder, plus the subfolder you set and — optionally — a per-profile folder. For example: Downloads/RedGifs/example-profile/Video title.mp4">
|
||||
В папку загрузок браузера, плюс заданная вами подпапка и, при желании, папка профиля.
|
||||
Например: «Загрузки/RedGifs/example-profile/Название ролика.mp4».
|
||||
</p>
|
||||
<p data-en="The root folder itself is defined by the browser download settings and cannot be overridden by an extension.">
|
||||
Сама корневая папка определяется настройками загрузок браузера и расширением не меняется.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary data-en="Does it bypass DRM or paid content?">Обходит ли расширение DRM или платный контент?</summary>
|
||||
<div class="faq-body">
|
||||
<p data-en="No. SAMPLE-AES and DRM are not supported and are not bypassed, and the extension grants no rights to anyone else's content.">
|
||||
Нет. SAMPLE-AES и DRM не поддерживаются и не обходятся, а само расширение не даёт прав
|
||||
на чужой контент.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary data-en="Is any data sent anywhere?">Отправляются ли куда-нибудь данные?</summary>
|
||||
<div class="faq-body">
|
||||
<p data-en="No. There is no developer-operated server, no analytics and no telemetry. Network requests go to RedGIFS and its content-delivery infrastructure only, exactly as the page itself would do.">
|
||||
Нет. Сервера разработчика, аналитики и телеметрии не существует. Сетевые запросы идут
|
||||
только на RedGIFS и его инфраструктуру доставки контента — так же, как это делает
|
||||
сама страница.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary data-en="Can I fork or redistribute the code?">Можно ли форкнуть или распространять код?</summary>
|
||||
<div class="faq-body">
|
||||
<p data-en="No. The source code and release builds are provided under a proprietary All Rights Reserved license. Only installing and running the unmodified official release for personal, non-commercial use is permitted.">
|
||||
Нет. Исходный код и релизные сборки предоставляются по проприетарной лицензии
|
||||
All Rights Reserved. Разрешена только установка и запуск неизменённого официального
|
||||
релиза для личного некоммерческого использования.
|
||||
</p>
|
||||
<p data-en="Public availability of files on GitHub does not by itself grant any additional rights.">
|
||||
Публичная доступность файлов на GitHub сама по себе не предоставляет дополнительных прав.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary data-en="What does the diagnostic log contain?">Что содержит диагностический лог?</summary>
|
||||
<div class="faq-body">
|
||||
<p data-en="Events, DOM geometry, HTTP statuses and error messages — never the video body or API response bodies. Query strings and fragments are removed, and known token, cookie, credential and secret fields are replaced with [redacted].">
|
||||
События, геометрию DOM, HTTP-статусы и сообщения об ошибках — но не тело видео
|
||||
и не тела ответов API. Query-строки и фрагменты удаляются, а известные поля токенов,
|
||||
cookie и секретов заменяются на [redacted].
|
||||
</p>
|
||||
<p data-en="Reviewing the file manually before sharing it is still recommended.">
|
||||
Перед публикацией файл всё равно стоит просмотреть вручную.
|
||||
</p>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================ CTA ============================ -->
|
||||
<section class="section section-tight">
|
||||
<div class="wrap">
|
||||
<div class="cta-box reveal">
|
||||
<h2 data-en="Grab the latest release">Возьмите последний релиз</h2>
|
||||
<p data-en="Unpack it, load it into the browser and the download button will be waiting on the next RedGIFS page you open.">
|
||||
Распакуйте, загрузите в браузер — и кнопка загрузки будет ждать вас на следующей
|
||||
открытой странице RedGIFS.
|
||||
</p>
|
||||
<div class="cta-actions">
|
||||
<a class="btn btn-primary" href="https://github.com/OwnerLink/redgifs-video-downloader/releases/latest" data-link="release" rel="noopener">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><path d="m7 11 5 5 5-5"/><path d="M4 20h16"/></svg>
|
||||
<span data-en="Download v0.6.23">Скачать v0.6.23</span>
|
||||
</a>
|
||||
<a class="btn btn-ghost" href="https://github.com/OwnerLink/redgifs-video-downloader" data-link="repo" rel="noopener">
|
||||
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2a10 10 0 0 0-3.16 19.49c.5.09.68-.22.68-.48l-.01-1.7c-2.78.6-3.37-1.34-3.37-1.34-.45-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.9 1.53 2.36 1.09 2.94.83.09-.65.35-1.09.63-1.34-2.22-.25-4.56-1.11-4.56-4.94 0-1.09.39-1.98 1.03-2.68-.1-.25-.45-1.27.1-2.65 0 0 .84-.27 2.75 1.02a9.6 9.6 0 0 1 5 0c1.91-1.29 2.75-1.02 2.75-1.02.55 1.38.2 2.4.1 2.65.64.7 1.03 1.59 1.03 2.68 0 3.84-2.34 4.69-4.57 4.94.36.31.68.92.68 1.85l-.01 2.75c0 .26.18.58.69.48A10 10 0 0 0 12 2Z"/></svg>
|
||||
<span data-en="View the repository">Открыть репозиторий</span>
|
||||
</a>
|
||||
</div>
|
||||
<p class="cta-note" data-en="Adults only. Use exclusively for content you own or are explicitly permitted to save.">
|
||||
Только для совершеннолетних. Используйте исключительно для материалов, которыми владеете
|
||||
вы или на сохранение которых у вас есть явное разрешение.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- ============================ FOOTER ============================ -->
|
||||
<footer class="site-footer">
|
||||
<div class="wrap">
|
||||
<div class="footer-grid">
|
||||
<div class="footer-brand">
|
||||
<a class="brand" href="./">
|
||||
<img src="assets/img/icon-128.png" alt="" width="32" height="32">
|
||||
<span>RedGifs Video Downloader<small>v0.6.23</small></span>
|
||||
</a>
|
||||
<p data-en="Unofficial local downloader for Chromium. Not affiliated with RedGIFS, Google or GitHub. Provided as is, without warranty of operability, RedGIFS availability, compliance with third-party terms or data retention.">
|
||||
Неофициальный локальный загрузчик для Chromium. Не связан с RedGIFS, Google или GitHub.
|
||||
Предоставляется «как есть», без гарантий работоспособности, доступности RedGIFS,
|
||||
соответствия сторонним условиям или сохранности данных.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="footer-col">
|
||||
<h5 data-en="Product">Продукт</h5>
|
||||
<ul>
|
||||
<li><a href="#features" data-en="Features">Возможности</a></li>
|
||||
<li><a href="#interface" data-en="Interface">Интерфейс</a></li>
|
||||
<li><a href="#formats" data-en="Formats">Форматы</a></li>
|
||||
<li><a href="#install" data-en="Install">Установка</a></li>
|
||||
<li><a href="#faq" data-en="FAQ">Вопросы</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="footer-col">
|
||||
<h5 data-en="Resources">Материалы</h5>
|
||||
<ul>
|
||||
<li><a href="https://github.com/OwnerLink/redgifs-video-downloader" data-link="repo" rel="noopener" data-en="GitHub repository">Репозиторий GitHub</a></li>
|
||||
<li><a href="https://github.com/OwnerLink/redgifs-video-downloader/releases/latest" data-link="release" rel="noopener" data-en="Latest release">Последний релиз</a></li>
|
||||
<li><a href="privacy.html" data-en="Privacy policy">Политика приватности</a></li>
|
||||
<li><a href="license.html" data-en="License">Лицензия</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer-bottom">
|
||||
<span data-en="© 2026 RedGifs Video Downloader. All rights reserved.">© 2026 RedGifs Video Downloader. Все права защищены.</span>
|
||||
<span data-en="18+ · For personal, non-commercial use only">18+ · Только для личного некоммерческого использования</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
<!doctype html>
|
||||
<html lang="ru" data-lang="ru"
|
||||
data-en-title="License — RedGifs Video Downloader"
|
||||
data-en-description="Licensing terms of RedGifs Video Downloader: a proprietary All Rights Reserved license permitting personal, non-commercial use of the unmodified official release.">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Лицензия — RedGifs Video Downloader</title>
|
||||
<meta name="description" content="Условия лицензирования RedGifs Video Downloader: проприетарная лицензия All Rights Reserved, разрешающая личное некоммерческое использование неизменённого официального релиза.">
|
||||
<meta name="theme-color" content="#070a0f">
|
||||
<meta name="color-scheme" content="dark">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32.png">
|
||||
<link rel="icon" type="image/svg+xml" href="assets/img/icon.svg">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap">
|
||||
<link rel="stylesheet" href="assets/css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a class="skip-link" href="#main" data-en="Skip to content">К основному содержимому</a>
|
||||
|
||||
<header class="site-header" id="siteHeader">
|
||||
<div class="wrap">
|
||||
<a class="brand" href="./" aria-label="RedGifs Video Downloader">
|
||||
<img src="assets/img/icon-128.png" alt="" width="32" height="32">
|
||||
<span>RedGifs Video Downloader<small>v0.6.23 · Manifest V3</small></span>
|
||||
</a>
|
||||
<nav class="nav" id="primaryNav" aria-label="Основная навигация" data-en-label="Main navigation">
|
||||
<a href="index.html#features" data-en="Features">Возможности</a>
|
||||
<a href="index.html#install" data-en="Install">Установка</a>
|
||||
<a href="privacy.html" data-en="Privacy">Приватность</a>
|
||||
<a href="license.html" data-en="License">Лицензия</a>
|
||||
</nav>
|
||||
<div class="header-actions">
|
||||
<div class="lang-switch" role="group" aria-label="Язык / Language">
|
||||
<button type="button" data-set-lang="ru" aria-pressed="true">RU</button>
|
||||
<button type="button" data-set-lang="en" aria-pressed="false">EN</button>
|
||||
</div>
|
||||
<button class="nav-toggle" id="navToggle" type="button" aria-expanded="false" aria-controls="primaryNav" aria-label="Меню" data-en-label="Menu">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 7h16"/><path d="M4 12h16"/><path d="M4 17h16"/></svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main" class="doc">
|
||||
<div class="wrap doc-inner">
|
||||
<a class="back-link" href="./">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M19 12H5"/><path d="m11 6-6 6 6 6"/></svg>
|
||||
<span data-en="Back to the overview">Назад на главную</span>
|
||||
</a>
|
||||
|
||||
<h1 data-en="License">Лицензия</h1>
|
||||
<p class="doc-meta" data-en="RedGifs Video Downloader Proprietary License, Version 1.0 · 14 August 2026 · Copyright © 2026 RedGifs Video Downloader. All rights reserved.">
|
||||
RedGifs Video Downloader Proprietary License, версия 1.0 · 14 августа 2026 · © 2026 RedGifs Video Downloader. Все права защищены.
|
||||
</p>
|
||||
|
||||
<div class="notice legal" style="margin-bottom:32px">
|
||||
<span class="notice-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 9v4"/><path d="M12 17h.01"/><path d="M10.3 3.9 2.4 17.5A2 2 0 0 0 4.1 20.5h15.8a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg></span>
|
||||
<div>
|
||||
<h4 data-en="This page is a plain-language summary">Эта страница — краткий пересказ</h4>
|
||||
<p data-en="The authoritative text is the LICENSE file in the repository. Where this summary and the LICENSE file differ, the LICENSE file applies.">
|
||||
Юридически значимым является файл LICENSE в репозитории. При расхождении этого пересказа
|
||||
и файла LICENSE применяется файл LICENSE.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 data-en="What is allowed">Что разрешено</h2>
|
||||
<p data-en="An individual end user gets a limited, revocable, non-exclusive, non-transferable license to install and run an unmodified official release, solely for personal, non-commercial use, and solely to save content the user owns or has explicit permission from the rights holder to save.">
|
||||
Индивидуальный конечный пользователь получает ограниченную, отзывную, неисключительную
|
||||
и непередаваемую лицензию на установку и запуск неизменённого официального релиза —
|
||||
исключительно для личного некоммерческого использования и исключительно для сохранения
|
||||
материалов, которыми пользователь владеет либо на сохранение которых у него есть явное
|
||||
разрешение правообладателя.
|
||||
</p>
|
||||
|
||||
<h2 data-en="What is not allowed">Что не разрешено</h2>
|
||||
<ul>
|
||||
<li data-en="copying, modifying, adapting, translating or creating derivative works;">копирование, изменение, адаптация, перевод и создание производных работ;</li>
|
||||
<li data-en="publishing, distributing, sublicensing, selling, hosting or mirroring the software;">публикация, распространение, сублицензирование, продажа, хостинг и зеркалирование;</li>
|
||||
<li data-en="forking, cloning for redistribution or maintaining a derivative — public or private;">форки, клонирование для перераспространения и поддержание производных — публичных или приватных;</li>
|
||||
<li data-en="reverse engineering, decompiling or disassembling, except where law forbids such a restriction;">обратная разработка, декомпиляция и дизассемблирование, кроме случаев, когда такой запрет противоречит закону;</li>
|
||||
<li data-en="removing or altering copyright, license and attribution notices;">удаление или изменение уведомлений об авторских правах, лицензии и атрибуции;</li>
|
||||
<li data-en="commercial activity, bulk republication, infringement, unauthorized access, DRM circumvention or violation of third-party terms.">коммерческая деятельность, массовая перепубликация, нарушение прав, несанкционированный доступ, обход DRM и нарушение условий третьих сторон.</li>
|
||||
</ul>
|
||||
<p data-en="Possession of the source code or a release archive grants no right beyond the limited end-user license above. Public availability of files on GitHub does not by itself grant additional rights — GitHub technically allows forking any public repository, but such a fork may breach this license.">
|
||||
Обладание исходным кодом или релизным архивом не даёт прав сверх ограниченной пользовательской
|
||||
лицензии выше. Публичная доступность файлов на GitHub сама по себе не предоставляет
|
||||
дополнительных прав: технически GitHub позволяет форкнуть любой публичный репозиторий, однако
|
||||
такой форк может нарушать эту лицензию.
|
||||
</p>
|
||||
|
||||
<h2 data-en="Third-party content and services">Сторонний контент и сервисы</h2>
|
||||
<p data-en="The software is unofficial and is not affiliated with, endorsed by or sponsored by RedGIFS, Google, GitHub or any content creator. The license grants no rights to third-party content, names, trademarks, services or APIs. Obtaining the necessary permissions and complying with applicable law and third-party terms is entirely the user's responsibility.">
|
||||
Программа является неофициальной и не связана с RedGIFS, Google, GitHub или каким-либо автором
|
||||
контента, не одобрена и не спонсируется ими. Лицензия не даёт прав на сторонний контент,
|
||||
названия, товарные знаки, сервисы и API. Получение необходимых разрешений и соблюдение
|
||||
применимого права и условий третьих сторон полностью лежит на пользователе.
|
||||
</p>
|
||||
|
||||
<h2 data-en="Termination">Прекращение действия</h2>
|
||||
<p data-en="The license terminates automatically upon breach. After termination the user must stop using the software and delete all copies in their possession or control.">
|
||||
Лицензия прекращается автоматически при нарушении её условий. После прекращения пользователь
|
||||
обязан прекратить использование программы и удалить все копии, находящиеся в его владении
|
||||
или под его контролем.
|
||||
</p>
|
||||
|
||||
<h2 data-en="No warranty and limitation of liability">Отказ от гарантий и ограничение ответственности</h2>
|
||||
<p data-en="The software is provided as is and as available, without warranty of any kind, express or implied, including merchantability, fitness for a particular purpose, title and non-infringement. Use is at the user's sole risk.">
|
||||
Программа предоставляется «как есть» и «как доступно», без каких-либо гарантий, явных или
|
||||
подразумеваемых, включая гарантии товарной пригодности, пригодности для конкретной цели,
|
||||
правового титула и ненарушения прав. Использование осуществляется на собственный риск
|
||||
пользователя.
|
||||
</p>
|
||||
<p data-en="To the maximum extent permitted by applicable law, the copyright holder is not liable for any claim, loss, damages or other liability arising from or related to the software or its use, whether in contract, tort or otherwise.">
|
||||
В максимальной степени, разрешённой применимым правом, правообладатель не несёт
|
||||
ответственности по любым претензиям, убыткам, ущербу или иным обязательствам, возникающим
|
||||
из программы или её использования либо связанным с ними, будь то в рамках договора,
|
||||
деликта или иным образом.
|
||||
</p>
|
||||
|
||||
<h2 data-en="Written permission">Письменное разрешение</h2>
|
||||
<p data-en="Any permission beyond the limited end-user license must be granted in a separate written agreement signed by the copyright holder. Requests may be submitted through the official GitHub repository.">
|
||||
Любое разрешение сверх ограниченной пользовательской лицензии должно предоставляться отдельным
|
||||
письменным соглашением, подписанным правообладателем. Запросы можно направить через
|
||||
<a href="https://github.com/OwnerLink/redgifs-video-downloader" data-link="repo" rel="noopener">официальный репозиторий GitHub</a>.
|
||||
</p>
|
||||
|
||||
<p style="margin-top:34px">
|
||||
<a class="btn btn-ghost" href="https://github.com/OwnerLink/redgifs-video-downloader/blob/main/LICENSE" data-link="license" rel="noopener">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z"/><path d="M14 3v5h5"/></svg>
|
||||
<span data-en="Full LICENSE text">Полный текст LICENSE</span>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="wrap">
|
||||
<div class="footer-bottom" style="border-top:0;padding-top:0">
|
||||
<span data-en="© 2026 RedGifs Video Downloader. All rights reserved.">© 2026 RedGifs Video Downloader. Все права защищены.</span>
|
||||
<span><a href="./" data-en="Overview">Главная</a> · <a href="privacy.html" data-en="Privacy">Приватность</a></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
<!doctype html>
|
||||
<html lang="ru" data-lang="ru"
|
||||
data-en-title="Privacy Policy — RedGifs Video Downloader"
|
||||
data-en-description="Privacy policy of the RedGifs Video Downloader extension: local processing, no developer server, no analytics, no telemetry.">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Политика приватности — RedGifs Video Downloader</title>
|
||||
<meta name="description" content="Политика приватности расширения RedGifs Video Downloader: локальная обработка, отсутствие сервера разработчика, аналитики и телеметрии.">
|
||||
<meta name="theme-color" content="#070a0f">
|
||||
<meta name="color-scheme" content="dark">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32.png">
|
||||
<link rel="icon" type="image/svg+xml" href="assets/img/icon.svg">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap">
|
||||
<link rel="stylesheet" href="assets/css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a class="skip-link" href="#main" data-en="Skip to content">К основному содержимому</a>
|
||||
|
||||
<header class="site-header" id="siteHeader">
|
||||
<div class="wrap">
|
||||
<a class="brand" href="./" aria-label="RedGifs Video Downloader">
|
||||
<img src="assets/img/icon-128.png" alt="" width="32" height="32">
|
||||
<span>RedGifs Video Downloader<small>v0.6.23 · Manifest V3</small></span>
|
||||
</a>
|
||||
<nav class="nav" id="primaryNav" aria-label="Основная навигация" data-en-label="Main navigation">
|
||||
<a href="index.html#features" data-en="Features">Возможности</a>
|
||||
<a href="index.html#install" data-en="Install">Установка</a>
|
||||
<a href="index.html#privacy" data-en="Privacy">Приватность</a>
|
||||
<a href="license.html" data-en="License">Лицензия</a>
|
||||
</nav>
|
||||
<div class="header-actions">
|
||||
<div class="lang-switch" role="group" aria-label="Язык / Language">
|
||||
<button type="button" data-set-lang="ru" aria-pressed="true">RU</button>
|
||||
<button type="button" data-set-lang="en" aria-pressed="false">EN</button>
|
||||
</div>
|
||||
<button class="nav-toggle" id="navToggle" type="button" aria-expanded="false" aria-controls="primaryNav" aria-label="Меню" data-en-label="Menu">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 7h16"/><path d="M4 12h16"/><path d="M4 17h16"/></svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main" class="doc">
|
||||
<div class="wrap doc-inner">
|
||||
<a class="back-link" href="./">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M19 12H5"/><path d="m11 6-6 6 6 6"/></svg>
|
||||
<span data-en="Back to the overview">Назад на главную</span>
|
||||
</a>
|
||||
|
||||
<h1 data-en="Privacy Policy">Политика приватности</h1>
|
||||
<p class="doc-meta" data-en="Effective date: 14 August 2026">Дата вступления в силу: 14 августа 2026 года</p>
|
||||
|
||||
<p data-en="RedGifs Video Downloader is designed to work locally in the user's Chromium-based browser.">
|
||||
RedGifs Video Downloader спроектирован так, чтобы работать локально в браузере пользователя
|
||||
на основе Chromium.
|
||||
</p>
|
||||
|
||||
<h2 data-en="Data handled by the extension">Данные, которые обрабатывает расширение</h2>
|
||||
<p data-en="The extension may process the following data when the user visits RedGIFS:">
|
||||
При посещении RedGIFS расширение может обрабатывать следующие данные:
|
||||
</p>
|
||||
<ul>
|
||||
<li data-en="the current RedGIFS page URL;">URL текущей страницы RedGIFS;</li>
|
||||
<li data-en="visible page elements and media metadata needed to identify a video;">видимые элементы страницы и метаданные медиа, необходимые для определения ролика;</li>
|
||||
<li data-en="RedGIFS media URLs and temporary API authorization required by the site;">URL медиа RedGIFS и временную авторизацию API, требуемую самим сайтом;</li>
|
||||
<li data-en="download settings and the stable IDs of successfully downloaded videos;">настройки загрузки и стабильные ID успешно скачанных роликов;</li>
|
||||
<li data-en="diagnostic events, DOM geometry, HTTP statuses and error messages.">диагностические события, геометрию DOM, HTTP-статусы и сообщения об ошибках.</li>
|
||||
</ul>
|
||||
|
||||
<h2 data-en="How data is used">Как используются данные</h2>
|
||||
<p data-en="This data is used only to find requested media, assemble it locally, save it through the browser download manager, remember completed downloads, and generate a diagnostic log when requested.">
|
||||
Эти данные используются только для того, чтобы найти запрошенное медиа, собрать его локально,
|
||||
сохранить через менеджер загрузок браузера, запомнить завершённые загрузки и сформировать
|
||||
диагностический журнал по запросу пользователя.
|
||||
</p>
|
||||
|
||||
<h2 data-en="Storage and sharing">Хранение и передача</h2>
|
||||
<ul>
|
||||
<li data-en="The project has no developer-operated server.">У проекта нет сервера, управляемого разработчиком.</li>
|
||||
<li data-en="No analytics or telemetry is collected.">Аналитика и телеметрия не собираются.</li>
|
||||
<li data-en="No data is sold or shared by the developer.">Разработчик не продаёт и не передаёт данные.</li>
|
||||
<li data-en="Settings and downloaded-video IDs remain in browser extension storage.">Настройки и ID скачанных роликов остаются в хранилище расширения браузера.</li>
|
||||
<li data-en="Temporary diagnostic events remain in session storage and are exported only when the user clicks the diagnostic-log button.">Временные диагностические события хранятся в session storage и экспортируются только по нажатию кнопки диагностического лога.</li>
|
||||
<li data-en="Media is not uploaded to a third-party service by this extension.">Расширение не выгружает медиа в сторонние сервисы.</li>
|
||||
</ul>
|
||||
<p data-en="Normal communication with RedGIFS and its content-delivery infrastructure remains subject to RedGIFS' own privacy policy and terms.">
|
||||
Обычное взаимодействие с RedGIFS и его инфраструктурой доставки контента регулируется
|
||||
собственной политикой приватности и условиями RedGIFS.
|
||||
</p>
|
||||
|
||||
<h2 data-en="Diagnostic redaction">Очистка диагностики</h2>
|
||||
<p data-en="The diagnostic exporter removes URL query strings and fragments and replaces known token, authorization, cookie, credential, password and secret fields with [redacted]. Video bodies and API response bodies are not included. Users should still review a diagnostic file before sharing it.">
|
||||
Экспортёр диагностики удаляет query-строки и фрагменты URL, а известные поля токенов,
|
||||
авторизации, cookie, учётных данных, паролей и секретов заменяет на <code>[redacted]</code>.
|
||||
Тела видео и тела ответов API в журнал не попадают. Перед публикацией диагностического файла
|
||||
его всё равно рекомендуется просмотреть вручную.
|
||||
</p>
|
||||
|
||||
<h2 data-en="Removal">Удаление</h2>
|
||||
<p data-en="Users can erase extension settings and history by removing the extension or clearing its stored data in the browser.">
|
||||
Настройки и историю расширения можно стереть, удалив расширение или очистив его данные
|
||||
в браузере.
|
||||
</p>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="wrap">
|
||||
<div class="footer-bottom" style="border-top:0;padding-top:0">
|
||||
<span data-en="© 2026 RedGifs Video Downloader. All rights reserved.">© 2026 RedGifs Video Downloader. Все права защищены.</span>
|
||||
<span><a href="./" data-en="Overview">Главная</a> · <a href="license.html" data-en="License">Лицензия</a></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,6 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Replace the host below if the site is published under a custom domain
|
||||
# or a different repository name.
|
||||
Sitemap: https://redgifs.extension.lonarpgproxy.space/sitemap.xml
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Replace the host below if the site is published under a custom domain
|
||||
or a different repository name.
|
||||
-->
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://redgifs.extension.lonarpgproxy.space/</loc>
|
||||
<lastmod>2026-08-22</lastmod>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://redgifs.extension.lonarpgproxy.space/privacy.html</loc>
|
||||
<lastmod>2026-08-22</lastmod>
|
||||
<priority>0.5</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://redgifs.extension.lonarpgproxy.space/license.html</loc>
|
||||
<lastmod>2026-08-22</lastmod>
|
||||
<priority>0.5</priority>
|
||||
</url>
|
||||
</urlset>
|
||||
Reference in new issue
Block a user