229 lines
11 KiB
JavaScript
229 lines
11 KiB
JavaScript
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();
|
||
});
|
||
});
|
||
});
|