Step 2: Available Blocks
Extract components first...
${comp.name}
#${comp.id}
${escapeHtml((comp.type === 'js' ? (comp.js || comp.html) : comp.css).substring(0, 150))}...
`).join('');
}
function addToBuilder(compId) {
const comp = components.find(c => c.id === compId);
if (!comp) return;
builderItems.push({...comp, builderId: `build-${Date.now()}-${Math.random()}`});
updateBuilder();
showStatus('Added to builder!');
}
function dragStart(event, compId) {
event.dataTransfer.effectAllowed = 'copy';
event.dataTransfer.setData('componentId', compId);
}
function dragOver(event) {
event.preventDefault();
event.dataTransfer.dropEffect = 'copy';
document.getElementById('builder').classList.add('drag-over');
}
function dragLeave(event) {
document.getElementById('builder').classList.remove('drag-over');
}
function dropComponent(event) {
event.preventDefault();
document.getElementById('builder').classList.remove('drag-over');
const compId = event.dataTransfer.getData('componentId');
addToBuilder(compId);
}
function updateBuilder() {
const builder = document.getElementById('builder');
if (builderItems.length === 0) {
builder.innerHTML = 'Extract components first...
';
document.getElementById('builder').innerHTML = '