// // SPDX-FileCopyrightText: Hadad // SPDX-License-Identifier: Apache-2.0 // (function () { 'use strict'; var sanitizeInput = function (raw, encode) { if (!raw) return ''; var clean = raw; if (typeof DOMPurify !== 'undefined') { clean = DOMPurify.sanitize(clean, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] }); } if (typeof filterXSS !== 'undefined') { clean = filterXSS(clean, { whiteList: {} }); } if (encode === true && typeof he !== 'undefined') { clean = he.encode(clean, { encodeEverything: false }); } return clean; }; var noop = function () {}; var methods = [ 'log', 'error', 'warn', 'info', 'debug', 'trace', 'dir', 'table', 'time', 'timeEnd', 'timeLog', 'group', 'groupEnd', 'assert', 'count', 'countReset', 'profile', 'profileEnd', 'clear', 'dirxml', 'exception', 'groupCollapsed' ]; var disableConsole = function () { methods.forEach(function (m) { try { window.console[m] = noop; } catch (e) {} }); try { Object.defineProperty(window, 'console', { value: Object.freeze(Object.create(null)), writable: false, configurable: false }); } catch (e) {} }; disableConsole(); var InitWelcomeModal = function () { try { var hasShown = localStorage.getItem('welcomeModalShown'); if (!hasShown) { var modal = document.getElementById('welcomeModal'); if (modal) { modal.style.display = 'flex'; } } } catch (e) { var modal = document.getElementById('welcomeModal'); if (modal) { modal.style.display = 'flex'; } } }; var closeWelcomeModal = function () { var modal = document.getElementById('welcomeModal'); if (modal) { modal.style.display = 'none'; try { localStorage.setItem('welcomeModalShown', 'true'); } catch (e) {} } }; var closeErrorModal = function () { var modal = document.getElementById('errorModal'); if (modal) { modal.style.animation = 'fadeIn 0.5s ease reverse'; setTimeout(function () { modal.remove(); }, 500); } }; var validateInputs = function () { var model = document.getElementById('modelSelect'); var size = document.getElementById('sizeSelect'); var prompt = document.getElementById('promptInput'); var submitBtn = document.getElementById('submitBtn'); if (!model || !size || !prompt || !submitBtn) return; var modelValue = model.value; var sizeValue = size.value; var promptValue = sanitizeInput(prompt.value); var isValid = !!modelValue && !!sizeValue && !!promptValue && promptValue.length > 0; if (isValid) { var hasNonWhitespace = /[^\s\t\n\r\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/.test(promptValue); isValid = isValid && hasNonWhitespace; } if (typeof validator !== 'undefined' && isValid) { isValid = isValid && validator.isLength(promptValue.trim(), { min: 1 }); } submitBtn.disabled = !isValid; }; var triggerExample = function (prompt, model, size) { var modelSelect = document.getElementById('modelSelect'); var sizeSelect = document.getElementById('sizeSelect'); var promptInput = document.getElementById('promptInput'); var form = document.getElementById('generateForm'); if (modelSelect) modelSelect.value = model; if (sizeSelect) sizeSelect.value = size; if (promptInput) { promptInput.value = sanitizeInput(prompt); } validateInputs(); if (form) { setTimeout(function () { var fa = document.getElementById('formAction'); if (fa) fa.value = 'generate'; submitForm(); }, 100); } }; var submitForm = function() { var form = document.getElementById('generateForm'); if (!form) return; var formData = new FormData(form); var promptValue = sanitizeInput(formData.get('prompt')); var hasNonWhitespace = /[^\s\t\n\r\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/.test(promptValue); if (!promptValue || !hasNonWhitespace) { return; } var data = { action: formData.get('action') || 'generate', prompt: promptValue, model: formData.get('model'), size: formData.get('size'), sessionId: document.body.dataset.sessionId || '' }; var xhr = new XMLHttpRequest(); xhr.open('POST', '/', true); xhr.setRequestHeader( 'Content-Type', 'application/json' ); xhr.onload = function() { try { var response = JSON.parse(xhr.responseText); if (!response.success && response.error) { showErrorModal(response.error); } } catch (e) {} }; xhr.send(JSON.stringify(data)); }; var cancelGeneration = function () { var xhr = new XMLHttpRequest(); xhr.open('POST', '/', true); xhr.setRequestHeader( 'Content-Type', 'application/json' ); xhr.send(JSON.stringify({ action: 'cancel', sessionId: document.body.dataset.sessionId || '' })); }; var showErrorModal = function(error) { var existingModal = document.getElementById('errorModal'); if (existingModal) existingModal.remove(); var modal = document.createElement('div'); modal.id = 'errorModal'; modal.className = 'modal-overlay'; modal.innerHTML = ''; document.body.appendChild(modal); }; var modelSelect = document.getElementById('modelSelect'); var sizeSelect = document.getElementById('sizeSelect'); var promptInput = document.getElementById('promptInput'); var form = document.getElementById('generateForm'); if (modelSelect) { modelSelect.addEventListener('change', validateInputs); } if (sizeSelect) { sizeSelect.addEventListener('change', validateInputs); } if (promptInput) { promptInput.addEventListener('input', function () { promptInput.value = sanitizeInput(promptInput.value); validateInputs(); }); promptInput.addEventListener('paste', function () { setTimeout(function () { promptInput.value = sanitizeInput(promptInput.value); validateInputs(); }, 10); }); promptInput.addEventListener('keydown', function (e) { if (e.key === 'Enter' && e.ctrlKey) { e.preventDefault(); var submitBtn = document.getElementById('submitBtn'); if (submitBtn && !submitBtn.disabled) { submitForm(); } } }); promptInput.addEventListener('keyup', function () { validateInputs(); }); promptInput.addEventListener('blur', function () { validateInputs(); }); } if (form) { form.addEventListener('submit', function(e) { e.preventDefault(); var promptValue = sanitizeInput(promptInput ? promptInput.value : ''); var hasNonWhitespace = /[^\s\t\n\r\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/.test(promptValue); if (!promptValue || !hasNonWhitespace) { return; } submitForm(); }); } window.closeWelcomeModal = closeWelcomeModal; window.closeErrorModal = closeErrorModal; window.triggerExample = triggerExample; window.cancelGeneration = cancelGeneration; window.validateInputs = validateInputs; validateInputs(); var cards = document.querySelectorAll('.card'); Array.prototype.forEach.call(cards, function (card) { card.addEventListener('mousemove', function (e) { var rect = card.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; card.style.setProperty('--mouse-x', x + 'px'); card.style.setProperty('--mouse-y', y + 'px'); }); }); document.addEventListener('DOMContentLoaded', function() { InitWelcomeModal(); validateInputs(); }); if (document.readyState === 'complete' || document.readyState === 'interactive') { InitWelcomeModal(); validateInputs(); } setInterval(function () { disableConsole(); }, 1000); })();