2727 --svg-axis-primary : oklch (75% 0.04 260 );
2828 --svg-fill-area : oklch (52% 0.07 200 );
2929
30+ --error-bg : oklch (55% 0.15 19 );
31+
3032 /* Всякое разное */
3133 --btn-active-translateY : -2px ;
3234
231233 }
232234
233235 .container {
234- animation : fadeIn 0.6s ease-out;
236+ animation : containerFadeIn 0.6s ease-out;
235237 }
236238
237- .form-row {
238- animation : fadeIn 0.8s ease-out;
239- }
240-
241239 /* Адаптивность */
242240 @media (max-width : 768px ) {
243241 .form-grid {
375373 transform : translateY (var (--btn-active-translateY ));
376374 }
377375
378- /* Адаптивность */
376+ /* Сообщение об ошибке */
377+ .error-message {
378+ position : fixed;
379+ bottom : 20px ;
380+ right : 20px ;
381+
382+ background-color : var (--error-bg );
383+ color : var (--text-primary );
384+
385+ padding : 15px 20px ;
386+
387+ border-radius : 8px ;
388+ box-shadow : 0 4px 12px rgba (0 , 0 , 0 , 0.3 );
389+
390+ z-index : 1000 ;
391+
392+ max-width : 350px ;
393+
394+ animation : errorSlideIn 0.3s ease-out, errorFadeOut 0.5s ease-in 4.5s forwards;
395+ }
396+
397+ /* Адаптивность */
379398 @media (max-width : 968px ) {
380399 .container {
381400 min-width : 95% ;
404423 }
405424
406425 /* Анимации */
407- @keyframes fadeIn {
426+ @keyframes containerFadeIn {
408427 from {
409428 opacity : 0 ;
410429 transform : translateY (20px );
414433 transform : translateY (0 );
415434 }
416435 }
436+
437+ @keyframes errorSlideIn {
438+ from {
439+ transform : translateX (100% );
440+ opacity : 0 ;
441+ }
442+ to {
443+ transform : translateX (0 );
444+ opacity : 1 ;
445+ }
446+ }
447+
448+ @keyframes errorFadeOut {
449+ from {
450+ opacity : 1 ;
451+ }
452+ to {
453+ opacity : 0 ;
454+ display : none;
455+ }
456+ }
417457 </ style >
418458</ head >
419459< body >
@@ -633,17 +673,43 @@ <h3 class="history-title">История введенных данных</h3>
633673 // Хранение истории данных
634674 let formHistory = JSON . parse ( localStorage . getItem ( 'formHistory' ) ) || [ ] ;
635675
676+ const showError = ( message ) => {
677+ // Убираем существующие сообщения
678+ const existingErrors = document . querySelectorAll ( '.error-message' ) ;
679+ existingErrors . forEach ( error => error . remove ( ) ) ;
680+
681+ // Слздаём элемент
682+ const errorDiv = document . createElement ( 'div' ) ;
683+ errorDiv . className = 'error-message' ;
684+ errorDiv . textContent = message ;
685+
686+ // Вставка
687+ document . body . appendChild ( errorDiv ) ;
688+
689+ // Убираем по прошествии 5-ти секунд
690+ setTimeout ( ( ) => {
691+ if ( errorDiv . parentNode ) {
692+ errorDiv . parentNode . removeChild ( errorDiv ) ;
693+ }
694+ } , 5000 ) ;
695+ } ;
696+
636697 const FFCGIResponceHandler = ( responce , X , Y , R ) => {
637- const JSONresponce = JSON . parse ( responce ) ;
698+ const JSONResponce = JSON . parse ( responce ) ;
699+
700+ if ( JSONResponce . error ) {
701+ showError ( `Ошибка: ${ JSONResponce . error } ` ) ;
702+ return ;
703+ }
638704
639705 // Сохраняем данные в историю
640706 const formData = {
641707 timestamp : new Date ( ) . toISOString ( ) ,
642708 X : X ,
643709 Y : Y ,
644710 R : R ,
645- elapsedTimeNs : JSONresponce . elapsedTimeNs ,
646- isHitted : JSONresponce . result
711+ elapsedTimeNs : JSONResponce . elapsedTimeNs ,
712+ isHitted : JSONResponce . result
647713 } ;
648714
649715 formHistory . push ( formData ) ;
@@ -666,7 +732,10 @@ <h3 class="history-title">История введенных данных</h3>
666732 const Y = document . getElementById ( 'Y' ) . value ;
667733
668734 if ( X && R && Y ) {
669- sendAJAXGETRequest ( "/fcgi-bin/" , { "x" : X , "y" : Y , "r" : R } , ( resp ) => { FFCGIResponceHandler ( resp , X , Y , R ) } ) ;
735+
736+ // Stub
737+ sendAJAXGETRequest ( "/fcgi/" , { "x" : X , "y" : Y , "r" : R } , ( data ) => { FFCGIResponceHandler ( data , X , Y , R ) } ) ;
738+ console . log ( `Данные отправлены!\nX: ${ X } \nY: ${ Y } \nR: ${ R } ` ) ;
670739
671740 // Очищаем форму
672741 this . reset ( ) ;
0 commit comments