[html]
<link id="btb-template-style" rel="stylesheet" type="text/css" href="https://forumstatic.ru/files/001c/8a/8a/76663.css">

<div class="btb-app">

    <div class="app-main-title">NPC-персонажи</div>

    <div class="app-main-subtitle">
        сокращённая анкета для второстепенных и эпизодических персонажей
    </div>

    <div class="app-main-line"></div>

    <div class="app-note">

        <div class="app-note-row">
            Анкета NPC создаётся <b>в этой же теме отдельным сообщением</b>.
        </div>

        <div class="app-note-row">
            Полную биографию расписывать необязательно —
            достаточно основных фактов, характера и роли персонажа в игре.
        </div>

        <div class="app-note-row">
            Для гоблинов, домовых эльфов и других персонажей
            можно использовать <b>ИИ-сгенерированные изображения</b>.
        </div>

        <div class="app-note-row">
            Если поле к персонажу не относится, поставьте прочерк.
        </div>

    </div>

    <div class="app-images">

        <div class="app-image">
            <img src="https://placehold.co/800x500/10232e/87969a?text=NPC+01" alt="">
        </div>

        <div class="app-image">
            <img src="https://placehold.co/800x500/10232e/87969a?text=NPC+02" alt="">
        </div>

    </div>

    <div class="app-appearance">
        внешность / образ:
        <b>Actor Name / AI-generated</b>
    </div>

    <div class="app-namebox">

        <div class="app-name-en">Name Surname</div>

        <div class="app-name-ru">Имя Фамилия</div>

    </div>

    <div class="app-info">

        <div class="app-info-row">
            <span class="app-label">Возраст:</span>
            <span class="app-value">—</span>
        </div>

        <div class="app-info-row">
            <span class="app-label">Раса / статус крови:</span>
            <span class="app-value">—</span>
        </div>

        <div class="app-info-row">
            <span class="app-label">Образование:</span>
            <span class="app-value">—</span>
        </div>

        <div class="app-info-row">
            <span class="app-label">Лояльность:</span>
            <span class="app-value">нейтралитет</span>
        </div>

        <div class="app-info-row app-info-wide">
            <span class="app-label">Род деятельности:</span>
            <span class="app-value">
                должность / профессия • место работы / организация
            </span>
        </div>

    </div>

    <div class="app-section">

        <div class="app-section-title">
            ✦ Кратко о персонаже ✦
        </div>

        <div class="app-section-body">
            Кратко опишите происхождение, важные события,
            настоящее, характер, манеру общения
            и роль NPC в текущей игре.
        </div>

    </div>

    <div class="app-section">

        <div class="app-section-title">
            ✦ Дополнительно ✦
        </div>

        <div class="app-section-body">

            <div class="app-info">

                <div class="app-info-row">
                    <b>Особые способности:</b><br>
                    прочерк или краткое описание
                </div>

                <div class="app-info-row">
                    <b>Артефакты:</b><br>
                    прочерк или перечисление
                </div>

            </div>

        </div>

    </div>

    <div class="app-form-divider">
        ✦ Заполнение шаблона ✦
    </div>

    <div class="app-form">

        <div class="app-form-grid">

            <div class="app-form-section">
                — оформление —
            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Ссылка на картинку №1
                </div>

                <input
                    id="npc-img-1"
                    class="app-input"
                    type="text"
                    placeholder="https://..."
                    autocomplete="off"
                >

            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Ссылка на картинку №2
                    <span>• необязательно</span>
                </div>

                <input
                    id="npc-img-2"
                    class="app-input"
                    type="text"
                    placeholder="https://..."
                    autocomplete="off"
                >

            </div>

            <div class="app-field app-field-wide">

                <div class="app-field-label">
                    Внешность / образ
                    <span>• актёр / модель на английском или AI-generated</span>
                </div>

                <input
                    id="npc-face"
                    class="app-input"
                    type="text"
                    placeholder="Actor Name / AI-generated"
                    autocomplete="off"
                >

            </div>

            <div class="app-form-section">
                — основные данные —
            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Имя и фамилия на английском
                </div>

                <input
                    id="npc-name-en"
                    class="app-input"
                    type="text"
                    placeholder="Name Surname"
                    autocomplete="off"
                >

            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Имя и фамилия на русском
                </div>

                <input
                    id="npc-name-ru"
                    class="app-input"
                    type="text"
                    placeholder="Имя Фамилия"
                    autocomplete="off"
                >

            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Возраст
                </div>

                <input
                    id="npc-age"
                    class="app-input"
                    type="text"
                    placeholder="35 лет / неизвестен"
                    autocomplete="off"
                >

            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Раса / статус крови
                </div>

                <select
                    id="npc-blood"
                    class="app-select"
                >
                    <option value="">выберите вариант</option>
                    <option>чистокровный волшебник</option>
                    <option>полукровный волшебник</option>
                    <option>магглорожденный волшебник</option>
                    <option>сквиб</option>
                    <option>полувампир</option>
                    <option>полувейла</option>
                    <option>полувеликан</option>
                    <option>вампир</option>
                    <option>вейла</option>
                    <option>великан</option>
                    <option>гоблин</option>
                    <option>домовой эльф</option>
                    <option>кентавр</option>
                    <option>оборотень</option>
                    <option>другое</option>
                </select>

            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Образование
                    <span>• факультет / школа / прочерк</span>
                </div>

                <input
                    id="npc-house"
                    class="app-input"
                    type="text"
                    placeholder="Хогвартс, Слизерин / прочерк"
                    autocomplete="off"
                >

            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Лояльность
                </div>

                <select
                    id="npc-loyalty"
                    class="app-select"
                >
                    <option>нейтралитет</option>
                    <option>Лига равных прав</option>
                    <option>Общество охотников на монстров</option>
                </select>

            </div>

            <div class="app-field app-field-wide">

                <div class="app-field-label">
                    Род деятельности
                    <span>• должность / профессия • место работы / организация</span>
                </div>

                <input
                    id="npc-job"
                    class="app-input"
                    type="text"
                    placeholder="аврор в Министерстве / преподаватель Хогвартса / частная практика..."
                    autocomplete="off"
                >

            </div>

            <div class="app-form-section">
                — кратко о персонаже —
            </div>

            <div class="app-field app-field-wide">

                <div class="app-field-label">
                    Кратко о персонаже
                    <span>• происхождение, важные события, настоящее, характер и роль в игре</span>
                </div>

                <textarea
                    id="npc-description"
                    class="app-textarea app-textarea-short"
                    placeholder="Кратко расскажите о персонаже..."
                ></textarea>

            </div>

            <div class="app-form-section">
                — дополнительно —
            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Особые способности
                </div>

                <input
                    id="npc-special"
                    class="app-input"
                    type="text"
                    placeholder="прочерк или краткое описание"
                    autocomplete="off"
                >

            </div>

            <div class="app-field">

                <div class="app-field-label">
                    Артефакты
                </div>

                <input
                    id="npc-artifacts"
                    class="app-input"
                    type="text"
                    placeholder="прочерк или перечисление"
                    autocomplete="off"
                >

            </div>

        </div>

        <div class="app-copy-wrap">

            <button
                type="button"
                class="btb-copy-button"
                onclick="copyBtbNpc(this); return false;"
            >
                ✦ Скопировать заполненную анкету ✦
            </button>

            <div class="app-copy-caption">
                вставьте скопированную анкету новым сообщением в этой теме
            </div>

        </div>

    </div>

    <div class="app-footer">
        NPC можно использовать для эпизодов, сюжетных линий,
        семейных связей, работников учреждений и других второстепенных ролей.
    </div>

