()
| 4788 | } |
| 4789 | |
| 4790 | function renderLayers() { |
| 4791 | if (!layersList) return; |
| 4792 | layersList.innerHTML = ""; |
| 4793 | // Top of list = front. Our elements array draws in order, so reverse for display. |
| 4794 | const list = elements.slice().reverse(); |
| 4795 | list.forEach((el) => { |
| 4796 | const row = document.createElement("div"); |
| 4797 | row.className = "layer-row" + (selectedIds && selectedIds.has(el.id) ? " selected" : ""); |
| 4798 | row.draggable = true; |
| 4799 | row.dataset.id = el.id; |
| 4800 | |
| 4801 | const name = document.createElement("div"); |
| 4802 | name.className = "layer-name"; |
| 4803 | name.textContent = getLayerLabel(el); |
| 4804 | |
| 4805 | const meta = document.createElement("div"); |
| 4806 | meta.className = "layer-meta"; |
| 4807 | meta.textContent = `${Math.round(el.x)},${Math.round(el.y)} ${Math.round(el.w)}×${Math.round(el.h)}`; |
| 4808 | |
| 4809 | const actions = document.createElement("div"); |
| 4810 | actions.className = "layer-actions"; |
| 4811 | |
| 4812 | const btnHide = document.createElement("button"); |
| 4813 | btnHide.type = "button"; |
| 4814 | btnHide.className = "layer-action-btn" + (el.hidden ? " active" : ""); |
| 4815 | btnHide.title = el.hidden ? "Show layer" : "Hide layer"; |
| 4816 | btnHide.textContent = "H"; |
| 4817 | btnHide.addEventListener("click", (e) => { |
| 4818 | e.preventDefault(); |
| 4819 | e.stopPropagation(); |
| 4820 | el.hidden = !el.hidden; |
| 4821 | // If hidden, also remove from selection |
| 4822 | if (el.hidden && selectedIds && selectedIds.has(el.id)) { |
| 4823 | selectedIds.delete(el.id); |
| 4824 | if (selectedId === el.id) selectedId = selectedIds.size ? Array.from(selectedIds)[selectedIds.size - 1] : null; |
| 4825 | } |
| 4826 | updatePropsInputs(false); |
| 4827 | renderElements(); |
| 4828 | renderLayers(); |
| 4829 | updateCode(); |
| 4830 | pushHistory(); |
| 4831 | }); |
| 4832 | |
| 4833 | const btnLock = document.createElement("button"); |
| 4834 | btnLock.type = "button"; |
| 4835 | btnLock.className = "layer-action-btn" + (el.locked ? " active" : ""); |
| 4836 | btnLock.title = el.locked ? "Unlock layer" : "Lock layer"; |
| 4837 | btnLock.textContent = "L"; |
| 4838 | btnLock.addEventListener("click", (e) => { |
| 4839 | e.preventDefault(); |
| 4840 | e.stopPropagation(); |
| 4841 | el.locked = !el.locked; |
| 4842 | renderLayers(); |
| 4843 | pushHistory(); |
| 4844 | }); |
| 4845 | |
| 4846 | actions.appendChild(btnHide); |
| 4847 | actions.appendChild(btnLock); |
no test coverage detected