Тепер питання задаєш ти. Шість раундів — шість київських компаній. Рекрутер говорить кліше. Твоя справа — обрати правильне питання і вирішити, чи вірити відповіді.
Він скаже щось типове — про команду, культуру або «гнучкість».
Три варіанти. Тільки одне розкриє правду — інші просто прозвучать.
🟢 вірю · 🟡 сумніваюся · 🔴 бреше. По 2 бали за раунд. Максимум 12.
Мій Київ × Бачиш recruiterа наскрізь.
Гра показала, як рекрутери говорять. injobe — майданчик, де ці питання вже задані за тебе: компанії, які приходять на injobe, проходять перевірку за тими ж критеріями. Обери, що тобі важливо — підберемо вакансії.
Ти зіграв із рекрутерами. Перед справжньою співбесідою — відкрий цей список. Збережи у нотатки. Якщо рекрутер уникає 5+ питань — це вже відповідь.
Сценарії і шпаргалка — Мій Київ. Інтеграція з реальним ринком — injobe. Дякуємо, що грав.
Мій Київ ×
(function(){
'use strict';
const ROUNDS = [
{
id: 1,
company: 'Київська FinTech-SaaS',
industry: 'B2B-фінанси',
district: 'Поділ',
teamSize: '80 людей',
recruiterName: 'Анна',
recruiterInitial: 'А',
phrase: 'У нас дружна команда, працюємо в офісі на Подолі, але можна 1 день на тиждень remote.',
questions: [
{
text: 'Який стек?',
deep: false,
answer: 'React, Node.js, PostgreSQL. Останній рік активно мігруємо на TypeScript.',
truth: 'yellow',
why: 'Питання нічого не сказало про команду. Recruiter відповів — і ти все ще не знаєш, як вони працюють і чи переробляють. Стек — це поверхня; за ним легко сховати все інше.'
},
{
text: 'Які бенефіти?',
deep: false,
answer: 'Медстраховка, спорт-залу, корпоратив раз на рік, англійська з ментором.',
truth: 'yellow',
why: 'Список як у 90% київських офісів. Спорт-залу ти, найімовірніше, не побачиш. Англійська — 30 хв на тиждень. Це питання recruiter готовий відповідати найшвидше — бо воно не загрозливе.'
},
{
text: 'Чи є обовʼязкові години присутності — і як швидко треба відповідати у месенджері після 19:00?',
deep: true,
answer: 'Чесно? До 20:00 — нормально, на реліз бувало і до півночі. Релізи раз на два тижні.',
truth: 'red',
why: '«Дружна команда» + чергування у месенджері до півночі двічі на місяць — це переробки, які ніхто не оплачує і ніхто не визнає переробками. Анна чесно проговорилася. Це червоний прапор: 2 рази на місяць у тебе фактично 12-годинний день.'
}
]
},
{
id: 2,
company: 'Product Studio · Lume',
industry: 'UX/UI студія',
district: 'Печерськ',
teamSize: '25 людей',
recruiterName: 'Богдан',
recruiterInitial: 'Б',
phrase: 'У нас творча атмосфера, плоска структура. Кожен голос має значення.',
questions: [
{
text: 'Як проходить адаптація нової людини?',
deep: false,
answer: 'Перший тиждень із наставником, на другому — перше дрібне завдання, далі по ситуації.',
truth: 'green',
why: 'Питання поверхневе, але відповідь нормальна. Тільки воно не перевіряє слова про «плоску структуру» — а саме там, як виявиться, і є проблема.'
},
{
text: 'Який середній стаж дизайнерів у команді?',
deep: false,
answer: 'Десь півтора-два роки. Молода команда, ще ростемо.',
truth: 'yellow',
why: '1,5–2 роки — це висока плинність для дизайн-студії. Або погана адаптація, або кожен другий йде, як знайшов кращі умови. «Молода команда» тут — евфемізм.'
},
{
text: 'Хто приймає фінальне рішення з дизайну, якщо ти і клієнт думаєте по-різному?',
deep: true,
answer: 'Засновник. Він дизайнер за освітою, тому свою думку додає всюди — на ескізах, на фінальному макеті, навіть на дрібних деталях.',
truth: 'red',
why: '«Плоска структура» зустрілася із засновником-дизайнером, який лізе у кожну дрібницю. Це не плоска — це нероздільна. Твоїй експертизі тут довірятимуть рівно до моменту, поки вона збігається з його смаком.'
}
]
},
{
id: 3,
company: 'E-commerce · Ostrov.UA',
industry: 'Маркетплейс',
district: 'Лукʼянівка',
teamSize: '200 людей',
recruiterName: 'Олена',
recruiterInitial: 'О',
phrase: 'Амбітний продукт, виходимо на ринок ЄС, шукаємо людину, націлену на зростання.',
questions: [
{
text: 'Яка вилка по позиції?',
deep: false,
answer: 'Це ми обговоримо на наступному етапі, коли пройдеш технічну співбесіду.',
truth: 'yellow',
why: 'Класичний хід: вилку приховують, щоб дізнатися твою першою. Це не червоний прапор сам по собі, але це сигнал — у компанії немає публічної політики оплати. Ти змагатимешся з собою.'
},
{
text: 'На які саме країни ЄС виходите і коли запуск?',
deep: false,
answer: 'Польща, Чехія. Запуск планували на другий квартал, ймовірно перенесемо на четвертий.',
truth: 'yellow',
why: 'Питання нормальне, відповідь чесна — план посунули. Це не страшно, але не каже нічого про команду, в якій ти будеш через місяць. «Амбітний продукт» — слова. Завтра планів може бути на 2 квартали менше.'
},
{
text: 'Скільки людей пішло з команди за останні 6 місяців і чому?',
deep: true,
answer: 'Кілька — у нас була реструктуризація. Зараз стабільно, нова структура працює.',
truth: 'red',
why: '«Реструктуризація» — корпоративна назва для масових звільнень. Якщо вона трапилася 6 місяців тому, ти приходиш у компанію, де вижила половина старої команди — і вони саме зараз вирішують, чи лишатися. Це не «стабільно».'
}
]
},
{
id: 4,
company: 'AdTech · Pixell',
industry: 'Performance-marketing',
district: 'Оболонь',
teamSize: '50 людей',
recruiterName: 'Денис',
recruiterInitial: 'Д',
phrase: 'У нас гнучкий графік, заходиш коли зручно, головне — результат.',
questions: [
{
text: 'Скільки відпустки на рік?',
deep: false,
answer: '20 робочих днів. Беремо за тиждень-два до планованої дати — і йдемо.',
truth: 'green',
why: 'Питання стандартне, відповідь нормальна. Але «20 днів» нічого не каже про «гнучкий графік», який recruiter обіцяв. Можливо, твоє питання й не варто було витрачати тут.'
},
{
text: 'А коли щоденна планерка? І чи бувають наради о 9:00?',
deep: true,
answer: 'Щоденна планерка о 10:30, на 15 хвилин. Раз на тиждень — годинне планування, теж о 10:30. Решту часу плануєш сам.',
truth: 'green',
why: 'Це той рідкісний випадок, коли рекрутер каже правду. Один спільний слот на день — і реальна гнучкість решту часу. Зелений прапор. У наступних раундах буде складніше.'
},
{
text: 'Чи доплачуєте за переробки?',
deep: false,
answer: 'Переробок у нас не буває :)',
truth: 'yellow',
why: 'Усмішка-смайлик і фраза «не буває» — це класичний відхід від питання. Переробки бувають усюди. «Не буває» означає або «ніхто не оформлює», або «це не вважається переробкою, бо ти ж сам погодився закрити завдання». Жовтий прапор.'
}
]
},
{
id: 5,
company: 'AI-стартап · NeuroKraft',
industry: 'ML / GenAI',
district: 'біля ВДНГ',
teamSize: '12 людей',
recruiterName: 'Марія',
recruiterInitial: 'М',
phrase: 'Ми не корпорація. У нас по-сімейному, всі один за одного, без зайвої бюрократії.',
questions: [
{
text: 'Чи є періодична оцінка роботи?',
deep: false,
answer: 'Формальної немає. Ми всі один одному даємо зворотний звʼязок постійно.',
truth: 'yellow',
why: '«Один одному постійно» — це означає «ніколи структурно». Без формальної оцінки ти не знатимеш, чого від тебе очікують, поки тобі не оголосять, що очікування не виправдалися. Жовтий прапор.'
},
{
text: 'Коли наступний раунд інвестицій — і на скільки місяців вистачить грошей?',
deep: false,
answer: 'Шукаємо Seed-раунд зараз. Грошей вистачить на 18 місяців у режимі економії.',
truth: 'yellow',
why: 'Чесна відповідь, але «у режимі економії» означає, що зарплати, ймовірно, нижчі за ринок, і команда буде малою ще довго. Це жовтий — не катастрофа, але ти заходиш у фазу режиму економії.'
},
{
text: 'Як у вас оформлюються переробки? Чи був випадок, коли хтось не схотів брати реліз у вихідний?',
deep: true,
answer: 'У нас немає такого поняття як «переробки». Ми всі залюблені в продукт — нікому не треба казати «давай у вихідний».',
truth: 'red',
why: '«Сімʼя» + «всі залюблені» + «нікому не треба казати» = відсутність кордонів. У такій культурі сказати «ні» означає бути «не нашим». Це найгірший червоний прапор гри — бо він найпривабливіший ззовні.'
}
]
},
{
id: 6,
company: 'GovTech · CivicStack',
industry: 'Сервіси для держави',
district: 'Поділ',
teamSize: '120 людей',
recruiterName: 'Ігор',
recruiterInitial: 'І',
phrase: 'Стабільна компанія, працюємо з держсектором, виросли на 25% за рік. Тут не страшно.',
questions: [
{
text: 'Як часто виплачують зарплату — і чи бувають затримки?',
deep: false,
answer: 'Раз на місяць, 5-го числа. За останній рік не затримували.',
truth: 'green',
why: 'Це поверхневе питання. Відповідь нормальна, але вона не перевіряє слово «стабільна». А саме там — головний нюанс цього раунду.'
},
{
text: 'Який договір про нерозголошення — і чи є обмеження на сторонні проєкти після звільнення?',
deep: false,
answer: 'Повне нерозголошення плюс заборона працювати на конкурентів — 12 місяців у тому ж секторі. Сторонні проєкти лише з письмового погодження.',
truth: 'yellow',
why: 'Це не червоний прапор, але це означає: якщо тобі не сподобається, піти буде дорого. 12 місяців без права працювати на конкурентів — це рік без роботи у галузі. Зважуй, чи готовий ти.'
},
{
text: 'Хто головний клієнт і чи є договір на 2026?',
deep: true,
answer: 'Кілька держструктур. Договори тендерні — переукладаються щороку у грудні-січні. Так, минулого року виграли всі.',
truth: 'yellow',
why: '«Стабільна» компанія, де всі ключові договори переукладаються щороку через тендер — це умовна стабільність. Виграли «всі минулого» — не гарантує цього року. У grudniu можеш дізнатися, що проєкт закривається. Жовтий прапор: не страшно, але йди з відкритими очима.'
}
]
}
];
const ARCHETYPES = [
{
key:'zp', minScore:0, maxScore:3,
emoji:String.fromCodePoint(0x1F4BC), title:'Дивиться лише на ЗП',
desc:'Питав про зарплату, забував про культуру. injobe тобі допоможе — там одразу видно, де платять і де живуть.'
},
{
key:'trust', minScore:4, maxScore:6,
emoji:String.fromCodePoint(0x1F33F), title:'Довірливий',
desc:'Віриш рекрутерам на слово. Перечитай лонгрід ще раз — і збережи шпаргалку. Перед справжньою співбесідою вона врятує.'
},
{
key:'skeptic', minScore:7, maxScore:9,
emoji:String.fromCodePoint(0x1F9ED), title:'Зі скепсисом',
desc:'Ти вже не купуєш красиві слова. Іноді хочеться повірити — і саме там тебе ловлять. injobe прибере половину сумнівів за тебе.'
},
{
key:'inspector', minScore:10, maxScore:12,
emoji:String.fromCodePoint(0x1F575)+'️', title:'Інспектор',
desc:'Бачиш рекрутера наскрізь. На injobe знайдеш «своє» за день — і не витратиш місяць на компанії, де «дружна команда» означає «черговий до півночі».'
}
];
// ─── STATE ───
const state = {
roundIdx: 0,
score: 0,
selectedQ: -1, // chosen question index in current round
flagged: null, // 'green'|'yellow'|'red'|null
phase: 'pick', // 'pick' | 'flag' | 'reveal'
history: [] // per-round: {qIdx, deep, flag, truth, points}
};
// ─── DOM ───
const $intro = document.getElementById('igIntro');
const $game = document.getElementById('igGame');
const $result = document.getElementById('igResult');
const $card = document.getElementById('igRoundCard');
const $roundNo = document.getElementById('igRoundNo');
const $scoreVal = document.getElementById('igScoreVal');
const $pdots = document.getElementById('igPdots');
const $archEmoji = document.getElementById('igArchEmoji');
const $archTitle = document.getElementById('igArchTitle');
const $archScore = document.getElementById('igArchScore');
const $archDesc = document.getElementById('igArchDesc');
const $archBar = document.getElementById('igArchBar');
const $recapList = document.getElementById('igRecapList');
// ─── HELPERS ───
function showScreen(id){
document.querySelectorAll('.ig-screen').forEach(s => s.classList.remove('is-active'));
document.getElementById(id).classList.add('is-active');
window.scrollTo({top:0, behavior:'smooth'});
}
function renderDots(){
let html = '';
for(let i=0; i<ROUNDS.length; i++){
let cls = 'ig-pdot';
if(i < state.roundIdx) cls += ' is-done';
else if(i === state.roundIdx) cls += ' is-on';
html += '<span class="'+cls+'"></span>';
}
$pdots.innerHTML = html;
}
function renderRound(){
const r = ROUNDS[state.roundIdx];
$roundNo.textContent = (state.roundIdx + 1).toString();
$scoreVal.textContent = state.score.toString();
renderDots();
// Build round card
let html = '';
// company card
html += '<div class="ig-co-card">';
html += '<div class="ig-co-av">'+escapeHtml(r.recruiterInitial)+'</div>';
html += '<div class="ig-co-meta"><b>'+escapeHtml(r.company)+'</b>'+escapeHtml(r.teamSize)+' · '+escapeHtml(r.district)+' · рекрутер '+escapeHtml(r.recruiterName)+'</div>';
html += '</div>';
// recruiter quote
html += '<div class="ig-recruiter-says">'+escapeHtml(r.recruiterName)+' каже:</div>';
html += '<div class="ig-quote">'+escapeHtml(r.phrase)+'</div>';
// question pick
html += '<div class="ig-step-label">Обери питання, яке поставиш</div>';
html += '<div class="ig-qoptions">';
r.questions.forEach((q, i) => {
const sel = (state.selectedQ === i) ? ' is-sel' : '';
const disabled = (state.phase !== 'pick') ? ' disabled' : '';
html += '<button class="ig-qopt'+sel+'" data-qidx="'+i+'"'+disabled+'>';
html += '<span class="ig-qbullet"></span>';
html += '<span>'+escapeHtml(q.text)+'</span>';
html += '</button>';
});
html += '</div>';
// answer + flags (after question pick)
if(state.phase === 'flag' || state.phase === 'reveal'){
const q = r.questions[state.selectedQ];
html += '<div class="ig-answer-wrap">';
html += '<div class="ig-answer">';
html += '<span class="ig-ans-lbl">'+escapeHtml(r.recruiterName)+' відповідає</span>';
html += escapeHtml(q.answer);
html += '</div>';
if(state.phase === 'flag'){
html += '<div class="ig-step-label">Поклади прапор: ти віриш цій відповіді?</div>';
}
const flagDisabled = (state.phase !== 'flag') ? ' disabled' : '';
html += '<div class="ig-flag-row">';
html += renderFlag('green', String.fromCodePoint(0x1F7E2), 'Вірю', flagDisabled);
html += renderFlag('yellow', String.fromCodePoint(0x1F7E1), 'Сумніваюся', flagDisabled);
html += renderFlag('red', String.fromCodePoint(0x1F534), 'Бреше', flagDisabled);
html += '</div>';
html += '</div>';
}
// reveal
if(state.phase === 'reveal'){
const q = r.questions[state.selectedQ];
const last = state.history[state.history.length - 1];
const points = last.points;
const flagCorrect = (state.flagged === q.truth);
let verdictClass = '';
let verdictBadge = '';
let verdictText = '';
if(points === 2){
verdictClass = 'is-good';
verdictBadge = '✓';
verdictText = 'Чітко! Деталь схоплено.';
} else if(points === 1){
verdictClass = 'is-mixed';
verdictBadge = '◐';
if(q.deep && !flagCorrect){
verdictText = 'Питання сильне. Прапор — не зовсім.';
} else if(!q.deep && flagCorrect){
verdictText = 'Прапор вірний. Питання — поверхневе.';
} else {
verdictText = 'Частково.';
}
} else {
verdictClass = 'is-bad';
verdictBadge = '✕';
verdictText = 'Рекрутер тебе обвів.';
}
html += '<div class="ig-reveal">';
html += '<div class="ig-verdict '+verdictClass+'">';
html += '<span class="ig-v-badge">'+verdictBadge+'</span>';
html += '<span>'+verdictText+'</span>';
html += '<span class="ig-verdict-points">+'+points+' / 2</span>';
html += '</div>';
html += '<div class="ig-why">';
html += '<span class="ig-why-q">Питання: <b>'+escapeHtml(q.text)+'</b></span>';
html += '<h5>Чому так</h5>';
html += '<p>'+escapeHtml(q.why)+'</p>';
if(q.deep){
html += '<p style="color:var(--brand-deep);font-weight:500"><b>Це було найкраще питання раунду.</b> Воно перевіряло саме те, що recruiter намагався прикрити кліше.</p>';
} else {
const deepQ = r.questions.find(x => x.deep);
html += '<p style="color:var(--muted);font-size:13.5px"><b>Краще питання:</b> «'+escapeHtml(deepQ.text)+'»</p>';
}
html += '</div>';
html += '<div class="ig-next-row">';
const lastRound = (state.roundIdx === ROUNDS.length - 1);
html += '<button class="ig-btn ig-btn-brand" id="igNextBtn">';
html += '<span>'+(lastRound ? 'Подивитися результат' : 'Наступний раунд')+'</span>';
html += '<span class="ig-btn-arrow">→</span>';
html += '</button>';
html += '</div>';
html += '</div>';
}
$card.innerHTML = html;
attachRoundHandlers();
}
function renderFlag(color, em, label, disabled){
const sel = (state.flagged === color) ? ' is-sel' : '';
const isTruth = (state.phase === 'reveal' && ROUNDS[state.roundIdx].questions[state.selectedQ].truth === color);
const truthCls = isTruth ? ' is-truth' : '';
const cls = 'ig-flag ig-flag-'+color.charAt(0)+sel+truthCls;
return '<button class="'+cls+'" data-flag="'+color+'"'+disabled+'>'+
'<span class="ig-flag-em">'+em+'</span>'+
'<span>'+escapeHtml(label)+'</span>'+
'</button>';
}
function attachRoundHandlers(){
// question pick
$card.querySelectorAll('.ig-qopt').forEach(btn => {
btn.addEventListener('click', () => {
if(state.phase !== 'pick') return;
state.selectedQ = parseInt(btn.dataset.qidx, 10);
state.phase = 'flag';
renderRound();
});
});
// flag pick
$card.querySelectorAll('.ig-flag').forEach(btn => {
btn.addEventListener('click', () => {
if(state.phase !== 'flag') return;
state.flagged = btn.dataset.flag;
scoreRound();
state.phase = 'reveal';
renderRound();
});
});
// next
const $next = document.getElementById('igNextBtn');
if($next){
$next.addEventListener('click', nextRound);
}
}
function scoreRound(){
const r = ROUNDS[state.roundIdx];
const q = r.questions[state.selectedQ];
let points = 0;
if(q.deep) points += 1;
if(state.flagged === q.truth) points += 1;
state.score += points;
state.history.push({
roundIdx: state.roundIdx,
company: r.company,
qIdx: state.selectedQ,
qText: q.text,
deep: q.deep,
flag: state.flagged,
truth: q.truth,
points: points
});
}
function nextRound(){
if(state.roundIdx === ROUNDS.length - 1){
showResult();
return;
}
state.roundIdx += 1;
state.selectedQ = -1;
state.flagged = null;
state.phase = 'pick';
renderRound();
}
function showResult(){
const score = state.score;
const arch = ARCHETYPES.find(a => score >= a.minScore && score <= a.maxScore);
$archEmoji.textContent = arch.emoji;
$archTitle.textContent = arch.title;
$archScore.textContent = score.toString();
$archDesc.textContent = arch.desc;
// highlight archetype cell
$archBar.querySelectorAll('.ig-arch-cell').forEach(c => c.classList.remove('is-you'));
const $cell = $archBar.querySelector('[data-arch="'+arch.key+'"]');
if($cell) $cell.classList.add('is-you');
// recap
let recapHtml = '';
state.history.forEach((h, i) => {
const zero = (h.points === 0) ? ' is-zero' : '';
recapHtml += '<div class="ig-recap-row">';
recapHtml += '<span class="ig-recap-n">0'+(i+1)+'</span>';
recapHtml += '<div class="ig-recap-co"><b>'+escapeHtml(h.company)+'</b>'+escapeHtml(truncate(h.qText, 60))+'</div>';
recapHtml += '<span class="ig-recap-pts'+zero+'">+'+h.points+' / 2</span>';
recapHtml += '</div>';
});
$recapList.innerHTML = recapHtml;
setupInjobePanel(arch);
showScreen('igResult');
}
// ─── INJOBE PANEL ───
const INJOBE_PRESETS = {
inspector: ['salary','overtime','team','remote','contract','growth'],
skeptic: ['salary','overtime','team','growth'],
trust: ['salary','overtime','team'],
zp: ['salary']
};
const INJOBE_INTROS = {
inspector: 'Ти бачив усе. <b>injobe</b> — наступний крок: вакансії, де компанії вже відповіли на ці питання за тебе. Не витрачай час на ті, які ще не готові.',
skeptic: 'Ти вже знаєш, на що дивитися. <b>injobe</b> просто прибере половину сумнівів — у профілі компанії одразу видно те, що рекрутер називає в останню чергу.',
trust: 'Шпаргалку ти вже маєш. Перед справжньою співбесідою — заходь на <b>injobe</b>: тут компанії пишуть про себе так, як рекрутер мав би сказати тобі вголос.',
zp: 'Зарплата — важлива. Але «гарна зарплата» у компанії, де релізи в неділю, не варта того. На <b>injobe</b> вилка і умови — на видноті з першої секунди.'
};
function setupInjobePanel(arch){
const $intro = document.getElementById('igInjIntro');
if($intro) $intro.innerHTML = INJOBE_INTROS[arch.key] || INJOBE_INTROS.skeptic;
const preset = INJOBE_PRESETS[arch.key] || INJOBE_PRESETS.skeptic;
document.querySelectorAll('#igChips .ig-chip').forEach(chip => {
const on = preset.indexOf(chip.dataset.key) !== -1;
chip.classList.toggle('is-on', on);
chip.setAttribute('aria-pressed', on ? 'true' : 'false');
});
updateInjobeCTA();
}
function updateInjobeCTA(){
const checked = [];
document.querySelectorAll('#igChips .ig-chip').forEach(chip => {
if(chip.classList.contains('is-on')) checked.push(chip.dataset.key);
});
const $label = document.getElementById('igInjobeCTALabel');
const $cta = document.getElementById('igInjobeCTA');
const $count = document.getElementById('igInjobeCount');
if(checked.length === 0){
$label.textContent = 'Подивитися всі вакансії на injobe';
$cta.href = 'https://injobe.com';
$count.innerHTML = '';
return;
}
// approximate count: more filters → narrower pool
const base = 320;
const approx = Math.max(8, Math.round(base / Math.pow(1.35, checked.length)));
$label.textContent = 'Підібрати вакансії на injobe';
$count.innerHTML = 'Знайдено ≈ <b>'+approx+'</b> вакансій';
const params = new URLSearchParams();
params.set('filters', checked.join(','));
params.set('utm_source', 'my-kiev');
params.set('utm_medium', 'game');
params.set('utm_campaign', 'kontr-spivbesida');
$cta.href = 'https://injobe.com?' + params.toString();
}
document.querySelectorAll('#igChips .ig-chip').forEach(chip => {
chip.addEventListener('click', () => {
const on = !chip.classList.contains('is-on');
chip.classList.toggle('is-on', on);
chip.setAttribute('aria-pressed', on ? 'true' : 'false');
updateInjobeCTA();
});
});
function truncate(s, n){
if(s.length <= n) return s;
return s.substr(0, n - 1).trim() + '…';
}
function escapeHtml(s){
return String(s).replace(/[&<>"']/g, function(c){
return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];
});
}
// ─── START ───
document.getElementById('igStartBtn').addEventListener('click', () => {
state.roundIdx = 0;
state.score = 0;
state.selectedQ = -1;
state.flagged = null;
state.phase = 'pick';
state.history = [];
showScreen('igGame');
renderRound();
});
// ─── REPLAY ───
document.getElementById('igReplayBtn').addEventListener('click', () => {
state.roundIdx = 0;
state.score = 0;
state.selectedQ = -1;
state.flagged = null;
state.phase = 'pick';
state.history = [];
showScreen('igGame');
renderRound();
});
// ─── SHARE ───
document.getElementById('igShareBtn').addEventListener('click', async () => {
const score = state.score;
const arch = ARCHETYPES.find(a => score >= a.minScore && score <= a.maxScore);
const text = 'Я '+arch.emoji+' '+arch.title+' — '+score+' / 12 у грі «Контр-співбесіда». Партнерство Мій Київ × injobe.';
const url = location.href;
if(navigator.share){
try {
await navigator.share({ title:'Контр-співбесіда', text:text, url:url });
return;
} catch(e){ /* fall through */ }
}
try {
await navigator.clipboard.writeText(text + 'n' + url);
const $btn = document.getElementById('igShareBtn');
const orig = $btn.innerHTML;
$btn.innerHTML = '<span>Скопійовано ✓</span>';
setTimeout(() => { $btn.innerHTML = orig; }, 1800);
} catch(e){
window.prompt('Скопіюй текст:', text + 'n' + url);
}
});
// ─── PRINT ───
document.getElementById('igPrintBtn').addEventListener('click', () => {
window.print();
});
})();