</div>

<script>
(function () {
    "use strict";

    function raw(id) {
        var el = document.getElementById(id);
        return el ? String(el.value || "").trim() : "";
    }

    function text(id, fallback) {
        var value = raw(id);
        return value || fallback;
    }

    function longText(id, fallback) {
        var value = raw(id);

        if (!value) return fallback;

        return value
            .replace(/<br\s*\/?>/gi, "\n")
            .replace(/\r\n?/g, "\n");
    }

    function image(id) {
        return raw(id)
            .replace(/[\r\n]/g, "")
            .replace(/\[/g, "%5B")
            .replace(/\]/g, "%5D");
    }

    function bbOpen(tag) {
        return "[" + tag + "]";
    }

    function bbClose(tag) {
        return "[/" + tag + "]";
    }

    function blockOpen(name) {
        return "[" + "block=" + name + "]";
    }

    function blockClose() {
        return "[/" + "block]";
    }

    function buildNpc() {
        var img1 = image("npc-img-1");
        var img2 = image("npc-img-2");

        var face = text("npc-face", "Actor Name / AI-generated");
        var nameEn = text("npc-name-en", "Name Surname");
        var nameRu = text("npc-name-ru", "Имя Фамилия");

        var age = text("npc-age", "—");
        var blood = text("npc-blood", "—");
        var house = text("npc-house", "—");
        var loyalty = text("npc-loyalty", "нейтралитет");
        var job = text("npc-job", "—");

        var description = longText(
            "npc-description",
            "Краткое описание персонажа."
        );

        var special = text("npc-special", "—");
        var artifacts = text("npc-artifacts", "—");

        var b = bbOpen("b");
        var eb = bbClose("b");
        var im = bbOpen("img");
        var eim = bbClose("img");

        var lines = [];

        lines.push(blockOpen("btb-character-card"));

        if (img1 || img2) {
            lines.push(blockOpen("app-images"));

            if (img1) {
                lines.push(
                    blockOpen("app-image") +
                    im + img1 + eim +
                    blockClose()
                );
            }

            if (img2) {
                lines.push(
                    blockOpen("app-image") +
                    im + img2 + eim +
                    blockClose()
                );
            }

            lines.push(blockClose());
        }

        lines.push(
            blockOpen("app-appearance") +
            "внешность / образ: " +
            b + face + eb +
            blockClose()
        );

        lines.push(blockOpen("app-namebox"));

        lines.push(
            blockOpen("app-name-en") +
            nameEn +
            blockClose()
        );

        lines.push(
            blockOpen("app-name-ru") +
            nameRu +
            blockClose()
        );

        lines.push(blockClose());

        lines.push(blockOpen("app-info"));

        lines.push(
            blockOpen("app-info-row") +
            b + "Возраст:" + eb + " " +
            age +
            blockClose()
        );

        lines.push(
            blockOpen("app-info-row") +
            b + "Раса / статус крови:" + eb + " " +
            blood +
            blockClose()
        );

        lines.push(
            blockOpen("app-info-row") +
            b + "Образование:" + eb + " " +
            house +
            blockClose()
        );

        lines.push(
            blockOpen("app-info-row") +
            b + "Лояльность:" + eb + " " +
            loyalty +
            blockClose()
        );

        lines.push(
            blockOpen("app-info-wide") +
            b + "Род деятельности:" + eb + " " +
            job +
            blockClose()
        );

        lines.push(blockClose());

        lines.push(blockOpen("app-section"));

        lines.push(
            blockOpen("app-section-title") +
            "✦ Кратко о персонаже ✦" +
            blockClose()
        );

        lines.push(blockOpen("app-section-body"));
        lines.push(description);
        lines.push(blockClose());
        lines.push(blockClose());

        lines.push(blockOpen("app-section"));

        lines.push(
            blockOpen("app-section-title") +
            "✦ Дополнительно ✦" +
            blockClose()
        );

        lines.push(blockOpen("app-section-body"));
        lines.push(blockOpen("app-info"));

        lines.push(
            blockOpen("app-info-row") +
            b + "Особые способности:" + eb + " " +
            special +
            blockClose()
        );

        lines.push(
            blockOpen("app-info-row") +
            b + "Артефакты:" + eb + " " +
            artifacts +
            blockClose()
        );

        lines.push(blockClose());
        lines.push(blockClose());
        lines.push(blockClose());
lines.push(blockClose());

        return lines.join("\n");
    }

    function showSuccess(button) {
        var original = button.innerHTML;

        button.innerHTML = "✓ Анкета скопирована";
        button.classList.add("app-copy-success");

        window.setTimeout(function () {
            button.innerHTML = original;
            button.classList.remove("app-copy-success");
        }, 2200);
    }

    function fallbackCopy(value, button) {
        var x = window.pageXOffset || 0;
        var y = window.pageYOffset || 0;

        var area = document.createElement("textarea");

        area.value = value;
        area.setAttribute("readonly", "readonly");

        area.style.position = "fixed";
        area.style.left = "50%";
        area.style.top = "50%";
        area.style.width = "1px";
        area.style.height = "1px";
        area.style.opacity = "0";
        area.style.pointerEvents = "none";

        document.body.appendChild(area);

        try {
            area.focus({ preventScroll: true });
        } catch (error) {
            area.focus();
        }

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

        var copied = false;

        try {
            copied = document.execCommand("copy");
        } catch (error) {
            copied = false;
        }

        document.body.removeChild(area);
        window.scrollTo(x, y);

        if (copied) {
            showSuccess(button);
        } else {
            window.prompt(
                "Нажмите Ctrl+C:",
                value
            );
        }
    }

    window.copyBtbNpc = function (button) {
        var value = buildNpc();

        if (navigator.clipboard && window.isSecureContext) {
            navigator.clipboard.writeText(value)
                .then(function () {
                    showSuccess(button);
                })
                .catch(function () {
                    fallbackCopy(value, button);
                });
        } else {
            fallbackCopy(value, button);
        }
    };

    /* Размер шрифта из общего ползунка форума. */

    var root = document.querySelector(".btb-app");

    function ownText(el) {
        var tag = (el.tagName || "").toLowerCase();

        if (/^(input|textarea|select|option|button)$/.test(tag)) {
            return true;
        }

        for (var i = 0; i < el.childNodes.length; i++) {
            var node = el.childNodes[i];

            if (
                node.nodeType === 3 &&
                /\S/.test(node.nodeValue || "")
            ) {
                return true;
            }
        }

        return false;
    }

    function rememberSizes() {
        if (!root) return;

        var elements = root.querySelectorAll("*");

        for (var i = 0; i < elements.length; i++) {
            var el = elements[i];

            if (!ownText(el)) continue;
            if (el.dataset.btbBaseFont) continue;

            var size = parseFloat(
                window.getComputedStyle(el).fontSize
            );

            if (!isNaN(size) && size > 0) {
                el.dataset.btbBaseFont = String(size);
            }
        }
    }

    function applyScale(scale) {
        if (!root) return;

        scale = parseFloat(scale);

        if (isNaN(scale)) scale = 1;

        rememberSizes();

        var elements = root.querySelectorAll("*");

        for (var i = 0; i < elements.length; i++) {
            var el = elements[i];

            var base = parseFloat(
                el.dataset.btbBaseFont
            );

            if (isNaN(base)) continue;

            el.style.setProperty(
                "font-size",
                (base * scale).toFixed(2) + "px",
                "important"
            );
        }
    }

    window.addEventListener(
        "message",
        function (event) {
            if (
                !event.data ||
                event.data.type !== "BTB_FONT_SCALE"
            ) {
                return;
            }

            applyScale(event.data.scale);
        }
    );

    function requestFontScale() {
        try {
            parent.postMessage(
                {
                    type: "BTB_FONT_REQUEST"
                },
                "*"
            );
        } catch (error) {}
    }

    /*
     * Внешний 76663.css должен сначала полностью загрузиться.
     * Иначе скрипт может запомнить браузерный размер шрифта
     * раньше наших стилей и визуально NPC получится крупнее/мельче.
     */
    if (document.readyState === "complete") {
        requestFontScale();
    } else {
        window.addEventListener("load", function () {
            requestFontScale();
        });
    }

})();
</script>
[/html]