{"id":9430,"date":"2026-02-21T13:50:22","date_gmt":"2026-02-21T10:50:22","guid":{"rendered":"https:\/\/1.cbm.ua\/?p=9430"},"modified":"2026-02-21T14:12:48","modified_gmt":"2026-02-21T11:12:48","slug":"%e2%9d%a4%ef%b8%8f%f0%9f%93%9c%e2%9d%a4%ef%b8%8f-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b7%d1%82%d0%b0%d1%82%d0%b5%d0%b9-%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5","status":"publish","type":"post","link":"https:\/\/1.cbm.ua\/?p=9430","title":{"rendered":"\u2764\ufe0f\ud83d\udcdc\u2764\ufe0f &#8212; \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0442\u0430\u0442\u0435\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435."},"content":{"rendered":"    <style>\n        #post-creator-wrap {\n            max-width: 800px;\n            margin: 0 auto;\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n        }\n        #post-creator-wrap input[type=\"text\"],\n        #post-creator-wrap select {\n            width: 100%;\n            padding: 10px 14px;\n            border: 1px solid #ddd;\n            border-radius: 6px;\n            font-size: 15px;\n            box-sizing: border-box;\n            margin-bottom: 10px;\n            color: #333;\n            background: #fff;\n        }\n        .pc-textarea {\n            width: 100%;\n            min-height: 140px;\n            resize: vertical;\n            font-family: 'Courier New', monospace;\n            padding: 10px 14px;\n            border: 1px solid #ddd;\n            border-radius: 6px;\n            font-size: 14px;\n            box-sizing: border-box;\n            margin-bottom: 8px;\n            color: #333 !important;\n            background: #fff !important;\n        }\n        .pc-html-editor {\n            width: 100%;\n            min-height: 140px;\n            border: 2px solid #1a73e8;\n            border-radius: 6px;\n            padding: 10px 14px;\n            box-sizing: border-box;\n            overflow-y: auto;\n            background: #fff;\n            margin-bottom: 4px;\n            outline: none;\n            font-size: 14px;\n            line-height: 1.5;\n            color: #333;\n\t\t\tmax-height: 300px;\n\t\t\toverflow-y: auto;\n        }\n        .pc-html-editor:focus {\n            border-color: #ff9800;\n            box-shadow: 0 0 6px rgba(255,152,0,0.3);\n        }\n        .pc-html-editor-hint {\n            font-size: 12px;\n            color: #888;\n            margin-bottom: 8px;\n        }\n        .pc-view-toggle {\n            display: flex;\n            gap: 6px;\n            margin-bottom: 6px;\n        }\n        .pc-view-toggle button {\n            padding: 4px 12px;\n            border: 1px solid #ccc;\n            border-radius: 4px;\n            background: #f1f3f4;\n            cursor: pointer;\n            font-size: 12px;\n            color: #333 !important;\n        }\n        .pc-view-toggle button.active {\n            background: #1a73e8;\n            color: white !important;\n            border-color: #1a73e8;\n        }\n        .pc-block {\n            background: #f9f9f9;\n            border: 1px solid #e0e0e0;\n            border-radius: 8px;\n            padding: 16px;\n            margin-bottom: 14px;\n            position: relative;\n        }\n        .pc-block-header {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            margin-bottom: 10px;\n        }\n        .pc-block-header select {\n            width: auto;\n            margin-bottom: 0;\n        }\n        .pc-remove-btn {\n            background: #ff4d4d;\n            color: white;\n            border: none;\n            border-radius: 50%;\n            width: 28px;\n            height: 28px;\n            cursor: pointer;\n            font-size: 18px;\n            line-height: 1;\n            padding: 0;\n            margin-left: auto;\n            flex-shrink: 0;\n        }\n        .pc-btn {\n            display: inline-block;\n            padding: 10px 22px;\n            border: none;\n            border-radius: 6px;\n            font-size: 15px;\n            cursor: pointer;\n            font-weight: 600;\n            transition: background 0.2s;\n        }\n        .pc-btn-add {\n            background: #e8f0fe;\n            color: #1a73e8;\n            margin-bottom: 16px;\n        }\n        .pc-btn-add:hover { background: #d2e3fc; }\n        .pc-btn-create {\n            background: #1a73e8;\n            color: white;\n            width: 100%;\n            padding: 14px;\n            font-size: 16px;\n            margin-top: 8px;\n        }\n        .pc-btn-create:hover { background: #1558b0; }\n        .pc-insert-btn {\n            background: #f1f3f4;\n            color: #444 !important;\n            border: 1px solid #ccc;\n            border-radius: 5px;\n            padding: 6px 14px;\n            font-size: 13px;\n            cursor: pointer;\n            margin-bottom: 0;\n        }\n        .pc-insert-btn:hover { background: #e8eaed; }\n\n        \/* \u041a\u043d\u043e\u043f\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f IndexDB *\/\n        .pc-idb-toolbar {\n            display: flex;\n            gap: 8px;\n            margin-bottom: 14px;\n            flex-wrap: wrap;\n        }\n        .pc-btn-idb-save {\n            background: #e6f4ea;\n            color: #137333;\n            border: 1px solid #a8d5b5;\n            border-radius: 6px;\n            padding: 8px 16px;\n            font-size: 13px;\n            font-weight: 600;\n            cursor: pointer;\n        }\n        .pc-btn-idb-save:hover { background: #ceead6; }\n        .pc-btn-idb-load {\n            background: #e8f0fe;\n            color: #1a73e8;\n            border: 1px solid #aecbfa;\n            border-radius: 6px;\n            padding: 8px 16px;\n            font-size: 13px;\n            font-weight: 600;\n            cursor: pointer;\n        }\n        .pc-btn-idb-load:hover { background: #d2e3fc; }\n        .pc-btn-idb-clear {\n            background: #fce8e6;\n            color: #c5221f;\n            border: 1px solid #f5c6c5;\n            border-radius: 6px;\n            padding: 8px 16px;\n            font-size: 13px;\n            font-weight: 600;\n            cursor: pointer;\n        }\n        .pc-btn-idb-clear:hover { background: #fad2cf; }\n\n        \/* \u041a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 *\/\n        .pc-btn-fill-title {\n            background: #fff3e0;\n            color: #e65100;\n            border: 1px solid #ffcc80;\n            border-radius: 6px;\n            padding: 8px 14px;\n            font-size: 13px;\n            font-weight: 600;\n            cursor: pointer;\n            margin-bottom: 10px;\n            display: inline-block;\n        }\n        .pc-btn-fill-title:hover { background: #ffe0b2; }\n\n        \/* \u0421\u0442\u0430\u0442\u0443\u0441 *\/\n        #pc-status {\n            margin-top: 14px;\n            padding: 12px 16px;\n            border-radius: 6px;\n            display: none;\n            font-size: 14px;\n        }\n        #pc-status.success { background: #e6f4ea; color: #137333; border: 1px solid #a8d5b5; }\n        #pc-status.error   { background: #fce8e6; color: #c5221f; border: 1px solid #f5c6c5; }\n        #pc-status.info    { background: #e8f0fe; color: #1a73e8; border: 1px solid #aecbfa; }\n\n        .pc-label {\n            font-size: 13px;\n            font-weight: 600;\n            color: #555;\n            margin-bottom: 4px;\n            display: block;\n        }\n        .pc-row {\n            display: flex;\n            gap: 12px;\n            margin-bottom: 10px;\n            flex-wrap: wrap;\n        }\n        .pc-row > * { flex: 1; min-width: 160px; }\n\n        \/* \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e *\/\n        #pc-modal-overlay {\n            display: none;\n            position: fixed;\n            top: 0; left: 0; right: 0; bottom: 0;\n            background: rgba(0,0,0,0.5);\n            z-index: 99999;\n            align-items: center;\n            justify-content: center;\n        }\n        #pc-modal-overlay.open {\n            display: flex;\n        }\n        #pc-modal {\n            background: #fff;\n            border-radius: 10px;\n            padding: 24px;\n            width: 90%;\n            max-width: 500px;\n            max-height: 80vh;\n            overflow-y: auto;\n            box-shadow: 0 8px 32px rgba(0,0,0,0.2);\n        }\n        #pc-modal h3 {\n            margin: 0 0 16px 0;\n            font-size: 18px;\n            color: #333;\n        }\n        .pc-modal-item {\n            padding: 10px 14px;\n            border: 2px solid #e0e0e0;\n            border-radius: 6px;\n            margin-bottom: 8px;\n            cursor: pointer;\n            transition: all 0.2s;\n        }\n        .pc-modal-item:hover { border-color: #1a73e8; background: #e8f0fe; }\n        .pc-modal-item.selected { border-color: #1a73e8; background: #e8f0fe; }\n        .pc-modal-item-title {\n            font-weight: 600;\n            color: #333;\n            font-size: 14px;\n        }\n        .pc-modal-item-date {\n            font-size: 12px;\n            color: #888;\n            margin-top: 2px;\n        }\n        .pc-modal-footer {\n            display: flex;\n            gap: 8px;\n            margin-top: 16px;\n            justify-content: flex-end;\n        }\n        .pc-modal-btn-load {\n            background: #1a73e8;\n            color: white;\n            border: none;\n            border-radius: 6px;\n            padding: 10px 20px;\n            font-size: 14px;\n            font-weight: 600;\n            cursor: pointer;\n        }\n        .pc-modal-btn-cancel {\n            background: #f1f3f4;\n            color: #444;\n            border: 1px solid #ccc;\n            border-radius: 6px;\n            padding: 10px 20px;\n            font-size: 14px;\n            cursor: pointer;\n        }\n        .pc-modal-empty {\n            color: #888;\n            font-size: 14px;\n            text-align: center;\n            padding: 20px;\n        }\n    <\/style>\n\n    <!-- \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e -->\n    <div id=\"pc-modal-overlay\">\n        <div id=\"pc-modal\">\n            <h3>\ud83d\udce6 \u0427\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435<\/h3>\n            <div id=\"pc-modal-list\"><\/div>\n            <div class=\"pc-modal-footer\">\n                <button class=\"pc-modal-btn-cancel\" onclick=\"pcCloseModal()\">\u041e\u0442\u043c\u0435\u043d\u0430<\/button>\n                <button class=\"pc-modal-btn-load\" onclick=\"pcLoadSelected()\">\u2b07\ufe0f \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"post-creator-wrap\">\n        <h3 style=\"margin-bottom:16px;\">\u270f\ufe0f \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c<\/h3>\n\n        <!-- \u041f\u0430\u043d\u0435\u043b\u044c IndexDB -->\n        <div class=\"pc-idb-toolbar\">\n            <button class=\"pc-btn-idb-save\" onclick=\"pcSaveToIDB()\" title=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435\">\ud83d\udcbe \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a<\/button>\n            <button class=\"pc-btn-idb-load\" onclick=\"pcOpenModal()\" title=\"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\">\ud83d\udcc2 \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a<\/button>\n            <button class=\"pc-btn-idb-clear\" onclick=\"pcClearIDB()\" title=\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 \u0438\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\">\ud83d\uddd1\ufe0f \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438<\/button>\n        <\/div>\n\n        <!-- \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 -->\n        <label class=\"pc-label\">\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438<\/label>\n        <div style=\"display:flex;gap:8px;align-items:flex-start;margin-bottom:10px;\">\n            <input type=\"text\" id=\"pc-title\" placeholder=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0430\u0442\u044c\u0438...\" style=\"margin-bottom:0;\" \/>\n            <button class=\"pc-btn-fill-title\" onclick=\"pcFillTitle()\" title=\"\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c\">\ud83d\udd50 JP2026<\/button>\n        <\/div>\n\n        <!-- \u0421\u0442\u0430\u0442\u0443\u0441 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442 -->\n        <div class=\"pc-row\">\n            <div>\n                <label class=\"pc-label\">\u0421\u0442\u0430\u0442\u0443\u0441<\/label>\n                <select id=\"pc-status-select\">\n                    <option value=\"draft\">\u0427\u0435\u0440\u043d\u043e\u0432\u0438\u043a<\/option>\n                    <option value=\"publish\">\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c<\/option>\n                    <option value=\"private\" selected>\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u0430\u044f<\/option>\n                <\/select>\n            <\/div>\n            <div>\n                <label class=\"pc-label\">\u0424\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/label>\n                <select id=\"pc-default-format\">\n                    <option value=\"text\">\u0422\u0435\u043a\u0441\u0442<\/option>\n                    <option value=\"html\">HTML<\/option>\n                    <option value=\"json\">JSON<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <!-- \u0411\u043b\u043e\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 -->\n        <label class=\"pc-label\">\u0411\u043b\u043e\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430<\/label>\n        <div id=\"pc-blocks-container\"><\/div>\n\n        <button class=\"pc-btn pc-btn-add\" onclick=\"pcAddBlock()\">\uff0b \u0415\u0449\u0451 \u0442\u0435\u043a\u0441\u0442<\/button>\n        <button class=\"pc-btn pc-btn-create\" onclick=\"pcCreatePost()\">\ud83d\ude80 \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c<\/button>\n\n        <div id=\"pc-status\"><\/div>\n    <\/div>\n\n    <script>\n    (function() {\n        let blockCount = 0;\n        let selectedIDBKey = null;\n        const IDB_NAME = 'PostCreatorDrafts';\n        const IDB_STORE = 'drafts';\n        let db = null;\n\n        \/\/ ===== IndexedDB =====\n        function openDB() {\n            return new Promise((resolve, reject) => {\n                if (db) { resolve(db); return; }\n                const req = indexedDB.open(IDB_NAME, 1);\n                req.onupgradeneeded = e => {\n                    e.target.result.createObjectStore(IDB_STORE, { keyPath: 'key' });\n                };\n                req.onsuccess = e => { db = e.target.result; resolve(db); };\n                req.onerror = () => reject(req.error);\n            });\n        }\n\n        function idbGetAll() {\n            return openDB().then(db => new Promise((resolve, reject) => {\n                const tx = db.transaction(IDB_STORE, 'readonly');\n                const req = tx.objectStore(IDB_STORE).getAll();\n                req.onsuccess = () => resolve(req.result);\n                req.onerror = () => reject(req.error);\n            }));\n        }\n\n        function idbPut(record) {\n            return openDB().then(db => new Promise((resolve, reject) => {\n                const tx = db.transaction(IDB_STORE, 'readwrite');\n                const req = tx.objectStore(IDB_STORE).put(record);\n                req.onsuccess = () => resolve();\n                req.onerror = () => reject(req.error);\n            }));\n        }\n\n        function idbDelete(key) {\n            return openDB().then(db => new Promise((resolve, reject) => {\n                const tx = db.transaction(IDB_STORE, 'readwrite');\n                const req = tx.objectStore(IDB_STORE).delete(key);\n                req.onsuccess = () => resolve();\n                req.onerror = () => reject(req.error);\n            }));\n        }\n\n        function idbClearAll() {\n            return openDB().then(db => new Promise((resolve, reject) => {\n                const tx = db.transaction(IDB_STORE, 'readwrite');\n                const req = tx.objectStore(IDB_STORE).clear();\n                req.onsuccess = () => resolve();\n                req.onerror = () => reject(req.error);\n            }));\n        }\n\n        \/\/ \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0442\u0430\u0440\u0448\u0435 24 \u0447\u0430\u0441\u043e\u0432\n        async function idbCleanOld() {\n            const all = await idbGetAll();\n            const cutoff = Date.now() - 24 * 60 * 60 * 1000;\n            for (const rec of all) {\n                if (rec.timestamp < cutoff) {\n                    await idbDelete(rec.key);\n                }\n            }\n        }\n\n        \/\/ \u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b\n        function collectFormData() {\n            const blocks = [];\n            document.querySelectorAll('.pc-block').forEach(block => {\n                const fmt = block.querySelector('.pc-format-select').value;\n                const content = getBlockContent(block);\n                blocks.push({ fmt, content });\n            });\n            return {\n                title: document.getElementById('pc-title').value,\n                status: document.getElementById('pc-status-select').value,\n                defaultFormat: document.getElementById('pc-default-format').value,\n                blocks\n            };\n        }\n\n        \/\/ \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0443\n        function restoreFormData(data) {\n            document.getElementById('pc-title').value = data.title || '';\n            document.getElementById('pc-status-select').value = data.status || 'private';\n            document.getElementById('pc-default-format').value = data.defaultFormat || 'text';\n            \/\/ \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\n            document.getElementById('pc-blocks-container').innerHTML = '';\n            blockCount = 0;\n            \/\/ \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\n\t\t\t(data.blocks || []).forEach(b => {\n\t\t\t\tblockCount++;\n\t\t\t\tconst fmt = b.fmt;\n\t\t\t\tconst container = document.getElementById('pc-blocks-container');\n\t\t\t\tconst div = document.createElement('div');\n\t\t\t\tdiv.className = 'pc-block';\n\t\t\t\tdiv.id = 'pc-block-' + blockCount;\n\t\t\t\tdiv.innerHTML = buildBlockHTML(blockCount, fmt);\n\t\t\t\tcontainer.appendChild(div);\n\t\t\t\tdiv.querySelector('.pc-format-select').addEventListener('change', function() {\n\t\t\t\t\tpcSwitchFormat(div, this.value);\n\t\t\t\t});\n\t\t\t\t\/\/ \u0422\u0435\u043f\u0435\u0440\u044c \u0431\u043b\u043e\u043a \u0442\u043e\u0447\u043d\u043e \u0432 DOM \u2014 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\n\t\t\t\tif (fmt === 'html') {\n\t\t\t\t\tconst editor = div.querySelector('.pc-html-editor');\n\t\t\t\t\tif (editor) editor.innerHTML = b.content || '';\n\t\t\t\t} else {\n\t\t\t\t\tconst ta = div.querySelector('.pc-textarea');\n\t\t\t\t\tif (ta) ta.value = b.content || '';\n\t\t\t\t}\n\t\t\t});\n        }\n\n        \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\n        window.pcSaveToIDB = async function() {\n            try {\n                await idbCleanOld();\n                const now = new Date();\n                const pad = n => String(n).padStart(2, '0');\n                const key = `draft_${now.getFullYear()}${pad(now.getMonth()+1)}${pad(now.getDate())}_${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;\n                const data = collectFormData();\n                await idbPut({ key, timestamp: Date.now(), title: data.title || key, data });\n                showStatus('info', `\ud83d\udcbe \u0427\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d: <b>${key}<\/b>`);\n            } catch(e) {\n                showStatus('error', '\u274c \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f: ' + e.message);\n            }\n        };\n\n        \/\/ \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438\n        window.pcClearIDB = async function() {\n            if (!confirm('\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 \u0438\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430?')) return;\n            try {\n                await idbClearAll();\n                showStatus('info', '\ud83d\uddd1\ufe0f \u0412\u0441\u0435 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b.');\n            } catch(e) {\n                showStatus('error', '\u274c \u041e\u0448\u0438\u0431\u043a\u0430: ' + e.message);\n            }\n        };\n\n        \/\/ \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e\n        window.pcOpenModal = async function() {\n            try {\n                await idbCleanOld();\n                const all = await idbGetAll();\n                const list = document.getElementById('pc-modal-list');\n                list.innerHTML = '';\n                selectedIDBKey = null;\n\n                if (!all.length) {\n                    list.innerHTML = '<div class=\"pc-modal-empty\">\u041d\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u043e\u0432<\/div>';\n                    document.getElementById('pc-modal-overlay').classList.add('open');\n                    return;\n                }\n\n                \/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u2014 \u043d\u043e\u0432\u044b\u0435 \u043f\u0435\u0440\u0432\u044b\u0435\n                all.sort((a, b) => b.timestamp - a.timestamp);\n\n                all.forEach((rec, idx) => {\n                    const d = new Date(rec.timestamp);\n                    const dateStr = d.toLocaleString('ru-RU');\n                    const div = document.createElement('div');\n                    div.className = 'pc-modal-item' + (idx === 0 ? ' selected' : '');\n                    div.dataset.key = rec.key;\n                    div.innerHTML = `\n                        <div class=\"pc-modal-item-title\">${rec.title || rec.key}<\/div>\n                        <div class=\"pc-modal-item-date\">\ud83d\udcc5 ${dateStr}<\/div>\n                    `;\n                    div.onclick = function() {\n                        document.querySelectorAll('.pc-modal-item').forEach(el => el.classList.remove('selected'));\n                        this.classList.add('selected');\n                        selectedIDBKey = this.dataset.key;\n                    };\n                    list.appendChild(div);\n                    if (idx === 0) selectedIDBKey = rec.key;\n                });\n\n                document.getElementById('pc-modal-overlay').classList.add('open');\n            } catch(e) {\n                showStatus('error', '\u274c \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438: ' + e.message);\n            }\n        };\n\n        \/\/ \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e\n        window.pcCloseModal = function() {\n            document.getElementById('pc-modal-overlay').classList.remove('open');\n        };\n\n        \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\n        window.pcLoadSelected = async function() {\n            if (!selectedIDBKey) return;\n            try {\n                const all = await idbGetAll();\n                const rec = all.find(r => r.key === selectedIDBKey);\n                if (rec) {\n                    restoreFormData(rec.data);\n                    showStatus('info', `\ud83d\udcc2 \u0427\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d: <b>${rec.title || rec.key}<\/b>`);\n                }\n                pcCloseModal();\n            } catch(e) {\n                showStatus('error', '\u274c \u041e\u0448\u0438\u0431\u043a\u0430: ' + e.message);\n            }\n        };\n\n        \/\/ \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043c\u043e\u0434\u0430\u043b\u043a\u0443 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u043e\u0432\u0435\u0440\u043b\u0435\u0439\n        document.getElementById('pc-modal-overlay').addEventListener('click', function(e) {\n            if (e.target === this) pcCloseModal();\n        });\n\n        \/\/ ===== \u0424\u043e\u0440\u043c\u0430 =====\n\n        \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\n        window.pcFillTitle = function() {\n            const now = new Date();\n            const pad = n => String(n).padStart(2, '0');\n            const yy = String(now.getFullYear()).slice(2);\n            const mm = pad(now.getMonth() + 1);\n            const dd = pad(now.getDate());\n            const hh = pad(now.getHours());\n            const min = pad(now.getMinutes());\n            const sec = pad(now.getSeconds());\n            document.getElementById('pc-title').value = `JP2026 ${yy}${mm}${dd}_${hh}${min}${sec}`;\n        };\n\n        \/\/ \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u043b\u043e\u043a\n        window.pcAddBlock = function(defaultFormat) {\n            blockCount++;\n            const fmt = defaultFormat || document.getElementById('pc-default-format').value;\n            const container = document.getElementById('pc-blocks-container');\n            const div = document.createElement('div');\n            div.className = 'pc-block';\n            div.id = 'pc-block-' + blockCount;\n            div.innerHTML = buildBlockHTML(blockCount, fmt);\n            container.appendChild(div);\n            div.querySelector('.pc-format-select').addEventListener('change', function() {\n                pcSwitchFormat(div, this.value);\n            });\n        };\n\n        function buildBlockHTML(num, fmt) {\n            return `\n                <div class=\"pc-block-header\">\n                    <span style=\"font-size:13px;font-weight:600;color:#888;\">\u0411\u043b\u043e\u043a #${num}<\/span>\n                    <select class=\"pc-format-select\">\n                        <option value=\"text\" ${fmt==='text'?'selected':''}>\u0422\u0435\u043a\u0441\u0442<\/option>\n                        <option value=\"html\" ${fmt==='html'?'selected':''}>HTML<\/option>\n                        <option value=\"json\" ${fmt==='json'?'selected':''}>JSON<\/option>\n                    <\/select>\n                    <button class=\"pc-remove-btn\" onclick=\"pcRemoveBlock('pc-block-${num}')\" title=\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043b\u043e\u043a\">\u00d7<\/button>\n                <\/div>\n                <div class=\"pc-content-area\">\n                    ${fmt === 'html' ? buildHtmlEditor() : buildTextarea(fmt)}\n                <\/div>\n                <button class=\"pc-insert-btn\" onclick=\"pcInsertSample(this)\">\ud83d\udccb \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440<\/button>\n            `;\n        }\n\n        function buildTextarea(fmt) {\n            const ph = fmt === 'json' ? '{\"key\": \"value\"}' : '\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u043b\u043e\u043a\u0430...';\n            return `<textarea class=\"pc-textarea\" placeholder=\"${ph}\"><\/textarea>`;\n        }\n\n        function buildHtmlEditor() {\n            return `\n                <div class=\"pc-view-toggle\">\n                    <button class=\"active\" onclick=\"pcSetView(this, 'visual')\">\ud83d\udc41 \u0412\u0438\u0437\u0443\u0430\u043b<\/button>\n                    <button onclick=\"pcSetView(this, 'code')\">\ud83d\udcdd HTML-\u043a\u043e\u0434<\/button>\n                <\/div>\n                <div class=\"pc-html-editor\" contenteditable=\"true\" data-view=\"visual\"\n                     title=\"\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Ctrl+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 HTML\"><\/div>\n                <textarea class=\"pc-textarea\" style=\"display:none;font-size:12px;color:#333;background:#f5f5f5;\"\n                          placeholder=\"HTML-\u043a\u043e\u0434...\"><\/textarea>\n                <div class=\"pc-html-editor-hint\">\ud83d\udca1 \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0432 \u043f\u043e\u043b\u0435 \u2192 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 <b>Ctrl+V<\/b> \u2014 HTML \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/div>\n            `;\n        }\n\n        window.pcSwitchFormat = function(blockDiv, newFmt) {\n            const area = blockDiv.querySelector('.pc-content-area');\n            const currentContent = getBlockContent(blockDiv);\n            area.innerHTML = newFmt === 'html' ? buildHtmlEditor() : buildTextarea(newFmt);\n            if (currentContent) {\n                if (newFmt === 'html') {\n                    area.querySelector('.pc-html-editor').innerHTML = currentContent;\n                } else {\n                    area.querySelector('.pc-textarea').value = currentContent;\n                }\n            }\n        };\n\n        window.pcSetView = function(btn, mode) {\n            const area = btn.closest('.pc-content-area');\n            const editor = area.querySelector('.pc-html-editor');\n            const codeArea = area.querySelector('.pc-textarea');\n            btn.closest('.pc-view-toggle').querySelectorAll('button').forEach(b => b.classList.remove('active'));\n            btn.classList.add('active');\n            if (mode === 'visual') {\n                editor.innerHTML = codeArea.value;\n                editor.style.display = '';\n                codeArea.style.display = 'none';\n            } else {\n                codeArea.value = editor.innerHTML;\n                codeArea.style.color = '#333';\n                codeArea.style.background = '#f5f5f5';\n                editor.style.display = 'none';\n                codeArea.style.display = '';\n                codeArea.style.minHeight = '140px';\n            }\n        };\n\n        function getBlockContent(blockDiv) {\n            const fmt = blockDiv.querySelector('.pc-format-select').value;\n            if (fmt === 'html') {\n                const editor = blockDiv.querySelector('.pc-html-editor');\n                const codeArea = blockDiv.querySelector('.pc-textarea');\n                if (editor && editor.style.display !== 'none') return editor.innerHTML;\n                if (codeArea) return codeArea.value;\n            } else {\n                const ta = blockDiv.querySelector('.pc-textarea');\n                return ta ? ta.value : '';\n            }\n            return '';\n        }\n\n        window.pcRemoveBlock = function(id) {\n            const el = document.getElementById(id);\n            if (el) el.remove();\n        };\n\n        window.pcInsertSample = function(btn) {\n            const block = btn.closest('.pc-block');\n            const fmt = block.querySelector('.pc-format-select').value;\n            const samples = {\n                text: '\u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.\\n\\n\u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0431\u0437\u0430\u0446.',\n                html: '<h2>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430<\/h2>\\n<p>\u042d\u0442\u043e \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444 \u0441 <strong>\u0436\u0438\u0440\u043d\u044b\u043c<\/strong> \u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\\n<ul><li>\u041f\u0443\u043d\u043a\u0442 1<\/li><li>\u041f\u0443\u043d\u043a\u0442 2<\/li><\/ul>',\n                json: '{\\n  \"key\": \"value\",\\n  \"items\": [1, 2, 3]\\n}'\n            };\n            if (fmt === 'html') {\n                const editor = block.querySelector('.pc-html-editor');\n                const codeArea = block.querySelector('.pc-textarea');\n                if (editor && editor.style.display !== 'none') editor.innerHTML = samples.html;\n                else if (codeArea) codeArea.value = samples.html;\n            } else {\n                const ta = block.querySelector('.pc-textarea');\n                if (ta) ta.value = samples[fmt] || '';\n            }\n        };\n\n        \/\/ \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c\n        window.pcCreatePost = function() {\n            const title = document.getElementById('pc-title').value.trim();\n            const status = document.getElementById('pc-status-select').value;\n\n            if (!title) {\n                showStatus('error', '\u26a0\ufe0f \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438.');\n                return;\n            }\n\n            const blocks = document.querySelectorAll('.pc-block');\n            let contentParts = [];\n            blocks.forEach(block => {\n                const fmt = block.querySelector('.pc-format-select').value;\n                const text = getBlockContent(block);\n                if (!text || !text.trim()) return;\n                if (fmt === 'html') {\n                    contentParts.push(text);\n                } else if (fmt === 'json') {\n                    contentParts.push('<pre><code>' + text.replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;') + '<\/code><\/pre>');\n                } else {\n                    contentParts.push('<p>' + text.trim().replace(\/\\n\\n+\/g,'<\/p><p>').replace(\/\\n\/g,'<br>') + '<\/p>');\n                }\n            });\n\n\t\t\tconst divider = '<hr style=\"border:none;border-top:3px solid #1a73e8;margin:32px auto;width:80%;opacity:0.5;\">';\n\t\t\tconst content = contentParts.join('\\n\\n' + divider + '\\n\\n');\n            if (!content.trim()) {\n                showStatus('error', '\u26a0\ufe0f \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c.');\n                return;\n            }\n\n            if (typeof wpApiSettings === 'undefined') {\n                showStatus('error', '\u274c WordPress API \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0432\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u044b.');\n                return;\n            }\n\n            const createBtn = document.querySelector('.pc-btn-create');\n            createBtn.disabled = true;\n            createBtn.textContent = '\u23f3 \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f...';\n\n            fetch(wpApiSettings.root + 'wp\/v2\/posts', {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json',\n                    'X-WP-Nonce': wpApiSettings.nonce\n                },\n                body: JSON.stringify({ title, content, status })\n            })\n            .then(r => r.json())\n            .then(data => {\n                createBtn.disabled = false;\n                createBtn.textContent = '\ud83d\ude80 \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c';\n                if (data.id) {\n                    showStatus('success', `\u2705 \u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0430! <a href=\"${data.link}\" target=\"_blank\">\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c<\/a> | <a href=\"\/wp-admin\/post.php?post=${data.id}&action=edit\" target=\"_blank\">\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435<\/a>`);\n                    \/\/ \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\n                    window.open(data.link, '_blank');\n                    \/\/ \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\n                    document.getElementById('pc-title').value = '';\n                    document.getElementById('pc-blocks-container').innerHTML = '';\n                    blockCount = 0;\n                    pcAddBlock();\n                    pcFillTitle();\n                } else {\n                    showStatus('error', '\u274c \u041e\u0448\u0438\u0431\u043a\u0430: ' + (data.message || JSON.stringify(data)));\n                }\n            })\n            .catch(err => {\n                createBtn.disabled = false;\n                createBtn.textContent = '\ud83d\ude80 \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c';\n                showStatus('error', '\u274c \u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: ' + err.message);\n            });\n        };\n\n        function showStatus(type, msg) {\n            const el = document.getElementById('pc-status');\n            el.className = type;\n            el.innerHTML = msg;\n            el.style.display = 'block';\n            el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n        }\n\n        \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\n        function init() {\n            pcAddBlock();\n            pcFillTitle();\n        }\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', init);\n        } else {\n            init();\n        }\n    })();\n    <\/script>\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":9435,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[199,184,138],"tags":[],"class_list":["post-9430","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-199","category--script","category-138"],"_links":{"self":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/9430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9430"}],"version-history":[{"count":2,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/9430\/revisions"}],"predecessor-version":[{"id":9432,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/9430\/revisions\/9432"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/media\/9435"}],"wp:attachment":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}