ZuzeTt's picture
сделай сайт который запускается на питоне и я смог его открывать в своей локальной сети в этом сайте адаптированным под телефон и компьютер оно соеденяется со swarm ui запущенным на пк где и питон сайта чтобы там был удобный интерфейс и приятный можно было вводить промпт негативный промпт выбирать модель и лора шаги cfg и выбор семплера и планировщика
b83d81d verified
// Global configuration
const API_BASE_URL = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'
? 'http://localhost:7860'
: `http://${window.location.hostname}:7860`;
// Form submission handler
document.getElementById('generationForm').addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const data = Object.fromEntries(formData);
// Show loading state
const submitButton = e.target.querySelector('button[type="submit"]');
const originalText = submitButton.innerHTML;
submitButton.innerHTML = '<i data-feather="loader" class="animate-spin inline w-5 h-5 mr-2"></i>Generating...';
feather.replace();
try {
// Simulate API call to Swarm UI
const response = await generateImage(data);
// Display results
displayGeneratedImage(response);
// Show results section
document.getElementById('results').classList.remove('hidden');
} catch (error) {
console.error('Generation failed:', error);
alert('Failed to generate image. Please check if Swarm UI is running.');
} finally {
// Restore button state
submitButton.innerHTML = originalText;
feather.replace();
}
});
// Mock image generation function (replace with actual Swarm UI API call)
async function generateImage(parameters) {
// This is a mock implementation - replace with actual API call
console.log('Generation parameters:', parameters);
// Simulate API delay
await new Promise(resolve => setTimeout(resolve, 2000));
// Return mock response with placeholder image
return {
image_url: `http://static.photos/abstract/640x360/${Math.floor(Math.random() * 1000)}`,
parameters: parameters
};
}
// Display generated image
function displayGeneratedImage(response) {
const container = document.getElementById('generatedImage');
container.innerHTML = `
<div class="text-center">
<img src="${response.image_url}"
alt="Generated image"
class="generated-image max-w-full h-auto mx-auto"
>
<div class="mt-4 text-sm text-gray-400">
Generated with ${response.parameters.model}${response.parameters.steps} steps
</div>
</div>
`;
}
// Initialize real-time connection status
function checkConnectionStatus() {
fetch(`${API_BASE_URL}/sdapi/v1/options`)
.then(response => {
if (response.ok) {
updateStatus('connected', 'Connected to Swarm UI');
} else {
updateStatus('disconnected', 'Swarm UI not responding');
}
})
.catch(error => {
updateStatus('disconnected', 'Cannot connect to Swarm UI');
});
}
function updateStatus(status, message) {
const navbar = document.querySelector('custom-navbar');
if (navbar && navbar.shadowRoot) {
const statusElement = navbar.shadowRoot.querySelector('#connectionStatus');
if (statusElement) {
statusElement.className = `inline-flex items-center px-3 py-1 rounded-full text-xs font-medium ${
status === 'connected'
? 'bg-green-500/20 text-green-400 border border-green-500/30'
: 'bg-red-500/20 text-red-400 border border-red-500/30'
}`;
statusElement.innerHTML = `
<i data-feather="${status === 'connected' ? 'check-circle' : 'x-circle'}" class="w-3 h-3 mr-1"></i>
${message}
`;
feather.replace();
}
}
}
// Auto-check connection status on page load
document.addEventListener('DOMContentLoaded', () => {
checkConnectionStatus();
// Check every 30 seconds
setInterval(checkConnectionStatus, 30000);
});
// Mobile menu toggle (handled by navbar component)
document.addEventListener('click', (e) => {
if (e.target.closest('[data-mobile-menu-toggle]')) {
const navbar = document.querySelector('custom-navbar');
if (navbar) {
const mobileMenu = navbar.shadowRoot.querySelector('#mobileMenu');
if (mobileMenu) {
mobileMenu.classList.toggle('hidden');
}
}
});
// Add smooth scrolling for anchor links
document.addEventListener('click', (e) => {
if (e.target.matches('a[href^="#"]')) {
e.preventDefault();
const target = document.querySelector(e.target.getAttribute('href'));
if (target) {
target.scrollIntoView({ behavior: 'smooth' });
}
}
});
// Form validation enhancement
document.querySelectorAll('input, textarea, select').forEach(element => {
element.addEventListener('invalid', (e) => {
e.target.classList.add('border-red-500');
});
element.addEventListener('input', (e) => {
e.target.classList.remove('border-red-500');
});
});
// Auto-save form data to localStorage
function autoSaveForm() {
const form = document.getElementById('generationForm');
const formData = new FormData(form);
const data = Object.fromEntries(formData);
localStorage.setItem('aiDiffusionForm', JSON.stringify(data));
}
// Load saved form data
function loadSavedForm() {
const saved = localStorage.getItem('aiDiffusionForm');
if (saved) {
const data = JSON.parse(saved);
Object.keys(data).forEach(key => {
const element = form.querySelector(`[name="${key}"]`);
if (element) {
element.value = data[key];
}
});
}
}
// Initialize auto-save
document.querySelectorAll('#generationForm input, #generationForm textarea, #generationForm select').forEach(element => {
element.addEventListener('change', autoSaveForm);
element.addEventListener('input', autoSaveForm);
});
// Load saved data on page load
document.addEventListener('DOMContentLoaded', loadSavedForm);