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);