<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>디지털 굿판</title> <!-- PWA 메타 태그 --> <link rel="manifest" href="/static/manifest.json"> <meta name="theme-color" content="#000000"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-title" content="디지털 굿판"> <link rel="apple-touch-icon" href="/static/icons/icon-152x152.png"> <script> // 화면 꺼짐 방지 async function preventSleep() { try { if ('wakeLock' in navigator) { const wakeLock = await navigator.wakeLock.request('screen'); console.log('화면 켜짐 유지 활성화'); // 화면이 다시 활성화될 때 wakeLock 재요청 document.addEventListener('visibilitychange', async () => { if (document.visibilityState === 'visible') { await preventSleep(); } }); } } catch (err) { console.log('화면 켜짐 유지 실패:', err); } } // 앱 상태 관리 class AppState { static async save(state) { try { localStorage.setItem('appState', JSON.stringify(state)); } catch (err) { console.error('상태 저장 실패:', err); } } static async load() { try { const state = localStorage.getItem('appState'); return state ? JSON.parse(state) : null; } catch (err) { console.error('상태 복원 실패:', err); return null; } } } // 초기화 window.addEventListener('load', async () => { // PWA 설치 확인 if ('serviceWorker' in navigator) { try { const registration = await navigator.serviceWorker.register('/static/service-worker.js'); console.log('ServiceWorker 등록 성공:', registration.scope); } catch (err) { console.log('ServiceWorker 등록 실패:', err); } } // 화면 켜짐 유지 await preventSleep(); // 상태 복원 const savedState = await AppState.load(); if (savedState) { // Gradio 앱 상태 복원 로직 window.gradioApp().querySelector('#component-0').value = savedState; } }); // 상태 저장 window.addEventListener('beforeunload', () => { const currentState = window.gradioApp().querySelector('#component-0').value; AppState.save(currentState); }); </script> </head> <body> <div id="gradio-app"></div> </body> </html>