()
| 4706 | } |
| 4707 | |
| 4708 | function renderAssets() { |
| 4709 | if (!assetsList) return; |
| 4710 | const q = (assetsSearchInput && assetsSearchInput.value ? assetsSearchInput.value : "").trim().toLowerCase(); |
| 4711 | assetsList.innerHTML = ""; |
| 4712 | const list = (assets || []) |
| 4713 | .filter(Boolean) |
| 4714 | .filter((a) => !q || String(a.name || "").toLowerCase().includes(q) || String(a.sourceName || "").toLowerCase().includes(q)) |
| 4715 | .slice() |
| 4716 | .sort((a, b) => String(a.name || "").localeCompare(String(b.name || ""))); |
| 4717 | |
| 4718 | if (!list.length) { |
| 4719 | const empty = document.createElement("div"); |
| 4720 | empty.className = "mini-hint"; |
| 4721 | empty.textContent = q ? "No assets match your search." : "No assets yet. Click Import to add PNGs."; |
| 4722 | assetsList.appendChild(empty); |
| 4723 | return; |
| 4724 | } |
| 4725 | |
| 4726 | list.forEach((a) => { |
| 4727 | const row = document.createElement("div"); |
| 4728 | row.className = "asset-row"; |
| 4729 | row.dataset.id = a.id; |
| 4730 | |
| 4731 | const thumb = document.createElement("div"); |
| 4732 | thumb.className = "asset-thumb"; |
| 4733 | if (a.dataUrl) { |
| 4734 | const img = document.createElement("img"); |
| 4735 | img.alt = a.name || "asset"; |
| 4736 | img.src = a.dataUrl; |
| 4737 | thumb.appendChild(img); |
| 4738 | } |
| 4739 | |
| 4740 | const main = document.createElement("div"); |
| 4741 | main.className = "asset-main"; |
| 4742 | const name = document.createElement("div"); |
| 4743 | name.className = "asset-name"; |
| 4744 | name.textContent = a.name || a.id; |
| 4745 | const meta = document.createElement("div"); |
| 4746 | meta.className = "asset-meta"; |
| 4747 | meta.textContent = formatAssetMeta(a); |
| 4748 | main.appendChild(name); |
| 4749 | main.appendChild(meta); |
| 4750 | |
| 4751 | const actions = document.createElement("div"); |
| 4752 | actions.className = "asset-actions"; |
| 4753 | |
| 4754 | const insertBtn = document.createElement("button"); |
| 4755 | insertBtn.type = "button"; |
| 4756 | insertBtn.className = "btn small secondary"; |
| 4757 | insertBtn.textContent = "Add"; |
| 4758 | insertBtn.title = "Add to canvas"; |
| 4759 | insertBtn.addEventListener("click", (e) => { |
| 4760 | e.preventDefault(); |
| 4761 | e.stopPropagation(); |
| 4762 | addAssetElementToCanvas(a.id); |
| 4763 | }); |
| 4764 | |
| 4765 | const delBtn = document.createElement("button"); |
no test coverage detected