[hideprofile]
[html]<style>
:root {
--sg30-gap: 6px;
--sg30-cell-size: 110px;
--sg30-board-width: 690px;
}
.sg30-root,
.sg30-root * {
box-sizing: border-box;
}
.sg30-root {
font-family: Arial, sans-serif;
width: 900px;
max-width: 100%;
margin: 0 auto;
color: #1f2937;
}
.sg30-layout {
display: flex;
flex-direction: column;
gap: 18px;
}
.sg30-panel,
.sg30-board-wrap {
border: 1px solid #d1d5db;
border-radius: 16px;
background: #ffffff;
padding: 16px;
}
.sg30-title {
margin: 0 0 8px;
font-size: 24px;
}
.sg30-sub {
margin: 0;
color: #6b7280;
line-height: 1.45;
}
.sg30-admin-grid {
display: grid;
grid-template-columns: repeat(2, minmax(220px, 1fr));
gap: 12px;
margin-top: 14px;
}
.sg30-admin-card {
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 12px;
background: #f9fafb;
}
.sg30-admin-head {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
font-weight: 700;
}
.sg30-token-dot {
width: 16px;
height: 16px;
border-radius: 50%;
border: 2px solid rgba(0,0,0,.2);
flex: 0 0 auto;
}
.sg30-label {
display: block;
font-size: 13px;
margin-bottom: 6px;
}
.sg30-select,
.sg30-button,
.sg30-copy-box {
width: 100%;
border-radius: 10px;
font: inherit;
}
.sg30-select {
min-height: 38px;
border: 1px solid #cbd5e1;
background: #fff;
padding: 8px 10px;
}
.sg30-button {
min-height: 38px;
border: 0;
background: #2563eb;
color: #fff;
padding: 10px 12px;
cursor: pointer;
font-weight: 700;
}
.sg30-button.sg30-button-secondary {
background: #e5e7eb;
color: #111827;
}
.sg30-admin-actions {
display: flex;
gap: 12px;
margin-top: 14px;
flex-wrap: wrap;
}
.sg30-help {
margin-top: 12px;
font-size: 13px;
color: #6b7280;
line-height: 1.45;
}
.sg30-copy-wrap {
margin-top: 16px;
border-top: 1px solid #e5e7eb;
padding-top: 16px;
}
.sg30-copy-title {
margin: 0 0 8px;
font-size: 16px;
}
.sg30-copy-box {
min-height: 260px;
border: 1px solid #cbd5e1;
background: #f8fafc;
padding: 12px;
resize: vertical;
font-family: Consolas, Monaco, monospace;
font-size: 12px;
line-height: 1.45;
}
.sg30-board-wrap {
width: fit-content;
}
.sg30-board {
display: grid;
grid-template-columns: repeat(6, 110px);
grid-template-rows: repeat(5, 110px);
gap: var(--sg30-gap);
position: relative;
width: var(--sg30-board-width);
}
.sg30-cell {
border: 1px solid #cbd5e1;
border-radius: 12px;
padding: 8px;
background: #fff;
font-size: 12px;
position: relative;
}
.sg30-start { background: #d1fae5; }
.sg30-finish { background: #fee2e2; }
.sg30-task { background: #fff7ed; }
.sg30-cell-num {
font-weight: 700;
font-size: 16px;
}
.sg30-cell-star {
position: absolute;
top: 8px;
right: 8px;
color: #f59e0b;
font-weight: 700;
}
.sg30-token-layer {
position: absolute;
inset: 0;
display: grid;
grid-template-columns: repeat(6, 110px);
grid-template-rows: repeat(5, 110px);
gap: var(--sg30-gap);
pointer-events: none;
z-index: 3;
}
.sg30-token {
width: 16px;
height: 16px;
border-radius: 50%;
border: 2px solid rgba(0,0,0,.2);
place-self: center;
}
.sg30-token-p1 { transform: translate(-14px,-14px); }
.sg30-token-p2 { transform: translate(0,-14px); }
.sg30-token-p3 { transform: translate(14px,-14px); }
.sg30-token-p4 { transform: translate(-14px,0); }
.sg30-token-p5 { transform: translate(0,0); }
.sg30-token-p6 { transform: translate(14px,0); }
.sg30-token-p7 { transform: translate(0,14px); }
.sg30-pos-0 { display: none; }
.sg30-pos-1 { grid-area: 1 / 1; }
.sg30-pos-2 { grid-area: 1 / 2; }
.sg30-pos-3 { grid-area: 1 / 3; }
.sg30-pos-4 { grid-area: 1 / 4; }
.sg30-pos-5 { grid-area: 1 / 5; }
.sg30-pos-6 { grid-area: 1 / 6; }
.sg30-pos-7 { grid-area: 2 / 6; }
.sg30-pos-8 { grid-area: 3 / 6; }
.sg30-pos-9 { grid-area: 4 / 6; }
.sg30-pos-10 { grid-area: 5 / 6; }
.sg30-pos-11 { grid-area: 5 / 5; }
.sg30-pos-12 { grid-area: 5 / 4; }
.sg30-pos-13 { grid-area: 5 / 3; }
.sg30-pos-14 { grid-area: 5 / 2; }
.sg30-pos-15 { grid-area: 5 / 1; }
.sg30-pos-16 { grid-area: 4 / 1; }
.sg30-pos-17 { grid-area: 3 / 1; }
.sg30-pos-18 { grid-area: 2 / 1; }
.sg30-pos-19 { grid-area: 2 / 2; }
.sg30-pos-20 { grid-area: 2 / 3; }
.sg30-pos-21 { grid-area: 2 / 4; }
.sg30-pos-22 { grid-area: 2 / 5; }
.sg30-pos-23 { grid-area: 3 / 5; }
.sg30-pos-24 { grid-area: 4 / 5; }
.sg30-pos-25 { grid-area: 4 / 4; }
.sg30-pos-26 { grid-area: 4 / 3; }
.sg30-pos-27 { grid-area: 4 / 2; }
.sg30-pos-28 { grid-area: 3 / 2; }
.sg30-pos-29 { grid-area: 3 / 3; }
.sg30-pos-30 { grid-area: 3 / 4; }
.sg30-hidden {
display: none !important;
}
@media (max-width: 760px) {
.sg30-admin-grid {
grid-template-columns: 1fr;
}
.sg30-root {
width: 100%;
}
.sg30-board {
transform: scale(.9);
transform-origin: top left;
}
.sg30-board-wrap {
overflow-x: auto;
}
}
</style>
<div class="sg30-root" id="sg30-root">
<div class="sg30-layout">
<section class="sg30-panel" id="sg30-admin-panel">
<h1 class="sg30-title">Настольная игра: спираль из 30 ячеек</h1>
<p class="sg30-sub">
Администратор выставляет номера клеток, нажимает «Применить позиции», затем копирует готовый HTML всего игрового блока и вставляет его в пост при редактировании.
</p>
<div class="sg30-admin-grid">
<div class="sg30-admin-card">
<div class="sg30-admin-head"><span class="sg30-token-dot" style="background:red"></span> Игрок 1</div>
<label class="sg30-label" for="sg30-select-p1">Номер ячейки</label>
<select class="sg30-select" id="sg30-select-p1" data-token="sg30-token-p1"></select>
</div>
<div class="sg30-admin-card">
<div class="sg30-admin-head"><span class="sg30-token-dot" style="background:blue"></span> Игрок 2</div>
<label class="sg30-label" for="sg30-select-p2">Номер ячейки</label>
<select class="sg30-select" id="sg30-select-p2" data-token="sg30-token-p2"></select>
</div>
<div class="sg30-admin-card">
<div class="sg30-admin-head"><span class="sg30-token-dot" style="background:green"></span> Игрок 3</div>
<label class="sg30-label" for="sg30-select-p3">Номер ячейки</label>
<select class="sg30-select" id="sg30-select-p3" data-token="sg30-token-p3"></select>
</div>
<div class="sg30-admin-card">
<div class="sg30-admin-head"><span class="sg30-token-dot" style="background:orange"></span> Игрок 4</div>
<label class="sg30-label" for="sg30-select-p4">Номер ячейки</label>
<select class="sg30-select" id="sg30-select-p4" data-token="sg30-token-p4"></select>
</div>
<div class="sg30-admin-card">
<div class="sg30-admin-head"><span class="sg30-token-dot" style="background:purple"></span> Игрок 5</div>
<label class="sg30-label" for="sg30-select-p5">Номер ячейки</label>
<select class="sg30-select" id="sg30-select-p5" data-token="sg30-token-p5"></select>
</div>
<div class="sg30-admin-card">
<div class="sg30-admin-head"><span class="sg30-token-dot" style="background:brown"></span> Игрок 6</div>
<label class="sg30-label" for="sg30-select-p6">Номер ячейки</label>
<select class="sg30-select" id="sg30-select-p6" data-token="sg30-token-p6"></select>
</div>
<div class="sg30-admin-card">
<div class="sg30-admin-head"><span class="sg30-token-dot" style="background:black"></span> Игрок 7</div>
<label class="sg30-label" for="sg30-select-p7">Номер ячейки</label>
<select class="sg30-select" id="sg30-select-p7" data-token="sg30-token-p7"></select>
</div>
</div>
<div class="sg30-admin-actions">
<button class="sg30-button" id="sg30-apply" type="button">Применить позиции</button>
<button class="sg30-button sg30-button-secondary" id="sg30-reset" type="button">Сбросить</button>
<button class="sg30-button" id="sg30-copy-html" type="button">Копировать весь HTML поля</button>
</div>
<div class="sg30-help">
0 — игрок вне поля. 1–30 — номер клетки. Несколько игроков могут стоять в одной ячейке.
</div>
<div class="sg30-copy-wrap">
<h2 class="sg30-copy-title">Полный HTML игрового блока для вставки в пост</h2>
<textarea class="sg30-copy-box" id="sg30-copy-box" readonly></textarea>
</div>
</section>
<section class="sg30-board-wrap" id="sg30-board-wrap">
<div class="sg30-board">
<div class="sg30-cell sg30-start" style="grid-area:1/1"><div class="sg30-cell-num">1</div></div>
<div class="sg30-cell" style="grid-area:1/2"><div class="sg30-cell-num">2</div></div>
<div class="sg30-cell sg30-task" style="grid-area:1/3"><div class="sg30-cell-num">3</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:1/4"><div class="sg30-cell-num">4</div></div>
<div class="sg30-cell" style="grid-area:1/5"><div class="sg30-cell-num">5</div></div>
<div class="sg30-cell sg30-task" style="grid-area:1/6"><div class="sg30-cell-num">6</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:2/6"><div class="sg30-cell-num">7</div></div>
<div class="sg30-cell" style="grid-area:3/6"><div class="sg30-cell-num">8</div></div>
<div class="sg30-cell sg30-task" style="grid-area:4/6"><div class="sg30-cell-num">9</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:5/6"><div class="sg30-cell-num">10</div></div>
<div class="sg30-cell" style="grid-area:5/5"><div class="sg30-cell-num">11</div></div>
<div class="sg30-cell sg30-task" style="grid-area:5/4"><div class="sg30-cell-num">12</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:5/3"><div class="sg30-cell-num">13</div></div>
<div class="sg30-cell" style="grid-area:5/2"><div class="sg30-cell-num">14</div></div>
<div class="sg30-cell sg30-task" style="grid-area:5/1"><div class="sg30-cell-num">15</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:4/1"><div class="sg30-cell-num">16</div></div>
<div class="sg30-cell" style="grid-area:3/1"><div class="sg30-cell-num">17</div></div>
<div class="sg30-cell sg30-task" style="grid-area:2/1"><div class="sg30-cell-num">18</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:2/2"><div class="sg30-cell-num">19</div></div>
<div class="sg30-cell" style="grid-area:2/3"><div class="sg30-cell-num">20</div></div>
<div class="sg30-cell sg30-task" style="grid-area:2/4"><div class="sg30-cell-num">21</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:2/5"><div class="sg30-cell-num">22</div></div>
<div class="sg30-cell" style="grid-area:3/5"><div class="sg30-cell-num">23</div></div>
<div class="sg30-cell sg30-task" style="grid-area:4/5"><div class="sg30-cell-num">24</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:4/4"><div class="sg30-cell-num">25</div></div>
<div class="sg30-cell" style="grid-area:4/3"><div class="sg30-cell-num">26</div></div>
<div class="sg30-cell sg30-task" style="grid-area:4/2"><div class="sg30-cell-num">27</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-cell" style="grid-area:3/2"><div class="sg30-cell-num">28</div></div>
<div class="sg30-cell" style="grid-area:3/3"><div class="sg30-cell-num">29</div></div>
<div class="sg30-cell sg30-task sg30-finish" style="grid-area:3/4"><div class="sg30-cell-num">30</div><div class="sg30-cell-star">★</div></div>
<div class="sg30-token-layer" id="sg30-token-layer">
<div class="sg30-token sg30-token-p1 sg30-pos-0" style="background:red"></div>
<div class="sg30-token sg30-token-p2 sg30-pos-0" style="background:blue"></div>
<div class="sg30-token sg30-token-p3 sg30-pos-0" style="background:green"></div>
<div class="sg30-token sg30-token-p4 sg30-pos-4" style="background:orange"></div>
<div class="sg30-token sg30-token-p5 sg30-pos-4" style="background:purple"></div>
<div class="sg30-token sg30-token-p6 sg30-pos-0" style="background:brown"></div>
<div class="sg30-token sg30-token-p7 sg30-pos-6" style="background:black"></div>
</div>
</div>
</section>
</div>
</div>[/html]