/** * [FOXTOOLS — PATROLLERS HELPER SCRIPT] * * •==============================================• * > Pencipta: Janorovic Volkov * > Pengembang: Janorovic Volkov * > Tipe: JavaScript (Module) * * Lihat [[WP:FT]] untuk informasi selengkapnya * tentang skrip ini * •==============================================• */ // <nowiki> (function(){ if(mw.config.get("wgNamespaceNumber")<0)return; functionnotiOK(msg){mw.notify?mw.notify(msg,{type:'success'}):alert(msg);} functionnotiWARN(msg){mw.notify?mw.notify(msg,{type:'warn'}):alert('⚠️ '+msg);} constFT=window.FoxTools; constisSysop=mw.config.get("wgUserGroups").includes("sysop"); constmodule={ name:"KPC", init(){ mw.util.addPortletLink( "p-tb", "#", "KPC (FT)", "t-ft-kpc", "Penghapusan cepat", "k" ).addEventListener("click",()=>this.openPanel()); }, openPanel(){ letpanel=document.getElementById("fox-panel"); if(!panel){ panel=document.createElement("div"); panel.id="fox-panel"; panel.innerHTML=` <div class="fox-header"> <div class="ft-dots"> <div class="dot yellow"></div> <div class="dot green"></div> <div class="dot red"></div> </div> <div style="float:right;"> <button id="fox-close">×</button> </div> <br> <h3><big>🦊 FoxTools — KPC</big></h3> </div> <br> <div class="fox-card"> <div id="fox-content"></div> </div> `; document.body.appendChild(panel); document.getElementById("fox-close").addEventListener("click",()=>panel.remove()); } constkonten=document.getElementById("fox-content"); konten.innerHTML=""; functionrenderUmumKPC(container){ container.innerHTML=` <div class="fox-radio-scroll"> <label><input name="reason" type="radio" value="U1" checked>U1 – Tulisan ngawur</label> <label><input name="reason" type="radio" value="U2">U2 – Halaman uji coba</label> <label><input name="reason" type="radio" value="U3">U3 – Vandalisme</label> <label><input name="reason" type="radio" value="U4">U4 – Pembuatan ulang dari halaman yang sudah dihapus</label> <label><input name="reason" type="radio" value="U5">U5 – Halaman yang dibuat oleh pengguna yang diblokir atau yang dilarang</label> <label><input name="reason" type="radio" value="U6">U6 – Penghapusan teknis</label> <label><input name="reason" type="radio" value="U7">U7 – Permintaan pembuat halaman atau pengosongan isi halaman</label> <label><input name="reason" type="radio" value="U8">U8 – Halaman yang tergantung pada halaman yang tak ada atau yang dihapus</label> <label><input name="reason" type="radio" value="U10">U10 – Serangan atau olokan terhadap subjek atau entitas lain</label> <label><input name="reason" type="radio" value="U11">U11 – Iklan, promosi murni/terang-terangan atau menyertakan pranala luar dengan tujuan promosi</label> <label><input name="reason" type="radio" value="U12">U12 – Pelanggaran hak cipta murni/terang-terangan</label> <label><input name="reason" type="radio" value="U13">U13 – Halaman yang dibuat menggunakan kecerdasan buatan generatif (AI/AI generatif)</label> </div> `; } functionrenderLainKPC(container){ container.innerHTML=` <div class="fox-radio-scroll"> <label><input name="reason" type="radio" value="A1" checked>A1 – Tanpa konteks</label> <label><input name="reason" type="radio" value="A2">A2 – Artikel berbahasa asing yang tidak diterjemahkan atau diterjemahkan secara buruk</label> <label><input name="reason" type="radio" value="A3">A3 – Tanpa isi</label> <label><input name="reason" type="radio" value="A5">A5 – Artikel transwiki</label> <label><input name="reason" type="radio" value="A7">A7 – Tidak mengindikasikan kepentingan (tokoh, organisasi, situs)</label> <label><input name="reason" type="radio" value="A9">A9 – Artikel yang tidak mengindikasikan kepentingan (film, acara televisi, dan rekaman musik)</label> <label><input name="reason" type="radio" value="A10">A10 – Artikel yang tidak dirapikan dalam batas waktu yang telah ditentukan</label> <label><input name="reason" type="radio" value="R2">R2 – Pengalihan dari ruang nama artikel ke ruang nama lain</label> <label><input name="reason" type="radio" value="R3">R3 – Pengalihan yang baru dibuat karena kesalahan ketik atau kesalahan penamaan yang tidak disengaja</label> <label><input name="reason" type="radio" value="B1">B1 – Redundan atau duplikat</label> <label><input name="reason" type="radio" value="B2">B2 – Rusak atau kosong</label> <label><input name="reason" type="radio" value="B3">B3 – Lisensi yang tidak sesuai</label> <label><input name="reason" type="radio" value="B4">B4 – Informasi lisensi kurang (tanpa sumber)</label> <label><input name="reason" type="radio" value="B5">B5 – Berkas tak bebas yang tak digunakan</label> <label><input name="reason" type="radio" value="B6">B6 – Tidak memiliki alasan penggunaan tak bebas</label> <label><input name="reason" type="radio" value="B7">B7 – Klaim penggunaan wajar tidak sah</label> <label><input name="reason" type="radio" value="B8">B8 – Berkas yang sama persis tersedia di Wikimedia Commons</label> <label><input name="reason" type="radio" value="B9">B9 – Terang-terangan melanggar hak cipta</label> <label><input name="reason" type="radio" value="B10">B10 – Berkas media yang tidak berguna</label> <label><input name="reason" type="radio" value="B11">B11 – Tak ada bukti izin penggunaan</label> </div> `; } functionrenderGabunganKPC(container){ container.innerHTML=` <div class="fox-radio-scroll"> <label><input name="reason" type="radio" value="U11|U4" checked>Kombinasi U11 + U4</label> <label><input name="reason" type="radio" value="U11|U5">Kombinasi U11 + U5</label> <label><input name="reason" type="radio" value="A7|U4">Kombinasi A7 + U4</label> <label><input name="reason" type="radio" value="A7|U5">Kombinasi A7 + U5</label> </div> `; } functionrenderUmum(container){ container.innerHTML=` <div class="fox-radio-scroll"> <label><input name="reason" type="radio" value="[[WP:KPC#U1|U1]]: Tulisan ngawur" checked>U1 – Tulisan ngawur</label> <label><input name="reason" type="radio" value="[[WP:KPC#U2|U2]]: Halaman uji coba">U2 – Halaman uji coba</label> <label><input name="reason" type="radio" value="[[WP:KPC#U3|U3]]: Vandalisme">U3 – Vandalisme</label> <label><input name="reason" type="radio" value="[[WP:KPC#U4|U4]]: Pembuatan ulang dari halaman yang sudah dihapus">U4 – Pembuatan ulang dari halaman yang sudah dihapus</label> <label><input name="reason" type="radio" value="[[WP:KPC#U5|U5]]: Halaman yang dibuat oleh pengguna yang diblokir atau yang dilarang">U5 – Halaman yang dibuat oleh pengguna yang diblokir atau yang dilarang</label> <label><input name="reason" type="radio" value="[[WP:KPC#U6|U6]]: Penghapusan teknis">U6 – Penghapusan teknis</label> <label><input name="reason" type="radio" value="[[WP:KPC#U7|U7]]: Permintaan pembuat halaman atau pengosongan isi halaman">U7 – Permintaan pembuat halaman atau pengosongan isi halaman</label> <label><input name="reason" type="radio" value="[[WP:KPC#U8|U8]]: Halaman yang tergantung pada halaman yang tak ada atau yang dihapus">U8 – Halaman yang tergantung pada halaman yang tak ada atau yang dihapus</label> <label><input name="reason" type="radio" value="[[WP:KPC#U10|U10]]: Serangan atau olokan terhadap subjek atau entitas lain">U10 – Serangan atau olokan terhadap subjek atau entitas lain</label> <label><input name="reason" type="radio" value="[[WP:KPC#U11|U11]]: Iklan, promosi murni/terang-terangan atau menyertakan pranala luar dengan tujuan promosi">U11 – Iklan, promosi murni/terang-terangan atau menyertakan pranala luar dengan tujuan promosi</label> <label><input name="reason" type="radio" value="[[WP:KPC#U12|U12]]: Pelanggaran hak cipta murni/terang-terangan">U12 – Pelanggaran hak cipta murni/terang-terangan</label> <label><input name="reason" type="radio" value="[[WP:KPC#U13|U13]]: Halaman yang dibuat menggunakan kecerdasan buatan generatif (AI/AI generatif)">U13 – Halaman yang dibuat menggunakan kecerdasan buatan generatif (AI)</label> </div> `; } functionrenderLain(container){ container.innerHTML=` <div class="fox-radio-scroll"> <label><input name="reason" type="radio" value="[[WP:KPC#A1|A1]]: Tanpa konteks" checked>A1 – Tanpa konteks</label> <label><input name="reason" type="radio" value="[[WP:KPC#A2|A2]]: Artikel berbahasa asing yang tidak diterjemahkan atau diterjemahkan secara buruk">A2 – Artikel berbahasa asing yang tidak diterjemahkan atau diterjemahkan secara buruk</label> <label><input name="reason" type="radio" value="[[WP:KPC#A3|A3]]: Tanpa isi">A3 – Tanpa isi</label> <label><input name="reason" type="radio" value="[[WP:KPC#A5|A5]]: Artikel transwiki">A5 – Artikel transwiki</label> <label><input name="reason" type="radio" value="[[WP:KPC#A7|A7]]: Tidak mengindikasikan kepentingan (tokoh, tempat, organisasi, situs, produk)">A7 – Tidak mengindikasikan kepentingan (tokoh, organisasi, situs)</label> <label><input name="reason" type="radio" value="[[WP:KPC#A9|A9]]: Artikel yang tidak mengindikasikan kepentingan (film, acara televisi, rekaman musik)">A9 – Artikel yang tidak mengindikasikan kepentingan (film, acara televisi, rekaman musik)</label> <label><input name="reason" type="radio" value="[[WP:KPC#A10|A10]]: Artikel yang tidak dirapikan dalam batas waktu yang telah ditentukan">A10 – Artikel yang tidak dirapikan dalam batas waktu yang telah ditentukan</label> <label><input name="reason" type="radio" value="[[WP:KPC#R2|R2]]: Pengalihan dari ruang nama artikel ke ruang nama lain">R2 – Pengalihan dari ruang nama artikel ke ruang nama lain</label> <label><input name="reason" type="radio" value="[[WP:KPC#R3|R3]]: Pengalihan yang baru dibuat karena kesalahan ketik atau kesalahan penamaan yang tidak disengaja">R3 – Pengalihan yang baru dibuat karena kesalahan ketik atau kesalahan penamaan yang tidak disengaja</label> <label><input name="reason" type="radio" value="[[WP:KPC#B1|B1]]: Redundan atau duplikat">B1 – Redundan atau duplikat</label> <label><input name="reason" type="radio" value="[[WP:KPC#B2|B2]]: Rusak atau kosong">B2 – Rusak atau kosong</label> <label><input name="reason" type="radio" value="[[WP:KPC#B3|B3]]: Lisensi yang tidak sesuai">B3 – Lisensi yang tidak sesuai</label> <label><input name="reason" type="radio" value="[[WP:KPC#B4|B4]]: Informasi lisensi kurang (tanpa sumber)">B4 – Informasi lisensi kurang (tanpa sumber)</label> <label><input name="reason" type="radio" value="[[WP:KPC#B5|B5]]: Berkas tak bebas yang tak digunakan">B5 – Berkas tak bebas yang tak digunakan</label> <label><input name="reason" type="radio" value="[[WP:KPC#B6|B6]]: Tidak memiliki alasan penggunaan tak bebas">B6 – Tidak memiliki alasan penggunaan tak bebas</label> <label><input name="reason" type="radio" value="[[WP:KPC#B7|B7]]: Klaim penggunaan wajar tidak sah">B7 – Klaim penggunaan wajar tidak sah</label> <label><input name="reason" type="radio" value="[[WP:KPC#B8|B8]]: Berkas yang sama persis tersedia di Wikimedia Commons">B8 – Berkas yang sama persis tersedia di Wikimedia Commons</label> <label><input name="reason" type="radio" value="[[WP:KPC#B9|B9]]: Terang-terangan melanggar hak cipta">B9 – Terang-terangan melanggar hak cipta</label> <label><input name="reason" type="radio" value="[[WP:KPC#B10|B10]]: Berkas media yang tidak berguna">B10 – Berkas media yang tidak berguna</label> <label><input name="reason" type="radio" value="[[WP:KPC#B11|B11]]: Tak ada bukti izin penggunaan">B11 – Tak ada bukti izin penggunaan</label> </div> `; } functionrenderGabungan(container){ container.innerHTML=` <div class="fox-radio-scroll"> <label><input name="reason" type="radio" value="Lebih dari satu macam alasan: penghapusan cepat kriteria [[WP:KPC#U11|U11]] ([[Wikipedia:Iklan|Iklan]], promosi murni/terang-terangan atau menyertakan [[Wikipedia:Spam|pranala luar]] dengan tujuan promosi) dan [[WP:KPC#U4|U4]] (Pembuatan ulang dari halaman yang sudah dihapus)" checked>Kombinasi U11 + U4</label> <label><input name="reason" type="radio" value="Lebih dari satu macam alasan: penghapusan cepat kriteria [[WP:KPC#U11|U11]] ([[Wikipedia:Iklan|Iklan]], promosi murni/terang-terangan atau menyertakan [[Wikipedia:Spam|pranala luar]] dengan tujuan promosi) dan [[WP:KPC#U5|U5]] (Halaman yang dibuat oleh pengguna yang diblokir atau yang dilarang)">Kombinasi U11 + U5</label> <label><input name="reason" type="radio" value="Lebih dari satu macam alasan: penghapusan cepat kriteria [[WP:KPC#A7|A7]] (Artikel yang tidak mengindikasikan kepentingan (tokoh, tempat, organisasi, situs, produk)) dan [[WP:KPC#U4|U4]] (Pembuatan ulang dari halaman yang sudah dihapus)">Kombinasi A7 + U4</label> <label><input name="reason" type="radio" value="Lebih dari satu macam alasan: penghapusan cepat kriteria [[WP:KPC#A7|A7]] (Artikel yang tidak mengindikasikan kepentingan (tokoh, tempat, organisasi, situs, produk)) dan [[WP:KPC#U5|U5]] (Halaman yang dibuat oleh pengguna yang diblokir atau yang dilarang)">Kombinasi A7 + U5</label> </div> `; } functionrenderForm(type){ constcontainer=document.getElementById("fox-form-container"); container.innerHTML=""; if(type==="umumkpc")returnrenderUmumKPC(container); if(type==="lainkpc")returnrenderLainKPC(container); if(type==="gabungankpc")returnrenderGabunganKPC(container); if(type==="umum")returnrenderUmum(container); if(type==="lain")returnrenderLain(container); if(type==="gabungan")returnrenderGabungan(container); } constKPC_MAP={ "U1":"[[WP:KPC#U1|U1]]: Tulisan ngawur", "U2":"[[WP:KPC#U2|U2]]: Halaman uji coba", "U3":"[[WP:KPC#U3|U3]]: Vandalisme", "U4":"[[WP:KPC#U4|U4]]: Pembuatan ulang dari halaman yang sudah dihapus", "U5":"[[WP:KPC#U5|U5]]: Halaman yang dibuat oleh pengguna yang diblokir atau yang dilarang", "U6":"[[WP:KPC#U6|U6]]: Penghapusan teknis", "U7":"[[WP:KPC#U7|U7]]: Permintaan pembuat halaman atau pengosongan isi halaman", "U8":"[[WP:KPC#U8|U8]]: Halaman yang tergantung pada halaman yang tak ada atau yang dihapus", "U10":"[[WP:KPC#U10|U10]]: Serangan atau olokan terhadap subjek atau entitas lain", "U11":"[[WP:KPC#U11|U11]]: Iklan, promosi murni/terang-terangan atau menyertakan pranala luar dengan tujuan promosi", "U12":"[[WP:KPC#U12|U12]]: Pelanggaran hak cipta murni/terang-terangan", "U13":"[[WP:KPC#U13|U13]]: Halaman yang dibuat menggunakan kecerdasan buatan generatif (AI/AI generatif)", "A1":"[[WP:KPC#A1|A1]]: Tanpa konteks", "A2":"[[WP:KPC#A2|A2]]: Artikel berbahasa asing yang tidak diterjemahkan atau diterjemahkan secara buruk", "A3":"[[WP:KPC#A3|A3]]: Tanpa isi", "A5":"[[WP:KPC#A5|A5]]: Artikel transwiki", "A7":"[[WP:KPC#A7|A7]]: Tidak mengindikasikan kepentingan (tokoh, tempat, organisasi, situs, produk)", "A9":"[[WP:KPC#A9|A9]]: Artikel yang tidak mengindikasikan kepentingan (film, acara televisi, rekaman musik)", "A10":"[[WP:KPC#A10|A10]]: Artikel yang tidak dirapikan dalam batas waktu yang telah ditentukan", "R2":"[[WP:KPC#R2|R2]]: Pengalihan dari ruang nama artikel ke ruang nama lain", "R3":"[[WP:KPC#R3|R3]]: Pengalihan yang baru dibuat karena kesalahan ketik atau kesalahan penamaan yang tidak disengaja", "B1":"[[WP:KPC#B1|B1]]: Redundan atau duplikat", "B2":"[[WP:KPC#B2|B2]]: Rusak atau kosong", "B3":"[[WP:KPC#B3|B3]]: Lisensi yang tidak sesuai", "B4":"[[WP:KPC#B4|B4]]: Informasi lisensi kurang (tanpa sumber)", "B5":"[[WP:KPC#B5|B5]]: Berkas tak bebas yang tak digunakan", "B6":"[[WP:KPC#B6|B6]]: Tidak memiliki alasan penggunaan tak bebas", "B7":"[[WP:KPC#B7|B7]]: Klaim penggunaan wajar tidak sah", "B8":"[[WP:KPC#B8|B8]]: Berkas yang sama persis tersedia di Wikimedia Commons", "B9":"[[WP:KPC#B9|B9]]: Terang-terangan melanggar hak cipta", "B10":"[[WP:KPC#B10|B10]]: Berkas media yang tidak berguna", "B11":"[[WP:KPC#B11|B11]]: Tak ada bukti izin penggunaan" }; functioncodesToFullText(codeStr){ if(!codeStr)return""; constcodes=codeStr.split("|"); consttexts=codes.map(c=>KPC_MAP[c]||c); if(texts.length<=1)returntexts[0]; returntexts.slice(0,-1).join(", ")+" dan "+texts.slice(-1); } if(isSysop){ constpage=mw.config.get('wgPageName').replace(/_/g,' '); konten.innerHTML=` <label><big><b>• Halaman:</b><br><big>${page}</big></big></label> <br> <label><big><b>• Alasan penghapusan:</b></big></label> <div class="fox-row"> <label><input type="radio" name="fox-radio" value="umum" checked> Alasan umum</label> <label><input type="radio" name="fox-radio" value="lain"> Alasan lain</label> <label><input type="radio" name="fox-radio" value="gabungan"> Alasan gabungan</label> </div> <div id="fox-form-container"></div> <br> <label><big><b>• Komentar penghapusan:</b></big></label><br><label class="fox-muted"><small><b>(Opsional)</b></small></label> <br> <textarea id="comment" style="width:95%; height:80px;"></textarea> <br> <input id="talk" type="checkbox"> Hapus pembicaraan terkait</label> <br> <input id="user" type="checkbox" checked> Peringati pembuat halaman</label> <br> <br> <button id="fox-delete-exec" class="fox-btn-danger">Hapus</button> `; renderForm("umum"); document.querySelectorAll("input[name='fox-radio']").forEach(radio=>{ radio.addEventListener("change",(e)=>renderForm(e.target.value)); }); document.getElementById("fox-delete-exec").onclick=async()=>{ constreasonSelect=document.querySelector('input[name="reason"]:checked'); letreason=reasonSelect?reasonSelect.value:''; constcomment=document.getElementById('comment'); consttalkCheck=document.getElementById('talk').checked; constuserNotify=document.getElementById('user').checked; if(comment&&comment.value.trim()!==''){ reason+=`: ${comment.value.trim()}`; } constapi=newmw.Api(); constcreatorQuery=awaitapi.get({ action:'query', prop:'revisions', titles:page, rvlimit:1, rvprop:'user', rvdir:'newer', formatversion:2 }); constcreator=creatorQuery.query.pages[0].revisions?.[0]?.user; awaitapi.postWithToken('csrf',{ action:'delete', title:page, reason:reason+` (${FT.ads})`, tags:'FoxTools' }); if(talkCheck){ consttalkTitle=mw.Title.newFromText(page).getTalkPage().getPrefixedText(); consttalkInfo=awaitapi.get({action:'query',titles:talkTitle}); consttalkPageExists=!Object.values(talkInfo.query.pages)[0].missing; if(talkPageExists){ awaitapi.postWithToken('csrf',{ action:'delete', title:talkTitle, reason:`Menghapus halaman pembicaraan dari ${page} (${FT.ads})`, tags:'FoxTools' }); }else{ notiWARN(`⚠️ Gagal menghapus halaman pembicaraan ${page}: halaman tidak ada`); } } if(userNotify){ consttalkUserPage=`User talk:${creator}`; consttext=`Halaman berjudul [[${page}]] telah dihapus berdasarkan kebijakan penghapusan cepat Wikipedia, secara khusus dengan alasan:\n\n<blockquote>${reasonSelect.value.trim()}</blockquote>\n\nMenurut [[Wikipedia:Kriteria penghapusan cepat|kriteria penghapusan cepat]], halaman yang memenuhi beberapa ketentuan dapat dihapus kapan saja dan tanpa peringatan.`; consttemplate=`\n{{subst:Db-deleted|target=${page}|text=${text}}} --~~~~`; awaitapi.postWithToken('csrf',{ action:'edit', title:talkUserPage, appendtext:template, summary:`Pemberitahuan penghapusan ${page} (${FT.ads})`, minor:true, tags:'FoxTools' }); } notiOK(`🟢 ${page} berhasil dihapus`); panel.remove(); }; }else{ constpage=mw.config.get('wgPageName').replace(/_/g,' '); konten.innerHTML=` <label><big><b>• Halaman:</b><br><big>${page}</big></big></label> <br> <label><big><b>• Alasan penghapusan:</b></big></label> <div class="fox-row"> <label><input type="radio" name="fox-radio" value="umumkpc" checked> Alasan umum</label> <label><input type="radio" name="fox-radio" value="lainkpc"> Alasan lain</label> <label><input type="radio" name="fox-radio" value="gabungankpc"> Alasan gabungan</label> </div> <div id="fox-form-container"></div> <br> <input id="user" type="checkbox" checked> Peringati pembuat halaman</label> <br> <br> <button id="fox-kpc-exec" class="fox-btn-danger">Tandai</button> `; renderForm("umumkpc"); document.querySelectorAll("input[name='fox-radio']").forEach(radio=>{ radio.addEventListener("change",(e)=>renderForm(e.target.value)); }); document.getElementById("fox-kpc-exec").onclick=async()=>{ constcodeSelect=document.querySelector('input[name="reason"]:checked'); letcode=codeSelect?codeSelect.value:''; constuserNotify=document.getElementById('user').checked; constfulltext=codesToFullText(code); constwikitext=`{{Db|${code}}}\n`; constapi=newmw.Api(); awaitapi.postWithToken('csrf',{ action:'edit', title:page, prependtext:wikitext, summary:`Meminta penghapusan cepat (${FT.ads})`, tags:`FoxTools` }); if(userNotify){ constcreatorQuery=awaitapi.get({ action:'query', prop:'revisions', titles:page, rvlimit:1, rvprop:'user', rvdir:'newer', formatversion:2 }); constcreator=creatorQuery.query.pages[0].revisions?.[0]?.user; consttalkUserPage=`User talk:${creator}`; consttemplate=`\n{{subst:Db-reason-notice|1=${page}|2=${fulltext}}} --~~~~`; awaitapi.postWithToken('csrf',{ action:'edit', title:talkUserPage, appendtext:template, summary:`Nominasi penghapusan cepat [[${page}]] (${FT.ads})`, minor:true, tags:'FoxTools' }); } notiOK(`🟢 ${page} berhasil ditandai untuk penghapusan cepat`); panel.remove(); }; } mw.util.addCSS(` #fox-panel { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 640px; width: 92%; background: rgba(30, 35, 45, 0.75); color: #f5f6fa; border: 1px solid rgba(180, 200, 255, 0.2); border-radius: 10px; padding: 1.2em 1.4em; font-family: "Noto Sans", "Segoe UI", sans-serif; font-size: 14px; z-index: 9999; box-shadow: 0 6px 20px rgba(0, 0, 0, 0.55); transition: all 0.3s ease-in-out; animation: foxFadeIn 0.25s ease-out; } @keyframes foxFadeIn { from { opacity: 0; transform: translate(-50%, -46%) scale(0.96); } to { opacity: 1; transform: translate(-50%, -50%) scale(1); } } #fox-panel h3 { margin-top: 0; font-size: 16px; font-weight: 600; border-bottom: 1px solid rgba(255, 255, 255, 0.1); padding-bottom: .5em; color: #8be9fd; display: flex; align-items: center; justify-content: space-between; } #fox-close { background: none; color: #8be9fd; border: none; font-weight: bold; cursor: pointer; transition: color 0.2s ease; } #fox-close:hover { color: #ff5555; text-decoration: underline; } #fox-panel button, #fox-panel textarea, #fox-panel input { font-family: inherit; font-size: 14px; border-radius: 6px; padding: 6px 12px; border: 1px solid rgba(180, 200, 255, 0.3); margin-top: 6px; margin-bottom: 10px; background: rgba(255, 255, 255, 0.05); color: #f5f6fa; transition: all 0.2s ease; } #fox-panel button:hover, #fox-panel textarea:hover, #fox-panel input:hover { background: rgba(255, 255, 255, 0.12); border-color: rgba(180, 200, 255, 0.6); } #fox-panel button:focus, #fox-panel textarea:focus, #fox-panel input:focus { outline: none; box-shadow: 0 0 0 2px rgba(140, 200, 255, 0.5); } #fox-panel .fox-btn-danger { background: linear-gradient(135deg, #d33, #a00); border: 1px solid #a00; color: #fff; font-weight: bold; } #fox-panel .fox-btn-danger:hover { background: linear-gradient(135deg, #e44, #c11); box-shadow: 0 0 6px rgba(255, 100, 100, 0.6); } .fox-radio-scroll { max-height: 180px; overflow-y: auto; padding: 6px; border: 1px solid rgba(180,200,255,0.2); border-radius: 6px; background: rgba(30,35,45,0.95); } .fox-radio-scroll label { display: block; padding: 4px 8px; cursor: pointer; color: #f5f6fa; } .fox-radio-scroll label:hover { background: rgba(255,255,255,0.08); } .fox-radio-scroll input[type="radio"] { margin-right: 6px; } .fox-row { display: flex; gap: 12px; flex-wrap: wrap; justify-content: space-between; } .fox-card { flex: 1 1 260px; border: 1px solid rgba(180, 200, 255, 0.15); padding: 12px; border-radius: 8px; background: rgba(255, 255, 255, 0.04); transition: transform 0.15s ease, background 0.2s ease; } .fox-card:hover { transform: translateY(-2px); background: rgba(255, 255, 255, 0.07); } .fox-muted { color: #aab6c3; font-size: 90%; } .ft-dots { display: flex; gap: 6px; margin-bottom: 6px; } .ft-dots .dot { width: 10px; height: 10px; border-radius: 50%; box-shadow: 0 0 3px rgba(255,255,255,0.4); } .dot.red { background: #ff5555; } .dot.yellow { background: #f1fa8c; } .dot.green { background: #50fa7b; } `); } }; FT.register&&FT.register("KPC",module); })(); // </nowiki>
MediaWiki:Gadget-FoxTools-KPC.js
Konten disalin dari Wikipedia Bahasa Indonesia (lisensi CC BY-SA)
Lihat versi asli di Wikipedia