sdelay-sayt-pomoschnik-veden/script.js

229 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

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

const CHECKLIST = [
"Кавер поста: единый стиль, читаемый за 3 секунды",
"Подпись: крючок в первой строке, короткий абзацы",
"Хештеги: 5–15, три уровня, не дублирую прошлый список",
"Время поста: 12–14 или 19–21 по моей аудитории",
"Сторис к посту: закулисье или реакция",
"Ответ на комментарии в первый час",
"Проверка: нет опечаток, битых ссылок",
"Напоминание: завтра выкладываю сторис «до/после»",
"Финальный просмотр ленты: новый пост вписывается в стиль"
];
const IDEAS = {
clients: [
"История: как клиент пришёл с проблемой и что получилось",
"До/после: 3 самых сильных примера",
"Ошибки клиентов, которые я решаю чаще всего",
"Что входит в работу и что нет",
"Один инструмент/метод, который экономит время",
"Ответ на главный вопрос: «а сколько стоит?»",
"Закулисье: как устроен мой рабочий день",
"FAQ: 3 вопроса, которые задают каждый день",
"Кейс с цифрами: сроки, результат, цена",
"Мой подход vs общий подход",
"Что я не делаю и почему",
"Отзыв (со скриншотом, с разрешения)"
],
followers: [
"Мини-гид в 5 кадрах",
"Миф vs правда о моей теме",
"Список: 7 вещей, о которых вы не думали",
"Мой самый странный факт о теме",
"Опрос: что посмотреть/почитать дальше",
"Релизы: что нового у меня",
"Баттл: два способа, какой ваш",
"Скрин-шаринг: как я это делаю",
"Подборка: 5 ресурсов, которые использую",
"История «почему я этим занимаюсь»",
"Челлендж на неделю (приглашаю участвовать)",
"Пересказ чужого поста со своим комментарием"
],
sales: [
"Оффер дня/недели с дедлайном",
"Что входит в пакет, по полочкам",
"Вопрос-ответ по оплате и срокам",
"Кейс: «было/стало» в цифрах",
"Один аргумент «почему именно сейчас»",
"Список: кому подойдёт, а кому нет",
"Закулисье подготовки (создаёт доверие)",
"Отзыв с результатом",
"Мини-консультация: отвечаю на вопросы в директ",
"Бонус при заказе в эту неделю",
"Что делать после покупки",
"Мифы о моей услуге"
],
brand: [
"История: почему появился этот проект",
"Ценности: 3 принципа, на которых стоит",
"Команда: кто стоит за брендом",
"Как мы работаем: 3 шага",
"Закулисье производства/процесса",
"Что отличает нас от других",
"Будущее: что появится в следующем quarter",
"Мой любимый продукт/услуга и почему",
"Подборка: как использовать",
"Одна ошибка, которую мы совершили (и чему научились)",
"Место, где нас можно найти офлайн",
"Секрет: что мы делаем «невидимого» для клиента"
],
fun: [
"Мой топ-5 (песни/места/фильмы по теме)",
"Закулисье процесса: как сделано",
"Провал недели (честно)",
"Мини-совет для таких же, как я",
"Место недели: куда и когда",
"Челлендж на неделю",
"Перед/после: результат",
"Вопрос к аудитории: что хотите узнать",
"Мой ритуал (утро, вечер, подготовка)",
"Случай, который меня изменил",
"3 книги/фильма/плейлиста по теме",
"Задушевный пост: почему я это веду"
],
default: [
"История: почему я этой занимаюсь",
"Закулисье: как выглядит мой процесс",
"3 вещи, которые я делаю иначе",
"Один совет на неделю",
"До/после",
"Мой топ-5",
"Частый вопрос и полный ответ",
"Провал недели (честно)",
"Что нового впереди",
"Мое место / мой день",
"Подборка ресурсов",
"Вопрос к аудитории в сторис"
]
};
const ADVICES = {
clients: "Фокус на результатах. 1 пост в неделю = кейс с цифрами. Добавьте 3 сторис: процесс, вопрос к аудитории, результат.",
followers: "Регулярность важнее идеальности. 2–3 поста в неделю + сторис каждый день. Одна рубрика, чтобы ждать.",
sales: "Продажи через пользу: кейس → аргумент → оффер. В директ отвечайте в первые 15 минут.",
brand: "Голос и ценности в первом же посте. Показывайте людей, процесс и цифры — бренд живёт деталями.",
fun: "Личное > полезное. Ваша история заходит лучше, чем «советы». 1 пост в неделю + сторис из жизни."
};
function load(key, fallback) {
try {
const v = localStorage.getItem(key);
return v ? JSON.parse(v) : fallback;
} catch {
return fallback;
}
}
function save(key, val) {
try { localStorage.setItem(key, JSON.stringify(val)); } catch {}
}
function buildChecklist() {
const list = document.getElementById("checklist-list");
const done = load("ig-checklist-done", {});
const itemsEl = document.createElement("div");
CHECKLIST.forEach((text, i) => {
const li = document.createElement("li");
li.tabIndex = 0;
const input = document.createElement("input");
input.type = "checkbox";
input.checked = !!done[i];
const span = document.createElement("span");
span.textContent = text;
li.append(input, span);
const toggle = () => {
done[i] = input.checked;
li.classList.toggle("done", input.checked);
save("ig-checklist-done", done);
updateProgress();
};
input.addEventListener("change", toggle);
li.addEventListener("click", (e) => { if (e.target !== input) { input.checked = !input.checked; toggle(); } });
li.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); input.checked = !input.checked; toggle(); } });
list.appendChild(li);
});
updateProgress();
}
function updateProgress() {
const boxes = document.querySelectorAll("#checklist-list input[type=checkbox]");
const total = boxes.length;
const checked = Array.from(boxes).filter((b) => b.checked).length;
const pct = total ? Math.round((checked / total) * 100) : 0;
const bar = document.getElementById("start-prog-bar");
if (bar) bar.style.width = pct + "%";
const label = document.getElementById("checklist-progress");
label.textContent = total
? `Прогресс: ${checked} из ${total} (закреплено в этом браузере)`
: "Отмечайте пункты — прогресс сохраняется в этом браузере.";
}
function buildIdeas() {
const grid = document.getElementById("ideas-grid");
const niche = document.getElementById("niche").value || "default";
const taken = load("ig-ideas-" + niche, []);
const ideas = IDEAS[niche] || IDEAS.default;
grid.innerHTML = "";
ideas.forEach((idea) => {
const card = document.createElement("article");
card.className = "kt-ai-card" + (taken.includes(idea) ? " taken" : "");
card.tabIndex = 0;
const title = document.createElement("h3");
title.textContent = idea;
const hint = document.createElement("p");
hint.className = "kt-ai-hero-sub";
hint.style.margin = "6px 0 0";
hint.textContent = taken.includes(idea) ? "Уже взята — нажмите, чтобы вернуть" : "Нажмите, чтобы взять в работу";
card.append(title, hint);
const flip = () => {
const idx = taken.indexOf(idea);
if (idx >= 0) taken.splice(idx, 1);
else taken.push(idea);
save("ig-ideas-" + niche, taken);
buildIdeas();
};
card.addEventListener("click", flip);
card.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); flip(); } });
grid.appendChild(card);
});
}
function computeStart() {
const goal = document.getElementById("goal").value;
const niche = document.getElementById("niche").value;
const freq = document.getElementById("frequency").value;
const card = document.getElementById("start-result");
if (!goal && !niche && !freq) { card.hidden = true; return; }
card.hidden = false;
const advice = ADVICES[goal] || ADVICES["clients"];
let extra = "";
if (freq === "daily") extra = " Каждый день — держите запас минимум на 3 поста.";
if (freq === "weekly") extra = " 1 раз в неделю — делайте контент-план на месяц вперёд.";
if (freq === "rare") extra = " Вспышками — соберите 5 идей в «банк» и публикуйте по мере готовности.";
document.getElementById("start-advice").textContent = advice + extra;
const row = document.getElementById("start-cta-row");
row.innerHTML = "";
const a1 = document.createElement("a");
a1.className = "kt-ai-btn";
a1.dataset.variant = "primary";
a1.href = "#checklist";
a1.textContent = "Открыть чек-лист";
const a2 = document.createElement("a");
a2.className = "kt-ai-btn";
a2.dataset.variant = "ghost";
a2.href = "#ideas";
a2.textContent = "Взять идеи";
row.append(a1, a2);
}
document.addEventListener("DOMContentLoaded", () => {
buildChecklist();
buildIdeas();
computeStart();
["goal", "niche", "frequency"].forEach((id) => {
document.getElementById(id).addEventListener("change", () => {
computeStart();
if (id === "niche") buildIdeas();
});
});
});