797797 .vp-ctrl .btn : disabled {opacity : .45 ;cursor : not-allowed;}
798798 .vp-ctrl .btn : disabled : hover {transform : none;border-color : var (--line-2 );}
799799 .vp-feedback {margin-top : 14px ;text-align : center;overflow : hidden;}
800+ .vp-feedback .sol-feedback {margin-top : 22px ;}
800801 .vp-feedback [hidden ]{display : none!important ;}
801802 .vp-fb-q {margin : 0 0 10px ;font-size : 14px ;color : var (--ink-2 );max-height : 32px ;opacity : 1 ;
802803 transition : opacity .35s var (--ease ), max-height .35s var (--ease ), margin .35s var (--ease );}
@@ -2634,7 +2635,11 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
26342635 trackEvent ( 'solve_empty' ) ;
26352636 body . innerHTML =
26362637 '<div class="sol-head"><span class="sol-title">Решение</span></div>' +
2637- '<div class="msg ok">Все штифты уже в центре - замок открыт. Ходов не нужно.</div>' ;
2638+ '<div class="msg ok">Все штифты уже в центре - замок открыт. Ходов не нужно.</div>' +
2639+ solFeedbackHtml ( ) ;
2640+ resetSolFeedback ( ) ;
2641+ bindSolFeedback ( ) ;
2642+ vpSyncFeedback ( true ) ;
26382643 return ;
26392644 }
26402645
@@ -2684,6 +2689,28 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
26842689 : '<span class="dirchip R">ВПРАВО →</span>' ;
26852690}
26862691
2692+ function solFeedbackHtml ( ) {
2693+ return '<div class="vp-feedback sol-feedback" id="vpFeedback" hidden>' +
2694+ '<p class="vp-fb-q">Сайт помог?</p>' +
2695+ '<div class="vp-fb-act" id="vpFbAct">' +
2696+ '<button class="vp-fb-btn vp-fb-up" id="vpFbUp" type="button">Да</button>' +
2697+ '<button class="vp-fb-btn vp-fb-down" id="vpFbDn" type="button">Нет</button>' +
2698+ '</div>' +
2699+ '<p class="vp-fb-hint" id="vpFbHint" hidden>Оценку можно изменить</p>' +
2700+ '<p class="vp-fb-thanks" id="vpFbThanks">Спасибо!</p>' +
2701+ '</div>' ;
2702+ }
2703+ function bindSolFeedback ( ) {
2704+ var up = document . getElementById ( 'vpFbUp' ) ;
2705+ var dn = document . getElementById ( 'vpFbDn' ) ;
2706+ if ( up ) up . onclick = function ( ) { vpSubmitFeedback ( 'up' ) ; } ;
2707+ if ( dn ) dn . onclick = function ( ) { vpSubmitFeedback ( 'down' ) ; } ;
2708+ }
2709+ function resetSolFeedback ( ) {
2710+ vpFbChecked = false ;
2711+ vpCurrentVote = null ;
2712+ }
2713+
26872714function renderSolution ( fresh ) {
26882715 if ( ! SOL ) return ;
26892716 var body = document . getElementById ( 'solbody' ) ;
@@ -2721,7 +2748,8 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27212748 }
27222749 html += '</div><div class="msg ok">После последнего шага все штифты встанут в центр - замок откроется. ' +
27232750 'Решение проверено симуляцией перед выводом. Кликай по шагам, чтобы отмечать выполненные.</div></div>' +
2724- '<div id="solPlayer"' + ( SOL_MODE === 'play' ? '' : ' style="display:none"' ) + '></div>' ;
2751+ '<div id="solPlayer"' + ( SOL_MODE === 'play' ? '' : ' style="display:none"' ) + '></div>' +
2752+ solFeedbackHtml ( ) ;
27252753 body . innerHTML = html ;
27262754 document . getElementById ( 'pvToggle' ) . onchange = function ( ) {
27272755 PV_ON = this . checked ;
@@ -2738,6 +2766,9 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27382766 if ( fresh ) vpIdx = 0 ;
27392767 buildPlayer ( ) ;
27402768 setSolMode ( SOL_MODE , false ) ;
2769+ resetSolFeedback ( ) ;
2770+ bindSolFeedback ( ) ;
2771+ vpSyncFeedback ( SOL_MODE === 'list' ) ;
27412772}
27422773
27432774/* ---------- визуальный пошаговый режим («Показ») ---------- */
@@ -2761,6 +2792,7 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27612792 if ( vp ) { vp . classList . remove ( 'show' ) ; void vp . offsetWidth ; vp . classList . add ( 'show' ) ; }
27622793 }
27632794 }
2795+ if ( SOL ) vpSyncFeedback ( SOL_MODE === 'list' || vpIdx >= vpGroups . length ) ;
27642796}
27652797
27662798function buildPlayer ( ) {
@@ -2778,15 +2810,6 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27782810 '<button id="vpPrev" class="btn" type="button">← Назад</button>' +
27792811 '<button id="vpNext" class="btn primary" type="button">Далее →</button>' +
27802812 '</div>' +
2781- '<div class="vp-feedback" id="vpFeedback" hidden>' +
2782- '<p class="vp-fb-q">Сайт помог?</p>' +
2783- '<div class="vp-fb-act" id="vpFbAct">' +
2784- '<button class="vp-fb-btn vp-fb-up" id="vpFbUp" type="button">Да</button>' +
2785- '<button class="vp-fb-btn vp-fb-down" id="vpFbDn" type="button">Нет</button>' +
2786- '</div>' +
2787- '<p class="vp-fb-hint" id="vpFbHint" hidden>Оценку можно изменить</p>' +
2788- '<p class="vp-fb-thanks" id="vpFbThanks">Спасибо!</p>' +
2789- '</div>' +
27902813 '</div>' ;
27912814 var lockEl = document . getElementById ( 'vpLock' ) ;
27922815 lockEl . style . setProperty ( '--vty' , ( ( N - 1 ) * 15 + 6 ) + 'px' ) ;
@@ -2806,11 +2829,8 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
28062829 vpStates = [ SOL . check . states [ 0 ] ] ;
28072830 for ( var g = 0 ; g < vpGroups . length ; g ++ ) vpStates . push ( SOL . check . states [ vpGroups [ g ] . endIdx + 1 ] ) ;
28082831 if ( vpIdx > vpGroups . length ) vpIdx = vpGroups . length ;
2809- vpFbChecked = false ;
28102832 document . getElementById ( 'vpPrev' ) . onclick = function ( ) { if ( vpIdx > 0 ) { vpIdx -- ; playerRender ( ) ; } } ;
28112833 document . getElementById ( 'vpNext' ) . onclick = function ( ) { if ( vpIdx < vpGroups . length ) { vpIdx ++ ; playerRender ( ) ; } } ;
2812- document . getElementById ( 'vpFbUp' ) . onclick = function ( ) { vpSubmitFeedback ( 'up' ) ; } ;
2813- document . getElementById ( 'vpFbDn' ) . onclick = function ( ) { vpSubmitFeedback ( 'down' ) ; } ;
28142834}
28152835
28162836var vpFbChecked = false ;
@@ -2904,6 +2924,7 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
29042924 document . getElementById ( 'vpMove' ) . innerHTML = done ? 'Все штифты в центре' : vpMoveText ( vpGroups [ vpIdx ] ) ;
29052925 document . getElementById ( 'vpPrev' ) . disabled = vpIdx === 0 ;
29062926 document . getElementById ( 'vpNext' ) . disabled = done ;
2927+ vpSyncFeedback ( done ) ;
29072928}
29082929
29092930/* ---------- ссылки / пресеты / сброс ---------- */
0 commit comments