(function () { function el(tag, attrs = {}, children = []) { const node = document.createElement(tag); Object.entries(attrs).forEach(([k, v]) => { if (k === "class") node.className = v; else if (k === "text") node.textContent = v; else if (k === "html") node.innerHTML = v; else if (k === "style") node.style.cssText = v; else node.setAttribute(k, v); }); children.forEach((c) => node.appendChild(c)); return node; } function render() { const root = document.getElementById("footcover-app"); if (!root) return; /** * 作品データ * memo は検索専用(画面には出ない) * image は画像URL(WPメディアの画像URL推奨) */ const data = [ { title: "引っ掛かって出られない! 若妻の巨尻に我慢できずバック潮でイカセまくる 2", color: "黒", memo: "", url: "https://al.fanza.co.jp/?lurl=https%3A%2F%2Fvideo.dmm.co.jp%2Fav%2Fcontent%2F%3Fid%3D1nhdta00878&af_id=iwaichi-005&ch=toolbar&ch_id=text", image: "" // ←ここに画像URLを入れる } ]; root.innerHTML = ""; const card = el("div", { class: "fc-card" }, [ el("div", { class: "fc-title", text: "フットカバー着用作品 検索" }) ]); const keywordRow = el("div", { class: "fc-row" }, [ el("label", { text: "キーワード" }), el("input", { type: "text", id: "fc-keyword", placeholder: "例:スーツ、汗、部屋" }) ]); const colorRow = el("div", { class: "fc-row" }, [ el("label", { text: "色" }), (function () { const s = el("select", { id: "fc-color" }); [ { v: "", t: "指定なし" }, { v: "黒", t: "黒" }, { v: "白", t: "白" }, { v: "ベージュ", t: "ベージュ" }, { v: "グレー", t: "グレー" }, { v: "その他", t: "その他" } ].forEach((o) => s.appendChild(el("option", { value: o.v, text: o.t }))); return s; })() ]); const btnRow = el("div", { class: "fc-row" }, [ el("button", { class: "fc-btn", id: "fc-search", type: "button", text: "検索" }), el("button", { class: "fc-btn fc-btn-sub", id: "fc-reset", type: "button", text: "リセット" }) ]); const meta = el("div", { class: "fc-result-meta", id: "fc-meta", text: `該当:${data.length}件` }); const list = el("div", { id: "fc-list" }); function makeItem(it) { // 画像(なければプレースホルダ) const imgBox = el("div", { class: "fc-thumb" }, []); if (it.image) { imgBox.appendChild( el("img", { src: it.image, alt: it.title, loading: "lazy" }) ); } else { imgBox.appendChild(el("div", { class: "fc-thumb-placeholder", text: "NO IMAGE" })); } const info = el("div", { class: "fc-info" }, [ el("div", { class: "fc-item-title", text: it.title }), el("div", { class: "fc-item-sub", text: it.color ? `色:${it.color}` : "色:指定なし" }), el("div", { class: "fc-item-actions" }, [ el("a", { class: "fc-link", href: it.url, target: "_blank", rel: "sponsored noopener", text: "作品ページへ" }) ]) ]); return el("div", { class: "fc-item" }, [imgBox, info]); } function draw(items) { list.innerHTML = ""; meta.textContent = `該当:${items.length}件`; items.forEach((it) => list.appendChild(makeItem(it))); } function filter() { const kw = (document.getElementById("fc-keyword").value || "").trim(); const color = document.getElementById("fc-color").value; const kws = kw ? kw.split(/[,\s、]+/).map((s) => s.trim()).filter(Boolean) : []; const filtered = data.filter((d) => { const okColor = !color || d.color === color; const haystack = `${d.title || ""} ${d.memo || ""}`; const okKw = kws.length === 0 || kws.every((k) => haystack.includes(k)); return okColor && okKw; }); draw(filtered); } root.addEventListener("click", function (e) { if (e.target && e.target.id === "fc-search") filter(); if (e.target && e.target.id === "fc-reset") { document.getElementById("fc-keyword").value = ""; document.getElementById("fc-color").value = ""; draw(data); } }); card.appendChild(keywordRow); card.appendChild(colorRow); card.appendChild(btnRow); card.appendChild(meta); card.appendChild(list); root.appendChild(card); draw(data); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", render); } else { render(); } })();