вашеимя
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque efficitur sit amet diam eu pharetra. Aliquam sit amet odio at urna tempus vehicula in sed quam. Cras ultricies dolor sit amet ex aliquam mollis. Donec iaculis est eget vestibulum aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque efficitur sit amet diam eu pharetra. Aliquam sit amet odio at urna tempus vehicula in sed quam. Cras ultricies dolor sit amet ex aliquam mollis. Donec iaculis est eget vestibulum aliquet.
love
улица бесконечное лето долгая бесконечная жизнь какие-то еще слова
flood
вася иванов 2 3
write
1 2 3

yanichegoneznayu

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » yanichegoneznayu » виды гостевых » гостевые


гостевые

Сообщений 1 страница 10 из 10

Перевести1

.

0

2

[hideprofile]
[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
    <title>Гостевая книга | ON:AIR — K-pop шоу</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: system-ui, 'Segoe UI', 'Poppins', 'Noto Sans KR', sans-serif;
        }

        body {
            background: linear-gradient(145deg, #faf0f5 0%, #f7e9f0 100%);
            min-height: 50vh;
            padding: 2rem 1.5rem;
        }

        .container {
            max-width: 1000px;
            margin: 0 auto;
        }

        /* Хедер с атмосферой шоу */
        .hero {
            text-align: center;
            margin-bottom: 2.5rem;
        }

        .hero h1 {
            font-size: 3.2rem;
            background: linear-gradient(135deg, #FF3B6F, #8B5CF6, #2DD4BF);
            background-clip: text;
            -webkit-background-clip: text;
            color: transparent;
            letter-spacing: -0.5px;
            display: inline-block;
            text-shadow: 0 2px 5px rgba(0,0,0,0.05);
        }

        .hero p {
            color: #4a4a5a;
            font-size: 1.1rem;
            margin-top: 0.5rem;
            font-weight: 500;
        }

        .badge-live {
            background: #ff2e63;
            color: white;
            font-size: 0.7rem;
            padding: 0.2rem 0.8rem;
            border-radius: 40px;
            display: inline-block;
            margin-top: 0.8rem;
            font-weight: 600;
            letter-spacing: 1px;
        }

        /* ГЛАВНАЯ СЕТКА: 2 КОЛОНКИ (мальчики/девочки) */
        .two-columns {
            display: flex;
            flex-wrap: wrap;
            gap: 2rem;
            margin-bottom: 3rem;
        }

        .column {
            flex: 1;
            min-width: 280px;
            background: rgba(255, 255, 255, 0.7);
            backdrop-filter: blur(2px);
            border-radius: 2rem;
            box-shadow: 0 20px 35px -12px rgba(0,0,0,0.15);
            overflow: hidden;
            transition: transform 0.2s;
            border: 1px solid rgba(255,255,240,0.8);
        }

        .column:hover {
            transform: translateY(-5px);
        }

        .column-header {
            padding: 1.2rem 1.5rem;
            background: white;
            border-bottom: 3px solid;
            display: flex;
            align-items: center;
            gap: 0.6rem;
        }

        .boys .column-header {
            border-bottom-color: #3b82f6;
            background: #f0f9ff;
        }

        .girls .column-header {
            border-bottom-color: #ec489a;
            background: #fff0f7;
        }

        .column-header h2 {
            font-size: 1.8rem;
            font-weight: 700;
        }

        .boys h2 { color: #2563eb; }
        .girls h2 { color: #db2777; }

        .entry-list {
            padding: 1rem 1.2rem;
            max-height: 500px;
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            gap: 0.9rem;
            background: rgba(255,248,245,0.5);
        }

        /* Стиль карточки гостя: ateez - (ссылка) choi san */
        .guest-card {
            background: white;
            border-radius: 1.2rem;
            padding: 0.9rem 1.2rem;
            box-shadow: 0 4px 10px rgba(0,0,0,0.02);
            transition: all 0.2s;
            border: 1px solid #ffe7f0;
            word-break: break-word;
        }

        .guest-card:hover {
            border-color: #ffb7c5;
            background: #fffbfd;
        }

        .guest-line {
            font-size: 1rem;
            display: flex;
            flex-wrap: wrap;
            align-items: baseline;
            gap: 0.3rem 0.5rem;
        }

        .group-name {
            font-weight: 800;
            color: #1e293b;
            background: #f1f5f9;
            padding: 0.2rem 0.6rem;
            border-radius: 40px;
            font-size: 0.8rem;
        }

        .guest-link {
            color: #6366f1;
            text-decoration: none;
            font-weight: 500;
            border-bottom: 1px dashed #cbd5e1;
        }

        .guest-link:hover {
            color: #ec489a;
            border-bottom-color: #f472b6;
        }

        .guest-name {
            font-weight: 700;
            background: linear-gradient(145deg, #2d2f36, #1f1f2a);
            background-clip: text;
            -webkit-background-clip: text;
            color: transparent;
            font-size: 1rem;
        }

        .empty-message {
            text-align: center;
            color: #aaa8b8;
            font-style: italic;
            padding: 2rem;
            font-size: 0.9rem;
        }

        /* ФОРМА ДОБАВЛЕНИЯ (универсальный блок) */
        .form-section {
            background: white;
            border-radius: 2rem;
            padding: 1.8rem;
            margin-top: 1rem;
            box-shadow: 0 20px 35px -12px rgba(0,0,0,0.1);
            border: 1px solid #ffe2ef;
        }

        .form-title {
            font-size: 1.5rem;
            font-weight: 700;
            margin-bottom: 1.2rem;
            display: flex;
            align-items: center;
            gap: 0.6rem;
        }

        .form-title span {
            background: #fdeef4;
            padding: 0.2rem 0.8rem;
            border-radius: 50px;
            font-size: 0.8rem;
        }

        .form-grid {
            display: flex;
            flex-wrap: wrap;
            gap: 1rem;
            margin-bottom: 1.5rem;
        }

        .input-group {
            flex: 1;
            min-width: 170px;
        }

        .input-group label {
            display: block;
            font-size: 0.75rem;
            font-weight: 600;
            text-transform: uppercase;
            letter-spacing: 0.5px;
            color: #6b6b7e;
            margin-bottom: 0.3rem;
        }

        .input-group input, .input-group select {
            width: 100%;
            padding: 0.8rem 1rem;
            border-radius: 1.2rem;
            border: 1.5px solid #edd3df;
            background: #fefafc;
            font-size: 0.9rem;
            transition: 0.2s;
        }

        .input-group input:focus, .input-group select:focus {
            outline: none;
            border-color: #f472b6;
            box-shadow: 0 0 0 3px rgba(236,72,153,0.1);
        }

        .gender-selector {
            display: flex;
            gap: 1rem;
            align-items: center;
            background: #faf3f7;
            padding: 0.4rem 1rem;
            border-radius: 3rem;
        }

        .gender-selector label {
            display: flex;
            align-items: center;
            gap: 0.4rem;
            font-weight: 500;
            color: #4a4a5e;
        }

        .add-button {
            background: linear-gradient(95deg, #FF3B6F, #C850C0);
            border: none;
            padding: 0.8rem 2rem;
            border-radius: 3rem;
            color: white;
            font-weight: bold;
            font-size: 1rem;
            cursor: pointer;
            transition: 0.2s;
            box-shadow: 0 5px 12px rgba(255,59,111,0.3);
        }

        .add-button:hover {
            transform: scale(1.02);
            background: linear-gradient(95deg, #f82b61, #b53cad);
            box-shadow: 0 8px 18px rgba(255,59,111,0.4);
        }

        .sample-note {
            font-size: 0.75rem;
            color: #857e8c;
            margin-top: 0.8rem;
            text-align: center;
            background: #fcf4f8;
            padding: 0.5rem;
            border-radius: 2rem;
        }

        hr {
            margin: 1rem 0;
            border-color: #ffdae9;
        }

        footer {
            text-align: center;
            margin-top: 2rem;
            font-size: 0.75rem;
            color: #a48f9b;
        }

        @media (max-width: 780px) {
            body {
                padding: 1rem;
            }
            .hero h1 {
                font-size: 2.3rem;
            }
            .column-header h2 {
                font-size: 1.4rem;
            }
        }

        /* Скролл для списков красивый */
        .entry-list::-webkit-scrollbar {
            width: 5px;
        }
        .entry-list::-webkit-scrollbar-track {
            background: #ffecf0;
            border-radius: 10px;
        }
        .entry-list::-webkit-scrollbar-thumb {
            background: #f4a0bd;
            border-radius: 10px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="hero">
        <h1>🎤 ON:AIR <span style="font-size: 2rem;">🎶</span></h1>
        <p>музыкальное шоу | корейская волна · гостиная фанатов</p>
        <div class="badge-live">✨ LIVE EDITION ✨</div>
    </div>

    <!-- Два блока: мальчики и девочки -->
    <div class="two-columns">
        <!-- Блок МАЛЬЧИКИ (BOYS) -->
        <div class="column boys">
            <div class="column-header">
                <span>🧑‍🎤</span>
                <h2>МАЛЬЧИКИ</h2>
                <span style="font-size: 0.75rem; background:#eef2ff; padding:0.2rem 0.7rem; border-radius: 30px;">보이그룹</span>
            </div>
            <div id="boysList" class="entry-list">
                <!-- Динамические карточки будут тут -->
                <div class="empty-message">✨ пока нет отзывов, добавь своего любимого айдола ✨</div>
            </div>
        </div>

        <!-- Блок ДЕВОЧКИ (GIRLS) -->
        <div class="column girls">
            <div class="column-header">
                <span>👩‍🎤</span>
                <h2>ДЕВОЧКИ</h2>
                <span style="font-size: 0.75rem; background:#ffe4f0; padding:0.2rem 0.7rem; border-radius: 30px;">걸그룹</span>
            </div>
            <div id="girlsList" class="entry-list">
                <div class="empty-message">🌸 добавь первую запись для девочек 🌸</div>
            </div>
        </div>
    </div>

    <!-- Форма добавления гостя (имя, группа, ссылка, выбор пола) -->
    <div class="form-section">
        <div class="form-title">
            📝 Добавить в гостевую книгу
            <span>ON:AIR</span>
        </div>
        <div class="form-grid">
            <div class="input-group">
                <label>🌟 Имя артиста / участника</label>
                <input type="text" id="artistName" placeholder="например: Choi San, Hanni, Karina ..." autocomplete="off">
            </div>
            <div class="input-group">
                <label>🎤 Группа / сольный проект</label>
                <input type="text" id="groupName" placeholder="например: ATEEZ, NewJeans, IVE ..." autocomplete="off">
            </div>
            <div class="input-group">
                <label>🔗 Ссылка (YouTube, Twitter, фан-арт...)</label>
                <input type="url" id="linkUrl" placeholder="https://..." autocomplete="off">
            </div>
            <div class="input-group">
                <label>⚧️ Категория</label>
                <div class="gender-selector">
                    <label>
                        <input type="radio" name="gender" value="boy" checked> 🧑 мальчики
                    </label>
                    <label>
                        <input type="radio" name="gender" value="girl"> 👩 девочки
                    </label>
                </div>
            </div>
        </div>
        <div style="display: flex; justify-content: center; margin-top: 0.5rem;">
            <button class="add-button" id="addEntryBtn">➕ Добавить запись →</button>
        </div>
        <div class="sample-note">
            💡 Пример готового стиля: <strong>ATEEZ</strong> - <a href="#" style="text-decoration:none;">(ссылка)</a> <strong>Choi San</strong><br>
            Заполни поля и запись появится в выбранном блоке.
        </div>
    </div>
    <footer>
        🌟 Гостевая книга шоу ON:AIR — K-pop фан-сообщество. Каждая запись в стиле «группа - (ссылка) имя артиста» 🌟
    </footer>
</div>

<script>
    // ----- Хранилище данных -----
    // Структура: { id, name, group, link, gender }  gender: 'boy' / 'girl'
    let entries = [];

    // Загрузка из localStorage, если есть
    function loadFromStorage() {
        const saved = localStorage.getItem('onair_guestbook');
        if (saved) {
            try {
                entries = JSON.parse(saved);
            } catch(e) { console.warn(e); entries = []; }
        }
        if (!entries || entries.length === 0) {
            // Небольшие демо-записи для красоты, чтобы блоки не были пустыми (но можно и без них, но пусть будет мило)
            entries = [
                { id: Date.now() + 1, name: "Choi San", group: "ATEEZ", link: "https://youtu.be/dQw4w9WgXcQ?feature=shared", gender: "boy" },
                { id: Date.now() + 2, name: "Hongjoong", group: "ATEEZ", link: "https://youtube.com", gender: "boy" },
                { id: Date.now() + 3, name: "Hanni", group: "NewJeans", link: "https://youtu.be/example", gender: "girl" },
                { id: Date.now() + 4, name: "Karina", group: "aespa", link: "https://youtu.be/example2", gender: "girl" },
                { id: Date.now() + 5, name: "Yeonjun", group: "TXT", link: "https://youtu.be/example3", gender: "boy" },
                { id: Date.now() + 6, name: "Winter", group: "aespa", link: "https://youtu.be/example4", gender: "girl" }
            ];
            saveToStorage();
        }
    }

    function saveToStorage() {
        localStorage.setItem('onair_guestbook', JSON.stringify(entries));
    }

    // Функция рендеринга двух блоков (мальчики / девочки)
    function renderEntries() {
        const boysContainer = document.getElementById('boysList');
        const girlsContainer = document.getElementById('girlsList');

        // Фильтруем записи
        const boys = entries.filter(entry => entry.gender === 'boy');
        const girls = entries.filter(entry => entry.gender === 'girl');

        // Рендер мальчиков
        if (boys.length === 0) {
            boysContainer.innerHTML = '<div class="empty-message">🎤 пока нет записей для мальчиков, добавь своего любимчика!</div>';
        } else {
            boysContainer.innerHTML = boys.map(entry => createGuestCardHTML(entry)).join('');
        }

        // Рендер девочек
        if (girls.length === 0) {
            girlsContainer.innerHTML = '<div class="empty-message">💖 пока нет записей для девочек, поделись любовью!</div>';
        } else {
            girlsContainer.innerHTML = girls.map(entry => createGuestCardHTML(entry)).join('');
        }
    }

    // Создание HTML карточки в стиле: ateez - (ссылка) choi san
    // По заданию "ateez - (ссылка) choi san"
    function createGuestCardHTML(entry) {
        // Экранирование спецсимволов для защиты XSS
        const safeGroup = escapeHtml(entry.group) || "группа";
        const safeName = escapeHtml(entry.name) || "имя";
        let safeLink = entry.link ? entry.link.trim() : "#";
        // если ссылка невалидная или пустая, то ставим заглушку, но сохраняем возможность клика
        if (safeLink === "" || (!safeLink.startsWith("http://") && !safeLink.startsWith("https://"))) {
            // если ссылка не начинается с протокола, но не пустая, делаем https префикс? но лучше просто заглушка
            if(safeLink !== "#" && safeLink !== "") {
                safeLink = "https://" + safeLink;
            } else {
                safeLink = "#";
            }
        }
        // ссылка с атрибутом target blank для удобства
        // создаем элемент согласно стилю: группа - (ссылка) имя
        // Шаблон: "<span class=\"group-name\">ATEEZ</span> - <a href='ссылка' class='guest-link' target='_blank'>(ссылка)</a> <span class='guest-name'>Choi San</span>"
        return `
            <div class="guest-card" data-id="${entry.id}">
                <div class="guest-line">
                    <span class="group-name">${safeGroup}</span>
                    <span> - </span>
                    <a href="${safeLink}" class="guest-link" target="_blank" rel="noopener noreferrer">(ссылка)</a>
                    <span class="guest-name">${safeName}</span>
                </div>
            </div>
        `;
    }

    // вспомогательная функция экранирования
    function escapeHtml(str) {
        if (!str) return '';
        return str.replace(/[&<>]/g, function(m) {
            if (m === '&') return '&';
            if (m === '<') return '<';
            if (m === '>') return '>';
            return m;
        }).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function(c) {
            return c;
        });
    }

    // Добавление новой записи
    function addEntry() {
        // получаем поля
        const nameInput = document.getElementById('artistName');
        const groupInput = document.getElementById('groupName');
        const linkInput = document.getElementById('linkUrl');
        const genderRadio = document.querySelector('input[name="gender"]:checked');
       
        let name = nameInput.value.trim();
        let group = groupInput.value.trim();
        let link = linkInput.value.trim();
        const gender = genderRadio ? genderRadio.value : 'boy';

        // Валидация: имя и группа обязательны
        if (name === "") {
            alert("❄️ Пожалуйста, введите Имя артиста / участника!");
            return;
        }
        if (group === "") {
            alert("🎶 Укажите группу или сольный проект!");
            return;
        }
        // ссылка необязательна, но если ввели — проверяем протокол, но не строго
        let finalLink = link;
        if (finalLink !== "" && !finalLink.startsWith("http://") && !finalLink.startsWith("https://")) {
            // если пользователь ввел что-то типа "youtube.com/..." попробуем добавить https
            finalLink = "https://" + finalLink;
        }
        // Если ссылка пустая, то оставляем пустую строку, но карточка обработает как #, но лучше чтобы ссылка была с заглушкой -
        // но по дизайну ссылка отображается как текст "(ссылка)" – она будет вести на введённый адрес или пустышку.
        // Однако в createGuestCardHTML если safeLink пустой, то ставим "#".
        if(finalLink === "") finalLink = "";   // тогда внутри функции станет '#', ссылка нерабочая но элемент есть.

        // создаем новый объект
        const newEntry = {
            id: Date.now() + Math.random() * 10000,
            name: name,
            group: group,
            link: finalLink,
            gender: gender,
        };

        entries.push(newEntry);
        saveToStorage();
        renderEntries();

        // очищаем форму, кроме радиокнопки (оставляем выбранный пол как был, удобно)
        nameInput.value = "";
        groupInput.value = "";
        linkInput.value = "";
        // можно фокус на имя для удобства
        nameInput.focus();

        // небольшой фидбек (опционально)
        const toastMsg = document.createElement('div');
        toastMsg.innerText = `✨ ${name} добавлен в ${gender === 'boy' ? 'мальчики' : 'девочки'} ✨`;
        toastMsg.style.position = 'fixed';
        toastMsg.style.bottom = '20px';
        toastMsg.style.left = '50%';
        toastMsg.style.transform = 'translateX(-50%)';
        toastMsg.style.backgroundColor = '#1e1a2f';
        toastMsg.style.color = '#fff0f5';
        toastMsg.style.padding = '0.5rem 1.2rem';
        toastMsg.style.borderRadius = '3rem';
        toastMsg.style.fontSize = '0.8rem';
        toastMsg.style.zIndex = '999';
        toastMsg.style.backdropFilter = 'blur(4px)';
        toastMsg.style.fontWeight = '500';
        document.body.appendChild(toastMsg);
        setTimeout(() => toastMsg.remove(), 2000);
    }

    function initDemoIfEmpty() {
        if (entries.length === 0) {
            entries = [
                { id: Date.now() + 10, name: "Choi San", group: "ATEEZ", link: "https://youtu.be/ATEEZ_SAN_fancam", gender: "boy" },
                { id: Date.now() + 11, name: "Jeon Soyeon", group: "(G)I-DLE", link: "https://youtu.be/soyeon_queen", gender: "girl" },
                { id: Date.now() + 12, name: "Felix", group: "Stray Kids", link: "https://youtu.be/felix_skz", gender: "boy" },
                { id: Date.now() + 13, name: "Wonyoung", group: "IVE", link: "https://youtu.be/wonyoung_star", gender: "girl" },
                { id: Date.now() + 14, name: "Beomgyu", group: "TXT", link: "https://youtu.be/beomgyu_melody", gender: "boy" }
            ];
            saveToStorage();
        }
    }

    // Обработчик кнопки добавить
    document.getElementById('addEntryBtn').addEventListener('click', addEntry);

    // Также добавим поддержку Enter в любом поле для удобства (нажатие Enter в любом инпуте добавляет запись)
    const inputs = ['artistName', 'groupName', 'linkUrl'];
    inputs.forEach(id => {
        const el = document.getElementById(id);
        if(el) {
            el.addEventListener('keypress', function(e) {
                if(e.key === 'Enter') {
                    e.preventDefault();
                    addEntry();
                }
            });
        }
    });

    // запуск
    loadFromStorage();
    initDemoIfEmpty();   // повторная страховка
    renderEntries();
</script>
</body>
</html>[/html]

0

3

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ON:AIR • Гостевая книга</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: system-ui, 'Segoe UI', 'Noto Sans KR', sans-serif;
        }
        body {
            background: linear-gradient(145deg, #0b0820, #03000c);
            min-height: 100vh;
            padding: 2rem 1.5rem;
        }
        .container {
            max-width: 1200px;
            margin: 0 auto;
        }
        /* хедер */
        .hero {
            text-align: center;
            margin-bottom: 2.5rem;
        }
        .hero h1 {
            font-size: 2.8rem;
            background: linear-gradient(135deg, #FFB8E7, #AA7AFF, #6EE7FF);
            background-clip: text;
            -webkit-background-clip: text;
            color: transparent;
        }
        .hero p {
            color: #a89ed0;
            margin-top: 0.3rem;
        }
        /* две колонки */
        .two-columns {
            display: flex;
            flex-wrap: wrap;
            gap: 2rem;
        }
        .column {
            flex: 1;
            min-width: 260px;
            background: rgba(25, 20, 50, 0.6);
            backdrop-filter: blur(10px);
            border-radius: 1.8rem;
            border: 1px solid rgba(255, 150, 200, 0.3);
            overflow: hidden;
        }
        .column-header {
            padding: 1rem 1.5rem;
            border-bottom: 2px solid;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .boys .column-header { border-bottom-color: #4c6ef5; }
        .girls .column-header { border-bottom-color: #f065aa; }
        .column-header h2 {
            font-size: 1.8rem;
            font-weight: 700;
        }
        .boys h2 { color: #88aaff; }
        .girls h2 { color: #ff9ace; }
        .counter {
            background: rgba(0,0,0,0.5);
            padding: 0.2rem 0.7rem;
            border-radius: 40px;
            font-size: 0.75rem;
            color: #ddd9ff;
        }
        .entry-list {
            padding: 1.2rem;
            max-height: 500px;
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            gap: 0.8rem;
        }
        .guest-card {
            background: rgba(35, 28, 65, 0.6);
            border-radius: 1.2rem;
            padding: 0.8rem 1rem;
            border: 1px solid rgba(255, 200, 230, 0.2);
            transition: 0.2s;
        }
        .guest-card:hover {
            background: rgba(55, 45, 90, 0.8);
            border-color: #ff9fcd;
        }
        .guest-line {
            display: flex;
            flex-wrap: wrap;
            align-items: baseline;
            gap: 0.3rem 0.6rem;
            font-size: 0.95rem;
        }
        .group-badge {
            font-weight: 800;
            background: #1e173b;
            padding: 0.2rem 0.7rem;
            border-radius: 30px;
            font-size: 0.75rem;
            color: #ffd6ed;
            border-left: 2px solid #ff79b0;
        }
        .guest-link {
            color: #b3aaff;
            text-decoration: none;
            font-size: 0.8rem;
            background: rgba(100, 80, 200, 0.3);
            padding: 0.1rem 0.55rem;
            border-radius: 30px;
        }
        .guest-link:hover {
            background: #c084fc;
            color: #0a041f;
        }
        .guest-name {
            font-weight: 700;
            background: linear-gradient(145deg, #FFD5F0, #D5B8FF);
            background-clip: text;
            -webkit-background-clip: text;
            color: transparent;
        }
        .empty-message {
            text-align: center;
            color: #a094c2;
            padding: 2rem;
            font-size: 0.85rem;
            font-style: italic;
        }
        footer {
            text-align: center;
            margin-top: 2rem;
            font-size: 0.7rem;
            color: #6f62a0;
        }
        @media (max-width: 700px) {
            .hero h1 { font-size: 2rem; }
            .column-header h2 { font-size: 1.4rem; }
        }
    </style>
</head>
<body>
<div class="container">
    <div class="hero">
        <h1>🎤 ON:AIR • 게스트북</h1>
        <p>музыкальное шоу | гостевая книга фанатов</p>
    </div>

    <div class="two-columns">
        <!-- Мальчики -->
        <div class="column boys">
            <div class="column-header">
                <h2>🧑‍🎤 МАЛЬЧИКИ</h2>
                <div class="counter" id="boysCounter">0</div>
            </div>
            <div id="boysList" class="entry-list"></div>
        </div>

        <!-- Девочки -->
        <div class="column girls">
            <div class="column-header">
                <h2>👩‍🎤 ДЕВОЧКИ</h2>
                <div class="counter" id="girlsCounter">0</div>
            </div>
            <div id="girlsList" class="entry-list"></div>
        </div>
    </div>
    <footer>✨ каждая запись в стиле: группа — (ссылка) имя ✨</footer>
</div>

<script>
    // готовые записи в нужном формате
    const entries = [
        // мальчики
        { group: "ATEEZ", name: "Choi San", link: "https://youtu.be/ATEEZ_SAN", gender: "boy" },
        { group: "ATEEZ", name: "Hongjoong", link: "https://youtu.be/hongjoong", gender: "boy" },
        { group: "Stray Kids", name: "Felix", link: "https://youtu.be/felix_skz", gender: "boy" },
        { group: "TXT", name: "Yeonjun", link: "https://youtu.be/yeonjun", gender: "boy" },
        { group: "BTS", name: "Jungkook", link: "https://youtu.be/jungkook", gender: "boy" },
        { group: "ENHYPEN", name: "Ni-ki", link: "https://youtu.be/niki", gender: "boy" },
        // девочки
        { group: "aespa", name: "Karina", link: "https://youtu.be/karina", gender: "girl" },
        { group: "aespa", name: "Winter", link: "https://youtu.be/winter", gender: "girl" },
        { group: "NewJeans", name: "Hanni", link: "https://youtu.be/hanni", gender: "girl" },
        { group: "IVE", name: "Wonyoung", link: "https://youtu.be/wonyoung", gender: "girl" },
        { group: "(G)I-DLE", name: "Soyeon", link: "https://youtu.be/soyeon", gender: "girl" },
        { group: "LE SSERAFIM", name: "Chaewon", link: "https://youtu.be/chaewon", gender: "girl" }
    ];

    function render() {
        const boys = entries.filter(e => e.gender === 'boy');
        const girls = entries.filter(e => e.gender === 'girl');
       
        document.getElementById('boysCounter').innerText = boys.length;
        document.getElementById('girlsCounter').innerText = girls.length;
       
        const boysContainer = document.getElementById('boysList');
        const girlsContainer = document.getElementById('girlsList');
       
        boysContainer.innerHTML = boys.map(entry => `
            <div class="guest-card">
                <div class="guest-line">
                    <span class="group-badge">${escapeHtml(entry.group)}</span>
                    <span>–</span>
                    <a href="${entry.link}" class="guest-link" target="_blank" rel="noopener">(ссылка)</a>
                    <span class="guest-name">${escapeHtml(entry.name)}</span>
                </div>
            </div>
        `).join('');
       
        girlsContainer.innerHTML = girls.map(entry => `
            <div class="guest-card">
                <div class="guest-line">
                    <span class="group-badge">${escapeHtml(entry.group)}</span>
                    <span>–</span>
                    <a href="${entry.link}" class="guest-link" target="_blank" rel="noopener">(ссылка)</a>
                    <span class="guest-name">${escapeHtml(entry.name)}</span>
                </div>
            </div>
        `).join('');
       
        if (boys.length === 0) boysContainer.innerHTML = '<div class="empty-message">✨ пока нет записей ✨</div>';
        if (girls.length === 0) girlsContainer.innerHTML = '<div class="empty-message">🌸 пока нет записей 🌸</div>';
    }
   
    function escapeHtml(str) {
        if (!str) return '';
        return str.replace(/[&<>]/g, function(m) {
            if (m === '&') return '&amp;';
            if (m === '<') return '&lt;';
            if (m === '>') return '&gt;';
            return m;
        });
    }
   
    render();
</script>
</body>
</html>[/html]

0

4

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ON:AIR · айдолы</title>
    <style>
        *{margin:0;padding:0;box-sizing:border-box;}
        body{background:#faf7f2;font-family:system-ui,sans-serif;padding:24px 16px;}
        .wrap{max-width:1000px;margin:0 auto;}
        h1{text-align:center;font-size:2rem;background:linear-gradient(135deg,#5e7e8e,#c2826b);-webkit-background-clip:text;background-clip:text;color:transparent;}
        .sub{text-align:center;color:#a08d77;font-size:0.75rem;margin-bottom:28px;}
        .grid{display:flex;gap:20px;flex-wrap:wrap;}
        .card{flex:1;min-width:260px;background:#fff;border-radius:28px;box-shadow:0 4px 12px rgba(0,0,0,0.03);overflow:hidden;}
        .head{padding:14px 18px;display:flex;justify-content:space-between;border-bottom:1px solid #f0e4d8;}
        .head h2{font-size:1.4rem;font-weight:550;}
        .boys .head h2{color:#4f7c8f;}
        .girls .head h2{color:#cc867b;}
        .cnt{background:#ede3d9;padding:2px 10px;border-radius:30px;font-size:0.7rem;}
        .msgs{padding:14px;max-height:460px;overflow-y:auto;display:flex;flex-direction:column;gap:10px;}
        .idol{background:#fefbf8;border-radius:20px;padding:12px 16px;border-left:4px solid;}
        .boys .idol{border-left-color:#6f9eb3;}
        .girls .idol{border-left-color:#e0a196;}
        .name{font-weight:600;font-size:0.9rem;color:#3d352c;}
        .empty{text-align:center;color:#cbbaa8;padding:30px;}
        footer{text-align:center;margin-top:24px;font-size:0.65rem;color:#c2ae9a;}
    </style>
</head>
<body>
<div class="wrap">
    <h1>🎧 ON:AIR</h1>
    <div class="sub">гостевая книга · айдолы</div>
    <div class="grid">
        <div class="card boys">
            <div class="head"><h2>🌟 МАЛЬЧИКИ</h2><span class="cnt" id="bc">0</span></div>
            <div class="msgs" id="bl"></div>
        </div>
        <div class="card girls">
            <div class="head"><h2>🌸 ДЕВОЧКИ</h2><span class="cnt" id="gc">0</span></div>
            <div class="msgs" id="gl"></div>
        </div>
    </div>
    <footer>✧ только имена айдолов ✧</footer>
</div>
<script>
    const data = {
        boys: [
            "ateez - choi san",
            "ateez - kim hongjoong",
            "stray kids - bang chan",
            "stray kids - lee know",
            "txt - choi yeonjun",
            "txt - kang taehyun",
            "enhypen - jungwon",
            "enhypen - ni-ki",
            "bts - jungkook",
            "bts - jimin",
            "nct 127 - taeyong",
            "nct dream - jeno",
            "seventeen - vernon",
            "seventeen - mingyu"
        ],
        girls: [
            "aespa - karina",
            "aespa - winter",
            "blackpink - jennie",
            "blackpink - rosé",
            "ive - jang wonyoung",
            "ive - an yujin",
            "newjeans - haerin",
            "newjeans - minji",
            "gidle - soyeon",
            "gidle - miyeon",
            "le sserafim - sakura",
            "le sserafim - kim chaewon",
            "twice - nayeon",
            "twice - sana"
        ]
    };
    const esc = s => s.replace(/[&<>]/g, m => m=='&'?'&amp;':m=='<'?'&lt;':'&gt;');
    const render = () => {
        const bl = document.getElementById('bl'), bc = document.getElementById('bc');
        bc.innerText = data.boys.length;
        bl.innerHTML = data.boys.map(n => `<div class="idol"><div class="name">✨ ${esc(n)}</div></div>`).join('');
        const gl = document.getElementById('gl'), gc = document.getElementById('gc');
        gc.innerText = data.girls.length;
        gl.innerHTML = data.girls.map(n => `<div class="idol"><div class="name">🌸 ${esc(n)}</div></div>`).join('');
    };
    render();
</script>
</body>
</html>[/html]

0

5

[hideprofile][html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ON:AIR · айдолы</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            background: #faf7f2;
            font-family: system-ui, 'Segoe UI', 'Pretendard', sans-serif;
            padding: 30px 20px;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        /* основная обёртка: картинка слева + блоки справа */
        .main-layout {
            max-width: 500px;
            width: 100%;
            margin: 0 auto;
            display: flex;
            gap: 32px;
            align-items: flex-start;
            flex-wrap: wrap;
        }

        /* Левая колонка с микрофоном */
        .mic-side {
            flex: 0 0 140px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: flex-start;
            padding-top: 40px;
        }

        .mic-icon {
            font-size: 90px;
            filter: drop-shadow(0 8px 14px rgba(0,0,0,0.08));
            transition: transform 0.2s ease;
        }

        .mic-icon:hover {
            transform: scale(1.02);
        }

        .mic-caption {
            text-align: center;
            margin-top: 12px;
            font-size: 0.7rem;
            color: #b8a68c;
            letter-spacing: 0.5px;
            font-weight: 500;
        }

        /* Правая колонка (контент) */
        .content-right {
            flex: 1;
            min-width: 260px;
        }

        /* хедер шоу */
        .show-header {
            text-align: center;
            margin-bottom: 28px;
        }

        .show-header h1 {
            font-size: 2.2rem;
            background: linear-gradient(135deg, #5e7e8e, #c2826b);
            -webkit-background-clip: text;
            background-clip: text;
            color: transparent;
            letter-spacing: -0.3px;
        }

        .show-header .sub {
            color: #a08d77;
            font-size: 0.75rem;
            margin-top: 4px;
        }

        /* карточки блоков */
        .guest-block {
            background: #ffffffec;
            border-radius: 32px;
            box-shadow: 0 8px 22px rgba(0, 0, 0, 0.03), 0 1px 2px rgba(0, 0, 0, 0.02);
            overflow: hidden;
            margin-bottom: 28px;
            backdrop-filter: blur(2px);
            transition: 0.2s;
        }

        .guest-block:hover {
            transform: translateY(-2px);
        }

        .block-header {
            padding: 14px 20px;
            display: flex;
            justify-content: space-between;
            align-items: center;
            border-bottom: 2px solid #f0e2d6;
        }

        .block-header h2 {
            font-size: 1.5rem;
            font-weight: 560;
            letter-spacing: -0.2px;
        }

        .boys .block-header h2 {
            color: #4f7c8f;
        }

        .girls .block-header h2 {
            color: #cc867b;
        }

        .count-badge {
            background: #ede3d9;
            padding: 4px 14px;
            border-radius: 40px;
            font-size: 0.7rem;
            font-weight: 600;
            color: #6e5c4b;
        }

        /* список айдолов */
        .idols-list {
            padding: 16px 18px;
            max-height: 360px;
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            gap: 10px;
        }

        .idol-card {
            background: #fefbf8;
            border-radius: 20px;
            padding: 12px 16px;
            border-left: 5px solid;
            transition: 0.05s linear;
        }

        .boys .idol-card {
            border-left-color: #6f9eb3;
        }

        .girls .idol-card {
            border-left-color: #e0a196;
        }

        .idol-name {
            font-weight: 600;
            font-size: 0.92rem;
            color: #3d352c;
            display: flex;
            align-items: center;
            gap: 8px;
        }

        .idol-name .emoji-boy {
            font-size: 0.9rem;
        }
        .idol-name .emoji-girl {
            font-size: 0.9rem;
        }

        .empty-message {
            text-align: center;
            color: #cbbaa8;
            padding: 28px 16px;
            font-style: italic;
            font-size: 0.85rem;
        }

        footer {
            text-align: center;
            margin-top: 20px;
            font-size: 0.65rem;
            color: #c2ae9a;
            border-top: 1px solid #efe1d4;
            padding-top: 16px;
        }

        /* скролл */
        .idols-list::-webkit-scrollbar {
            width: 4px;
        }
        .idols-list::-webkit-scrollbar-track {
            background: #ede3d9;
            border-radius: 10px;
        }
        .idols-list::-webkit-scrollbar-thumb {
            background: #cfbaa6;
            border-radius: 10px;
        }

        @media (max-width: 680px) {
            .main-layout {
                flex-direction: column;
                align-items: center;
            }
            .mic-side {
                flex: 0 0 auto;
                flex-direction: row;
                gap: 12px;
                padding-top: 0;
                width: 100%;
                justify-content: center;
            }
            .mic-icon {
                font-size: 60px;
            }
            .mic-caption {
                margin-top: 0;
            }
        }
    </style>
</head>
<body>
<div class="main-layout">
    <!-- левая часть: картинка микрофона -->
    <div class="mic-side">
        <div class="mic-icon">🎤</div>
        <div class="mic-caption">ON AIR · 스튜디오</div>
    </div>

    <!-- правая часть: контент -->
    <div class="content-right">
        <div class="show-header">
            <h1>🎧 ON:AIR</h1>
            <div class="sub">музыкальное шоу · гостевая книга айдолов</div>
        </div>

        <!-- БЛОК МАЛЬЧИКИ -->
        <div class="guest-block boys">
            <div class="block-header">
                <h2>🌟 МАЛЬЧИКИ</h2>
                <span class="count-badge" id="boysCount">0</span>
            </div>
            <div class="idols-list" id="boysList">
                <div class="empty-message">✨ загрузка...</div>
            </div>
        </div>

        <!-- БЛОК ДЕВОЧКИ (под мальчиками) -->
        <div class="guest-block girls">
            <div class="block-header">
                <h2>🌸 ДЕВОЧКИ</h2>
                <span class="count-badge" id="girlsCount">0</span>
            </div>
            <div class="idols-list" id="girlsList">
                <div class="empty-message">🌸 загрузка...</div>
            </div>
        </div>

        <footer>✧ только имена айдолов · on:air guestbook ✧</footer>
    </div>
</div>

<script>
    // список айдолов в формате "группа - имя"
    const idolsData = {
        boys: [
            "ateez - choi san",
            "ateez - kim hongjoong",
            "stray kids - bang chan",
            "stray kids - lee know",
            "txt - choi yeonjun",
            "txt - kang taehyun",
            "enhypen - jungwon",
            "enhypen - ni-ki",
            "bts - jungkook",
            "bts - jimin",
            "nct 127 - taeyong",
            "nct dream - jeno",
            "seventeen - vernon",
            "seventeen - mingyu",
            "the boyz - juyeon",
            "monsta x - shownu"
        ],
        girls: [
            "aespa - karina",
            "aespa - winter",
            "blackpink - jennie",
            "blackpink - rosé",
            "ive - jang wonyoung",
            "ive - an yujin",
            "newjeans - haerin",
            "newjeans - minji",
            "gidle - soyeon",
            "gidle - miyeon",
            "le sserafim - sakura",
            "le sserafim - kim chaewon",
            "twice - nayeon",
            "twice - sana",
            "red velvet - irene",
            "itzy - ryujin"
        ]
    };

    // защита от XSS
    function escapeHtml(str) {
        if (!str) return '';
        return str.replace(/[&<>]/g, function(m) {
            if (m === '&') return '&';
            if (m === '<') return '<';
            if (m === '>') return '>';
            return m;
        });
    }

    function renderBlocks() {
        // мальчики
        const boysContainer = document.getElementById('boysList');
        const boysCountSpan = document.getElementById('boysCount');
        boysCountSpan.innerText = idolsData.boys.length;
       
        if (idolsData.boys.length === 0) {
            boysContainer.innerHTML = '<div class="empty-message">💬 пока нет имён</div>';
        } else {
            boysContainer.innerHTML = idolsData.boys.map(name => `
                <div class="idol-card">
                    <div class="idol-name">
                        <span class="emoji-boy">✨</span> ${escapeHtml(name)}
                    </div>
                </div>
            `).join('');
        }

        // девочки
        const girlsContainer = document.getElementById('girlsList');
        const girlsCountSpan = document.getElementById('girlsCount');
        girlsCountSpan.innerText = idolsData.girls.length;
       
        if (idolsData.girls.length === 0) {
            girlsContainer.innerHTML = '<div class="empty-message">🌸 пока нет имён</div>';
        } else {
            girlsContainer.innerHTML = idolsData.girls.map(name => `
                <div class="idol-card">
                    <div class="idol-name">
                        <span class="emoji-girl">🌸</span> ${escapeHtml(name)}
                    </div>
                </div>
            `).join('');
        }
    }

    renderBlocks();
</script>
</body>
</html>[/html]

0

6

[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
    <title>ON:AIR | Корейское музыкальное шоу – гостевая книга айдолов</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            background: #fefaf5;
            font-family: 'Inter', 'Pretendard', system-ui, -apple-system, 'Segoe UI', 'Noto Sans KR', sans-serif;
            min-height: 100vh;
            padding: 2rem 2rem 1.5rem;
            position: relative;
        }

        /* фоновые полупрозрачные элементы – визуальный шарм корейского шоу */
        body::before {
            content: "♪";
            font-size: 220px;
            position: fixed;
            bottom: -30px;
            left: -50px;
            opacity: 0.03;
            font-family: monospace;
            pointer-events: none;
            transform: rotate(-10deg);
        }

        body::after {
            content: "🎵";
            font-size: 180px;
            position: fixed;
            top: 10%;
            right: -40px;
            opacity: 0.04;
            pointer-events: none;
            transform: rotate(15deg);
        }

        .main-container {
            max-width: 1300px;
            margin: 0 auto;
            position: relative;
            z-index: 2;
        }

        /* хедер с атмосферой live-шоу */
        .showcase-header {
            text-align: center;
            margin-bottom: 3rem;
            position: relative;
        }

        .glow-text {
            font-size: 3.3rem;
            font-weight: 800;
            letter-spacing: -0.02em;
            background: linear-gradient(125deg, #F15F5F, #FFB347, #6C8C9E);
            background-clip: text;
            -webkit-background-clip: text;
            color: transparent;
            display: inline-block;
            filter: drop-shadow(0 2px 5px rgba(0,0,0,0.05));
        }

        .tagline {
            background: rgba(255, 248, 235, 0.8);
            backdrop-filter: blur(4px);
            display: inline-block;
            padding: 0.4rem 1.6rem;
            border-radius: 60px;
            font-size: 0.8rem;
            font-weight: 500;
            color: #b4815c;
            margin-top: 10px;
            letter-spacing: 0.3px;
            gap: 8px;
            align-items: center;
            justify-content: center;
        }

        .tagline span {
            display: inline-flex;
            align-items: center;
            gap: 5px;
        }

        /* нестандартная сетка: мальчики – вверху слева, девочки – снизу справа */
        .dynamic-grid {
            display: flex;
            flex-wrap: wrap;
            justify-content: space-between;
            gap: 2rem;
            margin: 2rem 0 1rem;
            position: relative;
        }

        /* левая зона (здесь находится блок мальчиков и он выше) */
        .left-area {
            flex: 1.2;
            min-width: 280px;
            display: flex;
            flex-direction: column;
            gap: 1.5rem;
        }

        /* правая зона (содержит “визуальный твист” + блок девочек снизу) */
        .right-area {
            flex: 0.9;
            min-width: 280px;
            display: flex;
            flex-direction: column;
            justify-content: flex-end;
            gap: 1.5rem;
        }

        /* карточка-блок */
        .idol-card-block {
            background: rgba(255, 255, 255, 0.92);
            backdrop-filter: blur(2px);
            border-radius: 2rem;
            overflow: hidden;
            box-shadow: 0 20px 32px -12px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.02);
            transition: transform 0.2s ease, box-shadow 0.2s;
            border: 1px solid #f7ede2;
        }

        .idol-card-block:hover {
            transform: translateY(-4px);
            box-shadow: 0 26px 36px -14px rgba(0, 0, 0, 0.12);
        }

        /* заголовок блока */
        .block-title {
            padding: 1rem 1.8rem;
            display: flex;
            justify-content: space-between;
            align-items: center;
            border-bottom: 2px solid #ffede1;
            flex-wrap: wrap;
        }

        .title-deco {
            display: flex;
            align-items: center;
            gap: 10px;
        }

        .title-deco h2 {
            font-size: 1.7rem;
            font-weight: 640;
            letter-spacing: -0.3px;
        }

        .boys .title-deco h2 { color: #46788e; }
        .girls .title-deco h2 { color: #cb7f70; }

        .count-pill {
            background: #f1e8e0;
            padding: 0.25rem 0.9rem;
            border-radius: 60px;
            font-size: 0.75rem;
            font-weight: 600;
            color: #6d5c4b;
        }

        /* список айдолов */
        .idol-list {
            padding: 1.2rem 1.5rem 1.8rem;
            max-height: 440px;
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .idol-item {
            background: #ffffff;
            border-radius: 1.5rem;
            padding: 0.9rem 1.1rem;
            display: flex;
            align-items: center;
            gap: 12px;
            transition: all 0.15s;
            border: 1px solid #ffefe2;
            box-shadow: 0 1px 3px rgba(0,0,0,0.02);
        }

        .boys .idol-item {
            border-left: 4px solid #7fa5b9;
        }
        .girls .idol-item {
            border-left: 4px solid #e7b7ab;
        }

        .idol-avatar {
            font-size: 1.7rem;
            background: #fcf5ed;
            width: 44px;
            height: 44px;
            border-radius: 30px;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .idol-info {
            flex: 1;
        }
        .idol-name-text {
            font-weight: 600;
            font-size: 0.95rem;
            color: #2d2a24;
            letter-spacing: -0.2px;
        }
        .group-tag {
            font-size: 0.65rem;
            color: #b2947c;
            margin-top: 2px;
            font-weight: 500;
        }

        /* визуальные корейские элементы (микрофон, свет, эквалайзер) */
        .visual-elements {
            display: flex;
            justify-content: space-between;
            align-items: center;
            flex-wrap: wrap;
            background: rgba(255, 247, 240, 0.6);
            border-radius: 2rem;
            padding: 1rem 1.3rem;
            margin-bottom: 0.5rem;
            gap: 12px;
            backdrop-filter: blur(4px);
        }

        .eq-bars {
            display: flex;
            align-items: flex-end;
            gap: 4px;
            height: 32px;
        }
        .bar {
            width: 5px;
            background: #dcaea0;
            border-radius: 4px;
            transition: height 0.2s ease;
            animation: pulse 1.4s infinite alternate;
        }
        .bar:nth-child(1) { height: 12px; animation-delay: 0s; }
        .bar:nth-child(2) { height: 24px; animation-delay: 0.2s; background: #c2836b; }
        .bar:nth-child(3) { height: 18px; animation-delay: 0.4s; }
        .bar:nth-child(4) { height: 28px; animation-delay: 0.1s; background: #c2836b; }
        .bar:nth-child(5) { height: 10px; animation-delay: 0.3s; }

        @keyframes pulse {
            0% { opacity: 0.5; transform: scaleY(0.8); }
            100% { opacity: 1; transform: scaleY(1.1); }
        }

        .live-badge {
            background: #ffcfb0;
            border-radius: 60px;
            padding: 5px 14px;
            font-size: 0.75rem;
            font-weight: 700;
            color: #b4512c;
            display: flex;
            align-items: center;
            gap: 6px;
        }

        .vinyl-icon {
            font-size: 1.5rem;
            filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));
        }

        /* правый декоративный стафф */
        .kpop-quote {
            background: #fffdf9;
            border-radius: 1.5rem;
            padding: 1rem 1.4rem;
            text-align: center;
            border: 1px solid #faebdd;
            font-size: 0.8rem;
            color: #b68b6e;
            font-style: italic;
            backdrop-filter: blur(4px);
        }

        footer {
            margin-top: 3rem;
            text-align: center;
            font-size: 0.7rem;
            color: #d1bfae;
            border-top: 1px solid #f6e9de;
            padding-top: 1.8rem;
            display: flex;
            justify-content: center;
            gap: 20px;
        }

        /* скролл */
        .idol-list::-webkit-scrollbar {
            width: 5px;
        }
        .idol-list::-webkit-scrollbar-track {
            background: #f3ebe2;
            border-radius: 10px;
        }
        .idol-list::-webkit-scrollbar-thumb {
            background: #decbb8;
            border-radius: 10px;
        }

        @media (max-width: 780px) {
            body { padding: 1rem; }
            .dynamic-grid { flex-direction: column; }
            .left-area, .right-area { width: 100%; }
            .glow-text { font-size: 2.4rem; }
        }
    </style>
</head>
<body>

<div class="main-container">
    <!-- верхняя часть с тематикой ON:AIR -->
    <div class="showcase-header">
        <div class="glow-text">🎙️ ON:AIR</div>
        <div class="tagline">
            <span>🎧 KOREAN MUSIC SHOW</span>  |  <span>📡 LIVE STAGE</span>
        </div>
    </div>

    <!-- динамическая сетка: мальчики вверху слева / девочки снизу справа -->
    <div class="dynamic-grid">
        <!-- ЛЕВАЯ ЗОНА (содержит блок мальчиков наверху) -->
        <div class="left-area">
            <!-- Блок МАЛЬЧИКИ — размещается в верхней части левой колонки -->
            <div class="idol-card-block boys">
                <div class="block-title">
                    <div class="title-deco">
                        <span style="font-size:1.7rem;">🌟</span>
                        <h2>МАЛЬЧИКИ</h2>
                    </div>
                    <div class="count-pill" id="boysCount">0</div>
                </div>
                <div class="idol-list" id="boysList">
                    <!-- динамический рендер -->
                    <div class="idol-item" style="justify-content:center; background:transparent;">✨ загрузка...</div>
                </div>
            </div>
            <!-- дополнительный визуальный элемент под мальчиками (эффект студии) -->
            <div class="visual-elements">
                <div class="eq-bars">
                    <div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div><div class="bar"></div>
                </div>
                <div class="live-badge">
                    <span>🔴</span> ON AIR
                </div>
                <div class="vinyl-icon">🎚️🎛️</div>
            </div>
        </div>

        <!-- ПРАВАЯ ЗОНА: сначала свободное пространство, потом блок девочек снизу -->
        <div class="right-area">
            <!-- Декоративный цитатник / корейский визуал -->
            <div class="kpop-quote">
                <span>🎤 “음악은 우리의 언어”</span><br>
                <span style="font-size:0.7rem;">✧ музыка — наш общий язык ✧</span>
            </div>
            <!-- Блок ДЕВОЧКИ — снизу справа -->
            <div class="idol-card-block girls">
                <div class="block-title">
                    <div class="title-deco">
                        <span style="font-size:1.7rem;">🌸</span>
                        <h2>ДЕВОЧКИ</h2>
                    </div>
                    <div class="count-pill" id="girlsCount">0</div>
                </div>
                <div class="idol-list" id="girlsList">
                    <div class="idol-item" style="justify-content:center; background:transparent;">🌸 загрузка...</div>
                </div>
            </div>
            <!-- ещё один музыкальный штрих -->
            <div style="display: flex; justify-content: flex-end; margin-top: 8px;">
                <span style="background:#fff5ed; border-radius: 50px; padding:4px 12px; font-size:0.7rem; color:#b98866;">🎶 K-STAGE</span>
            </div>
        </div>
    </div>

    <footer>
        <span>🎧 ON:AIR guestbook</span>
        <span>✧ только айдолы ✧</span>
        <span>🎤 music show archive</span>
    </footer>
</div>

<script>
    // СПИСОК АЙДОЛОВ (формат группа - имя) только имена, без пожеланий
    const idolsLibrary = {
        boys: [
            "ateez - choi san",
            "ateez - kim hongjoong",
            "stray kids - bang chan",
            "stray kids - lee know",
            "txt - choi yeonjun",
            "txt - kang taehyun",
            "enhypen - jungwon",
            "enhypen - ni-ki",
            "bts - jungkook",
            "bts - jimin",
            "nct 127 - taeyong",
            "nct dream - jeno",
            "seventeen - vernon",
            "seventeen - mingyu",
            "the boyz - juyeon",
            "monsta x - shownu",
            "exo - baekhyun",
            "shinee - taemin"
        ],
        girls: [
            "aespa - karina",
            "aespa - winter",
            "blackpink - jennie",
            "blackpink - rosé",
            "ive - jang wonyoung",
            "ive - an yujin",
            "newjeans - haerin",
            "newjeans - minji",
            "gidle - soyeon",
            "gidle - miyeon",
            "le sserafim - sakura",
            "le sserafim - kim chaewon",
            "twice - nayeon",
            "twice - sana",
            "red velvet - irene",
            "itzy - ryujin",
            "nmixx - lily",
            "fromis_9 - saerom"
        ]
    };

    // вспомогательная функция экранирования
    function escapeHtml(str) {
        if (!str) return '';
        return str.replace(/[&<>]/g, function(m) {
            if (m === '&') return '&';
            if (m === '<') return '<';
            if (m === '>') return '>';
            return m;
        });
    }

    // парсим строку "группа - имя" для возможного разделения (для отображения группы в подзаголовке)
    function formatIdolItem(fullName) {
        const parts = fullName.split(' - ');
        if (parts.length === 2) {
            return { group: parts[0].trim(), name: parts[1].trim() };
        }
        return { group: '', name: fullName };
    }

    // рендер блока мальчиков
    function renderBoys() {
        const container = document.getElementById('boysList');
        const countSpan = document.getElementById('boysCount');
        const boysArray = idolsLibrary.boys;
        countSpan.innerText = boysArray.length;

        if (!boysArray.length) {
            container.innerHTML = '<div class="idol-item" style="justify-content:center;">✨ пока нет айдолов</div>';
            return;
        }

        let html = '';
        for (let idol of boysArray) {
            const { group, name } = formatIdolItem(idol);
            const displayName = group ? `${group} - ${name}` : name;
            html += `
                <div class="idol-item">
                    <div class="idol-avatar">🎤</div>
                    <div class="idol-info">
                        <div class="idol-name-text">${escapeHtml(displayName)}</div>
                        ${group ? `<div class="group-tag">🎧 ${escapeHtml(group)}</div>` : ''}
                    </div>
                    <span style="font-size:0.8rem; opacity:0.6;">🎵</span>
                </div>
            `;
        }
        container.innerHTML = html;
    }

    // рендер блока девочек
    function renderGirls() {
        const container = document.getElementById('girlsList');
        const countSpan = document.getElementById('girlsCount');
        const girlsArray = idolsLibrary.girls;
        countSpan.innerText = girlsArray.length;

        if (!girlsArray.length) {
            container.innerHTML = '<div class="idol-item" style="justify-content:center;">🌸 пока нет айдолов</div>';
            return;
        }

        let html = '';
        for (let idol of girlsArray) {
            const { group, name } = formatIdolItem(idol);
            const displayName = group ? `${group} - ${name}` : name;
            html += `
                <div class="idol-item">
                    <div class="idol-avatar">🎤</div>
                    <div class="idol-info">
                        <div class="idol-name-text">${escapeHtml(displayName)}</div>
                        ${group ? `<div class="group-tag">🎧 ${escapeHtml(group)}</div>` : ''}
                    </div>
                    <span style="font-size:0.8rem; opacity:0.6;">💗</span>
                </div>
            `;
        }
        container.innerHTML = html;
    }

    // Дополнительный эффект: анимация для эквалайзера (уже через css)
    renderBoys();
    renderGirls();

    // Маленькая анимация для визуала: микрофонная стойка мигает? добавим рандомные имена? готово
    // также дополнительно добавляем иконки "винил" в живую
    const liveBadge = document.querySelector('.live-badge');
    if(liveBadge) {
        setInterval(() => {
            const dot = liveBadge.querySelector('span');
            if(dot) {
                dot.style.opacity = dot.style.opacity === '0.4' ? '1' : '0.4';
            }
        }, 700);
    }
</script>
</body>
</html>[/html][hideprofile]

0

7

[hideprofile]
[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
    <title>Гостевая книга | ON:AIR — K-pop шоу</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: system-ui, 'Segoe UI', 'Poppins', 'Noto Sans KR', sans-serif;
        }

        body {
            background: linear-gradient(145deg, #faf0f5 0%, #f7e9f0 90%);
            min-height: 50vh;
            padding: 2rem 1.5rem;
        }

        .container {
            max-width: 700px;
            margin: 0 auto;
        }

        /* Хедер с атмосферой шоу */
        .hero {
            text-align: center;
            margin-bottom: 20px;
        }

        .hero h1 {
            font-size: 23px;
            background: linear-gradient(135deg, #FF3B6F, #8B5CF6, #2DD4BF);
            background-clip: text;
            -webkit-background-clip: text;
            color: transparent;
            letter-spacing: -0.5px;
            display: inline-block;
            text-shadow: 0 2px 5px rgba(0,0,0,0.05);
        }

        .hero p {
            color: #4a4a5a;
            font-size: 15px;
            margin-top: 0.5rem;
            font-weight: 100;
        }

        .badge-live {
            background: #ff2e63;
            color: white;
            font-size: 10px;
            padding: 0.2rem 0.8rem;
            border-radius: 20px;
            display: inline-block;
            margin-top: 0.8rem;
            font-weight: 300;
            letter-spacing: 1px;
        }

        /* ГЛАВНАЯ СЕТКА: 2 КОЛОНКИ (мальчики/девочки) */
        .two-columns {
            display: flex;
            flex-wrap: wrap;
            gap: 2rem;
            margin-bottom: 3rem;
        }

        .column {
            flex: 1;
            min-width: 180px;
            background: rgba(255, 255, 255, 0.7);
            backdrop-filter: blur(2px);
            border-radius: 2rem;
            box-shadow: 0 20px 35px -12px rgba(0,0,0,0.15);
            overflow: hidden;
            transition: transform 0.2s;
            border: 1px solid rgba(255,255,240,0.8);
        }

        .column:hover {
            transform: translateY(-5px);
        }

        .column-header {
            padding: 1.2rem 1.5rem;
            background: white;
            border-bottom: 3px solid;
            display: flex;
            align-items: center;
            gap: 0.6rem;
        }

        .boys .column-header {
            border-bottom-color: #3b82f6;
            background: #f0f9ff;
        }

        .girls .column-header {
            border-bottom-color: #ec489a;
            background: #fff0f7;
        }

        .column-header h2 {
            font-size: 15px;
            font-weight: 300;
        }

        .boys h2 { color: #2563eb; }
        .girls h2 { color: #db2777; }

        .entry-list {
            padding: 1rem 1.2rem;
            max-height: 150px;
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            gap: 0.9rem;
            background: rgba(255,248,245,0.5);
        }

        /* Стиль карточки гостя: ateez - (ссылка) choi san */
        .guest-card {
            background: white;
            border-radius: 1.2rem;
            padding: 0.9rem 1.2rem;
            box-shadow: 0 4px 10px rgba(0,0,0,0.02);
            transition: all 0.2s;
            border: 1px solid #ffe7f0;
            word-break: break-word;
        }

        .guest-card:hover {
            border-color: #ffb7c5;
            background: #fffbfd;
        }

        .guest-line {
            font-size: 15px;
            display: flex;
            flex-wrap: wrap;
            align-items: baseline;
            gap: 0.3rem 0.5rem;
        }

        .group-name {
            font-weight: 100;
            color: #1e293b;
            background: #f1f5f9;
            padding: 0.2rem 0.6rem;
            border-radius: 40px;
            font-size: 15px;
        }

        .guest-link {
            color: #6366f1;
            text-decoration: none;
            font-weight: 100;
            border-bottom: 1px dashed #cbd5e1;
        }

        .guest-link:hover {
            color: #ec489a;
            border-bottom-color: #f472b6;
        }

        .guest-name {
            font-weight: 100;
            background: linear-gradient(145deg, #2d2f36, #1f1f2a);
            background-clip: text;
            -webkit-background-clip: text;
            color: transparent;
            font-size: 15px;
        }

        .empty-message {
            text-align: center;
            color: #aaa8b8;
            font-style: italic;
            padding: 2rem;
            font-size: 0.9rem;
        }

        /* ФОРМА ДОБАВЛЕНИЯ (универсальный блок) */
        .form-section {
            background: white;
            border-radius: 2rem;
            padding: 1.8rem;
            margin-top: 1rem;
            box-shadow: 0 20px 35px -12px rgba(0,0,0,0.1);
            border: 1px solid #ffe2ef;
        }

        .form-title {
            font-size: 1.5rem;
            font-weight: 200;
            margin-bottom: 1.2rem;
            display: flex;
            align-items: center;
            gap: 0.6rem;
        }

        .form-title span {
            background: #fdeef4;
            padding: 0.2rem 0.8rem;
            border-radius: 50px;
            font-size: 0.8rem;
        }

        .form-grid {
            display: flex;
            flex-wrap: wrap;
            gap: 1rem;
            margin-bottom: 1.5rem;
        }

        .input-group {
            flex: 1;
            min-width: 170px;
        }

        .input-group label {
            display: block;
            font-size: 15px;
            font-weight: 100;
            text-transform: uppercase;
            letter-spacing: 0.5px;
            color: #6b6b7e;
            margin-bottom: 0.3rem;
        }

        .input-group input, .input-group select {
            width: 100%;
            padding: 0.8rem 1rem;
            border-radius: 1.2rem;
            border: 1.5px solid #edd3df;
            background: #fefafc;
            font-size: 15px;
            transition: 0.2s;
        }

        .input-group input:focus, .input-group select:focus {
            outline: none;
            border-color: #f472b6;
            box-shadow: 0 0 0 3px rgba(236,72,153,0.1);
        }

        .gender-selector {
            display: flex;
            gap: 1rem;
            align-items: center;
            background: #faf3f7;
            padding: 0.4rem 1rem;
            border-radius: 3rem;
        }

        .gender-selector label {
            display: flex;
            align-items: center;
            gap: 0.4rem;
            font-weight: 200;
            color: #4a4a5e;
        }

        .add-button {
            background: linear-gradient(95deg, #FF3B6F, #C850C0);
            border: none;
            padding: 0.8rem 2rem;
            border-radius: 3rem;
            color: white;
            font-weight: bold;
            font-size: 1rem;
            cursor: pointer;
            transition: 0.2s;
            box-shadow: 0 5px 12px rgba(255,59,111,0.3);
        }

        .add-button:hover {
            transform: scale(1.02);
            background: linear-gradient(95deg, #f82b61, #b53cad);
            box-shadow: 0 8px 18px rgba(255,59,111,0.4);
        }

        .sample-note {
            font-size: 5px;
            color: #857e8c;
            margin-top: 0.8rem;
            text-align: center;
            background: #fcf4f8;
            padding: 0.5rem;
            border-radius: 2rem;
        }

        hr {
            margin: 1rem 0;
            border-color: #ffdae9;
        }

        footer {
            text-align: center;
            margin-top: 2rem;
            font-size: 10px;
            color: #a48f9b;
        }

        @media (max-width: 480px) {
            body {
                padding: 1rem;
            }
            .hero h1 {
                font-size: 15px;
            }
            .column-header h2 {
                font-size: 10px;
            }
        }

        /* Скролл для списков красивый */
        .entry-list::-webkit-scrollbar {
            width: 5px;
        }
        .entry-list::-webkit-scrollbar-track {
            background: #ffecf0;
            border-radius: 10px;
        }
        .entry-list::-webkit-scrollbar-thumb {
            background: #f4a0bd;
            border-radius: 10px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="hero">
        <h1>🎤 ON:AIR <span style="font-size: 2rem;">🎶</span></h1>
        <p>музыкальное шоу | корейская волна · гостиная фанатов</p>
        <div class="badge-live">✨ LIVE EDITION ✨</div>
    </div>

    <!-- Два блока: мальчики и девочки -->
    <div class="two-columns">
        <!-- Блок МАЛЬЧИКИ (BOYS) -->
        <div class="column boys">
            <div class="column-header">
                <span>🧑🎤</span>
                <h2>МАЛЬЧИКИ</h2>
                <span style="font-size: 0.75rem; background:#eef2ff; padding:0.2rem 0.7rem; border-radius: 30px;">보이그룹</span>
            </div>
            <div id="boysList" class="entry-list">
                <!-- Динамические карточки будут тут -->
                <div class="empty-message">✨ пока нет отзывов, добавь своего любимого айдола ✨</div>
            </div>
        </div>

        <!-- Блок ДЕВОЧКИ (GIRLS) -->
        <div class="column girls">
            <div class="column-header">
                <span>👩🎤</span>
                <h2>ДЕВОЧКИ</h2>
                <span style="font-size: 0.75rem; background:#ffe4f0; padding:0.2rem 0.7rem; border-radius: 30px;">걸그룹</span>
            </div>
            <div id="girlsList" class="entry-list">
                <div class="empty-message">🌸 добавь первую запись для девочек 🌸</div>
            </div>
        </div>
    </div>

    <!-- Форма добавления гостя (имя, группа, ссылка, выбор пола) -->
    <div class="form-section">
        <div class="form-title">
            📝 Добавить в гостевую книгу
            <span>ON:AIR</span>
        </div>
        <div class="form-grid">
            <div class="input-group">
                <label>🌟 Имя артиста / участника</label>
                <input type="text" id="artistName" placeholder="например: Choi San, Hanni, Karina ..." autocomplete="off">
            </div>
            <div class="input-group">
                <label>🎤 Группа / сольный проект</label>
                <input type="text" id="groupName" placeholder="например: ATEEZ, NewJeans, IVE ..." autocomplete="off">
            </div>
            <div class="input-group">
                <label>🔗 Ссылка (YouTube, Twitter, фан-арт...)</label>
                <input type="url" id="linkUrl" placeholder="https://..." autocomplete="off">
            </div>
            <div class="input-group">
                <label>⚧ Категория</label>
                <div class="gender-selector">
                    <label>
                        <input type="radio" name="gender" value="boy" checked> 🧑 мальчики
                    </label>
                    <label>
                        <input type="radio" name="gender" value="girl"> 👩 девочки
                    </label>
                </div>
            </div>
        </div>
        <div style="display: flex; justify-content: center; margin-top: 0.5rem;">
            <button class="add-button" id="addEntryBtn">➕ Добавить запись →</button>
        </div>
        <div class="sample-note">
            💡 Пример готового стиля: <strong>ATEEZ</strong> - <a href="#" style="text-decoration:none;">(ссылка)</a> <strong>Choi San</strong><br>
            Заполни поля и запись появится в выбранном блоке.
        </div>
    </div>
    <footer>
        🌟 Гостевая книга шоу ON:AIR — K-pop фан-сообщество. Каждая запись в стиле «группа - (ссылка) имя артиста» 🌟
    </footer>
</div>

<script>
    // ----- Хранилище данных -----
    // Структура: { id, name, group, link, gender }  gender: 'boy' / 'girl'
    let entries = [];

    // Загрузка из localStorage, если есть
    function loadFromStorage() {
        const saved = localStorage.getItem('onair_guestbook');
        if (saved) {
            try {
                entries = JSON.parse(saved);
            } catch(e) { console.warn(e); entries = []; }
        }
        if (!entries || entries.length === 0) {
            // Небольшие демо-записи для красоты, чтобы блоки не были пустыми (но можно и без них, но пусть будет мило)
            entries = [
                { id: Date.now() + 1, name: "Choi San", group: "ATEEZ", link: "https://youtu.be/dQw4w9WgXcQ?feature=shared", gender: "boy" },
                { id: Date.now() + 2, name: "Hongjoong", group: "ATEEZ", link: "https://youtube.com", gender: "boy" },
                { id: Date.now() + 3, name: "Hanni", group: "NewJeans", link: "https://youtu.be/example", gender: "girl" },
                { id: Date.now() + 4, name: "Karina", group: "aespa", link: "https://youtu.be/example2", gender: "girl" },
                { id: Date.now() + 5, name: "Yeonjun", group: "TXT", link: "https://youtu.be/example3", gender: "boy" },
                { id: Date.now() + 6, name: "Winter", group: "aespa", link: "https://youtu.be/example4", gender: "girl" }
            ];
            saveToStorage();
        }
    }

    function saveToStorage() {
        localStorage.setItem('onair_guestbook', JSON.stringify(entries));
    }

    // Функция рендеринга двух блоков (мальчики / девочки)
    function renderEntries() {
        const boysContainer = document.getElementById('boysList');
        const girlsContainer = document.getElementById('girlsList');

        // Фильтруем записи
        const boys = entries.filter(entry => entry.gender === 'boy');
        const girls = entries.filter(entry => entry.gender === 'girl');

        // Рендер мальчиков
        if (boys.length === 0) {
            boysContainer.innerHTML = '<div class="empty-message">🎤 пока нет записей для мальчиков, добавь своего любимчика!</div>';
        } else {
            boysContainer.innerHTML = boys.map(entry => createGuestCardHTML(entry)).join('');
        }

        // Рендер девочек
        if (girls.length === 0) {
            girlsContainer.innerHTML = '<div class="empty-message">💖 пока нет записей для девочек, поделись любовью!</div>';
        } else {
            girlsContainer.innerHTML = girls.map(entry => createGuestCardHTML(entry)).join('');
        }
    }

    // Создание HTML карточки в стиле: ateez - (ссылка) choi san
    // По заданию "ateez - (ссылка) choi san"
    function createGuestCardHTML(entry) {
        // Экранирование спецсимволов для защиты XSS
        const safeGroup = escapeHtml(entry.group) || "группа";
        const safeName = escapeHtml(entry.name) || "имя";
        let safeLink = entry.link ? entry.link.trim() : "#";
        // если ссылка невалидная или пустая, то ставим заглушку, но сохраняем возможность клика
        if (safeLink === "" || (!safeLink.startsWith("http://") && !safeLink.startsWith("https://"))) {
            // если ссылка не начинается с протокола, но не пустая, делаем https префикс? но лучше просто заглушка
            if(safeLink !== "#" && safeLink !== "") {
                safeLink = "https://" + safeLink;
            } else {
                safeLink = "#";
            }
        }
        // ссылка с атрибутом target blank для удобства
        // создаем элемент согласно стилю: группа - (ссылка) имя
        // Шаблон: "<span class=\"group-name\">ATEEZ</span> - <a href='ссылка' class='guest-link' target='_blank'>(ссылка)</a> <span class='guest-name'>Choi San</span>"
        return `
            <div class="guest-card" data-id="${entry.id}">
                <div class="guest-line">
                    <span class="group-name">${safeGroup}</span>
                    <span> - </span>
                    <a href="${safeLink}" class="guest-link" target="_blank" rel="noopener noreferrer">(ссылка)</a>
                    <span class="guest-name">${safeName}</span>
                </div>
            </div>
        `;
    }

    // вспомогательная функция экранирования
    function escapeHtml(str) {
        if (!str) return '';
        return str.replace(/[&<>]/g, function(m) {
            if (m === '&') return '&';
            if (m === '<') return '<';
            if (m === '>') return '>';
            return m;
        }).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function(c) {
            return c;
        });
    }

    // Добавление новой записи
    function addEntry() {
        // получаем поля
        const nameInput = document.getElementById('artistName');
        const groupInput = document.getElementById('groupName');
        const linkInput = document.getElementById('linkUrl');
        const genderRadio = document.querySelector('input[name="gender"]:checked');
       
        let name = nameInput.value.trim();
        let group = groupInput.value.trim();
        let link = linkInput.value.trim();
        const gender = genderRadio ? genderRadio.value : 'boy';

        // Валидация: имя и группа обязательны
        if (name === "") {
            alert("❄ Пожалуйста, введите Имя артиста / участника!");
            return;
        }
        if (group === "") {
            alert("🎶 Укажите группу или сольный проект!");
            return;
        }
        // ссылка необязательна, но если ввели — проверяем протокол, но не строго
        let finalLink = link;
        if (finalLink !== "" && !finalLink.startsWith("http://") && !finalLink.startsWith("https://")) {
            // если пользователь ввел что-то типа "youtube.com/..." попробуем добавить https
            finalLink = "https://" + finalLink;
        }
        // Если ссылка пустая, то оставляем пустую строку, но карточка обработает как #, но лучше чтобы ссылка была с заглушкой -
        // но по дизайну ссылка отображается как текст "(ссылка)" – она будет вести на введённый адрес или пустышку.
        // Однако в createGuestCardHTML если safeLink пустой, то ставим "#".
        if(finalLink === "") finalLink = "";   // тогда внутри функции станет '#', ссылка нерабочая но элемент есть.

        // создаем новый объект
        const newEntry = {
            id: Date.now() + Math.random() * 10000,
            name: name,
            group: group,
            link: finalLink,
            gender: gender,
        };

        entries.push(newEntry);
        saveToStorage();
        renderEntries();

        // очищаем форму, кроме радиокнопки (оставляем выбранный пол как был, удобно)
        nameInput.value = "";
        groupInput.value = "";
        linkInput.value = "";
        // можно фокус на имя для удобства
        nameInput.focus();

        // небольшой фидбек (опционально)
        const toastMsg = document.createElement('div');
        toastMsg.innerText = `✨ ${name} добавлен в ${gender === 'boy' ? 'мальчики' : 'девочки'} ✨`;
        toastMsg.style.position = 'fixed';
        toastMsg.style.bottom = '20px';
        toastMsg.style.left = '50%';
        toastMsg.style.transform = 'translateX(-50%)';
        toastMsg.style.backgroundColor = '#1e1a2f';
        toastMsg.style.color = '#fff0f5';
        toastMsg.style.padding = '0.5rem 1.2rem';
        toastMsg.style.borderRadius = '3rem';
        toastMsg.style.fontSize = '0.8rem';
        toastMsg.style.zIndex = '999';
        toastMsg.style.backdropFilter = 'blur(4px)';
        toastMsg.style.fontWeight = '500';
        document.body.appendChild(toastMsg);
        setTimeout(() => toastMsg.remove(), 2000);
    }

    function initDemoIfEmpty() {
        if (entries.length === 0) {
            entries = [
                { id: Date.now() + 10, name: "Choi San", group: "ATEEZ", link: "https://youtu.be/ATEEZ_SAN_fancam", gender: "boy" },
                { id: Date.now() + 11, name: "Jeon Soyeon", group: "(G)I-DLE", link: "https://youtu.be/soyeon_queen", gender: "girl" },
                { id: Date.now() + 12, name: "Felix", group: "Stray Kids", link: "https://youtu.be/felix_skz", gender: "boy" },
                { id: Date.now() + 13, name: "Wonyoung", group: "IVE", link: "https://youtu.be/wonyoung_star", gender: "girl" },
                { id: Date.now() + 14, name: "Beomgyu", group: "TXT", link: "https://youtu.be/beomgyu_melody", gender: "boy" }
            ];
            saveToStorage();
        }
    }

    // Обработчик кнопки добавить
    document.getElementById('addEntryBtn').addEventListener('click', addEntry);

    // Также добавим поддержку Enter в любом поле для удобства (нажатие Enter в любом инпуте добавляет запись)
    const inputs = ['artistName', 'groupName', 'linkUrl'];
    inputs.forEach(id => {
        const el = document.getElementById(id);
        if(el) {
            el.addEventListener('keypress', function(e) {
                if(e.key === 'Enter') {
                    e.preventDefault();
                    addEntry();
                }
            });
        }
    });

    // запуск
    loadFromStorage();
    initDemoIfEmpty();   // повторная страховка
    renderEntries();
</script>
</body>
</html>[/html]

0

8

[hideprofile][html]

<div class="oa-guest">

<div class="oa-guest-card">

  <!--
  ШАПКА ГОСТЕВОЙ.
  ЗДЕСЬ МЕНЯЕМ: МАЛЕНЬКУЮ ПОДПИСЬ, БОЛЬШОЙ ЗАГОЛОВОК И ПОДЗАГОЛОВОК.
  -->
  <div class="oa-guest-top">
    <div>
      <span>ON:AIR GUEST</span>
      <h2>гостевая</h2>
      <em>придержать внешность / задать вопрос / найти своих</em>
    </div>

    <!--
    ПРАВЫЙ БЛОК В ШАПКЕ.
    ЗДЕСЬ МЕНЯЕМ: ЗНАЧОК ✦ И КОРОТКУЮ ПОДПИСЬ.
    -->
    <div class="oa-guest-badge">
      <b>✦</b>
      <span>face claim check</span>
    </div>
  </div>

  <div class="oa-guest-body">

    <!--
    ЛЕВЫЙ ЧЁРНЫЙ ON AIR-БЛОК.
    ЗДЕСЬ МЕНЯЕМ: GUEST ON AIR, WELCOME ROOM, ГОСТЕВАЯ, ФРАЗУ ПОД НАЗВАНИЕМ И МИНИ-ТЕГИ.
    -->
    <div class="oa-guest-machine">

      <div class="oa-guest-display">

        <div class="oa-guest-live">
          <i></i>
          <b>GUEST ON AIR</b>
        </div>

        <div class="oa-guest-title">
          <span>welcome room</span>
          <b>гостевая</b>
          <em>зашёл — придержал эфир</em>
        </div>

        <div class="oa-guest-equalizer">
          <i></i><i></i><i></i><i></i><i></i>
        </div>

        <!--
        МИНИ-ТЕГИ.
        ЛУЧШЕ ПИСАТЬ КОРОТКО: RESERVE, CLAIM, CODE, HELP, FACE.
        -->
        <div class="oa-guest-tags">
          <span>reserve</span>
          <span>claim</span>
          <span>code</span>
          <span>help</span>
        </div>

        <div class="oa-guest-caption">
          appearance reservation desk
        </div>

      </div>

    </div>

    <!--
    ПРАВОЕ ОСНОВНОЕ ОКНО.
    СТРУКТУРА: ОПИСАНИЕ → BOYS/GIRLS → ГЕНЕРАТОР КОДА.
    -->
    <div class="oa-guest-panel">

      <!--
      ОПИСАНИЕ ГОСТЕВОЙ.
      ЗДЕСЬ МЕНЯЕМ ПРИВЕТСТВИЕ, ПРАВИЛА, СРОКИ ПРИДЕРЖАНИЯ И ОБЩИЙ ТЕКСТ.
      -->
      <div class="oa-guest-info">
        <h3>привет!</h3>

        <p>
          Ты находишься в гостевой <b>ON:AIR</b> — здесь можно задать вопрос, найти соигроков,
          уточнить занятость внешности и придержать понравившийся фейс до регистрации.
        </p>

        <p>
          Внешность держится <b>3 дня</b> с возможностью продления ещё на <b>2 дня</b>.
          Для придержания заполни форму ниже или оставь код в теме вручную.
        </p>
      </div>

      <div class="oa-guest-main">

        <div class="oa-guest-lists">

          <!--
          БЛОК BOYS.
          СЮДА АДМИНЫ ВНОСЯТ ПРИДЕРЖАННЫЕ МУЖСКИЕ ВНЕШНОСТИ.
          МОЖНО МЕНЯТЬ ЗАГОЛОВОК BOYS И ТЕКСТ ВНУТРИ .oa-claim-text.
          -->
          <div class="oa-claim-box">
            <h4>boys</h4>

            <div class="oa-claim-text">
              <b>★ за амс</b><br>
              [solo] — park jaebeom<br>
              [nct] — lee jeno<br>
              [nct] — na jaemin<br>
              [zb1] — park gunwook<br><br>

              <b>★ до 27.05</b><br>
              [actor] — имя фамилия<br>
              [solo] — имя фамилия
            </div>
          </div>

          <!--
          БЛОК GIRLS.
          СЮДА АДМИНЫ ВНОСЯТ ПРИДЕРЖАННЫЕ ЖЕНСКИЕ ВНЕШНОСТИ.
          МОЖНО МЕНЯТЬ ЗАГОЛОВОК GIRLS И ТЕКСТ ВНУТРИ .oa-claim-text.
          -->
          <div class="oa-claim-box">
            <h4>girls</h4>

            <div class="oa-claim-text">
              <b>★ за амс</b><br>
              [actress] — lee ji-eun<br><br>

              <b>★ до 27.05</b><br>
              [kep1er] — shen xiaoting<br>
              [solo] — имя фамилия
            </div>
          </div>

        </div>

        <!--
        ГЕНЕРАТОР КОДА.
        ЗДЕСЬ МЕНЯЕМ PLACEHOLDER У ПОЛЕЙ И ТЕКСТЫ НА КНОПКАХ.
        КОД КОПИРУЕТСЯ В ФОРМАТЕ:
        [group] - <a href="ссылка_на_профиль">name surname</a><br>
        ID НЕ ТРОГАТЬ — ОНИ НУЖНЫ ДЛЯ СКРИПТА.
        -->
        <div class="oa-guest-form code-generator">

          <div class="notification" id="result"></div>

          <div class="oa-guest-form-title">
            <b>код придержания</b>
            <span>заполни поля и скопируй готовый шаблон</span>
          </div>

          <div class="input-fields oa-guest-fields">
            <input type="text" id="type" placeholder="group | solo | actor/actress">
            <input type="text" id="name" placeholder="name surname">
            <input type="text" id="link" placeholder="ссылка_на_профиль">
          </div>

          <div class="oa-guest-buttons">
            <button type="button" id="copyButton">скопировать код</button>
            <button type="button" id="copyWithoutLinkButton">скопировать без ссылки</button>
          </div>

          <div class="oa-guest-status">
            код скопируется автоматически после нажатия на кнопку
          </div>

          <textarea id="hiddenTextarea" aria-hidden="true"></textarea>

        </div>

      </div>

    </div>

  </div>

</div>
</div>

<style>
/*
ОБЩАЯ КАРТА ЦВЕТОВ ON:AIR.
ЕСЛИ У ВАС ЭТА КАРТА УЖЕ ЕСТЬ В ОБЩЕМ CSS ФОРУМА, ЭТОТ БЛОК МОЖНО НЕ ДУБЛИРОВАТЬ.
МЕНЯЕМ ЦВЕТА ТУТ — И ВСЕ БЛОКИ, КОТОРЫЕ ПОДВЯЗАНЫ К --OA-GLOBAL-..., МЕНЯЮТСЯ ВМЕСТЕ.
*/

:root {
  --oa-global-pink: #ffb4dc;
  --oa-global-hot-pink: #ff3cac;
  --oa-global-red: #ff6b6b;
  --oa-global-blue: #78dcff;
  --oa-global-mint: #8ff5ec;

  --oa-global-pink-soft: rgba(255,180,220,.28);
  --oa-global-pink-glow: rgba(255,180,220,.17);
  --oa-global-blue-soft: rgba(120,220,255,.22);
  --oa-global-blue-glow: rgba(120,220,255,.18);
  --oa-global-mint-glow: rgba(143,245,236,.35);

  --oa-global-dark: #2f2f31;
  --oa-global-darker: #19191b;

  --oa-global-soft: rgba(244,241,234,.95);
  --oa-global-light: rgba(255,255,255,.86);
  --oa-global-glass: rgba(255,255,255,.72);

  --oa-global-text: #222;
  --oa-global-copy: #666;
  --oa-global-muted: #777;
  --oa-global-overline: #999;
  --oa-global-white: #fff;

  --oa-global-border: rgba(30,30,30,.9);
  --oa-global-shadow: rgba(0,0,0,.15);

  --oa-global-font: Trebuchet MS, Arial, sans-serif;
}

/*
ПОДВЯЗКА ГОСТЕВОЙ К ОБЩЕЙ КАРТЕ ЦВЕТОВ.
ЗДЕСЬ НЕ СТАВИМ ОТДЕЛЬНЫЕ ЦВЕТА, А БЕРЁМ ИХ ИЗ :ROOT.
*/

.oa-guest {
  --oa-pink: var(--oa-global-pink, #ffb4dc);
  --oa-hot-pink: var(--oa-global-hot-pink, #ff3cac);
  --oa-red: var(--oa-global-red, #ff6b6b);
  --oa-blue: var(--oa-global-blue, #78dcff);
  --oa-mint: var(--oa-global-mint, #8ff5ec);

  --oa-pink-soft: var(--oa-global-pink-soft, rgba(255,180,220,.28));
  --oa-pink-glow: var(--oa-global-pink-glow, rgba(255,180,220,.17));
  --oa-blue-soft: var(--oa-global-blue-soft, rgba(120,220,255,.22));
  --oa-blue-glow: var(--oa-global-blue-glow, rgba(120,220,255,.18));
  --oa-mint-glow: var(--oa-global-mint-glow, rgba(143,245,236,.35));

  --oa-dark: var(--oa-global-dark, #2f2f31);
  --oa-darker: var(--oa-global-darker, #19191b);

  --oa-soft: var(--oa-global-soft, rgba(244,241,234,.95));
  --oa-light: var(--oa-global-light, rgba(255,255,255,.86));
  --oa-glass: var(--oa-global-glass, rgba(255,255,255,.72));

  --oa-text: var(--oa-global-text, #222);
  --oa-copy: var(--oa-global-copy, #666);
  --oa-muted: var(--oa-global-muted, #777);
  --oa-overline: var(--oa-global-overline, #999);
  --oa-white: var(--oa-global-white, #fff);

  --oa-border: var(--oa-global-border, rgba(30,30,30,.9));
  --oa-shadow: var(--oa-global-shadow, rgba(0,0,0,.15));

  width: min(900px, 100%);
  max-width: calc(100vw - 20px);
  margin: 30px auto;
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
  color: var(--oa-text);
}

.oa-guest,
.oa-guest *,
.oa-guest *:before,
.oa-guest *:after {
  box-sizing: border-box;
}

.oa-guest-card {
  padding: 26px;
  border-radius: 36px;
  background:
    radial-gradient(circle at 10% 0%, var(--oa-blue-soft), transparent 32%),
    radial-gradient(circle at 90% 8%, var(--oa-pink-soft), transparent 34%),
    linear-gradient(135deg, var(--oa-white), #fbfaf7);
  box-shadow: 0 18px 45px var(--oa-shadow);
  border: 2px solid var(--oa-border);
}

/*
ШАПКА.
ЗДЕСЬ МЕНЯЮТСЯ РАЗМЕРЫ, ШРИФТЫ И ОТСТУПЫ ВЕРХНЕЙ ЧАСТИ.
*/

.oa-guest-top {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 20px;
  margin-bottom: 22px;
}

.oa-guest-top span {
  display: block;
  font-size: 11px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--oa-overline);
}

.oa-guest-top h2 {
  margin: 4px 0 4px;
  font-size: 38px;
  line-height: 1;
  font-family: Georgia, serif;
  font-style: italic;
  font-weight: normal;
}

.oa-guest-top em {
  font-style: normal;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 2px;
  color: var(--oa-muted);
}

.oa-guest-badge {
  min-width: 155px;
  padding: 13px 16px;
  border-radius: 22px;
  background: var(--oa-glass);
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.06);
  text-align: right;
}

.oa-guest-badge b {
  display: block;
  font-size: 28px;
  line-height: 1;
  color: var(--oa-hot-pink);
}

.oa-guest-badge span {
  font-size: 11px;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--oa-muted);
}

/*
ОБЩАЯ СЕТКА.
245PX — ШИРИНА ЧЁРНОГО БЛОКА СЛЕВА.
1FR — ПРАВОЕ ИНФОРМАТИВНОЕ ОКНО.
*/

.oa-guest-body {
  display: grid;
  grid-template-columns: 245px 1fr;
  gap: 22px;
  align-items: stretch;
}

/*
ЛЕВЫЙ ЧЁРНЫЙ БЛОК.
ТУТ МЕНЯЮТСЯ РАЗМЕРЫ, ФОН, ОТСТУПЫ И СКРУГЛЕНИЯ ON AIR-БЛОКА.
*/

.oa-guest-machine {
  border-radius: 30px;
  padding: 16px;
  background:
    linear-gradient(180deg, var(--oa-dark), var(--oa-darker));
  box-shadow:
    inset 0 0 0 2px rgba(255,255,255,.12),
    0 16px 30px rgba(0,0,0,.18);
}

.oa-guest-display {
  position: relative;
  min-height: 390px;
  height: 100%;
  border-radius: 24px;
  overflow: hidden;
  padding: 18px;
  background:
    radial-gradient(circle at 80% 10%, var(--oa-pink-glow), transparent 35%),
    radial-gradient(circle at 15% 85%, var(--oa-blue-glow), transparent 34%),
    linear-gradient(135deg, rgba(255,255,255,.16), rgba(120,220,255,.06));
  box-shadow: inset 0 0 0 1px rgba(255,255,255,.28);
}

.oa-guest-display:after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(120deg, transparent 0 35%, rgba(255,255,255,.16) 45%, transparent 58%);
  pointer-events: none;
}

.oa-guest-live {
  position: relative;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 8px 12px;
  border-radius: 999px;
  background: rgba(0,0,0,.28);
  color: var(--oa-white);
  font-size: 11px;
  letter-spacing: 2px;
}

.oa-guest-live i {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--oa-hot-pink);
  box-shadow: 0 0 12px rgba(255,60,172,.75);
}

.oa-guest-title {
  position: relative;
  z-index: 2;
  margin-top: 26px;
  color: var(--oa-white);
}

.oa-guest-title span {
  display: block;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 3px;
  color: rgba(255,255,255,.62);
}

.oa-guest-title b {
  display: block;
  margin-top: 8px;
  font-size: 31px;
  line-height: 1.05;
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
  font-weight: bold;
  text-transform: lowercase;
  letter-spacing: -.5px;
}

.oa-guest-title em {
  display: block;
  margin-top: 12px;
  padding: 10px 12px;
  border-radius: 16px;
  background: rgba(255,255,255,.10);
  font-style: normal;
  font-size: 12px;
  line-height: 1.35;
  color: rgba(255,255,255,.82);
}

.oa-guest-equalizer {
  position: relative;
  z-index: 2;
  height: 74px;
  margin-top: 32px;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: 8px;
}

.oa-guest-equalizer i {
  display: block;
  width: 12px;
  border-radius: 999px;
  background: linear-gradient(180deg, var(--oa-mint), var(--oa-pink));
  box-shadow: 0 0 12px var(--oa-mint-glow);
}

.oa-guest-equalizer i:nth-child(1) { height: 29px; }
.oa-guest-equalizer i:nth-child(2) { height: 58px; }
.oa-guest-equalizer i:nth-child(3) { height: 42px; }
.oa-guest-equalizer i:nth-child(4) { height: 68px; }
.oa-guest-equalizer i:nth-child(5) { height: 35px; }

.oa-guest-tags {
  position: relative;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
  margin-top: 28px;
}

.oa-guest-tags span {
  padding: 6px 9px;
  border-radius: 999px;
  background: rgba(255,255,255,.12);
  color: rgba(255,255,255,.82);
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 1px;
}

.oa-guest-caption {
  position: relative;
  z-index: 2;
  margin-top: 15px;
  padding: 11px;
  border-radius: 16px;
  background: rgba(255,255,255,.10);
  color: rgba(255,255,255,.75);
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 1.4px;
  font-size: 9px;
}

/*
ПРАВОЕ ИНФОРМАТИВНОЕ ОКНО.
ЗДЕСЬ МЕНЯЕТСЯ ФОН, ОТСТУПЫ, СКРУГЛЕНИЕ И ОБЩАЯ ВЫСОТА ПРАВОГО БЛОКА.
*/

.oa-guest-panel {
  min-width: 0;
  min-height: 100%;
  padding: 18px;
  border-radius: 30px;
  background:
    radial-gradient(circle at 92% 8%, var(--oa-blue-glow), transparent 34%),
    rgba(255,255,255,.68);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.7),
    0 12px 25px rgba(0,0,0,.08);
}

.oa-guest-info {
  padding: 18px;
  border-radius: 24px;
  background:
    radial-gradient(circle at 92% 10%, var(--oa-pink-soft), transparent 34%),
    var(--oa-light);
  box-shadow: 0 12px 25px rgba(0,0,0,.07);
  margin-bottom: 16px;
}

.oa-guest-info h3 {
  margin: 0 0 10px;
  font-size: 25px;
  line-height: 1;
  text-transform: lowercase;
}

.oa-guest-info p {
  margin: 0 0 9px;
  color: var(--oa-copy);
  line-height: 1.5;
  font-size: 13px;
}

.oa-guest-info p:last-child {
  margin-bottom: 0;
}

/*
ПРАВАЯ НИЖНЯЯ ЧАСТЬ.
СТРУКТУРА: BOYS/GIRLS ГОРИЗОНТАЛЬНО, ГЕНЕРАТОР КОДА СНИЗУ.
*/

.oa-guest-main {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}

.oa-guest-lists {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
}

/*
ОКНА BOYS / GIRLS.
ЗДЕСЬ МЕНЯЕТСЯ ВЫСОТА, ФОН, СКРУГЛЕНИЕ, ШРИФТЫ И ВНУТРЕННИЕ ОТСТУПЫ СПИСКОВ.
*/

.oa-claim-box {
  position: relative;
  min-height: 225px;
  border-radius: 24px;
  background: var(--oa-light);
  box-shadow: 0 12px 25px rgba(0,0,0,.08);
  padding: 30px 14px 14px;
}

.oa-claim-box h4 {
  position: absolute;
  top: -9px;
  left: 22px;
  right: 22px;
  margin: 0;
  padding: 6px 10px;
  border-radius: 12px;
  background: linear-gradient(135deg, var(--oa-dark), var(--oa-darker));
  color: var(--oa-white);
  text-align: center;
  font-size: 12px;
  text-transform: lowercase;
  letter-spacing: 1px;
}

.oa-claim-text {
  font-family: monospace;
  font-size: 11px;
  line-height: 1.35;
  color: var(--oa-text);
  white-space: normal;
}

/*
ГЕНЕРАТОР КОДА.
ЗДЕСЬ МЕНЯЕТСЯ ФОН, РАСПОЛОЖЕНИЕ ПОЛЕЙ, КНОПКИ И ТЕКСТ СТАТУСА.
*/

.oa-guest-form {
  position: relative;
  padding: 15px;
  border-radius: 24px;
  background:
    radial-gradient(circle at 92% 10%, var(--oa-pink-glow), transparent 34%),
    var(--oa-light);
  box-shadow: 0 12px 25px rgba(0,0,0,.07);
}

.oa-guest-form-title {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  align-items: center;
  margin-bottom: 12px;
}

.oa-guest-form-title b {
  display: block;
  font-size: 18px;
  line-height: 1;
  text-transform: lowercase;
}

.oa-guest-form-title span {
  display: block;
  color: var(--oa-muted);
  font-size: 11px;
  line-height: 1.25;
  text-align: right;
}

.oa-guest-fields {
  display: grid;
  grid-template-columns: 1fr 1fr 1.25fr;
  gap: 9px;
  margin-bottom: 10px;
}

/*
ПОЛЯ ЗАПОЛНЕНИЯ В ГЕНЕРАТОРЕ.
ЗДЕСЬ МЕНЯЕТСЯ ЗАЛИВКА, ОБВОДКА, ТЕНЬ, РАЗМЕР ШРИФТА И ОТСТУПЫ ПОЛЕЙ.
*/

.oa-guest-form input {
  width: 100%;
  border: 1px solid rgba(47,47,49,.22);
  outline: 0;
  border-radius: 999px;
  background:
    linear-gradient(135deg, rgba(255,255,255,.95), rgba(244,241,234,.92));
  color: var(--oa-text);
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
  font-size: 12px;
  padding: 11px 13px;
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.75),
    0 5px 12px rgba(0,0,0,.05);
  transition: .22s;
}

.oa-guest-form input::placeholder {
  color: rgba(34,34,34,.45);
}

.oa-guest-form input:focus {
  border-color: var(--oa-hot-pink);
  background: var(--oa-white);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.9),
    0 0 0 3px var(--oa-pink-soft),
    0 8px 16px rgba(0,0,0,.07);
}

.oa-guest-buttons {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 9px;
  margin-bottom: 10px;
}

.oa-guest-buttons button {
  border: 0;
  border-radius: 999px;
  background: linear-gradient(135deg, var(--oa-dark), var(--oa-darker));
  color: var(--oa-white);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: .6px;
  padding: 10px 8px;
  cursor: pointer;
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
}

.oa-guest-buttons button:hover {
  background: linear-gradient(135deg, var(--oa-red), var(--oa-hot-pink));
}

.oa-guest-status {
  padding: 9px 12px;
  border-radius: 16px;
  background: var(--oa-soft);
  color: var(--oa-muted);
  font-size: 10px;
  line-height: 1.35;
  text-align: center;
}

/*
ВСПЛЫВАЮЩЕЕ УВЕДОМЛЕНИЕ ГЕНЕРАТОРА.
ЗДЕСЬ МЕНЯЕТСЯ ВИД СООБЩЕНИЯ "КОД СКОПИРОВАН" / "ЗАПОЛНИТЕ ПОЛЯ".
*/

.oa-guest .notification {
  position: fixed;
  left: 50%;
  bottom: 28px;
  z-index: 99999;
  transform: translateX(-50%) translateY(18px);
  padding: 12px 18px;
  border-radius: 999px;
  background: linear-gradient(135deg, var(--oa-dark), var(--oa-darker));
  color: var(--oa-white);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  box-shadow: 0 12px 28px rgba(0,0,0,.25);
  opacity: 0;
  pointer-events: none;
  transition: .25s;
}

.oa-guest .notification.show {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}

/*
СКРЫТОЕ ПОЛЕ ДЛЯ КОПИРОВАНИЯ.
ВАЖНО: POSITION FIXED НУЖЕН, ЧТОБЫ НА ТЕЛЕФОНЕ НЕ КИДАЛО ВВЕРХ ПРИ КОПИРОВАНИИ.
*/

#hiddenTextarea {
  position: fixed;
  left: 0;
  top: 0;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
  z-index: -1;
}

/*
АДАПТИВ.
ЗДЕСЬ МЕНЯЕТСЯ ОТОБРАЖЕНИЕ НА ПЛАНШЕТАХ И ТЕЛЕФОНАХ.
*/

@media (max-width: 820px) {
  .oa-guest-body {
    display: block;
  }

  .oa-guest-machine {
    margin-bottom: 18px;
  }

  .oa-guest-display {
    min-height: 260px;
  }

  .oa-guest-main {
    grid-template-columns: 1fr;
  }

  .oa-guest-fields {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 620px) {
  .oa-guest {
    max-width: calc(100vw - 12px);
    margin: 16px auto;
  }

  .oa-guest-card {
    padding: 18px;
    border-radius: 26px;
  }

  .oa-guest-top {
    display: block;
  }

  .oa-guest-top h2 {
    font-size: 31px;
  }

  .oa-guest-top em {
    font-size: 10px;
    line-height: 1.45;
  }

  .oa-guest-badge {
    width: 100%;
    min-width: 0;
    margin-top: 15px;
    text-align: left;
  }

  .oa-guest-lists {
    grid-template-columns: 1fr;
  }

  .oa-claim-box {
    min-height: 190px;
  }

  .oa-guest-buttons {
    grid-template-columns: 1fr;
  }

  .oa-guest-form-title {
    display: block;
  }

  .oa-guest-form-title span {
    margin-top: 5px;
    text-align: left;
  }

  .oa-guest-info,
  .oa-guest-panel,
  .oa-guest-form {
    padding: 15px;
  }
}

@media (max-width: 420px) {
  .oa-guest-card {
    padding: 14px;
    border-radius: 22px;
  }

  .oa-guest-top h2 {
    font-size: 28px;
  }

  .oa-guest-title b {
    font-size: 25px;
  }
}
</style>

<script>
document.getElementById('copyButton').addEventListener('click', function(event) {
    event.preventDefault();

    var type = document.getElementById('type').value.trim();
    var name = document.getElementById('name').value.trim();
    var link = document.getElementById('link').value.trim();
    var resultElement = document.getElementById('result');

    if (!type || !name || !link) {
        resultElement.textContent = 'Пожалуйста, заполните все поля!';
        resultElement.classList.add('show');

        setTimeout(function() {
            resultElement.classList.remove('show');
        }, 2000);

        return false;
    }

    var code = '[' + type + '] - <a href="' + link + '">' + name + '</a><br>';

    copyToClipboard(code, resultElement);

    return false;
});

document.getElementById('copyWithoutLinkButton').addEventListener('click', function(event) {
    event.preventDefault();

    var type = document.getElementById('type').value.trim();
    var name = document.getElementById('name').value.trim();
    var resultElement = document.getElementById('result');

    if (!type || !name) {
        resultElement.textContent = 'Пожалуйста, заполните тип и имя!';
        resultElement.classList.add('show');

        setTimeout(function() {
            resultElement.classList.remove('show');
        }, 2000);

        return false;
    }

    var code = '[' + type + '] - ' + name + '<br>';

    copyToClipboard(code, resultElement);

    return false;
});

function copyToClipboard(code, resultElement) {
    var scrollX = window.pageXOffset || document.documentElement.scrollLeft;
    var scrollY = window.pageYOffset || document.documentElement.scrollTop;

    var textarea = document.getElementById('hiddenTextarea');

    textarea.value = code;

    try {
        textarea.focus({ preventScroll: true });
    } catch(e) {
        textarea.focus();
    }

    textarea.select();
    textarea.setSelectionRange(0, textarea.value.length);

    try {
        var successful = document.execCommand('copy');

        if (successful) {
            showGuestNotice(resultElement, '✓ код скопирован');
        } else {
            showGuestNotice(resultElement, 'Ошибка копирования');
        }
    } catch (err) {
        showGuestNotice(resultElement, 'Ошибка копирования');
    }

    setTimeout(function() {
        window.scrollTo(scrollX, scrollY);
    }, 0);

    if (navigator.clipboard) {
        navigator.clipboard.writeText(code).catch(function(err) {
            console.error('Clipboard API error:', err);
        });
    }
}

function showGuestNotice(resultElement, text) {
    resultElement.textContent = text;
    resultElement.classList.add('show');

    setTimeout(function() {
        resultElement.classList.remove('show');
    }, 2000);
}
</script>

[/html]
[/hideprofile]

0

9

[hideprofile][html]

<div class="oa-faces">

<div class="oa-faces-card">

  <!--
  ШАПКА ЗАНЯТЫХ ВНЕШНОСТЕЙ.
  ЗДЕСЬ МЕНЯЕМ: МАЛЕНЬКУЮ ПОДПИСЬ, БОЛЬШОЙ ЗАГОЛОВОК И ПОДЗАГОЛОВОК.
  -->
  <div class="oa-faces-top">
    <div>
      <span>ON:AIR FACE CLAIM</span>
      <h2>занятые внешности</h2>
      <em>актуальный список занятых фейсов</em>
    </div>

    <!--
    ПРАВЫЙ БЛОК В ШАПКЕ.
    ЗДЕСЬ МЕНЯЕМ: ЗНАЧОК ✦ И КОРОТКУЮ ПОДПИСЬ.
    -->
    <div class="oa-faces-badge">
      <b>✦</b>
      <span>ctrl + f для поиска</span>
    </div>
  </div>

  <div class="oa-faces-body">

    <!--
    ЛЕВЫЙ ЧЁРНЫЙ ON AIR-БЛОК.
    ЗДЕСЬ МЕНЯЕМ: FACE ON AIR, FACE CLAIM, ЗАНЯТЫЕ, ФРАЗУ ПОД НАЗВАНИЕМ И МИНИ-ТЕГИ.
    -->
    <div class="oa-faces-machine">

      <div class="oa-faces-display">

        <div class="oa-faces-live">
          <i></i>
          <b>FACE ON AIR</b>
        </div>

        <div class="oa-faces-title">
          <span>face claim</span>
          <b>занятые</b>
          <em>проверяй фейс до подачи анкеты</em>
        </div>

        <div class="oa-faces-equalizer">
          <i></i><i></i><i></i><i></i><i></i>
        </div>

        <!--
        МИНИ-ТЕГИ.
        ЛУЧШЕ ПИСАТЬ КОРОТКО: BOYS, GIRLS, CLAIM, SEARCH.
        -->
        <div class="oa-faces-tags">
          <span>boys</span>
          <span>girls</span>
          <span>claim</span>
          <span>search</span>
        </div>

        <div class="oa-faces-caption">
          occupied appearance list
        </div>

      </div>

    </div>

    <!--
    ПРАВОЕ ОСНОВНОЕ ОКНО.
    СТРУКТУРА: ОПИСАНИЕ → BOYS/GIRLS.
    -->
    <div class="oa-faces-panel">

      <!--
      ОПИСАНИЕ ТЕМЫ.
      ЗДЕСЬ МЕНЯЕМ ПРАВИЛА, ПОЯСНЕНИЯ И СРОКИ.
      -->
      <div class="oa-faces-info">
        <h3>как пользоваться списком?</h3>

        <p>
          Внешность считается занятой после принятия анкеты. Перед регистрацией проверьте список через поиск по странице:
          <b>ctrl + f</b>.
        </p>

        <p>
          О возможном освобождении желаемой внешности можно узнать в гостевой или в списках на удаление.
          Список придержанных и выкупленных внешностей находится в гостевой.
        </p>
      </div>

      <div class="oa-faces-main">

        <!--
        БЛОК BOYS.
        СЮДА АДМИНЫ ВНОСЯТ ЗАНЯТЫЕ МУЖСКИЕ ВНЕШНОСТИ.
        ЧТОБЫ ДОБАВИТЬ НОВУЮ БУКВЕННУЮ СЕКЦИЮ — СКОПИРОВАТЬ .oa-face-section.
        -->
        <div class="oa-face-column oa-face-boys">

          <div class="oa-face-title">boys</div>

          <div class="oa-face-scroll">

            <div class="oa-face-section">
              <div class="oa-face-letter">A — B — C — D</div>
              <div class="oa-face-list">
                <b>actor</b> - Lee Minho<br>
                <b>actor</b> - Kim Woobin
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">E — F — G — H</div>
              <div class="oa-face-list">
                <b>EXO</b> - Park Chanyeol
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">I — J — K — L</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">M — N — O — P</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">Q — R — S — T</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">U — V — W — X — Y — Z</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

          </div>

        </div>

        <!--
        БЛОК GIRLS.
        СЮДА АДМИНЫ ВНОСЯТ ЗАНЯТЫЕ ЖЕНСКИЕ ВНЕШНОСТИ.
        ЧТОБЫ ДОБАВИТЬ НОВУЮ БУКВЕННУЮ СЕКЦИЮ — СКОПИРОВАТЬ .oa-face-section.
        -->
        <div class="oa-face-column oa-face-girls">

          <div class="oa-face-title">girls</div>

          <div class="oa-face-scroll">

            <div class="oa-face-section">
              <div class="oa-face-letter">A — B — C — D</div>
              <div class="oa-face-list">
                <b>actress</b> - Lee Bona<br>
                <b>actress</b> - Park Sinhyo
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">E — F — G — H</div>
              <div class="oa-face-list">
                <b>EVERGLOW</b> - chto-to tam
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">I — J — K — L</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">M — N — O — P</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">Q — R — S — T</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">U — V — W — X — Y — Z</div>
              <div class="oa-face-list">
                ...
              </div>
            </div>

          </div>

        </div>

      </div>

    </div>

  </div>

</div>
</div>

<style>
/*
ОБЩАЯ КАРТА ЦВЕТОВ ON:AIR.
ЕСЛИ У ВАС ЭТА КАРТА УЖЕ ЕСТЬ В ОБЩЕМ CSS ФОРУМА, ЭТОТ БЛОК МОЖНО НЕ ДУБЛИРОВАТЬ.
МЕНЯЕМ ЦВЕТА ТУТ — И ВСЕ БЛОКИ, КОТОРЫЕ ПОДВЯЗАНЫ К --OA-GLOBAL-..., МЕНЯЮТСЯ ВМЕСТЕ.
*/

:root {
  --oa-global-pink: #ffb4dc;
  --oa-global-hot-pink: #ff3cac;
  --oa-global-red: #ff6b6b;
  --oa-global-blue: #78dcff;
  --oa-global-mint: #8ff5ec;

  --oa-global-pink-soft: rgba(255,180,220,.28);
  --oa-global-pink-glow: rgba(255,180,220,.17);
  --oa-global-blue-soft: rgba(120,220,255,.22);
  --oa-global-blue-glow: rgba(120,220,255,.18);
  --oa-global-mint-glow: rgba(143,245,236,.35);

  --oa-global-dark: #2f2f31;
  --oa-global-darker: #19191b;

  --oa-global-soft: rgba(244,241,234,.95);
  --oa-global-light: rgba(255,255,255,.86);
  --oa-global-glass: rgba(255,255,255,.72);

  --oa-global-text: #222;
  --oa-global-copy: #666;
  --oa-global-muted: #777;
  --oa-global-overline: #999;
  --oa-global-white: #fff;

  --oa-global-border: rgba(30,30,30,.9);
  --oa-global-shadow: rgba(0,0,0,.15);

  --oa-global-font: Trebuchet MS, Arial, sans-serif;
}

/*
ПОДВЯЗКА ЗАНЯТЫХ ВНЕШНОСТЕЙ К ОБЩЕЙ КАРТЕ ЦВЕТОВ.
ЗДЕСЬ НЕ СТАВИМ ОТДЕЛЬНЫЕ ЦВЕТА, А БЕРЁМ ИХ ИЗ :ROOT.
*/

.oa-faces {
  --oa-pink: var(--oa-global-pink, #ffb4dc);
  --oa-hot-pink: var(--oa-global-hot-pink, #ff3cac);
  --oa-red: var(--oa-global-red, #ff6b6b);
  --oa-blue: var(--oa-global-blue, #78dcff);
  --oa-mint: var(--oa-global-mint, #8ff5ec);

  --oa-pink-soft: var(--oa-global-pink-soft, rgba(255,180,220,.28));
  --oa-pink-glow: var(--oa-global-pink-glow, rgba(255,180,220,.17));
  --oa-blue-soft: var(--oa-global-blue-soft, rgba(120,220,255,.22));
  --oa-blue-glow: var(--oa-global-blue-glow, rgba(120,220,255,.18));
  --oa-mint-glow: var(--oa-global-mint-glow, rgba(143,245,236,.35));

  --oa-dark: var(--oa-global-dark, #2f2f31);
  --oa-darker: var(--oa-global-darker, #19191b);

  --oa-soft: var(--oa-global-soft, rgba(244,241,234,.95));
  --oa-light: var(--oa-global-light, rgba(255,255,255,.86));
  --oa-glass: var(--oa-global-glass, rgba(255,255,255,.72));

  --oa-text: var(--oa-global-text, #222);
  --oa-copy: var(--oa-global-copy, #666);
  --oa-muted: var(--oa-global-muted, #777);
  --oa-overline: var(--oa-global-overline, #999);
  --oa-white: var(--oa-global-white, #fff);

  --oa-border: var(--oa-global-border, rgba(30,30,30,.9));
  --oa-shadow: var(--oa-global-shadow, rgba(0,0,0,.15));

  width: min(900px, 100%);
  max-width: calc(100vw - 20px);
  margin: 30px auto;
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
  color: var(--oa-text);
}

.oa-faces,
.oa-faces *,
.oa-faces *:before,
.oa-faces *:after {
  box-sizing: border-box;
}

.oa-faces-card {
  padding: 26px;
  border-radius: 36px;
  background:
    radial-gradient(circle at 10% 0%, var(--oa-blue-soft), transparent 32%),
    radial-gradient(circle at 90% 8%, var(--oa-pink-soft), transparent 34%),
    linear-gradient(135deg, var(--oa-white), #fbfaf7);
  box-shadow: 0 18px 45px var(--oa-shadow);
  border: 2px solid var(--oa-border);
}

/*
ШАПКА.
ЗДЕСЬ МЕНЯЮТСЯ РАЗМЕРЫ, ШРИФТЫ И ОТСТУПЫ ВЕРХНЕЙ ЧАСТИ.
*/

.oa-faces-top {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 20px;
  margin-bottom: 22px;
}

.oa-faces-top span {
  display: block;
  font-size: 11px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--oa-overline);
}

.oa-faces-top h2 {
  margin: 4px 0 4px;
  font-size: 38px;
  line-height: 1;
  font-family: Georgia, serif;
  font-style: italic;
  font-weight: normal;
  text-transform: lowercase;
}

.oa-faces-top em {
  font-style: normal;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 2px;
  color: var(--oa-muted);
}

.oa-faces-badge {
  min-width: 160px;
  padding: 13px 16px;
  border-radius: 22px;
  background: var(--oa-glass);
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.06);
  text-align: right;
}

.oa-faces-badge b {
  display: block;
  font-size: 28px;
  line-height: 1;
  color: var(--oa-hot-pink);
}

.oa-faces-badge span {
  font-size: 11px;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--oa-muted);
}

/*
ОБЩАЯ СЕТКА.
205PX — ШИРИНА ЧЁРНОГО БЛОКА СЛЕВА.
МОЖНО СДЕЛАТЬ ЕЩЁ УЖЕ: 190PX.
*/

.oa-faces-body {
  display: grid;
  grid-template-columns: 205px 1fr;
  gap: 22px;
  align-items: stretch;
}

/*
ЛЕВЫЙ ЧЁРНЫЙ БЛОК.
ТУТ МЕНЯЮТСЯ РАЗМЕРЫ, ФОН, ОТСТУПЫ И СКРУГЛЕНИЯ ON AIR-БЛОКА.
*/

.oa-faces-machine {
  border-radius: 26px;
  padding: 13px;
  background:
    linear-gradient(180deg, var(--oa-dark), var(--oa-darker));
  box-shadow:
    inset 0 0 0 2px rgba(255,255,255,.12),
    0 16px 30px rgba(0,0,0,.18);
}

.oa-faces-display {
  position: relative;
  min-height: 500px;
  height: 100%;
  border-radius: 22px;
  overflow: hidden;
  padding: 16px;
  background:
    radial-gradient(circle at 80% 10%, var(--oa-pink-glow), transparent 35%),
    radial-gradient(circle at 15% 85%, var(--oa-blue-glow), transparent 34%),
    linear-gradient(135deg, rgba(255,255,255,.16), rgba(120,220,255,.06));
  box-shadow: inset 0 0 0 1px rgba(255,255,255,.28);
}

.oa-faces-display:after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(120deg, transparent 0 35%, rgba(255,255,255,.16) 45%, transparent 58%);
  pointer-events: none;
}

.oa-faces-live {
  position: relative;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  border-radius: 999px;
  background: rgba(0,0,0,.28);
  color: var(--oa-white);
  font-size: 10px;
  letter-spacing: 1.5px;
}

.oa-faces-live i {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--oa-hot-pink);
  box-shadow: 0 0 12px rgba(255,60,172,.75);
}

.oa-faces-title {
  position: relative;
  z-index: 2;
  margin-top: 24px;
  color: var(--oa-white);
}

.oa-faces-title span {
  display: block;
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 2.5px;
  color: rgba(255,255,255,.62);
}

.oa-faces-title b {
  display: block;
  margin-top: 8px;
  font-size: 26px;
  line-height: 1.05;
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
  font-weight: bold;
  text-transform: lowercase;
  letter-spacing: -.5px;
}

.oa-faces-title em {
  display: block;
  margin-top: 12px;
  padding: 10px 11px;
  border-radius: 16px;
  background: rgba(255,255,255,.10);
  font-style: normal;
  font-size: 11px;
  line-height: 1.35;
  color: rgba(255,255,255,.82);
}

.oa-faces-equalizer {
  position: relative;
  z-index: 2;
  height: 64px;
  margin-top: 28px;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: 7px;
}

.oa-faces-equalizer i {
  display: block;
  width: 10px;
  border-radius: 999px;
  background: linear-gradient(180deg, var(--oa-mint), var(--oa-pink));
  box-shadow: 0 0 12px var(--oa-mint-glow);
}

.oa-faces-equalizer i:nth-child(1) { height: 25px; }
.oa-faces-equalizer i:nth-child(2) { height: 50px; }
.oa-faces-equalizer i:nth-child(3) { height: 36px; }
.oa-faces-equalizer i:nth-child(4) { height: 58px; }
.oa-faces-equalizer i:nth-child(5) { height: 30px; }

.oa-faces-tags {
  position: relative;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 28px;
}

.oa-faces-tags span {
  padding: 6px 8px;
  border-radius: 999px;
  background: rgba(255,255,255,.12);
  color: rgba(255,255,255,.82);
  font-size: 8px;
  text-transform: uppercase;
  letter-spacing: .8px;
}

.oa-faces-caption {
  position: relative;
  z-index: 2;
  margin-top: 15px;
  padding: 10px;
  border-radius: 16px;
  background: rgba(255,255,255,.10);
  color: rgba(255,255,255,.75);
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  font-size: 8px;
}

/*
ПРАВОЕ ИНФОРМАТИВНОЕ ОКНО.
ЗДЕСЬ МЕНЯЕТСЯ ФОН, ОТСТУПЫ, СКРУГЛЕНИЕ И ОБЩАЯ ВЫСОТА ПРАВОГО БЛОКА.
*/

.oa-faces-panel {
  min-width: 0;
  min-height: 100%;
  padding: 18px;
  border-radius: 30px;
  background:
    radial-gradient(circle at 92% 8%, var(--oa-blue-glow), transparent 34%),
    rgba(255,255,255,.68);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.7),
    0 12px 25px rgba(0,0,0,.08);
}

.oa-faces-info {
  padding: 18px;
  border-radius: 24px;
  background:
    radial-gradient(circle at 92% 10%, var(--oa-pink-soft), transparent 34%),
    var(--oa-light);
  box-shadow: 0 12px 25px rgba(0,0,0,.07);
  margin-bottom: 16px;
}

.oa-faces-info h3 {
  margin: 0 0 10px;
  font-size: 25px;
  line-height: 1;
  text-transform: lowercase;
}

.oa-faces-info p {
  margin: 0 0 9px;
  color: var(--oa-copy);
  line-height: 1.5;
  font-size: 13px;
}

.oa-faces-info p:last-child {
  margin-bottom: 0;
}

/*
СПИСКИ BOYS / GIRLS.
ЗДЕСЬ МЕНЯЕТСЯ ОБЩАЯ СЕТКА ДВУХ КОЛОНОК.
*/

.oa-faces-main {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
}

/*
КОЛОНКИ BOYS / GIRLS.
ЗДЕСЬ МЕНЯЕТСЯ ФОН, ВЫСОТА, СКРУГЛЕНИЕ И ОТСТУПЫ.
*/

.oa-face-column {
  position: relative;
  border-radius: 24px;
  background: var(--oa-light);
  box-shadow: 0 12px 25px rgba(0,0,0,.08);
  padding: 30px 14px 14px;
  min-height: 360px;
}

.oa-face-title {
  position: absolute;
  top: -9px;
  left: 22px;
  right: 22px;
  margin: 0;
  padding: 6px 10px;
  border-radius: 12px;
  background: linear-gradient(135deg, var(--oa-dark), var(--oa-darker));
  color: var(--oa-white);
  text-align: center;
  font-size: 12px;
  text-transform: lowercase;
  letter-spacing: 1px;
}

.oa-face-boys .oa-face-title {
  box-shadow: 0 0 14px rgba(120,220,255,.22);
}

.oa-face-girls .oa-face-title {
  box-shadow: 0 0 14px rgba(255,60,172,.18);
}

/*
ВНУТРЕННИЙ СКРОЛЛ КОЛОНОК.
HEIGHT — ВЫСОТА ВИДИМОЙ ЧАСТИ СПИСКА.
*/

.oa-face-scroll {
  height: 315px;
  overflow-y: auto;
  padding-right: 7px;
}

.oa-face-scroll::-webkit-scrollbar {
  width: 6px;
}

.oa-face-scroll::-webkit-scrollbar-track {
  background: rgba(230,225,218,.65);
  border-radius: 20px;
}

.oa-face-scroll::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, var(--oa-blue), var(--oa-pink));
  border-radius: 20px;
}

/*
БУКВЕННЫЕ СЕКЦИИ.
ЗДЕСЬ МЕНЯЕТСЯ ВИД ОДНОГО БЛОКА A-B-C-D И Т.Д.
*/

.oa-face-section {
  padding: 11px;
  border-radius: 18px;
  background: rgba(255,255,255,.70);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.7),
    0 8px 16px rgba(0,0,0,.04);
  margin-bottom: 12px;
}

.oa-face-section:last-child {
  margin-bottom: 0;
}

.oa-face-letter {
  padding: 7px 10px;
  border-radius: 999px;
  background:
    linear-gradient(135deg, rgba(255,255,255,.95), rgba(244,241,234,.92));
  border: 1px solid rgba(47,47,49,.10);
  color: var(--oa-muted);
  text-align: center;
  font-size: 11px;
  letter-spacing: 1.8px;
  text-transform: uppercase;
  margin-bottom: 9px;
}

.oa-face-list {
  text-align: center;
  color: var(--oa-text);
  font-size: 12px;
  line-height: 1.55;
  text-transform: lowercase;
}

.oa-face-list b {
  color: var(--oa-text);
}

/*
АДАПТИВ.
НА ПЛАНШЕТАХ ЧЁРНЫЙ БЛОК УХОДИТ НАВЕРХ, СПИСКИ ОСТАЮТСЯ НИЖЕ.
*/

@media (max-width: 820px) {
  .oa-faces-body {
    display: block;
  }

  .oa-faces-machine {
    margin-bottom: 18px;
  }

  .oa-faces-display {
    min-height: 260px;
  }

  .oa-faces-main {
    grid-template-columns: 1fr;
  }

  .oa-face-scroll {
    height: auto;
    max-height: 320px;
  }
}

/*
АДАПТИВ ТЕЛЕФОНА.
ЗДЕСЬ МЕНЯЕТСЯ РАЗМЕР ШАПКИ, ОТСТУПЫ И СКРУГЛЕНИЯ.
*/

@media (max-width: 620px) {
  .oa-faces {
    max-width: calc(100vw - 12px);
    margin: 16px auto;
  }

  .oa-faces-card {
    padding: 18px;
    border-radius: 26px;
  }

  .oa-faces-top {
    display: block;
  }

  .oa-faces-top h2 {
    font-size: 31px;
  }

  .oa-faces-top em {
    font-size: 10px;
    line-height: 1.45;
  }

  .oa-faces-badge {
    width: 100%;
    min-width: 0;
    margin-top: 15px;
    text-align: left;
  }

  .oa-faces-info,
  .oa-faces-panel {
    padding: 15px;
  }

  .oa-face-column {
    min-height: 0;
  }
}

@media (max-width: 420px) {
  .oa-faces-card {
    padding: 14px;
    border-radius: 22px;
  }

  .oa-faces-top h2 {
    font-size: 28px;
  }

  .oa-faces-title b {
    font-size: 25px;
  }

  .oa-face-letter {
    font-size: 10px;
    letter-spacing: 1px;
  }

  .oa-face-list {
    font-size: 11px;
  }
}
</style>

[/html]
[/hideprofile]

0

10

[hideprofile][html]

<div class="oa-faces">

<div class="oa-faces-card">

  <!--
  ШАПКА ЗАНЯТЫХ ВНЕШНОСТЕЙ.
  ЗДЕСЬ МЕНЯЕМ: МАЛЕНЬКУЮ ПОДПИСЬ, БОЛЬШОЙ ЗАГОЛОВОК И ПОДЗАГОЛОВОК.
  -->
  <div class="oa-faces-top">
    <div>
      <span>ON:AIR FACE CLAIM</span>
      <h2>занятые внешности</h2>
      <em>актуальный список занятых фейсов</em>
    </div>

    <!--
    ПРАВЫЙ БЛОК В ШАПКЕ.
    ЗДЕСЬ МЕНЯЕМ: ЗНАЧОК И КОРОТКУЮ ПОДПИСЬ.
    -->
    <div class="oa-faces-badge">
      <b>✦</b>
      <span>ctrl + f для поиска</span>
    </div>
  </div>

  <div class="oa-faces-body">

    <!--
    ЛЕВЫЙ ЧЁРНЫЙ ON AIR-БЛОК.
    ЗДЕСЬ МЕНЯЕМ: FACE ON AIR, FACE CLAIM, ЗАНЯТЫЕ, ПРАВИЛА И ПОДПИСИ.
    -->
    <div class="oa-faces-machine">

      <div class="oa-faces-display">

        <div class="oa-faces-live">
          <i></i>
          <b>FACE ON AIR</b>
        </div>

        <div class="oa-faces-title">
          <span>face claim</span>
          <b>занятые</b>
        </div>

        <!--
        ПРАВИЛА В ЧЁРНОМ БЛОКЕ.
        ЗДЕСЬ МЕНЯЕМ ОПИСАНИЕ, ПРАВИЛА ЗАНЯТЫХ, ПРИДЕРЖАННЫХ И ВЫКУПЛЕННЫХ ВНЕШНОСТЕЙ.
        -->
        <div class="oa-faces-rules">
          <p>
            Внешность считается занятой после принятия анкеты. Перед регистрацией проверьте список через поиск по странице:
            <b>ctrl + f</b>.
          </p>
          <p>
            О возможном освобождении фейса можно узнать в гостевой или в списках на удаление.
          </p>
          <p>
            Придержанные и выкупленные внешности отмечаются отдельно в гостевой.
          </p>
        </div>

        <div class="oa-faces-equalizer">
          <i></i><i></i><i></i><i></i><i></i>
        </div>

      </div>

    </div>

    <!--
    ПРАВОЕ ОСНОВНОЕ ОКНО.
    ТАБЛИЦА BOYS / GIRLS РАСТЯНУТА ПО ВЫСОТЕ ЧЁРНОГО БЛОКА.
    -->
    <div class="oa-faces-panel">

      <div class="oa-faces-main">

        <!--
        БЛОК BOYS.
        СЮДА АДМИНЫ ВНОСЯТ ЗАНЯТЫЕ МУЖСКИЕ ВНЕШНОСТИ.
        ВНУТРИ КАЖДОЙ БУКВЕННОЙ КАТЕГОРИИ ЕСТЬ ОТДЕЛЬНЫЙ СКРОЛЛ.
        -->
        <div class="oa-face-column oa-face-boys">

          <div class="oa-face-title">boys</div>

          <div class="oa-face-scroll">

            <div class="oa-face-section">
              <div class="oa-face-letter">A — B — C — D</div>
              <div class="oa-face-list">
                <b>A.C.E</b> - Lee Donghun<br>
                <b>AB6IX</b> - Jeon Woong<br>
                <b>ATEEZ</b> - Choi San<br>
                <b>ATEEZ</b> - Park Seonghwa<br>
                <b>ASTRO</b> - Cha Eunwoo<br>
                <b>BTS</b> - Kim Taehyung<br>
                <b>BTS</b> - Min Yoongi<br>
                <b>CIX</b> - Bae Jinyoung<br>
                <b>CRAVITY</b> - Kang Minhee<br>
                <b>DKZ</b> - Park Jaechan
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">E — F — G — H</div>
              <div class="oa-face-list">
                <b>EXO</b> - Byun Baekhyun<br>
                <b>EXO</b> - Park Chanyeol<br>
                <b>EXO</b> - Oh Sehun<br>
                <b>ENHYPEN</b> - Park Sunghoon<br>
                <b>ENHYPEN</b> - Lee Heeseung<br>
                <b>GOT7</b> - Mark Tuan<br>
                <b>GOT7</b> - Jackson Wang<br>
                <b>HIGHLIGHT</b> - Yoon Dujun<br>
                <b>HIGHLIGHT</b> - Yang Yoseob<br>
                <b>actor</b> - Hwang Inyeop
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">I — J — K — L</div>
              <div class="oa-face-list">
                <b>IKON</b> - Kim Jinhwan<br>
                <b>IKON</b> - Song Yunhyeong<br>
                <b>JYJ</b> - Kim Jaejoong<br>
                <b>actor</b> - Ji Changwook<br>
                <b>actor</b> - Jung Haein<br>
                <b>actor</b> - Kim Seonho<br>
                <b>actor</b> - Kim Woobin<br>
                <b>actor</b> - Lee Minho<br>
                <b>actor</b> - Lee Dohyun<br>
                <b>actor</b> - Lee Jongsuk
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">M — N — O — P</div>
              <div class="oa-face-list">
                <b>MONSTA X</b> - Yoo Kihyun<br>
                <b>MONSTA X</b> - Lee Minhyuk<br>
                <b>NCT</b> - Lee Taeyong<br>
                <b>NCT</b> - Na Jaemin<br>
                <b>NCT</b> - Jung Jaehyun<br>
                <b>ONEUS</b> - Lee Seoho<br>
                <b>ONEUS</b> - Kim Youngjo<br>
                <b>PENTAGON</b> - Jung Wooseok<br>
                <b>PENTAGON</b> - Kang Hyunggu<br>
                <b>P1Harmony</b> - Choi Taeyang
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">Q — R — S — T</div>
              <div class="oa-face-list">
                <b>RIIZE</b> - Jung Sungchan<br>
                <b>RIIZE</b> - Park Wonbin<br>
                <b>SEVENTEEN</b> - Yoon Jeonghan<br>
                <b>SEVENTEEN</b> - Kim Mingyu<br>
                <b>SEVENTEEN</b> - Wen Junhui<br>
                <b>Stray Kids</b> - Hwang Hyunjin<br>
                <b>Stray Kids</b> - Lee Felix<br>
                <b>TXT</b> - Choi Yeonjun<br>
                <b>TXT</b> - Choi Soobin<br>
                <b>THE BOYZ</b> - Lee Juyeon
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">U — V — W — X — Y — Z</div>
              <div class="oa-face-list">
                <b>UP10TION</b> - Kim Wooseok<br>
                <b>VICTON</b> - Han Seungwoo<br>
                <b>VIXX</b> - Jung Taekwoon<br>
                <b>VIXX</b> - Kim Wonshik<br>
                <b>WayV</b> - Wong Yukhei<br>
                <b>WayV</b> - Xiao Dejun<br>
                <b>WEi</b> - Kim Yohan<br>
                <b>WINNER</b> - Kang Seungyoon<br>
                <b>Xdinary Heroes</b> - Goo Gunil<br>
                <b>ZEROBASEONE</b> - Zhang Hao
              </div>
            </div>

          </div>

        </div>

        <!--
        БЛОК GIRLS.
        СЮДА АДМИНЫ ВНОСЯТ ЗАНЯТЫЕ ЖЕНСКИЕ ВНЕШНОСТИ.
        ВНУТРИ КАЖДОЙ БУКВЕННОЙ КАТЕГОРИИ ЕСТЬ ОТДЕЛЬНЫЙ СКРОЛЛ.
        -->
        <div class="oa-face-column oa-face-girls">

          <div class="oa-face-title">girls</div>

          <div class="oa-face-scroll">

            <div class="oa-face-section">
              <div class="oa-face-letter">A — B — C — D</div>
              <div class="oa-face-list">
                <b>aespa</b> - Yoo Jimin<br>
                <b>aespa</b> - Kim Minjeong<br>
                <b>AOA</b> - Kim Seolhyun<br>
                <b>Apink</b> - Jung Eunji<br>
                <b>BLACKPINK</b> - Kim Jisoo<br>
                <b>BLACKPINK</b> - Lalisa Manobal<br>
                <b>Billlie</b> - Kim Siyoon<br>
                <b>CLC</b> - Choi Yujin<br>
                <b>Dreamcatcher</b> - Kim Minji<br>
                <b>Dreamcatcher</b> - Lee Siyeon
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">E — F — G — H</div>
              <div class="oa-face-list">
                <b>EVERGLOW</b> - Wang Yiren<br>
                <b>EVERGLOW</b> - Kim Sihyeon<br>
                <b>EXID</b> - Ahn Hani<br>
                <b>fromis_9</b> - Lee Saerom<br>
                <b>fromis_9</b> - Roh Jisun<br>
                <b>GFRIEND</b> - Jung Yerin<br>
                <b>GFRIEND</b> - Kim Yewon<br>
                <b>Girls' Generation</b> - Kim Taeyeon<br>
                <b>Girls' Generation</b> - Im Yoona<br>
                <b>H1-KEY</b> - Lee Hwiseo
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">I — J — K — L</div>
              <div class="oa-face-list">
                <b>ITZY</b> - Shin Ryujin<br>
                <b>ITZY</b> - Hwang Yeji<br>
                <b>IVE</b> - An Yujin<br>
                <b>IVE</b> - Jang Wonyoung<br>
                <b>Jessica</b> - Jung Sooyeon<br>
                <b>Kep1er</b> - Shen Xiaoting<br>
                <b>Kep1er</b> - Kim Chaehyun<br>
                <b>LE SSERAFIM</b> - Kim Chaewon<br>
                <b>LE SSERAFIM</b> - Miyawaki Sakura<br>
                <b>LOONA</b> - Jeon Heejin
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">M — N — O — P</div>
              <div class="oa-face-list">
                <b>MAMAMOO</b> - Moon Byulyi<br>
                <b>MAMAMOO</b> - Ahn Hyejin<br>
                <b>Miss A</b> - Bae Suzy<br>
                <b>NewJeans</b> - Kim Minji<br>
                <b>NewJeans</b> - Pham Hanni<br>
                <b>NewJeans</b> - Kang Haerin<br>
                <b>OH MY GIRL</b> - Choi Hyojung<br>
                <b>OH MY GIRL</b> - Yoo Shiah<br>
                <b>PURPLE KISS</b> - Na Goeun<br>
                <b>PRISTIN</b> - Zhou Jieqiong
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">Q — R — S — T</div>
              <div class="oa-face-list">
                <b>Red Velvet</b> - Bae Joohyun<br>
                <b>Red Velvet</b> - Kang Seulgi<br>
                <b>Red Velvet</b> - Park Sooyoung<br>
                <b>STAYC</b> - Bae Sumin<br>
                <b>STAYC</b> - Yoon Seeun<br>
                <b>STAYC</b> - Jang Yeeun<br>
                <b>TWICE</b> - Im Nayeon<br>
                <b>TWICE</b> - Myoui Mina<br>
                <b>TWICE</b> - Hirai Momo<br>
                <b>tripleS</b> - Yoon Seoyeon
              </div>
            </div>

            <div class="oa-face-section">
              <div class="oa-face-letter">U — V — W — X — Y — Z</div>
              <div class="oa-face-list">
                <b>VIVIZ</b> - Jung Eunbi<br>
                <b>VIVIZ</b> - Hwang Eunbi<br>
                <b>WJSN</b> - Kim Jiyeon<br>
                <b>WJSN</b> - Bona Kim<br>
                <b>Weki Meki</b> - Choi Yoojung<br>
                <b>Weeekly</b> - Lee Soojin<br>
                <b>woo!ah!</b> - Kwon Nayeon<br>
                <b>actress</b> - Won Jina<br>
                <b>YENA</b> - Choi Yena<br>
                <b>actress</b> - Zhao Lusi
              </div>
            </div>

          </div>

        </div>

      </div>

    </div>

  </div>

</div>
</div>

<style>
/*
ОБЩАЯ КАРТА ЦВЕТОВ ON:AIR.
ЕСЛИ У ВАС ЭТА КАРТА УЖЕ ЕСТЬ В ОБЩЕМ CSS ФОРУМА, ЭТОТ БЛОК МОЖНО НЕ ДУБЛИРОВАТЬ.
МЕНЯЕМ ЦВЕТА ТУТ — И ВСЕ БЛОКИ, КОТОРЫЕ ПОДВЯЗАНЫ К --OA-GLOBAL-..., МЕНЯЮТСЯ ВМЕСТЕ.
*/

:root {
  --oa-global-pink: #ffb4dc;
  --oa-global-hot-pink: #ff3cac;
  --oa-global-red: #ff6b6b;
  --oa-global-blue: #78dcff;
  --oa-global-mint: #8ff5ec;

  --oa-global-pink-soft: rgba(255,180,220,.28);
  --oa-global-pink-glow: rgba(255,180,220,.17);
  --oa-global-blue-soft: rgba(120,220,255,.22);
  --oa-global-blue-glow: rgba(120,220,255,.18);
  --oa-global-mint-glow: rgba(143,245,236,.35);

  --oa-global-dark: #2f2f31;
  --oa-global-darker: #19191b;

  --oa-global-soft: rgba(244,241,234,.95);
  --oa-global-light: rgba(255,255,255,.86);
  --oa-global-glass: rgba(255,255,255,.72);

  --oa-global-text: #222;
  --oa-global-copy: #666;
  --oa-global-muted: #777;
  --oa-global-overline: #999;
  --oa-global-white: #fff;

  --oa-global-border: rgba(30,30,30,.9);
  --oa-global-shadow: rgba(0,0,0,.15);

  --oa-global-font: Trebuchet MS, Arial, sans-serif;
}

/*
ПОДВЯЗКА ЗАНЯТЫХ ВНЕШНОСТЕЙ К ОБЩЕЙ КАРТЕ ЦВЕТОВ.
--oa-faces-height — ОБЩАЯ ВЫСОТА ЧЁРНОГО БЛОКА И ПРАВОЙ ТАБЛИЦЫ НА ПК.
*/

.oa-faces {
  --oa-pink: var(--oa-global-pink, #ffb4dc);
  --oa-hot-pink: var(--oa-global-hot-pink, #ff3cac);
  --oa-red: var(--oa-global-red, #ff6b6b);
  --oa-blue: var(--oa-global-blue, #78dcff);
  --oa-mint: var(--oa-global-mint, #8ff5ec);

  --oa-pink-soft: var(--oa-global-pink-soft, rgba(255,180,220,.28));
  --oa-pink-glow: var(--oa-global-pink-glow, rgba(255,180,220,.17));
  --oa-blue-soft: var(--oa-global-blue-soft, rgba(120,220,255,.22));
  --oa-blue-glow: var(--oa-global-blue-glow, rgba(120,220,255,.18));
  --oa-mint-glow: var(--oa-global-mint-glow, rgba(143,245,236,.35));

  --oa-dark: var(--oa-global-dark, #2f2f31);
  --oa-darker: var(--oa-global-darker, #19191b);

  --oa-soft: var(--oa-global-soft, rgba(244,241,234,.95));
  --oa-light: var(--oa-global-light, rgba(255,255,255,.86));
  --oa-glass: var(--oa-global-glass, rgba(255,255,255,.72));

  --oa-text: var(--oa-global-text, #222);
  --oa-copy: var(--oa-global-copy, #666);
  --oa-muted: var(--oa-global-muted, #777);
  --oa-overline: var(--oa-global-overline, #999);
  --oa-white: var(--oa-global-white, #fff);

  --oa-border: var(--oa-global-border, rgba(30,30,30,.9));
  --oa-shadow: var(--oa-global-shadow, rgba(0,0,0,.15));
  --oa-faces-height: 560px;

  width: min(900px, 100%);
  max-width: calc(100vw - 20px);
  margin: 30px auto;
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
  color: var(--oa-text);
}

.oa-faces,
.oa-faces *,
.oa-faces *:before,
.oa-faces *:after {
  box-sizing: border-box;
}

.oa-faces-card {
  padding: 26px;
  border-radius: 36px;
  background:
    radial-gradient(circle at 10% 0%, var(--oa-blue-soft), transparent 32%),
    radial-gradient(circle at 90% 8%, var(--oa-pink-soft), transparent 34%),
    linear-gradient(135deg, var(--oa-white), #fbfaf7);
  box-shadow: 0 18px 45px var(--oa-shadow);
  border: 2px solid var(--oa-border);
}

/*
ШАПКА.
ЗДЕСЬ МЕНЯЮТСЯ РАЗМЕРЫ, ШРИФТЫ И ОТСТУПЫ ВЕРХНЕЙ ЧАСТИ.
*/

.oa-faces-top {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 20px;
  margin-bottom: 22px;
}

.oa-faces-top span {
  display: block;
  font-size: 11px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--oa-overline);
}

.oa-faces-top h2 {
  margin: 4px 0 4px;
  font-size: 38px;
  line-height: 1;
  font-family: Georgia, serif;
  font-style: italic;
  font-weight: normal;
  text-transform: lowercase;
}

.oa-faces-top em {
  font-style: normal;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 2px;
  color: var(--oa-muted);
}

.oa-faces-badge {
  min-width: 160px;
  padding: 13px 16px;
  border-radius: 22px;
  background: var(--oa-glass);
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.06);
  text-align: right;
}

.oa-faces-badge b {
  display: block;
  font-size: 28px;
  line-height: 1;
  color: var(--oa-hot-pink);
}

.oa-faces-badge span {
  font-size: 11px;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--oa-muted);
}

/*
ОБЩАЯ СЕТКА.
235PX — ШИРИНА ЧЁРНОГО БЛОКА СЛЕВА. МОЖНО СДЕЛАТЬ УЖЕ: 215PX. ШИРЕ: 255PX.
*/

.oa-faces-body {
  display: grid;
  grid-template-columns: 235px 1fr;
  gap: 22px;
  height: var(--oa-faces-height);
  align-items: stretch;
  overflow: hidden;
}

.oa-faces-machine,
.oa-faces-panel,
.oa-faces-main,
.oa-face-column {
  min-height: 0;
}

/*
ЛЕВЫЙ ЧЁРНЫЙ БЛОК.
ТУТ МЕНЯЮТСЯ РАЗМЕРЫ, ФОН, ОТСТУПЫ И СКРУГЛЕНИЯ ON AIR-БЛОКА.
*/

.oa-faces-machine {
  height: 100%;
  border-radius: 28px;
  padding: 14px;
  background:
    linear-gradient(180deg, var(--oa-dark), var(--oa-darker));
  box-shadow:
    inset 0 0 0 2px rgba(255,255,255,.12),
    0 16px 30px rgba(0,0,0,.18);
}

.oa-faces-display {
  position: relative;
  height: 100%;
  border-radius: 23px;
  overflow: hidden;
  padding: 16px;
  background:
    radial-gradient(circle at 80% 10%, var(--oa-pink-glow), transparent 35%),
    radial-gradient(circle at 15% 85%, var(--oa-blue-glow), transparent 34%),
    linear-gradient(135deg, rgba(255,255,255,.16), rgba(120,220,255,.06));
  box-shadow: inset 0 0 0 1px rgba(255,255,255,.28);
}

.oa-faces-display:after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(120deg, transparent 0 35%, rgba(255,255,255,.16) 45%, transparent 58%);
  pointer-events: none;
}

.oa-faces-live {
  position: relative;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  border-radius: 999px;
  background: rgba(0,0,0,.28);
  color: var(--oa-white);
  font-size: 10px;
  letter-spacing: 1.5px;
}

.oa-faces-live i {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--oa-hot-pink);
  box-shadow: 0 0 12px rgba(255,60,172,.75);
}

.oa-faces-title {
  position: relative;
  z-index: 2;
  margin-top: 22px;
  color: var(--oa-white);
}

.oa-faces-title span {
  display: block;
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 2.5px;
  color: rgba(255,255,255,.62);
}

.oa-faces-title b {
  display: block;
  margin-top: 8px;
  font-size: 28px;
  line-height: 1.05;
  font-family: var(--oa-global-font, Trebuchet MS, Arial, sans-serif);
  font-weight: bold;
  text-transform: lowercase;
  letter-spacing: -.5px;
}

/*
ПРАВИЛА В ЧЁРНОМ БЛОКЕ.
ТУТ МЕНЯЕТСЯ ТЕКСТ, РАЗМЕР ШРИФТА, ОТСТУПЫ И ФОН ПРАВИЛ.
*/

.oa-faces-rules {
  position: relative;
  z-index: 2;
  margin-top: 16px;
  padding: 13px;
  border-radius: 17px;
  background: rgba(255,255,255,.10);
  color: rgba(255,255,255,.80);
}

.oa-faces-rules p {
  margin: 0 0 8px;
  font-size: 11px;
  line-height: 1.38;
}

.oa-faces-rules p:last-child {
  margin-bottom: 0;
}

.oa-faces-rules b {
  color: var(--oa-mint);
}

.oa-faces-equalizer {
  position: relative;
  z-index: 2;
  height: 64px;
  margin-top: 24px;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: 7px;
}

.oa-faces-equalizer i {
  display: block;
  width: 10px;
  border-radius: 999px;
  background: linear-gradient(180deg, var(--oa-mint), var(--oa-pink));
  box-shadow: 0 0 12px var(--oa-mint-glow);
}

.oa-faces-equalizer i:nth-child(1) { height: 25px; }
.oa-faces-equalizer i:nth-child(2) { height: 50px; }
.oa-faces-equalizer i:nth-child(3) { height: 36px; }
.oa-faces-equalizer i:nth-child(4) { height: 58px; }
.oa-faces-equalizer i:nth-child(5) { height: 30px; }

/*
ПРАВОЕ ИНФОРМАТИВНОЕ ОКНО.
ВЫСОТА РАВНА ЧЁРНОМУ БЛОКУ ЗА СЧЁТ HEIGHT: 100%.
*/

.oa-faces-panel {
  min-width: 0;
  height: 100%;
  min-height: 0;
  overflow: hidden;
  padding: 18px;
  border-radius: 30px;
  background:
    radial-gradient(circle at 92% 8%, var(--oa-blue-glow), transparent 34%),
    rgba(255,255,255,.68);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.7),
    0 12px 25px rgba(0,0,0,.08);
}

/*
СПИСКИ BOYS / GIRLS.
ЗДЕСЬ МЕНЯЕТСЯ ОБЩАЯ СЕТКА ДВУХ КОЛОНОК.
*/

.oa-faces-main {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
  height: 100%;
  min-height: 0;
}

/*
КОЛОНКИ BOYS / GIRLS.
ВАЖНО: OVERFLOW: VISIBLE НУЖЕН, ЧТОБЫ ПЛАШКИ BOYS / GIRLS НЕ ОБРЕЗАЛИСЬ СВЕРХУ.
*/

.oa-face-column {
  position: relative;
  height: 100%;
  min-height: 0;
  overflow: visible;
  border-radius: 24px;
  background: var(--oa-light);
  box-shadow: 0 12px 25px rgba(0,0,0,.08);
  padding: 30px 14px 14px;
}

.oa-face-title {
  position: absolute;
  top: -9px;
  left: 22px;
  right: 22px;
  margin: 0;
  padding: 6px 10px;
  border-radius: 12px;
  background: linear-gradient(135deg, var(--oa-dark), var(--oa-darker));
  color: var(--oa-white);
  text-align: center;
  font-size: 12px;
  text-transform: lowercase;
  letter-spacing: 1px;
}

.oa-face-boys .oa-face-title {
  box-shadow: 0 0 14px rgba(120,220,255,.22);
}

.oa-face-girls .oa-face-title {
  box-shadow: 0 0 14px rgba(255,60,172,.18);
}

/*
ВНУТРЕННИЙ СКРОЛЛ ВСЕЙ КОЛОНКИ BOYS / GIRLS.
*/

.oa-face-scroll {
  height: 100%;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 7px;
}

.oa-face-scroll::-webkit-scrollbar {
  width: 6px;
}

.oa-face-scroll::-webkit-scrollbar-track {
  background: rgba(230,225,218,.65);
  border-radius: 20px;
}

.oa-face-scroll::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, var(--oa-blue), var(--oa-pink));
  border-radius: 20px;
}

/*
БУКВЕННЫЕ СЕКЦИИ.
ЗДЕСЬ МЕНЯЕТСЯ ВИД ОДНОГО БЛОКА A-B-C-D И Т.Д.
*/

.oa-face-section {
  padding: 11px;
  border-radius: 18px;
  background: rgba(255,255,255,.70);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.7),
    0 8px 16px rgba(0,0,0,.04);
  margin-bottom: 12px;
}

.oa-face-section:last-child {
  margin-bottom: 0;
}

.oa-face-letter {
  padding: 7px 10px;
  border-radius: 999px;
  background:
    linear-gradient(135deg, rgba(255,255,255,.95), rgba(244,241,234,.92));
  border: 1px solid rgba(47,47,49,.10);
  color: var(--oa-muted);
  text-align: center;
  font-size: 11px;
  letter-spacing: 1.8px;
  text-transform: uppercase;
  margin-bottom: 9px;
}

.oa-face-list {
  text-align: center;
  color: var(--oa-text);
  font-size: 12px;
  line-height: 1.55;
  text-transform: lowercase;

  /*
  СКРОЛЛ ВНУТРИ КАЖДОЙ БУКВЕННОЙ КАТЕГОРИИ.
  ЕСЛИ В A-B-C-D ИЛИ M-N-O-P БУДЕТ БОЛЬШЕ 20 ПОЗИЦИЙ, БЛОК НЕ РАЗНЕСЁТ ВЁРСТКУ.
  */
  max-height: 120px;
  overflow-y: auto;
  padding-right: 5px;
}

.oa-face-list b {
  color: var(--oa-text);
}

.oa-face-list::-webkit-scrollbar {
  width: 5px;
}

.oa-face-list::-webkit-scrollbar-track {
  background: rgba(230,225,218,.65);
  border-radius: 20px;
}

.oa-face-list::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, var(--oa-blue), var(--oa-pink));
  border-radius: 20px;
}

/*
АДАПТИВ.
НА ПЛАНШЕТАХ ЧЁРНЫЙ БЛОК УХОДИТ НАВЕРХ, СПИСКИ ОСТАЮТСЯ НИЖЕ.
*/

@media (max-width: 820px) {
  .oa-faces-body {
    display: block;
    height: auto;
    overflow: visible;
  }

  .oa-faces-machine {
    height: auto;
    margin-bottom: 18px;
  }

  .oa-faces-display {
    min-height: 360px;
    height: auto;
  }

  .oa-faces-panel {
    height: auto;
    overflow: visible;
  }

  .oa-faces-main {
    grid-template-columns: 1fr;
    height: auto;
  }

  .oa-face-column {
    height: auto;
  }

  .oa-face-scroll {
    height: auto;
    max-height: 320px;
  }
}

/*
АДАПТИВ ТЕЛЕФОНА.
ЗДЕСЬ МЕНЯЕТСЯ РАЗМЕР ШАПКИ, ОТСТУПЫ И СКРУГЛЕНИЯ.
*/

@media (max-width: 620px) {
  .oa-faces {
    max-width: calc(100vw - 12px);
    margin: 16px auto;
  }

  .oa-faces-card {
    padding: 18px;
    border-radius: 26px;
  }

  .oa-faces-top {
    display: block;
  }

  .oa-faces-top h2 {
    font-size: 31px;
  }

  .oa-faces-top em {
    font-size: 10px;
    line-height: 1.45;
  }

  .oa-faces-badge {
    width: 100%;
    min-width: 0;
    margin-top: 15px;
    text-align: left;
  }

  .oa-faces-panel {
    padding: 15px;
  }

  .oa-face-column {
    min-height: 0;
  }
}

@media (max-width: 420px) {
  .oa-faces-card {
    padding: 14px;
    border-radius: 22px;
  }

  .oa-faces-top h2 {
    font-size: 28px;
  }

  .oa-faces-title b {
    font-size: 25px;
  }

  .oa-face-letter {
    font-size: 10px;
    letter-spacing: 1px;
  }

  .oa-face-list {
    font-size: 11px;
  }
}
</style>

[/html]
[/hideprofile]

0


Вы здесь » yanichegoneznayu » виды гостевых » гостевые


Рейтинг форумов | Создать форум бесплатно