class LoraSelector extends HTMLElement { connectedCallback() { this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `
`; this.loadLoraModels(); } async loadLoraModels() { const selectElement = this.shadowRoot.getElementById('loraSelect'); const loadingIndicator = this.shadowRoot.getElementById('loadingIndicator'); const errorMessage = this.shadowRoot.getElementById('errorMessage'); try { loadingIndicator.style.display = 'block'; // Fetch LoRA models from Hugging Face API const response = await fetch('https://huggingface.co/api/models/Playtime-AI/Wan2.2-Loras'); const data = await response.json(); // Get safetensors files const safetensorsFiles = data.siblings.filter(file => file.rfilename.endsWith('.safetensors')); // Clear loading option selectElement.innerHTML = ''; // Add each LoRA model as an option safetensorsFiles.forEach(file => { const option = document.createElement('option'); const modelName = file.rfilename.replace('.safetensors', ''); option.value = JSON.stringify({ filename: file.rfilename, trigger: this.getTriggerWord(modelName) }); option.textContent = modelName; selectElement.appendChild(option); }); // Dispatch event when models are loaded this.dispatchEvent(new CustomEvent('loras-loaded', { detail: { models: safetensorsFiles }, bubbles: true })); } catch (error) { console.error('Error loading LoRA models:', error); selectElement.innerHTML = ''; errorMessage.textContent = 'Failed to load LoRA models. Please try again later.'; errorMessage.style.display = 'block'; } finally { loadingIndicator.style.display = 'none'; } } getTriggerWord(modelName) { const triggers = { 'Wan2.2-Disco-Diffusion': 'disco style', 'Wan2.2-Futuristic-City': 'futuristic cityscape', 'Wan2.2-Anime-Art': 'anime art style', 'Wan2.2-Cyberpunk': 'cyberpunk aesthetic', 'Wan2.2-Fantasy': 'fantasy illustration', 'Wan2.2-Photorealistic': 'photorealistic', 'Wan2.2-Watercolor': 'watercolor painting', 'Wan2.2-Oil-Painting': 'oil painting', 'Wan2.2-Sketch': 'pencil sketch', 'Wan2.2-Impressionist': 'impressionist painting' }; return triggers[modelName] || 'enhanced style'; } get selectedValue() { const selected = this.shadowRoot.getElementById('loraSelect').value; try { return JSON.parse(selected); } catch { return { filename: '', trigger: '' }; } } set selectedValue(value) { this.shadowRoot.getElementById('loraSelect').value = JSON.stringify(value); } } customElements.define('lora-selector', LoraSelector);