[hideprofile]
[html]
<div class="guide-wrapper rules-mybb-fix">
<div class="main-box">
<div class="inner-box">
<div class="header-box">
ВНИМАНИЕ!
</div>
<div class="guide-block">В целях упрощения процедуры заполнения хронологии, мы разработали генератор хронологии. Напоминаем, что хронология на нашем проекте не является обязательной и введена исключительно для вашего удобства. Хронологию можно разместить следующим сообщением после анкеты в теме с анкетой вашего персонажа.</div>
</div>
</div>
</div>
<style>
@font-face {
font-family: 'Cinzel';
src: url('https://raw.githubusercontent.com/tukiteruamano-a11y/anketa/main/cinzel_regular.ttf') format('truetype');
}
@font-face { font-family: 'Comfortaa'; src: url('https://raw.githubusercontent.com/flamevector-rusff/styles/main/comfortaa.ttf');}
/* FIX MYBB */
.rules-mybb-fix, .rules-mybb-fix * { overflow: visible; box-sizing: border-box; }
/* Основной блок */
.main-box {
width: 850px;
margin: 2px auto !important;
background: url("https://upforme.ru/uploads/001c/a4/b9/3/943373.jpg") repeat;
border-radius: 20px;
padding: 5px;
font-family: 'Cinzel', serif;
}
.main-box a {
font-family: inherit !important;
}
/* Второй уровень */
.inner-box {
background: #c7c7c7;
border-radius: 15px;
padding: 5px;
}
/* Верхний прямоугольник */
.header-box {
background: url("https://upforme.ru/uploads/001c/a4/b9/3/943373.jpg") repeat;
border-radius: 12px;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
font-size: 32px;
color: #c7c7c7;
}
/* GUIDE BLOCKS */
.guide-block {
position: relative;
padding: 10px;
margin: 10px 5px 5px 5px;
border-radius: 16px;
border: 1px solid #a9a9a9;
font-size: 18px;
text-indent: 25px;
text-align: justify;
font-family: 'Comfortaa';
}
a {
color: #744D37 !important;
}
a:hover {
color: #AF6F51 !important;
}
</style>
<div class="weekly-wrapper">
<div class="weekly-bg">
<div class="weekly-inner">
<div class="archive-title" style="text-align:center; font-size:25px;">ГЕНЕРАТОР ХРОНОЛОГИИ</div>
<div class="mode-switch">
<label><input type="radio" name="mode" value="chronology" checked> ХРОНОЛОГИЯ</label>
<label><input type="radio" name="mode" value="episode"> ЭПИЗОД</label>
</div>
<div class="archive-title">ЭПИЗОДЫ</div>
<div id="episodes"></div>
<div class="archive-title" style="margin-top:20px;">АЛЬТЕРНАТИВНАЯ РЕАЛЬНОСТЬ</div>
<div id="altEpisodes"></div>
<div style="margin-top:10px;">
<button onclick="addEpisode()">+ ЭПИЗОД</button>
<button onclick="addAlt()">+ АЛЬТЕРНАТИВА</button>
</div>
<div style="margin-top:10px;">
<button onclick="generateCode()">СГЕНЕРИРОВАТЬ</button>
<button onclick="copyCode()">СКОПИРОВАТЬ</button>
</div>
<div id="copyMsg" style="display:none; text-align:center; margin-top:10px;">
КОД УСПЕШНО СКОПИРОВАН
</div>
<textarea id="output"></textarea>
<details style='font-size:14px; border: 1px black solid; border-radius:10px; margin-top: 10px;'>
<summary style='text-align: center; margin: 10px;'><strong>ИНСТРУКЦИЯ</strong></summary>
<div class="generator-instructions">
<div class="instruction-block">
<div class="instruction-title">Использование генератора</div>
<div class="instruction-text">
Генератор предназначен для создания оформленных записей эпизодов.
Заполните поля и получите готовый результат для публикации.
</div>
</div>
<div class="instruction-block">
<div class="instruction-title">Добавление записей</div>
<div class="instruction-text">
Создавайте новые записи с помощью кнопок добавления.
Введите название эпизода, ссылку на него и укажите дату.
</div>
</div>
<div class="instruction-block">
<div class="instruction-title">Хронология и Эпизод</div>
<div class="instruction-text">
Активируйте радиокнопку "Хроонлогия", если вам нужна сама хронология, или "Эпизод", если вам нужно дополнить уже имеющуюся хронологию.
</div>
</div>
<div class="instruction-block">
<div class="instruction-title">Отметка статуса</div>
<div class="instruction-text">
Отметьте запись как завершённую (если это необходимо) с помощью специальной кнопки (первый крестик справа от поля ввода).
Такие записи отображаются иначе и помечаются как закрытые.
</div>
</div>
<div class="instruction-block">
<div class="instruction-title">Удаление</div>
<div class="instruction-text">
Если запись была добавлена ошибочно, её можно удалить (бордовый крестик справа от поля ввода).
</div>
</div>
<div class="instruction-block">
<div class="instruction-title">Создание результата</div>
<div class="instruction-text">
После заполнения нажмите кнопку генерации.
Результат появится ниже и будет готов для использования.
</div>
</div>
<div class="instruction-block">
<div class="instruction-title">Копирование</div>
<div class="instruction-text">
Нажмите кнопку копирования, чтобы перенести результат в буфер обмена.
После успешного копирования появится подтверждение.
</div>
</div>
</div>
</details>
</div>
</div>
</div>
<style>
@font-face {
font-family:'Cinzel';
src:url('https://raw.githubusercontent.com/tukiteruamano-a11y/anketa/main/cinzel_regular.ttf');
}
@font-face { font-family: 'Comfortaa'; src: url('https://raw.githubusercontent.com/flamevector-rusff/styles/main/comfortaa.ttf');}
.weekly-wrapper { width:850px; margin:2px auto !important; padding:5px; font-family:'Cinzel', serif; font-weight:bold;}
.weekly-bg { padding:5px; background:url(https://upforme.ru/uploads/001c/a4/b9/3/943373.jpg) repeat; border-radius:20px;}
.weekly-inner { background:#c7c7c7; padding:15px; border-radius:15px;}
.archive-title { font-size:16px; margin-bottom:10px; border-bottom:1px solid #777;}
.mode-switch { display:flex; gap:20px; margin-bottom:10px;}
.mode-switch label { display:flex; align-items:center; gap:5px;}
.episode-row {
display: grid;
grid-template-columns: 100px 1fr 1.5fr 30px 30px;
gap: 8px;
margin-bottom: 10px;
align-items: center;
}
.episode-row.alt {
grid-template-columns: 1fr 1.5fr 30px 30px;
}
input {
width: 100%;
box-sizing: border-box;
padding: 6px;
border: none;
font-family: inherit;
}
.episode-row.alt { grid-template-columns: 1fr 1fr 40px 30px; }
input { padding:4px; border:none; width:100%; border-radius:5px; background: #e0dede !important; }
.close-btn { cursor:pointer; opacity:0.3; text-align:center; }
.remove-btn { cursor:pointer; color:#6b3b3b; text-align:center; }
textarea {
width: 100%;
height: 150px;
resize: none;
margin-top: 10px;
font-family: monospace;
box-sizing: border-box;
display: block;
background: #e0dede !important;
}
.weekly-inner textarea {
width: 100%;
box-sizing: border-box;
border-radius:15px;
margin-top:10px;
}
input {
font-family: 'Cinzel', serif !important;
font-size: 14px !important;
}
button {
padding:5px 10px;
background:url(https://upforme.ru/uploads/001c/a4/b9/3/943373.jpg) repeat;
color:white;
border:none;
cursor:pointer;
border-radius:5px;
font-family:'Cinzel', serif;
}
.generator-instructions {
width: 100%;
margin-top: 20px;
font-family: 'Cinzel', serif;
}
.instruction-block {
background: rgba(199, 199, 199, 0.85);
border: 1px solid #a9a9a9;
border-radius: 10px;
padding: 12px 14px;
margin: 12px;
font-family: 'Comfortaa';
}
.instruction-title {
font-size: 20px;
letter-spacing: 2px;
border-bottom: 1px solid #a9a9a9;
margin-bottom: 6px;
padding-bottom: 4px;
}
.instruction-text {
font-size: 18px;
line-height: 1.4;
font-weight:normal !important;
}
</style>
<script>
const episodesEl = document.getElementById('episodes');
const altEl = document.getElementById('altEpisodes');
const output = document.getElementById('output');
const msg = document.getElementById('copyMsg');
function createRow(isAlt=false){
const div=document.createElement('div');
div.className='episode-row'+(isAlt?' alt':'');
div.innerHTML = isAlt
? `<input placeholder="Название">
<input placeholder="Ссылка">
<div class="close-btn">✖</div>
<div class="remove-btn">✕</div>`
: `<input placeholder="Дата">
<input placeholder="Название">
<input placeholder="Ссылка">
<div class="close-btn">✖</div>
<div class="remove-btn">✕</div>`;
let closed=false;
const closeBtn=div.querySelector('.close-btn');
closeBtn.onclick=()=>{
closed=!closed;
div.dataset.closed=closed;
closeBtn.style.opacity=closed?1:0.3;
};
div.querySelector('.remove-btn').onclick=()=>div.remove();
return div;
}
function addEpisode(){ episodesEl.appendChild(createRow()); }
function addAlt(){ altEl.appendChild(createRow(true)); }
function getStyle(){
return `[html]<style>
@font-face {
font-family:'Cinzel';
src:url('https://raw.githubusercontent.com/tukiteruamano-a11y/anketa/main/cinzel_regular.ttf');
}
.weekly-wrapper { width:600px; margin:auto; padding:5px; font-family:'Cinzel', serif; font-weight:bold;}
.weekly-bg { padding:5px; background:url(https://i.ibb.co/0xP0jH4/6bbf97e48d3c1d … 564e74.jpg) repeat; border-radius:10px;}
.weekly-inner { background:#c7c7c7; padding:15px; border-radius:10px;}
.archive-title { font-size:16px; letter-spacing:3px; margin-bottom:10px; border-bottom:1px solid #777;}
.episode-row { display:grid; grid-template-columns:90px 1fr 70px; padding:6px 4px; font-size:13px;}
.episode-row.alt { grid-template-columns:1fr 70px;}
.episode-name a { text-decoration:none; color:#2f5f2f !important; font-weight:bold !important;}
.episode-name.closed a { color:#6b3b3b !important;}
.episode-status.active { color:#2f5f2f;}
.episode-status.closed { color:#6b3b3b;}
</style>\n`;
}
function generateCode(){
const mode = document.querySelector('input[name="mode"]:checked').value;
let html = '';
if(mode === 'episode'){
[...episodesEl.children].forEach(r=>{
const i=r.querySelectorAll('input');
const closed=r.dataset.closed==='true';
html += `<div class="episode-row">
`;
if(i[0].value){
html += `<div class="episode-date">${i[0].value}</div>
`;
}
html += `<div class="episode-name ${closed?'closed':''}">
<a href="${i[2].value}">${i[1].value}</a>
</div>
<div class="episode-status ${closed?'closed':'active'}">${closed?'ЗАКРЫТ':'ОТКРЫТ'}</div>
</div>
/*ДЛЯ ЗАКРЫТИЯ ЭПА ПОМЕНЯТЬ "active" на "closed"*/
`;
});
// альтернатива (тоже только строки)
[...altEl.children].forEach(r=>{
const i=r.querySelectorAll('input');
const closed=r.dataset.closed==='true';
html += `<div class="episode-row alt">
<div class="episode-name ${closed?'closed':''}">
<a href="${i[1].value}">${i[0].value}</a>
</div>
<div class="episode-status ${closed?'closed':'active'}">${closed?'ЗАКРЫТ':'ОТКРЫТ'}</div>
</div>
/*ДЛЯ ЗАКРЫТИЯ ЭПА ПОМЕНЯТЬ "active" на "closed"*/
`;
});
}
if(mode === 'chronology'){
html += getStyle(); // стили тут
html += `<div class="weekly-wrapper">
<div class="weekly-bg">
<div class="weekly-inner">
<div class="archive-block">
<div class="archive-title">ЭПИЗОДЫ</div>
`;
[...episodesEl.children].forEach(r=>{
const i=r.querySelectorAll('input');
const closed=r.dataset.closed==='true';
html += `<div class="episode-row">
`;
if(i[0].value){
html += `<div class="episode-date">${i[0].value}</div>
`;
}
html += `<div class="episode-name ${closed?'closed':''}">
<a href="${i[2].value}">${i[1].value}</a>
</div>
<div class="episode-status ${closed?'closed':'active'}">${closed?'ЗАКРЫТ':'ОТКРЫТ'}</div>
</div>
<!--ДЛЯ ЗАКРЫТИЯ ЭПА ПОМЕНЯТЬ "active" на "closed"-->
`;
});
html += `
</div>
<div class="archive-block" style="margin-top:20px;">
<div class="archive-title">АЛЬТЕРНАТИВНАЯ РЕАЛЬНОСТЬ</div>
`;
[...altEl.children].forEach(r=>{
const i=r.querySelectorAll('input');
const closed=r.dataset.closed==='true';
html += `<div class="episode-row alt">
<div class="episode-name ${closed?'closed':''}">
<a href="${i[1].value}">${i[0].value}</a>
</div>
<div class="episode-status ${closed?'closed':'active'}">${closed?'ЗАКРЫТ':'ОТКРЫТ'}</div>
</div>
`;
});
html += `
</div>
</div>
</div>
</div>[` + `/html]`;
}
output.value = html;
}
function copyCode() {
const text = output.value;
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(text)
.then(() => showCopyMsg())
.catch(() => fallbackCopy());
} else {
// fallback для старых браузеров
fallbackCopy();
}
function fallbackCopy() {
// временно выделяем textarea, чтобы сработало copy
output.select();
output.setSelectionRange(0, 99999); // для мобильных
document.execCommand('copy');
showCopyMsg();
}
function showCopyMsg() {
msg.style.display = 'block';
setTimeout(() => msg.style.display = 'none', 2000);
}
}
function showMsg(){
msg.style.display='block';
setTimeout(()=>msg.style.display='none',2000);
}
addEpisode();
</script>[/html]




























