MediaWiki:Common.js: Perbedaan antara revisi

Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Tidak ada ringkasan suntingan
 
(14 revisi perantara oleh pengguna yang sama tidak ditampilkan)
Baris 1: Baris 1:
/**
/**
  * ====================================================================
  * ====================================================================
  * MIPPEDIA DATA - ADVANCED STRUCTURED DATA SYSTEM (V8.0 ULTIMATE PRO)
  * MIPPEDIA DATA - ADVANCED STRUCTURED DATA SYSTEM (V8.7 SECURE ULTIMATE)
  * Fitur: Smart Collapsible Refs, Dark Mode, Reorder, Duplicate, Toast
  * Fitur: ALL ORIGINAL V8 FEATURES KEPT + Global Social Media Box,  
  * Notifications, LocalStorage Draft, Glass UI, Mobile-First, Auto-Domain
  * Smart Autocomplete/Preview Wikilink, Ultra-Strict Security, Mobile Ready.
  * ====================================================================
  * ====================================================================
  */
  */
Baris 19: Baris 19:
         var isLocked = false;
         var isLocked = false;
         var api = new mw.Api();
         var api = new mw.Api();
        var DRAFT_KEY = 'mippedia_data_draft_' + pageName;


         // 1. DATA MASTER PLATFORM MEDIA SOSIAL & MUSIK (Ditambah)
         // 1. DATA MASTER PLATFORM MEDIA SOSIAL & MUSIK (FULL ASLI)
         var SOCIAL_PLATFORMS = {
         var SOCIAL_PLATFORMS = {
             applemusic: { name: 'Apple Music', base: 'https://music.apple.com/artist/', color: '#fc3c44', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm3.32 12.383c-.328.232-.82.418-1.32.418-1.238 0-1.922-.828-1.922-2.191v-4.14l4.312-.868v1.398l-2.91.586v2.805c0 .734.336 1.148.977 1.148.336 0 .617-.094.863-.258v1.102z"/></svg>' },
             applemusic: { name: 'Apple Music', base: 'https://music.apple.com/artist/', color: '#fc3c44', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm3.32 12.383c-.328.232-.82.418-1.32.418-1.238 0-1.922-.828-1.922-2.191v-4.14l4.312-.868v1.398l-2.91.586v2.805c0 .734.336 1.148.977 1.148.336 0 .617-.094.863-.258v1.102z"/></svg>' },
             spotify: { name: 'Spotify', base: 'https://open.spotify.com/artist/', color: '#1db954', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm4.586 14.424c-.18.295-.563.387-.857.207-2.35-1.434-5.308-1.758-8.793-.963-.335.077-.67-.133-.746-.468-.077-.334.132-.67.467-.745 3.816-.87 7.092-.493 9.72 1.112.294.18.386.563.209.857zm1.213-2.71c-.226.368-.703.483-1.07.258-2.688-1.652-6.785-2.13-9.965-1.164-.413.125-.85-.108-.975-.522-.125-.413.108-.85.522-.975 3.633-1.102 8.157-.568 11.23 1.332.368.226.483.703.258 1.071zm.14-2.827c-3.225-1.915-8.54-2.092-11.614-1.16-.503.153-1.037-.133-1.19-.636-.152-.503.133-1.037.636-1.19 3.532-1.072 9.404-.865 13.115 1.338.45.267.598.85.33 1.3-.267.45-.85.598-1.3.33z"/></svg>' },
             spotify: { name: 'Spotify', base: 'https://open.spotify.com/artist/', color: '#1db954', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm4.586 14.424c-.18.295-.563.387-.857.207-2.35-1.434-5.308-1.758-8.793-.963-.335.077-.67-.133-.746-.468-.077-.334.132-.67.467-.745 3.816-.87 7.092-.493 9.72 1.112.294.18.386.563.209.857zm1.213-2.71c-.226.368-.703.483-1.07.258-2.688-1.652-6.785-2.13-9.965-1.164-.413.125-.85-.108-.975-.522-.125-.413.108-.85.522-.975 3.633-1.102 8.157-.568 11.23 1.332.368.226.483.703.258 1.071zm.14-2.827c-3.225-1.915-8.54-2.092-11.614-1.16-.503.153-1.037-.133-1.19-.636-.152-.503.133-1.037.636-1.19 3.532-1.072 9.404-.865 13.115 1.338.45.267.598.85.33 1.3-.267.45-.85.598-1.3.33z"/></svg>' },
             soundcloud: { name: 'SoundCloud', base: 'https://soundcloud.com/', color: '#ff5500', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M1.175 12.225c-.062 0-.115.053-.115.116v4.636c0 .062.053.115.115.115h.411c.063 0 .116-.053.116-.115v-4.636c0-.063-.053-.116-.116-.116h-.411zm1.312-1.28c-.062 0-.115.052-.115.115v6.52c0 .063.053.115.115.115h.43c.062 0 .115-.052.115-.115v-6.52c0-.063-.053-.115-.115-.115h-.43zm1.33-1.258c-.063 0-.115.052-.115.115v8.322c0 .063.052.115.115.115h.43c.063 0 .115-.052.115-.115V9.802c0-.063-.052-.115-.115-.115h-.43zm1.33-.86c-.063 0-.115.053-.115.116v9.542c0 .063.052.115.115.115h.43c.063 0 .115-.052.115-.115V8.942c0-.063-.052-.116-.115-.116h-.43zm21.43 3.652c-.413 0-.802.08-1.157.228-.312-2.73-2.613-4.858-5.422-4.858-1.08 0-2.083.315-2.928.858-.2-.702-.592-1.332-1.12-1.826-.78-.727-1.812-1.13-2.882-1.13-.815 0-1.6.236-2.272.684v10.822c0 .063.052.115.115.115h15.666c1.666 0 3.018-1.352 3.018-3.018 0-1.666-1.352-3.018-3.018-3.018z"/></svg>' },
             soundcloud: { name: 'SoundCloud', base: 'https://soundcloud.com/', color: '#ff5500', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M1.175 12.225c-.062 0-.115.053-.115.116v4.636c0 .062.053.115.115.115h.411c.063 0 .116-.053.116-.115v-4.636c0-.063-.053-.116-.116-.116h-.411zm1.312-1.28c-.062 0-.115.052-.115.115v6.52c0 .063.053.115.115.115h.43c.062 0 .115-.052.115-.115v-6.52c0-.063-.053-.115-.115-.115h-.43zm1.33-1.258c-.063 0-.115.052-.115.115v8.322c0 .063.052.115.115.115h.43c.063 0 .115-.052.115-.115V9.802c0-.063-.052-.115-.115-.115h-.43zm1.33-.86c-.063 0-.115.053-.115.116v9.542c0 .063.052.115.115.115h.43c.063 0 .115-.052.115-.115V8.942c0-.063-.052-.116-.115-.116h-.43zm21.43 3.652c-.413 0-.802.08-1.157.228-.312-2.73-2.613-4.858-5.422-4.858-1.08 0-2.083.315-2.928.858-.2-.702-.592-1.332-1.12-1.826-.78-.727-1.812-1.13-2.882-1.13-.815 0-1.6.236-2.272.684v10.822c0 .063.052.115.115.115h15.666c1.666 0 3.018-1.352 3.018-3.018 0-1.666-1.352-3.018-3.018-3.018z"/></svg>' },
            bandcamp: { name: 'Bandcamp', base: 'https://bandcamp.com/', color: '#1da0c3', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M0 18.75l7.437-13.5H24l-7.438 13.5H0z"/></svg>' },
             instagram: { name: 'Instagram', base: 'https://instagram.com/', color: '#e1306c', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"></line></svg>' },
             instagram: { name: 'Instagram', base: 'https://instagram.com/', color: '#e1306c', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"></line></svg>' },
             tiktok: { name: 'TikTok', base: 'https://www.tiktok.com/@', color: '#000000', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M19.59 6.69a4.83 4.83 0 0 1-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 1 1-5.2-1.74 2.89 2.89 0 0 1 2.31-2.22V8.2a6.34 6.34 0 0 0-5 6.13 6.34 6.34 0 1 0 10.7-4.52A8.25 8.25 0 0 0 20 10.56V6.69z"/></svg>' },
             tiktok: { name: 'TikTok', base: 'https://www.tiktok.com/@', color: '#000000', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M19.59 6.69a4.83 4.83 0 0 1-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 1 1-5.2-1.74 2.89 2.89 0 0 1 2.31-2.22V8.2a6.34 6.34 0 0 0-5 6.13 6.34 6.34 0 1 0 10.7-4.52A8.25 8.25 0 0 0 20 10.56V6.69z"/></svg>' },
Baris 32: Baris 34:
             facebook: { name: 'Facebook', base: 'https://facebook.com/', color: '#1877f2', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"></path></svg>' },
             facebook: { name: 'Facebook', base: 'https://facebook.com/', color: '#1877f2', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"></path></svg>' },
             linkedin: { name: 'LinkedIn', base: 'https://linkedin.com/in/', color: '#0a66c2', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path><rect x="2" y="9" width="4" height="12"></rect><circle cx="4" cy="4" r="2"></circle></svg>' },
             linkedin: { name: 'LinkedIn', base: 'https://linkedin.com/in/', color: '#0a66c2', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path><rect x="2" y="9" width="4" height="12"></rect><circle cx="4" cy="4" r="2"></circle></svg>' },
             reddit: { name: 'Reddit', base: 'https://reddit.com/user/', color: '#ff4500', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M24 11.5c0-1.65-1.35-3-3-3-.96 0-1.86.48-2.42 1.24-1.64-1-3.75-1.64-6.07-1.72.08-1.1.4-3.05 1.52-3.7.72-.4 1.73-.24 3 .5C17.2 6.3 18.46 7.5 20 7.5c1.65 0 3-1.35 3-3s-1.35-3-3-3c-1.38 0-2.54.94-2.88 2.22-1.43-.72-2.64-.8-3.6-.25-1.64.94-1.95 3.47-2 4.55-2.33.08-4.45.7-6.1 1.72C4.86 8.98 3.96 8.5 3 8.5c-1.65 0-3 1.35-3 3 0 1.32.84 2.44 2.05 2.84-.03.22-.05.44-.05.66 0 3.86 4.5 7 10 7s10-3.14 10-7c0-.22-.02-.44-.05-.66 1.2-.4 2.05-1.54 2.05-2.84zM2.3 13.37C1.5 13.07 1 12.35 1 11.5c0-1.1.9-2 2-2 .64 0 1.22.32 1.6.82-1.1.85-1.92 1.9-2.3 3.05zm3.7.13c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2zm9.8 4.8c-1.08.63-2.42.96-3.8.96-1.4 0-2.74-.34-3.8-.95-.24-.13-.32-.44-.2-.68.15-.24.46-.32.7-.18 1.83 1.06 4.76 1.06 6.6 0 .23-.13.53-.05.67.2.14.23.06.54-.18.67zm.2-2.8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm5.7-2.13c-.38-1.16-1.2-2.2-2.3-3.05.38-.5.96-.82 1.6-.82 1.1 0 2 .9 2 2 0 .84-.53 1.57-1.3 1.87z"/></svg>' },
             github: { name: 'GitHub', base: 'https://github.com/', color: '#24292e', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg>' },
             discord: { name: 'Discord', base: 'https://discord.com/users/', color: '#5865F2', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189z"/></svg>' },
             pinterest: { name: 'Pinterest', base: 'https://pinterest.com/', color: '#e60023', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.373 0 0 5.372 0 12c0 5.084 3.163 9.426 7.627 11.174-.105-.949-.2-2.405.042-3.441.218-.937 1.407-5.965 1.407-5.965s-.359-.719-.359-1.782c0-1.668.967-2.914 2.171-2.914 1.023 0 1.518.769 1.518 1.69 0 1.029-.655 2.568-.994 3.995-.283 1.194.599 2.169 1.777 2.169 2.133 0 3.772-2.249 3.772-5.495 0-2.873-2.064-4.882-5.012-4.882-3.414 0-5.418 2.561-5.418 5.207 0 1.031.397 2.138.893 2.738.098.119.112.224.083.345l-.333 1.36c-.053.22-.174.267-.402.161-1.499-.698-2.436-2.889-2.436-4.649 0-3.785 2.75-7.262 7.929-7.262 4.163 0 7.398 2.967 7.398 6.931 0 4.136-2.607 7.464-6.227 7.464-1.216 0-2.359-.631-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12 24c6.627 0 12-5.373 12-12 0-6.628-5.373-12-12-12z"/></svg>' }
            twitch: { name: 'Twitch', base: 'https://twitch.tv/', color: '#9146FF', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M2.149 0L.537 4.119v16.836h5.731V24h3.224l3.045-3.045h4.657l6.269-6.269V0H2.149zm19.164 13.612l-4.298 4.298h-5.373l-3.045 3.045v-3.045H4.119V2.149h17.194v11.463zm-3.582-7.343v6.269h-2.149V6.269h2.149zm-5.731 0v6.269h-2.149V6.269h2.149z"/></svg>' },
            telegram: { name: 'Telegram', base: 'https://t.me/', color: '#26A5E4', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z"/></svg>' },
            whatsapp: { name: 'WhatsApp', base: 'https:///', color: '#25D366', icon: '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a5.8 5.8 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.82 9.82 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z"/></svg>' }
         };
         };


         // 2. PRESET TEMPLATES LABEL LENGKAP (Diperluas)
         // 2. PRESET & MASTER RUJUKAN
         var PRESET_LABELS = [
         var PRESET_LABELS = [
             "Nama Lahir", "Tanggal Lahir", "Tempat Lahir", "Pekerjaan",  
             "Nama Lahir", "Tanggal Lahir", "Tempat Lahir", "Pekerjaan",  
             "Kebangsaan", "Agama", "Pendidikan", "Genre", "Instrumen",  
             "Kebangsaan", "Genre", "Instrumen", "Label Rekaman",  
            "Label Rekaman", "Tahun Aktif", "Situs Web Resmi", "Pasangan",  
            "Tahun Aktif", "Situs Web Resmi", "Pasangan", "Orang Tua"
            "Orang Tua", "Anak", "Penghargaan", "Agensi", "Tinggi Badan"
         ];
         ];


        // 3. MASTER TIPE RUJUKAN
         var REF_TYPES = {
         var REF_TYPES = {
             "Berita": ["Berita Online", "Berita Cetak / Koran", "Wawancara Eksklusif", "Liputan Khusus", "Editorial", "Investigasi Media", "Siaran Radio / TV"],
             "Berita": ["Berita Online", "Berita Cetak / Koran", "Wawancara Eksklusif", "Liputan Khusus", "Editorial", "Investigasi Media", "Siaran Radio / TV"],
Baris 63: Baris 60:
         };
         };


         // 4. IKON SISTEM (Diperbarui dengan ikon tajam & bersih)
        var VERIFIED_DOMAINS = [
            'kompas.com', 'kompas.id', 'detik.com', 'cnnindonesia.com', 'tribunnews.com', 'kumparan.com', 'tirto.id',
            'youtube.com', 'spotify.com', 'apple.com', 'musicbrainz.org', 'billboard.com', 'rollingstone.com',
            'bbc.com', 'nytimes.com', 'instagram.com', 'x.com', 'twitter.com', 'facebook.com', 'wikipedia.org', 'imdb.com'
        ];
 
         // 3. IKON SISTEM  
         var svgEdit = '<svg class="md-icon" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg>';
         var svgEdit = '<svg class="md-icon" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg>';
         var svgLock = '<svg class="md-icon" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>';
         var svgLock = '<svg class="md-icon" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>';
Baris 71: Baris 74:
         var svgSearch = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>';
         var svgSearch = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>';
         var svgCode = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline></svg>';
         var svgCode = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline></svg>';
         var svgUp = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="18 15 12 9 6 15"></polyline></svg>';
         var svgVerified = '<svg width="15" height="15" viewBox="0 0 24 24" fill="#3b82f6" stroke="#ffffff" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline></svg>';
        var svgDown = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"></polyline></svg>';
         var svgHelp = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>';
         var svgDuplicate = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>';
        var svgMoon = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg>';
        var svgLinkExt = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg>';
        var svgVerified = '<svg width="13" height="13" viewBox="0 0 24 24" fill="#3b82f6" stroke="#fff" stroke-width="2"><polygon points="12 2 15.09 5.09 19.5 5.5 20.41 9.91 23.5 13 20.41 16.09 19.5 20.5 15.09 20.91 12 24 8.91 20.91 4.5 20.5 3.59 16.09 0.5 13 3.59 9.91 4.5 5.5 8.91 5.09 12 2"></polygon><polyline points="8 12.5 11 15.5 16 9.5" fill="none"></polyline></svg>';


         // 5. HELPER UTILITY CANGGIH
         // 4. HELPER UTILITY & ADVANCED SECURITY
         function showToast(msg, type) {
         function sanitizeHTML(str) {
             $('.md-toast').remove();
             if (typeof str !== 'string') return str;
            var bg = type === 'error' ? '#ef4444' : '#10b981';
            return str.replace(/[&<>"'`=\/]/g, function(s) {
            var $toast = $('<div class="md-toast" style="position:fixed; bottom:20px; right:20px; background:' + bg + '; color:white; padding:10px 16px; border-radius:8px; font-weight:600; font-size:0.85rem; box-shadow:0 4px 12px rgba(0,0,0,0.15); z-index:9999; display:none; flex-align:center; gap:8px;">' + msg + '</div>');
                return {
            $('body').append($toast);
                    '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;',
             $toast.fadeIn(300).delay(2500).fadeOut(300, function() { $(this).remove(); });
                    "'": '&#39;', '/': '&#x2F;', '`': '&#x60;', '=': '&#x3D;'
                }[s];
            });
        }
        function isVerifiedSite(urlStr) {
            if(!urlStr) return false;
             var domain = extractDomain(urlStr);
            return VERIFIED_DOMAINS.some(function(vd) { return domain === vd || domain.endsWith('.' + vd); });
         }
         }
         function formatIndonesianDate(dateStr) {
         function formatIndonesianDate(dateStr) {
             if (!dateStr) return '';
             if (!dateStr) return '';
             var parts = dateStr.split('-');
             var parts = dateStr.split('-');
             if (parts.length !== 3) return dateStr;
             if (parts.length !== 3) return dateStr;
             var months = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des'];
             var months = ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'];
             var day = parseInt(parts[2], 10);
             var day = parseInt(parts[2], 10);
             var monthIdx = parseInt(parts[1], 10) - 1;
             var monthIdx = parseInt(parts[1], 10) - 1;
             var year = parts[0];
             var year = parts[0];
             if (isNaN(day) || monthIdx < 0 || monthIdx > 11 || isNaN(year)) return dateStr;
             if (isNaN(day) || monthIdx < 0 || monthIdx > 11 || isNaN(year)) return sanitizeHTML(dateStr);
             return day + ' ' + months[monthIdx] + ' ' + year;
             return day + ' ' + months[monthIdx] + ' ' + year;
         }
         }
         function extractDomain(urlStr) {
         function extractDomain(urlStr) {
             try {
             try {
                 if (!urlStr.match(/^https?:\/\//i)) urlStr = 'https://' + urlStr;
                 if (!urlStr.match(/^https?:\/\//i)) urlStr = 'https://' + urlStr;
                 var parsed = new URL(urlStr);
                 return new URL(urlStr).hostname.replace(/^www\./, '');
                return parsed.hostname.replace(/^www\./, '');
             } catch(e) { return urlStr.replace(/^https?:\/\/(www\.)?/, '').split('/')[0]; }
             } catch(e) {
                return urlStr.replace(/^https?:\/\/(www\.)?/, '').split('/')[0];
            }
         }
         }
         function ensureHttps(urlStr) {
         function ensureHttps(urlStr) {
             if (!urlStr) return '';
             if (!urlStr) return '';
             urlStr = urlStr.trim();
             urlStr = urlStr.trim();
             if (urlStr && !urlStr.match(/^https?:\/\//i)) {
             var protoMatch = urlStr.match(/^([a-z0-9]+):/i);
                 return 'https://' + urlStr;
            if (protoMatch) {
                 var badProtos = ['javascript', 'data', 'vbscript', 'file', 'ws', 'wss', 'ftp'];
                if (badProtos.indexOf(protoMatch[1].toLowerCase()) !== -1) return '';
             }
             }
             return urlStr;
             return (urlStr && !urlStr.match(/^https?:\/\//i)) ? 'https://' + urlStr : urlStr;
         }
         }
         function getTodayString() {
         function getTodayString() {
             var now = new Date();
             var now = new Date();
Baris 126: Baris 127:
         }
         }


        function isVerifiedSite(domain) {
         // 5. STYLESHEET (TERMASUK LAYOUT MEDIA SOSIAL GLOBAL & AUTOCOMPLETE)
            var officialSites = ['wikipedia.org', 'imdb.com', 'spotify.com', 'apple.com', 'bbc.com', 'cnn.com', 'nytimes.com', 'gov', 'edu'];
            return officialSites.some(function(site) { return domain.indexOf(site) !== -1; });
        }
 
         // 6. STYLESHEET MODERN V8.0 ULTIMATE PRO
         var css = `
         var css = `
            :root {
                --md-bg: #ffffff; --md-border: #e2e8f0; --md-text: #0f172a; --md-text-muted: #64748b;
                --md-bg-hover: #f8fafc; --md-primary: #4f46e5; --md-primary-hover: #4338ca;
                --md-card-bg: #fff; --md-ref-bg: #f8fafc; --md-input-bg: #f8fafc;
                --md-shadow: 0 4px 24px rgba(0,0,0,0.06);
            }
            .md-dark-mode {
                --md-bg: #0f172a; --md-border: #334155; --md-text: #f8fafc; --md-text-muted: #94a3b8;
                --md-bg-hover: #1e293b; --md-primary: #6366f1; --md-primary-hover: #818cf8;
                --md-card-bg: #1e293b; --md-ref-bg: #0f172a; --md-input-bg: #0f172a;
                --md-shadow: 0 4px 24px rgba(0,0,0,0.3);
            }
             #mippedia-data-app {
             #mippedia-data-app {
                 background: var(--md-bg); border-radius: 16px; box-shadow: var(--md-shadow);
                 background: #ffffff; border-radius: 16px; box-shadow: 0 4px 24px rgba(0,0,0,0.06);
                 padding: 20px; margin: 20px 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
                 padding: 20px; margin: 20px 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
                 border: 1px solid var(--md-border); max-width: 100%; box-sizing: border-box; overflow: hidden;
                 border: 1px solid #e2e8f0; max-width: 100%; box-sizing: border-box; overflow: hidden;
                color: var(--md-text); transition: background 0.3s, color 0.3s;
             }
             }
           
             .md-header { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 16px; padding-bottom: 14px; border-bottom: 1px solid #f1f5f9; }
             .md-header { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 16px; padding-bottom: 14px; border-bottom: 1px solid var(--md-border); }
             .md-title-container { display: flex; align-items: center; gap: 8px; flex: 1 1 auto; min-width: 180px; }
             .md-title-container { display: flex; align-items: center; gap: 8px; flex: 1 1 auto; min-width: 180px; }
             .md-title { font-size: 1.25rem; font-weight: 800; color: var(--md-text); margin: 0; white-space: nowrap; letter-spacing: -0.3px; }
             .md-title { font-size: 1.25rem; font-weight: 800; color: #0f172a; margin: 0; white-space: nowrap; }
             .md-actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
             .md-actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
              
              
             .md-btn-icon {
             .md-btn-icon {
                 background: var(--md-bg-hover); border: 1px solid var(--md-border); cursor: pointer; color: var(--md-primary);
                 background: #f8fafc; border: 1px solid #cbd5e1; cursor: pointer; color: #4f46e5;
                 padding: 8px 14px; border-radius: 8px; transition: all 0.2s ease;
                 padding: 8px 14px; border-radius: 8px; transition: all 0.2s ease;
                 display: inline-flex; align-items: center; gap: 6px; font-size: 0.85rem; font-weight: 600; white-space: nowrap;
                 display: inline-flex; align-items: center; gap: 6px; font-size: 0.85rem; font-weight: 600; white-space: nowrap;
             }
             }
             .md-btn-icon:hover:not(:disabled) { border-color: var(--md-text-muted); transform: translateY(-1px); box-shadow: 0 2px 8px rgba(0,0,0,0.05); }
             .md-btn-icon:hover:not(:disabled) { background: #f1f5f9; border-color: #94a3b8; transform: translateY(-1px); }
             .md-btn-lock { color: #dc2626; background: #fef2f2; border-color: #fca5a5; }
             .md-btn-lock { color: #dc2626; background: #fef2f2; border-color: #fca5a5; }


             .md-search-box { position: relative; margin-bottom: 16px; width: 100%; box-sizing: border-box; }
             .md-search-box { position: relative; margin-bottom: 16px; width: 100%; box-sizing: border-box; }
             .md-search-input { width: 100%; padding: 8px 12px 8px 34px; border: 1px solid var(--md-border); border-radius: 8px; font-size: 0.85rem; box-sizing: border-box; background: var(--md-input-bg); color: var(--md-text); transition: 0.2s; }
             .md-search-input { width: 100%; padding: 8px 12px 8px 34px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 0.85rem; box-sizing: border-box; background: #f8fafc; transition: 0.2s; }
             .md-search-input:focus { border-color: var(--md-primary); outline: none; box-shadow: 0 0 0 3px rgba(99,102,241,0.15); }
             .md-search-input:focus { background: #fff; border-color: #4f46e5; outline: none; }
             .md-search-icon { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: var(--md-text-muted); }
            .md-search-icon { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: #94a3b8; }
 
            /* Kotak Global Sosial Media Terpisah di Atas */
            .md-global-social-box { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 16px; margin-bottom: 16px; box-shadow: 0 2px 8px rgba(0,0,0,0.02); }
             .md-social-box-title { font-size: 0.85rem; font-weight: 800; color: #475569; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; border-bottom: 1px dashed #cbd5e1; padding-bottom: 8px; }
            .md-social-group { display: flex; flex-wrap: wrap; gap: 8px; }
            .md-social-badge { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 20px; font-size: 0.8rem; font-weight: 600; color: white !important; text-decoration: none !important; transition: transform 0.2s, opacity 0.2s; box-shadow: 0 2px 4px rgba(0,0,0,0.05); }
            .md-social-badge:hover { transform: translateY(-2px); opacity: 0.92; }


            /* Row Display Fix */
             .md-row-display { display: flex; justify-content: space-between; align-items: flex-start; padding: 16px 12px; border-bottom: 1px solid #f1f5f9; transition: all 0.2s; border-radius: 12px; gap: 12px; margin-bottom: 8px; background: #fff; }
             .md-row-display {
             .md-row-display:hover { background: #faf5ff; box-shadow: inset 4px 0 0 #6366f1; }
                display: flex; justify-content: space-between; align-items: flex-start;
                padding: 16px 12px; border-bottom: 1px solid var(--md-border); transition: all 0.2s;
                border-radius: 12px; gap: 12px; margin-bottom: 8px; background: var(--md-card-bg);
            }
             .md-row-display:hover { background: var(--md-bg-hover); box-shadow: inset 4px 0 0 var(--md-primary); }
              
              
             .md-data-group { display: flex; flex-direction: column; gap: 6px; flex: 1; min-width: 0; }
             .md-data-group { display: flex; flex-direction: column; gap: 6px; flex: 1; min-width: 0; }
             .md-data-label { font-size: 0.72rem; color: var(--md-text-muted); font-weight: 800; text-transform: uppercase; letter-spacing: 0.6px; }
             .md-data-label { font-size: 0.72rem; color: #64748b; font-weight: 800; text-transform: uppercase; letter-spacing: 0.6px; }
             .md-data-value-wrap { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
             .md-data-value-wrap { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
             .md-data-value { font-size: 1.02rem; color: var(--md-text); line-height: 1.4; font-weight: 600; word-break: break-word; }
             .md-data-value { font-size: 1.02rem; color: #0f172a; line-height: 1.4; font-weight: 600; word-break: break-word; }
              
              
             .md-btn-copy { background: none; border: none; color: var(--md-text-muted); cursor: pointer; padding: 2px 4px; border-radius: 4px; transition: 0.2s; display: inline-flex; align-items: center; }
             .md-btn-copy { background: none; border: none; color: #94a3b8; cursor: pointer; padding: 2px 4px; border-radius: 4px; transition: 0.2s; display: inline-flex; align-items: center; }
             .md-btn-copy:hover { color: var(--md-primary); background: var(--md-border); }
             .md-btn-copy:hover { color: #4f46e5; background: #e0e7ff; }


            /* Tampilan Referensi V8.0 (COLLAPSIBLE / ACCORDION) */
             .md-ref-container { margin-top: 10px; width: 100%; box-sizing: border-box; }
             .md-ref-wrapper { margin-top: 8px; width: 100%; box-sizing: border-box; }
             .md-ref-details { background: #f8fafc; border-left: 3px solid #4f46e5; border-radius: 10px; overflow: hidden; border-top:1px solid #f1f5f9; border-right:1px solid #f1f5f9; border-bottom:1px solid #f1f5f9; transition: 0.3s; }
             .md-ref-toggle {
             .md-ref-details summary { display: flex; padding: 10px 14px; font-size: 0.85rem; font-weight: 700; color: #374151; cursor: pointer; user-select: none; list-style: none; flex-wrap: nowrap; align-items: center; gap: 8px; }
                background: var(--md-ref-bg); border: 1px solid var(--md-border); border-radius: 6px;
             .md-ref-details summary::-webkit-details-marker { display: none; }
                padding: 6px 12px; font-size: 0.78rem; font-weight: 700; color: var(--md-primary);
             .md-ref-details[open] summary { border-bottom: 1px dashed #cbd5e1; background: #e0e7ff; color: #3730a3; }
                cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: 0.2s;
             .md-ref-body { padding: 12px 14px; font-size: 0.85rem; display: flex; flex-direction: column; gap: 6px; }
            }
             .md-ref-toggle:hover { background: var(--md-bg-hover); transform: translateX(2px); }
            .md-ref-toggle.active { border-bottom-left-radius: 0; border-bottom-right-radius: 0; border-bottom: none; }
           
            .md-ref-card {
                background: var(--md-ref-bg); padding: 12px 14px; border-radius: 0 6px 6px 6px;
                border: 1px solid var(--md-border); font-size: 0.85rem; display: none; flex-direction: column; gap: 8px;
                box-sizing: border-box; animation: mdFadeIn 0.3s ease-in-out;
            }
            @keyframes mdFadeIn { from { opacity: 0; transform: translateY(-5px); } to { opacity: 1; transform: translateY(0); } }
 
            .md-ref-header { font-weight: 700; color: var(--md-text); font-size: 0.9rem; word-break: break-word; display: flex; align-items: center; gap: 5px;}
             .md-ref-details-grid { display: flex; flex-direction: column; gap: 4px; }
             .md-ref-detail-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 6px; font-size: 0.82rem; color: var(--md-text-muted); }
             .md-ref-lbl { font-weight: 700; white-space: nowrap; flex-shrink: 0; }
            .md-ref-val { color: var(--md-text); font-weight: 500; word-break: break-word; }
              
              
             .md-ref-actions { display: flex; gap: 8px; margin-top: 6px; flex-wrap: wrap; }
             .md-verified-badge { cursor: pointer; display: inline-flex; align-items: center; justify-content: center; margin-left: 4px; vertical-align: middle; transition: transform 0.2s; flex-shrink: 0; }
            .md-ref-visit-btn {
             .md-verified-badge:hover { transform: scale(1.1); }
                background: var(--md-primary); color: white; padding: 5px 12px; border-radius: 6px;
             .md-btn-visit { background: #f1f5f9; color: #0f172a; padding: 6px 12px; border-radius: 6px; text-decoration: none; font-size: 0.8rem; display: inline-block; width: fit-content; margin-top: 6px; font-weight:700; border:1px solid #cbd5e1; }
                font-size: 0.75rem; font-weight: 700; text-decoration: none; display: inline-flex; align-items: center; gap: 4px; transition: 0.2s;
             .md-btn-visit:hover { background: #e2e8f0; text-decoration:none; }
            }
             .md-ref-visit-btn:hover { background: var(--md-primary-hover); transform: translateY(-1px); color: white; text-decoration: none; }
             .md-ref-badge { display: inline-block; background: var(--md-border); color: var(--md-text); padding: 3px 8px; border-radius: 6px; font-weight: 700; font-size: 0.72rem; }
 
            /* Media Sosial Badges V8 */
            .md-social-group { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
            .md-social-badge { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px; border-radius: 18px; font-size: 0.78rem; font-weight: 600; color: white; text-decoration: none; transition: transform 0.2s, opacity 0.2s; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
             .md-social-badge:hover { transform: translateY(-2px); opacity: 0.92; color: white; text-decoration: none; }
 
            /* Toolbars List */
            .md-row-tools { display: flex; flex-direction: column; gap: 4px; align-items: flex-end; }
            .md-row-tools-group { display: flex; gap: 4px; }


            /* Preset Pill Badges */
             .md-preset-wrapper { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
             .md-preset-wrapper { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
             .md-preset-pill { background: var(--md-bg-hover); border: 1px solid var(--md-border); padding: 4px 10px; border-radius: 12px; font-size: 0.75rem; font-weight: 600; color: var(--md-text-muted); cursor: pointer; transition: 0.2s; }
             .md-preset-pill { background: #f1f5f9; border: 1px solid #cbd5e1; padding: 4px 10px; border-radius: 12px; font-size: 0.75rem; font-weight: 600; color: #475569; cursor: pointer; transition: 0.2s; }
             .md-preset-pill:hover { background: #e0e7ff; color: #3730a3; border-color: #a5b4fc; }
             .md-preset-pill:hover { background: #e0e7ff; color: #3730a3; border-color: #a5b4fc; }


            /* Form Elements Responsif */
             .md-form-box { background: #ffffff; border-radius: 12px; padding: 18px; margin-top: 16px; border: 1px solid #cbd5e1; box-shadow: 0 4px 16px rgba(0,0,0,0.05); }
             .md-form-box { background: var(--md-card-bg); border-radius: 12px; padding: 18px; margin-top: 16px; border: 1px solid var(--md-border); box-shadow: var(--md-shadow); backdrop-filter: blur(10px); }
             .md-form-title { font-size: 1.05rem; font-weight: 800; color: #0f172a; margin: 0 0 16px 0; border-bottom: 2px solid #e2e8f0; padding-bottom: 8px; }
             .md-form-title { font-size: 1.05rem; font-weight: 800; color: var(--md-text); margin: 0 0 16px 0; border-bottom: 2px solid var(--md-border); padding-bottom: 8px; position: sticky; top: 0; background: var(--md-card-bg); z-index: 10; }
             .md-form-group { margin-bottom: 14px; }
             .md-form-group { margin-bottom: 14px; }
             .md-form-group label { display: block; font-size: 0.82rem; font-weight: 700; margin-bottom: 6px; color: var(--md-text-muted); }
             .md-form-group label { display: flex; align-items:center; font-size: 0.82rem; font-weight: 700; margin-bottom: 6px; color: #334155; }
             .md-input, .md-select, .md-textarea { width: 100%; padding: 9px 12px; border: 1px solid var(--md-border); border-radius: 8px; box-sizing: border-box; font-family: inherit; font-size: 0.9rem; transition: 0.2s; background: var(--md-input-bg); color: var(--md-text); }
           
             .md-input:focus, .md-select:focus, .md-textarea:focus { border-color: var(--md-primary); outline: none; box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15); }
             .md-input, .md-select, .md-textarea { width: 100%; padding: 9px 12px; border: 1px solid #cbd5e1; border-radius: 8px; box-sizing: border-box; font-family: inherit; font-size: 0.9rem; transition: 0.2s; background: #fff; }
            .md-input.error { border-color: #ef4444; background: #fef2f2; }
             .md-input:focus, .md-select:focus, .md-textarea:focus { border-color: #4f46e5; outline: none; box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15); }
              
              
             .md-ref-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; background: var(--md-bg-hover); padding: 12px; border-radius: 8px; border: 1px dashed var(--md-border); }
            /* Autocomplete Styles */
             .md-social-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; background: var(--md-bg-hover); padding: 12px; border-radius: 8px; border: 1px solid var(--md-border); max-height: 280px; overflow-y: auto; }
            .md-autocomplete-wrapper { position: relative; width: 100%; }
            .md-autocomplete-list { position: absolute; top: 100%; left: 0; right: 0; background: #fff; border: 1px solid #cbd5e1; border-radius: 0 0 8px 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); z-index: 1000; display: none; max-height: 200px; overflow-y: auto; margin-top: -2px; }
            .md-autocomplete-item { padding: 10px 12px; font-size: 0.88rem; color: #0f172a; cursor: pointer; border-bottom: 1px solid #f1f5f9; transition: 0.2s; display: flex; align-items: center; gap: 8px; }
            .md-autocomplete-item:last-child { border-bottom: none; }
            .md-autocomplete-item:hover { background: #f8fafc; color: #4f46e5; padding-left: 16px; }
 
             .md-ref-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; background: #f8fafc; padding: 12px; border-radius: 8px; border: 1px dashed #cbd5e1; }
             .md-social-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; background: #f1f5f9; padding: 12px; border-radius: 8px; border: 1px solid #cbd5e1; max-height: 280px; overflow-y: auto; }
             .md-grid-full { grid-column: span 2; }
             .md-grid-full { grid-column: span 2; }
              
              
             .md-form-actions { display: flex; gap: 10px; align-items: center; margin-top: 20px; padding-top: 14px; border-top: 1px solid var(--md-border); flex-wrap: wrap; }
            .md-cc0-notice { background: #fef2f2; color: #991b1b; padding: 12px; border-radius: 8px; font-size: 0.82rem; line-height: 1.4; border-left: 4px solid #ef4444; margin-top: 15px; margin-bottom: 15px; }
            .md-edit-meta { background: #f8fafc; padding: 12px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #e2e8f0; display:flex; flex-direction:column; gap:10px; }
           
            .md-help-icon { color: #64748b; cursor: pointer; margin-left: 6px; display:inline-flex; align-items:center; }
            .md-help-icon:hover { color: #4f46e5; }
            .md-tooltip-popup { position: absolute; background: #1e293b; color: #fff; padding: 10px 14px; border-radius: 8px; font-size: 0.8rem; width: 260px; max-width: calc(100vw - 30px); z-index: 1000; box-shadow: 0 4px 15px rgba(0,0,0,0.15); display: none; line-height: 1.4; text-align: left; font-weight:normal; }
            .md-tooltip-popup::after { content: ''; position: absolute; border-width: 6px; border-style: solid; border-color: #1e293b transparent transparent transparent; top: 100%; left: 15px; }
 
            .md-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 9999; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(2px); }
            .md-modal-box { background: #fff; padding: 24px; border-radius: 12px; max-width: 400px; text-align: center; box-shadow: 0 10px 25px rgba(0,0,0,0.2); animation: mdPopIn 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); }
            @keyframes mdPopIn { 0% { transform: scale(0.8); opacity: 0; } 100% { transform: scale(1); opacity: 1; } }
 
             .md-form-actions { display: flex; gap: 10px; align-items: center; margin-top: 20px; padding-top: 14px; border-top: 1px solid #e2e8f0; flex-wrap: wrap; }
             .md-btn { padding: 10px 18px; border: none; border-radius: 8px; font-weight: 700; cursor: pointer; color: white; font-size: 0.85rem; transition: 0.2s; display: inline-flex; align-items: center; gap: 6px; justify-content: center; }
             .md-btn { padding: 10px 18px; border: none; border-radius: 8px; font-weight: 700; cursor: pointer; color: white; font-size: 0.85rem; transition: 0.2s; display: inline-flex; align-items: center; gap: 6px; justify-content: center; }
             .md-btn:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 4px 10px rgba(0,0,0,0.15); }
             .md-btn:hover:not(:disabled) { transform: translateY(-1px); }
             .md-btn-save { background: linear-gradient(135deg, var(--md-primary), var(--md-primary-hover)); flex: 1; min-width: 140px; }
             .md-btn-save { background: linear-gradient(135deg, #4f46e5, #4338ca); flex: 1; min-width: 140px; }
             .md-btn-cancel { background: #64748b; }
             .md-btn-cancel { background: #64748b; }
            .md-btn-draft { background: #10b981; }
             .md-btn-delete { background: #dc2626; margin-left: auto; }
             .md-btn-delete { background: #dc2626; margin-left: auto; }
              
              
Baris 256: Baris 229:
             @keyframes md-spin { to { transform: rotate(360deg); } }
             @keyframes md-spin { to { transform: rotate(360deg); } }


            /* Mobile Optimized Layout (Seluler) */
             @media (max-width: 600px) {
             @media (max-width: 600px) {
                 #mippedia-data-app { padding: 14px; margin: 14px 0; border-radius: 12px; }
                 #mippedia-data-app { padding: 14px; margin: 14px 0; border-radius: 12px; }
                 .md-header { flex-direction: column; align-items: flex-start; gap: 10px; }
                 .md-header { flex-direction: column; align-items: flex-start; gap: 10px; }
                 .md-actions { width: 100%; justify-content: flex-start; overflow-x: auto; padding-bottom: 4px; }
                 .md-actions { width: 100%; justify-content: flex-start; overflow-x:auto; padding-bottom:5px; }
                 .md-btn-icon { padding: 7px 12px; font-size: 0.8rem; }
                 .md-btn-icon { padding: 7px 12px; font-size: 0.8rem; }
                 .md-ref-grid, .md-social-grid { grid-template-columns: 1fr; }
                 .md-ref-grid, .md-social-grid { grid-template-columns: 1fr; }
Baris 265: Baris 239:
                 .md-form-actions { flex-direction: column; width: 100%; }
                 .md-form-actions { flex-direction: column; width: 100%; }
                 .md-btn { width: 100%; margin: 0 !important; }
                 .md-btn { width: 100%; margin: 0 !important; }
                 .md-row-display { flex-direction: column; padding: 14px; }
                 .md-row-display { padding: 12px 10px; flex-direction:column; align-items:stretch;}
                 .md-row-tools { flex-direction: row; width: 100%; justify-content: space-between; margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--md-border); }
                 .edit-btn { align-self:flex-end; margin-top:8px; }
                .md-ref-details summary { align-items: flex-start; }
             }
             }
             .md-native-render { display: none; }
             .md-native-render { display: none; }
Baris 272: Baris 247:
         $('<style>').text(css).appendTo('head');
         $('<style>').text(css).appendTo('head');


         // 7. PARSER & PENYIMPANAN DATA
        // 6. POPUP, MODAL & TOOLTIPS
        function showModal(title, text) {
            $('.md-modal-overlay').remove();
            var $overlay = $('<div class="md-modal-overlay"></div>');
            var $box = $('<div class="md-modal-box"><h3 style="margin-top:0; color:#0f172a;">' + sanitizeHTML(title) + '</h3><p style="font-size:0.9rem; color:#475569; margin:15px 0;">' + sanitizeHTML(text) + '</p><button class="md-btn md-btn-save" style="width:100%;">Tutup & Mengerti</button></div>');
            $box.find('button').on('click', function() { $overlay.remove(); });
            $overlay.append($box);
            $('body').append($overlay);
        }
 
        function initTooltips() {
            $('.md-help-icon').off('click').on('click', function(e) {
                $('.md-tooltip-popup').remove();
                e.stopPropagation();
                var $icon = $(this);
                var text = sanitizeHTML($icon.data('help'));
                var $tt = $('<div class="md-tooltip-popup">' + text + '</div>');
                $('body').append($tt);
               
                var offset = $icon.offset();
                var ttWidth = $tt.outerWidth();
                var winWidth = $(window).width();
                var leftPos = offset.left - 15;
               
                if (leftPos + ttWidth > winWidth - 15) leftPos = winWidth - ttWidth - 15;
                if (leftPos < 10) leftPos = 10;
               
                $tt.css({ top: offset.top - $tt.outerHeight() - 10, left: leftPos }).fadeIn(200);
            });
            $(document).off('click.mdtt').on('click.mdtt', function() { $('.md-tooltip-popup').fadeOut(200, function(){ $(this).remove(); }); });
        }
 
         // 7. PARSER WIKITEXT & PENYIMPANAN DATA  
         function loadData() {
         function loadData() {
             return api.get({
             return api.get({
Baris 292: Baris 299:
         function buildWikitextVal(item) {
         function buildWikitextVal(item) {
             var val = item.val;
             var val = item.val;
             if (item.linkTarget && item.linkTarget.trim() !== '') { return "[[" + item.linkTarget.trim() + "|" + val + "]]"; }
             if (item.linkTarget && item.linkTarget.trim() !== '') {
                return "[[" + item.linkTarget.trim() + "|" + val + "]]";
            }
             if (item.linkSplit) {
             if (item.linkSplit) {
                 return val.replace(/([a-zA-Z0-9_À-ÿ\- ]+)/g, function(match) {
                 return val.replace(/([a-zA-Z0-9_À-ÿ\- ]+)/g, function(match) {
                     var trimmed = match.trim();
                     var trimmed = match.trim();
                     if (trimmed.length > 2 && trimmed.toLowerCase() !== 'dan' && trimmed.toLowerCase() !== 'atau') { return "[[" + trimmed + "]]"; }
                     if (trimmed.length > 2 && trimmed.toLowerCase() !== 'dan' && trimmed.toLowerCase() !== 'atau') {
                        return "[[" + trimmed + "]]";
                    }
                     return match;
                     return match;
                 });
                 });
             }
             }
             if (item.link) { return "[[" + val + "]]"; }
             if (item.link) {
                return "[[" + val + "]]";
            }
             return val;
             return val;
         }
         }
Baris 319: Baris 332:
         }
         }


         function saveData(actionType, $btnEl, originalContent) {
         function saveData(actionType, $btnEl, originalContent, customSummary, isMinorEdit) {
             if ($btnEl) $btnEl.addClass('is-loading').prop('disabled', true);
             if ($btnEl) $btnEl.addClass('is-loading').prop('disabled', true);
              
              
             // Auto-Save ke localstorage sebelum kirim API untuk cadangan
             var summaryTxt = customSummary ? ('Mippedia Data: ' + customSummary) : ('Mippedia Data V8.7: ' + actionType);
            localStorage.setItem('md_backup_' + pageName, JSON.stringify(dataItems));
 
             var jsonStr = JSON.stringify({ locked: isLocked, items: dataItems });
             var jsonStr = JSON.stringify({ locked: isLocked, items: dataItems });
             var wt = "<!-- MIPPEDIA_DATA_START | " + jsonStr + " -->\n";
             var wt = "<!-- MIPPEDIA_DATA_START | " + jsonStr + " -->\n";
Baris 345: Baris 356:


             api.postWithToken('csrf', {
             api.postWithToken('csrf', {
                 action: 'edit', title: pageName, text: newContent, summary: 'Mippedia Data V8: ' + actionType, minor: false
                 action: 'edit', title: pageName, text: newContent, summary: summaryTxt, minor: isMinorEdit || false
             }).done(function() {
             }).done(function() {
                 localStorage.removeItem('md_backup_' + pageName); // Hapus backup jika sukses
                 localStorage.removeItem(DRAFT_KEY);
                showToast("Berhasil menyimpan!", "success");
                 var nocacheUrl = location.pathname + "?refresh=" + new Date().getTime();
                 setTimeout(function() {
                window.location.href = nocacheUrl;
                    var nocacheUrl = location.pathname + "?refresh=" + new Date().getTime();
                    window.location.href = nocacheUrl;
                }, 800);
             }).fail(function(err) {
             }).fail(function(err) {
                 if ($btnEl) $btnEl.removeClass('is-loading').prop('disabled', false);
                 if ($btnEl) $btnEl.removeClass('is-loading').prop('disabled', false);
                 showToast("Gagal menyimpan! Error: " + err, "error");
                 alert("Gagal menyimpan! Error: " + err);
             });
             });
         }
         }
Baris 363: Baris 371:
             var $app = $('<div id="mippedia-data-app"></div>');
             var $app = $('<div id="mippedia-data-app"></div>');
              
              
            // HEADER
             var $header = $('<div class="md-header"></div>');
             var $header = $('<div class="md-header"></div>');
             var $titleContainer = $('<div class="md-title-container"><h3 class="md-title">' + svgEdit + ' Data Terstruktur</h3></div>');
             var $titleContainer = $('<div class="md-title-container"><h3 class="md-title">' + svgEdit + ' Data Terstruktur</h3></div>');
             var $actions = $('<div class="md-actions"></div>');
             var $actions = $('<div class="md-actions"></div>');
              
              
            // Tombol Dark Mode
            var $themeBtn = $('<button class="md-btn-icon" title="Toggle Dark Mode">' + svgMoon + '</button>');
            $themeBtn.on('click', function() { $('#mippedia-data-app').toggleClass('md-dark-mode'); });
            $actions.append($themeBtn);
            // Tombol JSON
             var $jsonBtn = $('<button class="md-btn-icon" title="Ekspor/Impor JSON">' + svgCode + ' JSON</button>');
             var $jsonBtn = $('<button class="md-btn-icon" title="Ekspor/Impor JSON">' + svgCode + ' JSON</button>');
             $jsonBtn.on('click', function() { showJsonModal(rawContent); });
             $jsonBtn.on('click', function() { showJsonModal(rawContent); });
Baris 379: Baris 380:


             if (isSysop) {
             if (isSysop) {
                 var $lockBtn = $('<button class="md-btn-icon ' + (isLocked ? 'md-btn-lock' : '') + '">' + (isLocked ? svgUnlock + ' Kunci Terbuka' : svgLock + ' Kunci') + ' <span class="md-spinner"></span></button>');
                 var $lockBtn = $('<button class="md-btn-icon ' + (isLocked ? 'md-btn-unlock' : 'md-btn-lock') + '">' + (isLocked ? svgUnlock + ' Buka Kunci' : svgLock + ' Kunci') + '</button>');
                 $lockBtn.on('click', function() {
                 $lockBtn.on('click', function() {
                     isLocked = !isLocked;
                     isLocked = !isLocked;
Baris 396: Baris 397:
             $app.append($header);
             $app.append($header);


             // SEARCH BAR
             // Tampilkan kotak pencarian jika data banyak
             if (dataItems.length > 2) {
             if (dataItems.length > 2) {
                 var $searchBox = $('<div class="md-search-box"><span class="md-search-icon">' + svgSearch + '</span><input type="text" class="md-search-input" placeholder="Cari data terstruktur..."></div>');
                 var $searchBox = $('<div class="md-search-box"><span class="md-search-icon">' + svgSearch + '</span><input type="text" class="md-search-input" placeholder="Cari data terstruktur..."></div>');
                var searchTimeout;
                 $searchBox.find('input').on('keyup input', function() {
                 $searchBox.find('input').on('input', function() {
                     var q = $(this).val().toLowerCase();
                     var q = $(this).val().toLowerCase();
                     clearTimeout(searchTimeout);
                     $app.find('.md-row-display').each(function() {
                    searchTimeout = setTimeout(function() {
                        var text = $(this).text().toLowerCase();
                        $app.find('.md-row-display').each(function() {
                        $(this).toggle(text.indexOf(q) !== -1);
                            var text = $(this).text().toLowerCase();
                     });
                            $(this).toggle(text.indexOf(q) !== -1);
                        });
                     }, 200); // Debounce
                 });
                 });
                 $app.append($searchBox);
                 $app.append($searchBox);
             }
             }


             // DAFTAR BARIS DATA
             // MENGUMPULKAN MEDIA SOSIAL GLOBAL (Memisahkan media sosial ke atas)
            var globalSocials = {};
            dataItems.forEach(function(item) {
                if (item.isPersonOrg && item.socials) {
                    Object.assign(globalSocials, item.socials);
                }
            });
 
            if (Object.keys(globalSocials).length > 0) {
                var $topSocials = $('<div class="md-global-social-box"></div>');
                $topSocials.append('<div class="md-social-box-title">Media Sosial & Platform Resmi</div>');
                var $socialGroupGlobal = $('<div class="md-social-group"></div>');
               
                Object.keys(SOCIAL_PLATFORMS).forEach(function(key) {
                    var uname = globalSocials[key];
                    if (uname) {
                        var platform = SOCIAL_PLATFORMS[key];
                        var fullUrl = platform.base + uname.replace(/^@/, '');
                        var $badge = $('<a class="md-social-badge" href="' + sanitizeHTML(fullUrl) + '" target="_blank" rel="noopener noreferrer" style="background:' + platform.color + ';">' + platform.icon + ' ' + sanitizeHTML(platform.name) + '</a>');
                        $socialGroupGlobal.append($badge);
                    }
                });
                $topSocials.append($socialGroupGlobal);
                $app.append($topSocials);
            }
 
             var $list = $('<div class="md-list"></div>');
             var $list = $('<div class="md-list"></div>');
             if (dataItems.length === 0) {
             if (dataItems.length === 0) {
                 $list.append('<div style="color:var(--md-text-muted); text-align:center; padding: 25px 10px; background:var(--md-bg-hover); border-radius:10px; border:1px dashed var(--md-border); font-size:0.88rem;">Belum ada data terstruktur. Klik <b>Tambah</b> untuk membuat baru.</div>');
                 $list.append('<div style="color:#64748b; text-align:center; padding: 25px 10px; background:#f8fafc; border-radius:10px; border:1px dashed #cbd5e1; font-size:0.88rem;">Belum ada data terstruktur. Klik <b>Tambah</b> untuk membuat baru.</div>');
             } else {
             } else {
                 dataItems.forEach(function(item, index) {
                 dataItems.forEach(function(item, index) {
                     var $row = $('<div class="md-row-display"></div>');
                     var $row = $('<div class="md-row-display"></div>');
                     var $info = $('<div class="md-data-group"></div>');
                     var $info = $('<div class="md-data-group"></div>');
                     $info.append('<span class="md-data-label">' + item.prop + '</span>');
                     $info.append('<span class="md-data-label">' + sanitizeHTML(item.prop) + '</span>');
                      
                      
                    // RENDER NILAI DATA
                     var displayValHtml = '';
                     var displayValHtml = '';
                     var rawVal = item.val || '';
                     var rawVal = item.val || '';


                     if (rawVal.match(/^https?:\/\//i)) {
                     if (rawVal.match(/^https?:\/\//i)) {
                        var domain = extractDomain(rawVal);
                         displayValHtml = '<a href="' + sanitizeHTML(rawVal) + '" target="_blank" rel="noopener noreferrer" style="color:#2563eb; font-weight:700; text-decoration:none;">' + extractDomain(rawVal) + '</a>';
                         displayValHtml = '<a href="' + rawVal + '" target="_blank" style="color:var(--md-primary); font-weight:700; text-decoration:none;">' + domain + '</a>';
                     } else if (item.linkTarget && item.linkTarget.trim() !== '') {
                     } else if (item.linkTarget && item.linkTarget.trim() !== '') {
                         displayValHtml = '<a href="' + mw.util.getUrl(item.linkTarget.trim()) + '" style="color:var(--md-primary); font-weight:700; text-decoration:none;">' + rawVal + '</a>';
                         displayValHtml = '<a href="' + mw.util.getUrl(item.linkTarget.trim()) + '" style="color:#2563eb; font-weight:700; text-decoration:none;">' + sanitizeHTML(rawVal) + '</a>';
                     } else if (item.linkSplit) {
                     } else if (item.linkSplit) {
                         var parts = rawVal.split(/([,/\s]+dan\s+|[,/\s]+atau\s+|[,/]+)/gi);
                         var parts = rawVal.split(/([,/\s]+dan\s+|[,/\s]+atau\s+|[,/]+)/gi);
Baris 437: Baris 457:
                             var trimmed = p.trim();
                             var trimmed = p.trim();
                             if (trimmed && !p.match(/^[,/\s]+$/) && trimmed.toLowerCase() !== 'dan' && trimmed.toLowerCase() !== 'atau') {
                             if (trimmed && !p.match(/^[,/\s]+$/) && trimmed.toLowerCase() !== 'dan' && trimmed.toLowerCase() !== 'atau') {
                                 return '<a href="' + mw.util.getUrl(trimmed) + '" style="color:var(--md-primary); font-weight:700; text-decoration:none;">' + trimmed + '</a>';
                                 return '<a href="' + mw.util.getUrl(trimmed) + '" style="color:#2563eb; font-weight:700; text-decoration:none;">' + sanitizeHTML(trimmed) + '</a>';
                             }
                             }
                             return p;
                             return sanitizeHTML(p);
                         }).join('');
                         }).join('');
                     } else if (item.link) {
                     } else if (item.link) {
                         displayValHtml = '<a href="' + mw.util.getUrl(rawVal) + '" style="color:var(--md-primary); font-weight:700; text-decoration:none;">' + rawVal + '</a>';
                         displayValHtml = '<a href="' + mw.util.getUrl(rawVal) + '" style="color:#2563eb; font-weight:700; text-decoration:none;">' + sanitizeHTML(rawVal) + '</a>';
                     } else {
                     } else {
                         displayValHtml = rawVal;
                         displayValHtml = sanitizeHTML(rawVal);
                     }
                     }


Baris 453: Baris 473:
                     $copyBtn.on('click', function() {
                     $copyBtn.on('click', function() {
                         navigator.clipboard.writeText(rawVal);
                         navigator.clipboard.writeText(rawVal);
                         showToast("Disalin: " + rawVal, "success");
                         $(this).css('color', '#16a34a');
                        setTimeout(function(){ $copyBtn.css('color', '#94a3b8'); }, 1200);
                     });
                     });
                     $valWrap.append($copyBtn);
                     $valWrap.append($copyBtn);
                     $info.append($valWrap);
                     $info.append($valWrap);
                    // RENDER MEDIA SOSIAL & MUSIK
                    if (item.isPersonOrg && item.socials) {
                        var $socialGroup = $('<div class="md-social-group"></div>');
                        var hasSocial = false;
                        Object.keys(SOCIAL_PLATFORMS).forEach(function(key) {
                            var uname = item.socials[key];
                            if (uname) {
                                hasSocial = true;
                                var platform = SOCIAL_PLATFORMS[key];
                                var fullUrl = platform.base + uname.replace(/^@/, '');
                                var $badge = $('<a class="md-social-badge" href="' + fullUrl + '" target="_blank" style="background:' + platform.color + ';">' + platform.icon + ' ' + platform.name + '</a>');
                                $socialGroup.append($badge);
                            }
                        });
                        if (hasSocial) $info.append($socialGroup);
                    }
                      
                      
                    // RENDER REFERENSI EKSPLISIT COLLAPSIBLE (V8.0)
                     if (item.ref && (item.ref.url || item.ref.title)) {
                     if (item.ref && (item.ref.url || item.ref.title)) {
                         var ref = item.ref;
                         var ref = item.ref;
                         var $refContainer = $('<div class="md-ref-wrapper"></div>');
                         var isVer = isVerifiedSite(ref.url);
                       
                         var verBadgeHtml = isVer ? '<span class="md-verified-badge" title="Situs Populer Terverifikasi">' + svgVerified + '</span>' : '';
                        var typeLabel = ref.type ? ref.type : "Sumber Rujukan";
                        var $refToggle = $('<button class="md-ref-toggle" title="Klik untuk lihat detail referensi">' + svgRef + ' Lihat Referensi (' + typeLabel + ')</button>');
                        var $refCard = $('<div class="md-ref-card"></div>');
 
                        var refTitle = ref.title || "Referensi Terpaut";
                        var headerContent = refTitle;
                        if (ref.site && isVerifiedSite(ref.site)) { headerContent += " " + svgVerified; }
                       
                        $refCard.append('<div class="md-ref-header">' + headerContent + '</div>');
 
                         var $detailsGrid = $('<div class="md-ref-details-grid"></div>');
                        if (ref.author) { $detailsGrid.append('<div class="md-ref-detail-row"><span class="md-ref-lbl">Penulis:</span><span class="md-ref-val">' + ref.author + '</span></div>'); }
                        if (ref.site) { $detailsGrid.append('<div class="md-ref-detail-row"><span class="md-ref-lbl">Situs:</span><span class="md-ref-val">' + ref.site + '</span></div>'); }
                        if (ref.publisher) { $detailsGrid.append('<div class="md-ref-detail-row"><span class="md-ref-lbl">Penerbit:</span><span class="md-ref-val">' + ref.publisher + '</span></div>'); }
                        if (ref.date) { $detailsGrid.append('<div class="md-ref-detail-row"><span class="md-ref-lbl">Diakses pada:</span><span class="md-ref-val">' + formatIndonesianDate(ref.date) + '</span></div>'); }
                        $refCard.append($detailsGrid);
 
                        var $refActions = $('<div class="md-ref-actions"></div>');
                        if (ref.subType) { $refActions.append('<span class="md-ref-badge">' + ref.subType + '</span>'); }
                          
                          
                         if (ref.url) {
                         var safeUrl = ref.url ? ensureHttps(ref.url) : '';
                            var safeUrl = ensureHttps(ref.url);
                        var refTitle = ref.title || "Sumber Rujukan";
                            $refActions.append('<a href="' + safeUrl + '" target="_blank" class="md-ref-visit-btn">' + svgLinkExt + ' Kunjungi Situs</a>');
                        }
                          
                          
                         $refCard.append($refActions);
                         var $refContainer = $('<div class="md-ref-container"></div>');
                        var $refDetails = $(`
                            <details class="md-ref-details">
                                <summary>
                                    <div style="color:#4f46e5; display:inline-flex; align-items:center; gap:5px; white-space:nowrap; flex-shrink:0;">${svgRef} REFERENSI:</div>
                                    <div style="color:#374151; display:flex; align-items:center; flex-wrap:wrap; flex:1;">
                                        <span style="word-break:break-word; line-height:1.3;">${sanitizeHTML(refTitle)}</span>${verBadgeHtml}
                                    </div>
                                </summary>
                                <div class="md-ref-body">
                                    ${ref.author ? '<div><span style="color:#64748b; font-weight:700;">Penulis:</span> ' + sanitizeHTML(ref.author) + '</div>' : ''}
                                    ${ref.site ? '<div><span style="color:#64748b; font-weight:700;">Situs:</span> ' + sanitizeHTML(ref.site) + '</div>' : ''}
                                    ${ref.publisher ? '<div><span style="color:#64748b; font-weight:700;">Penerbit:</span> ' + sanitizeHTML(ref.publisher) + '</div>' : ''}
                                    ${ref.date ? '<div><span style="color:#64748b; font-weight:700;">Tanggal Akses:</span> ' + formatIndonesianDate(ref.date) + '</div>' : ''}
                                    ${ref.type ? '<div style="margin-top:4px;"><span style="background:#e2e8f0; padding:2px 8px; border-radius:6px; font-weight:700; font-size:0.75rem;">' + sanitizeHTML(ref.type) + (ref.subType ? ' &bull; ' + sanitizeHTML(ref.subType) : '') + '</span></div>' : ''}
                                    ${safeUrl ? '<a href="' + sanitizeHTML(safeUrl) + '" target="_blank" rel="noopener noreferrer" class="md-btn-visit">Kunjungi Situs</a>' : ''}
                                </div>
                            </details>
                        `);
                          
                          
                        // Toggle Logic
                         $refDetails.find('.md-verified-badge').on('click', function(e) {
                         $refToggle.on('click', function() {
                             e.preventDefault(); e.stopPropagation();
                             $refCard.slideToggle(200);
                             showModal('Situs Terverifikasi', 'Centang biru menandakan bahwa URL referensi ini valid dan berasal dari entitas, media publikasi besar, portal populer, atau pangkalan data resmi (seperti Kompas, YouTube, Apple Music, Spotify, dll) yang bereputasi kredibel.');
                            $(this).toggleClass('active');
                             if ($(this).hasClass('active')) {
                                $(this).html(svgRef + ' Tutup Referensi');
                            } else {
                                $(this).html(svgRef + ' Lihat Referensi (' + typeLabel + ')');
                            }
                         });
                         });


                         $refContainer.append($refToggle).append($refCard);
                         $refContainer.append($refDetails);
                         $info.append($refContainer);
                         $info.append($refContainer);
                     }
                     }
Baris 524: Baris 518:
                     $row.append($info);
                     $row.append($info);


                     if (!isLocked || isSysop) {
                     if (isLocked && !isSysop) {
                         var $toolsBox = $('<div class="md-row-tools"></div>');
                         var $lockNotifyBtn = $('<button class="md-btn-icon edit-btn" style="color:#dc2626; border-color:#fca5a5; background:#fef2f2;">' + svgLock + ' Terkunci</button>');
                       
                         $lockNotifyBtn.on('click', function() {
                        var $btnEdit = $('<button class="md-btn-icon edit-btn" style="padding:6px 10px;" title="Edit data">' + svgEdit + ' Edit</button>');
                             showModal('Halaman Dikunci', 'Halaman Data Terstruktur ini sedang dikunci sementara oleh pengurus untuk melindungi dari vandalisme atau perubahan yang tidak sah. Pengguna biasa atau anonim tidak dapat mengedit saat ini.');
                        $btnEdit.on('click', function() { showForm(index, rawContent); });
                        $toolsBox.append($btnEdit);
 
                        var $upDownGroup = $('<div class="md-row-tools-group"></div>');
                       
                        var $btnUp = $('<button class="md-btn-icon" style="padding:6px; margin-right:4px;" title="Pindah ke Atas" ' + (index === 0 ? 'disabled' : '') + '>' + svgUp + '</button>');
                         $btnUp.on('click', function() {
                             if (index > 0) {
                                var temp = dataItems[index]; dataItems[index] = dataItems[index - 1]; dataItems[index - 1] = temp;
                                saveData('Reorder data (Up)', $(this), rawContent);
                            }
                         });
                         });
 
                         $row.append($lockNotifyBtn);
                         var $btnDown = $('<button class="md-btn-icon" style="padding:6px;" title="Pindah ke Bawah" ' + (index === dataItems.length - 1 ? 'disabled' : '') + '>' + svgDown + '</button>');
                    } else {
                        $btnDown.on('click', function() {
                         var $editIcon = $('<button class="md-btn-icon edit-btn">' + svgEdit + ' Edit</button>');
                            if (index < dataItems.length - 1) {
                         $editIcon.on('click', function() { showForm(index, rawContent); });
                                var temp = dataItems[index]; dataItems[index] = dataItems[index + 1]; dataItems[index + 1] = temp;
                         $row.append($editIcon);
                                saveData('Reorder data (Down)', $(this), rawContent);
                            }
                        });
                       
                         var $btnDuplicate = $('<button class="md-btn-icon" style="padding:6px; margin-left:4px;" title="Duplikat baris ini">' + svgDuplicate + '</button>');
                         $btnDuplicate.on('click', function() {
                            var cloned = JSON.parse(JSON.stringify(dataItems[index]));
                            dataItems.splice(index + 1, 0, cloned);
                            saveData('Duplikat data', $(this), rawContent);
                        });
 
                        $upDownGroup.append($btnUp).append($btnDown).append($btnDuplicate);
                        $toolsBox.append($upDownGroup);
                       
                         $row.append($toolsBox);
                     }
                     }
                   
                     $list.append($row);
                     $list.append($row);
                 });
                 });
Baris 573: Baris 542:
         }
         }


         // 9. FORM EDIT DENGAN PRESET & PLATFORM LENGKAP
         // 9. FORM EDIT & DRAFT LOGIC
         function showForm(index, rawContent) {
         function showForm(index, rawContent) {
             var $container = $('#md-form-container');
             var $container = $('#md-form-container').empty();
            $container.empty();  
 
             var isNew = index === -1;
             var isNew = index === -1;
           
            var draftData = localStorage.getItem(DRAFT_KEY);
             var currentData = isNew ? { prop: '', val: '', link: false, linkTarget: '', linkSplit: false, ref: {}, isPersonOrg: false, socials: {} } : dataItems[index];
             var currentData = isNew ? { prop: '', val: '', link: false, linkTarget: '', linkSplit: false, ref: {}, isPersonOrg: false, socials: {} } : dataItems[index];
           
            if (isNew && draftData) {
                if(confirm("Anda memiliki draft yang belum tersimpan sebelumnya. Ingin melanjutkan draft tersebut?")) {
                    try { currentData = JSON.parse(draftData); } catch(e) {}
                }
            }
             var currentRef = currentData.ref || {};
             var currentRef = currentData.ref || {};
             var currentSocials = currentData.socials || {};
             var currentSocials = currentData.socials || {};
Baris 586: Baris 562:
             $form.append('<h4 class="md-form-title">' + (isNew ? 'Tambah Data Baru' : 'Edit Data Terstruktur') + '</h4>');
             $form.append('<h4 class="md-form-title">' + (isNew ? 'Tambah Data Baru' : 'Edit Data Terstruktur') + '</h4>');
              
              
            // Label Data + Preset Fast Selector
             var $propGroup = $('<div class="md-form-group"></div>');
             var $propGroup = $('<div class="md-form-group"><label>Label Data (Cth: Pekerjaan, Sutradara)</label><input type="text" id="md-inp-prop" class="md-input" value="' + (currentData.prop || '') + '"></div>');
            $propGroup.append('<label>Label Data <span class="md-help-icon" data-help="Nama bidang data (contoh: Pekerjaan, Sutradara, Tempat Lahir). Klik tombol preset di bawah untuk isi otomatis.">' + svgHelp + '</span></label>');
            $propGroup.append('<input type="text" id="md-inp-prop" class="md-input" value="' + sanitizeHTML(currentData.prop || '') + '">');
           
             var $presetWrap = $('<div class="md-preset-wrapper"></div>');
             var $presetWrap = $('<div class="md-preset-wrapper"></div>');
             PRESET_LABELS.forEach(function(lbl) {
             PRESET_LABELS.forEach(function(lbl) {
Baris 597: Baris 575:
             $form.append($propGroup);
             $form.append($propGroup);
              
              
            // Nilai Data & Wikilink Options
             var $valBox = $('<div class="md-form-group"></div>');
             var $valBox = $('<div class="md-form-group"></div>');
             $valBox.append('<label>Nilai Data</label><input type="text" id="md-inp-val" class="md-input" value="' + (currentData.val || '') + '">');
             $valBox.append('<label>Nilai Data <span class="md-help-icon" data-help="Ketik nilai. Jika halaman sudah ada di Wiki, saran akan muncul (pratinjau) dan otomatis mencentang opsi Wikilink.">' + svgHelp + '</span></label>');
              
              
             // Auto Capitalize for certain inputs
             // FITUR AUTOCOMPLETE PRATINJAU DIMULAI DI SINI
             $('#md-inp-prop').on('blur', function() {
             var $autoWrap = $('<div class="md-autocomplete-wrapper"></div>');
                var val = $(this).val();
            var $valInput = $('<input type="text" id="md-inp-val" class="md-input" autocomplete="off" value="' + sanitizeHTML(currentData.val || '') + '">');
                $(this).val(val.charAt(0).toUpperCase() + val.slice(1));
             var $autoList = $('<div class="md-autocomplete-list"></div>');
            });
            $autoWrap.append($valInput).append($autoList);
 
            $valBox.append($autoWrap);
             var $wikilinkOpts = $('<div style="margin-top:8px; display:flex; flex-direction:column; gap:8px; background:var(--md-bg-hover); padding:10px; border-radius:8px; border:1px solid var(--md-border);"></div>');
              
              
            var $wikilinkOpts = $('<div style="margin-top:8px; display:flex; flex-direction:column; gap:8px; background:#f8fafc; padding:10px; border-radius:8px; border:1px solid #e2e8f0;"></div>');
             var chkLink = currentData.link ? 'checked' : '';
             var chkLink = currentData.link ? 'checked' : '';
             var chkSplit = currentData.linkSplit ? 'checked' : '';
             var chkSplit = currentData.linkSplit ? 'checked' : '';
              
              
             $wikilinkOpts.append('<label style="display:flex; align-items:center; gap:8px; font-size:0.82rem; font-weight:700; cursor:pointer;"><input type="checkbox" id="md-inp-link" ' + chkLink + '> Jadikan Wikilink Standar</label>');
             var $linkCheck = $('<input type="checkbox" id="md-inp-link" ' + chkLink + '>');
             $wikilinkOpts.append('<label style="display:flex; align-items:center; gap:8px; font-size:0.82rem; font-weight:700; cursor:pointer;"><input type="checkbox" id="md-inp-split" ' + chkSplit + '> Smart Split Wikilink (Koma/Dan)</label>');
            var $lblLinkCheck = $('<label style="display:flex; align-items:center; gap:8px; font-size:0.82rem; font-weight:700; cursor:pointer;"></label>');
           
            $lblLinkCheck.append($linkCheck).append(' Jadikan Wikilink Standar');
             var $pipedGroup = $('<div style="margin-top:4px;"><label style="font-size:0.78rem; color:var(--md-text-muted);">Target Halaman Khusus (Opsional):</label><input type="text" id="md-inp-target" class="md-input" style="padding:6px 10px; font-size:0.85rem;" placeholder="Contoh: Diskografi Mippedia" value="' + (currentData.linkTarget || '') + '"></div>');
 
            // Logika pratinjau ketika diketik
            var isAutoChecked = false;
            $valInput.on('input', function() {
                var q = $(this).val();
               
                // Jika input dikosongkan/berubah, kembalikan centang link ke false jika tadinya otomatis centang
                if (isAutoChecked) {
                    $linkCheck.prop('checked', false);
                    isAutoChecked = false;
                }
 
                if(q.length < 1) {
                    $autoList.empty().hide();
                    return;
                }
 
                // Panggil API MediaWiki Prefix Search
                api.get({
                    action: 'query',
                    list: 'prefixsearch',
                    pssearch: q,
                    pslimit: 6,
                    format: 'json'
                }).done(function(data) {
                    $autoList.empty();
                    if(data.query && data.query.prefixsearch && data.query.prefixsearch.length > 0) {
                        data.query.prefixsearch.forEach(function(res) {
                            var $item = $('<div class="md-autocomplete-item">' + svgSearch + ' ' + sanitizeHTML(res.title) + '</div>');
                            $item.on('click', function() {
                                $valInput.val(res.title);
                                $autoList.empty().hide();
                                $linkCheck.prop('checked', true); // OTOMATIS TERCENTANG
                                isAutoChecked = true;
                            });
                            $autoList.append($item);
                        });
                        $autoList.show();
                    } else {
                        $autoList.hide();
                    }
                });
            });
 
            // Sembunyikan pratinjau saat klik di luar
            $(document).on('click.mdauto', function(e) {
                if(!$(e.target).closest('.md-autocomplete-wrapper').length) {
                    $autoList.hide();
                }
            });
 
            $wikilinkOpts.append($lblLinkCheck);
             $wikilinkOpts.append('<label style="display:flex; align-items:center; gap:8px; font-size:0.82rem; font-weight:700; cursor:pointer;"><input type="checkbox" id="md-inp-split" ' + chkSplit + '> Smart Split Wikilink</label>');
             var $pipedGroup = $('<div style="margin-top:4px;"><label style="font-size:0.78rem; color:#475569; margin-bottom:4px;">Target Halaman Khusus (Opsional):</label><input type="text" id="md-inp-target" class="md-input" style="padding:6px 10px; font-size:0.85rem;" placeholder="Contoh: Diskografi Rumi Haitami" value="' + sanitizeHTML(currentData.linkTarget || '') + '"></div>');
             $wikilinkOpts.append($pipedGroup);
             $wikilinkOpts.append($pipedGroup);
           
             $valBox.append($wikilinkOpts);
             $valBox.append($wikilinkOpts);
             $form.append($valBox);
             $form.append($valBox);


            // MEDIA SOSIAL & MUSIK LENGKAP
             var $socialSec = $('<div class="md-form-group" style="margin-top:16px;"></div>');
             var $socialSec = $('<div class="md-form-group" style="margin-top:16px;"></div>');
             var chkPerson = currentData.isPersonOrg ? 'checked' : '';
             var chkPerson = currentData.isPersonOrg ? 'checked' : '';
             $socialSec.append('<label style="display:flex; align-items:center; gap:8px; cursor:pointer; background:rgba(79, 70, 229, 0.1); padding:10px; border-radius:8px; font-weight:700; color:var(--md-primary); font-size:0.85rem;"><input type="checkbox" id="md-chk-person" ' + chkPerson + '> Aktifkan Kolom Media Sosial / Musik</label>');
             $socialSec.append('<label style="display:flex; align-items:center; gap:8px; cursor:pointer; background:#e0e7ff; padding:10px; border-radius:8px; font-weight:700; color:#3730a3; font-size:0.85rem;"><input type="checkbox" id="md-chk-person" ' + chkPerson + '> Simpan Profil Media Sosial (Akan muncul di paling atas) <span class="md-help-icon" data-help="Centang ini untuk mengisi data sosial media. Datanya akan dihimpun dan dimunculkan di kotak teratas data struktur.">' + svgHelp + '</span></label>');
              
              
             var $socialGrid = $('<div class="md-social-grid" id="md-social-box" style="display:' + (currentData.isPersonOrg ? 'grid' : 'none') + '; margin-top:8px;"></div>');
             var $socialGrid = $('<div class="md-social-grid" id="md-social-box" style="display:' + (currentData.isPersonOrg ? 'grid' : 'none') + '; margin-top:8px;"></div>');
Baris 630: Baris 658:
                 var p = SOCIAL_PLATFORMS[key];
                 var p = SOCIAL_PLATFORMS[key];
                 var valUname = currentSocials[key] || '';
                 var valUname = currentSocials[key] || '';
                 $socialGrid.append('<div><label style="font-size:0.78rem; color:var(--md-text); font-weight:700;">' + p.name + '</label><input type="text" id="md-soc-' + key + '" class="md-input" placeholder="Username / ID" value="' + valUname + '"></div>');
                 $socialGrid.append('<div><label style="font-size:0.78rem; color:#334155; font-weight:700; margin-bottom:4px;">' + p.name + '</label><input type="text" id="md-soc-' + key + '" class="md-input" placeholder="ID / Username" value="' + sanitizeHTML(valUname) + '"></div>');
             });
             });
             $socialSec.append($socialGrid);
             $socialSec.append($socialGrid);
             $form.append($socialSec);
             $form.append($socialSec);


            // GRID DETAIL RUJUKAN LENGKAP
             var $refArea = $('<div class="md-form-group" style="margin-top:20px;"></div>');
             var $refArea = $('<div class="md-form-group" style="margin-top:20px;"></div>');
             $refArea.append('<label style="font-size:0.95rem; font-weight:800; color:var(--md-text);">Sumber Referensi Cerdas</label>');
             $refArea.append('<label style="font-size:0.95rem; font-weight:800; color:#0f172a; margin-bottom:10px;">Sumber Referensi <span class="md-help-icon" data-help="Mohon berikan sumber referensi yang valid, kredibel, dan dapat dipertanggungjawabkan (seperti portal berita resmi, jurnal akademik ilmiah, buku cetak ber-ISBN, atau pangkalan data terverifikasi). Referensi yang kuat sangat membantu memastikan keakuratan informasi. Jika URL rujukan Anda mengarah ke situs web besar yang terverifikasi, sistem keamanan akan secara otomatis menampilkan lencana centang biru premium sebagai tanda sumber tepercaya.">' + svgHelp + '</span></label>');
           
             var $refGrid = $('<div class="md-ref-grid"></div>');
             var $refGrid = $('<div class="md-ref-grid"></div>');
              
              
             var $typeSel = $('<select id="md-ref-type" class="md-select"><option value="">-- Pilih Tipe --</option></select>');
             var $typeSel = $('<select id="md-ref-type" class="md-select"><option value="">-- Pilih Tipe Utama --</option></select>');
             Object.keys(REF_TYPES).forEach(function(t) {
             Object.keys(REF_TYPES).forEach(function(t) {
                 var sel = currentRef.type === t ? 'selected' : '';
                 var sel = currentRef.type === t ? 'selected' : '';
Baris 647: Baris 673:
             });
             });


             var $subTypeSel = $('<select id="md-ref-subtype" class="md-select"><option value="">-- Sub-Tipe --</option></select>');
             var $subTypeSel = $('<select id="md-ref-subtype" class="md-select"><option value="">-- Pilih Sub-Tipe --</option></select>');
           
             function updateSubTypes(mainType, selectedSub) {
             function updateSubTypes(mainType, selectedSub) {
                 $subTypeSel.empty().append('<option value="">-- Sub-Tipe --</option>');
                 $subTypeSel.empty().append('<option value="">-- Pilih Sub-Tipe --</option>');
                 if (mainType && REF_TYPES[mainType]) {
                 if (mainType && REF_TYPES[mainType]) {
                     REF_TYPES[mainType].forEach(function(st) {
                     REF_TYPES[mainType].forEach(function(st) {
Baris 658: Baris 683:
                 }
                 }
             }
             }
             $typeSel.on('change', function() { updateSubTypes($(this).val(), ''); });
             $typeSel.on('change', function() { updateSubTypes($(this).val(), ''); });
             updateSubTypes(currentRef.type, currentRef.subType);
             updateSubTypes(currentRef.type, currentRef.subType);


             $refGrid.append('<div><label style="font-size:0.78rem;">Tipe Utama</label></div>').find('div').last().append($typeSel);
             $refGrid.append('<div><label style="font-size:0.78rem; margin-bottom:4px;">Tipe Utama</label></div>').find('div').last().append($typeSel);
             $refGrid.append('<div><label style="font-size:0.78rem;">Kategori Spesifik</label></div>').find('div').last().append($subTypeSel);
             $refGrid.append('<div><label style="font-size:0.78rem; margin-bottom:4px;">Sub-Tipe</label></div>').find('div').last().append($subTypeSel);


             var $urlInput = $('<input type="text" id="md-ref-url" class="md-input" placeholder="https://..." value="' + (currentRef.url || '') + '">');
             var $urlInput = $('<input type="text" id="md-ref-url" class="md-input" placeholder="https://...." value="' + sanitizeHTML(currentRef.url || '') + '">');
             $urlInput.on('blur', function() {
             $urlInput.on('blur', function() {
                 var u = $(this).val().trim();
                 var u = ensureHttps($(this).val());
                 if(u) {
                 $(this).val(u);
                    var safe = ensureHttps(u);
                var $siteInp = $('#md-ref-site');
                    $(this).val(safe);
                if (u && !$siteInp.val().trim()) $siteInp.val(extractDomain(u));
                    var $siteInp = $('#md-ref-site');
                    if (!$siteInp.val().trim()) { $siteInp.val(extractDomain(safe)); }
                   
                    // Validasi regex dasar
                    if(!/^https?:\/\/[^\s$.?#].[^\s]*$/.test(safe)) { $(this).addClass('error'); showToast('URL sepertinya tidak valid', 'error'); }
                    else { $(this).removeClass('error'); }
                } else { $(this).removeClass('error'); }
             });
             });


             $refGrid.append('<div class="md-grid-full"><label style="font-size:0.78rem;">URL Rujukan Penuh</label></div>').find('div').last().append($urlInput);
             $refGrid.append('<div class="md-grid-full"><label style="font-size:0.78rem; margin-bottom:4px;">URL Rujukan</label></div>').find('div').last().append($urlInput);
             $refGrid.append('<div><label style="font-size:0.78rem;">Judul Konten/Artikel</label><input type="text" id="md-ref-title" class="md-input" placeholder="Judul..." value="' + (currentRef.title || '') + '"></div>');
             $refGrid.append('<div><label style="font-size:0.78rem; margin-bottom:4px;">Judul Halaman</label><input type="text" id="md-ref-title" class="md-input" placeholder="Judul Rujukan" value="' + sanitizeHTML(currentRef.title || '') + '"></div>');
             $refGrid.append('<div><label style="font-size:0.78rem;">Nama Situs</label><input type="text" id="md-ref-site" class="md-input" placeholder="Cth: Kompas.com" value="' + (currentRef.site || '') + '"></div>');
             $refGrid.append('<div><label style="font-size:0.78rem; margin-bottom:4px;">Nama Situs</label><input type="text" id="md-ref-site" class="md-input" placeholder="Situs" value="' + sanitizeHTML(currentRef.site || '') + '"></div>');
             $refGrid.append('<div><label style="font-size:0.78rem;">Penulis/Kreator</label><input type="text" id="md-ref-author" class="md-input" placeholder="Nama..." value="' + (currentRef.author || '') + '"></div>');
             $refGrid.append('<div><label style="font-size:0.78rem; margin-bottom:4px;">Penulis</label><input type="text" id="md-ref-author" class="md-input" placeholder="Penulis" value="' + sanitizeHTML(currentRef.author || '') + '"></div>');
             $refGrid.append('<div><label style="font-size:0.78rem;">Penerbit / Agensi</label><input type="text" id="md-ref-publisher" class="md-input" placeholder="Cth: Gramedia" value="' + (currentRef.publisher || '') + '"></div>');
             $refGrid.append('<div><label style="font-size:0.78rem; margin-bottom:4px;">Penerbit</label><input type="text" id="md-ref-publisher" class="md-input" placeholder="Penerbit" value="' + sanitizeHTML(currentRef.publisher || '') + '"></div>');
              
              
            // Tanggal Akses + Hari Ini
             var $dateBox = $('<div><label style="font-size:0.78rem; margin-bottom:4px;">Tanggal Akses</label></div>');
             var $dateBox = $('<div><label style="font-size:0.78rem;">Tanggal Akses</label></div>');
             var $dateInpWrap = $('<div style="display:flex; gap:6px;"></div>');
             var $dateInpWrap = $('<div style="display:flex; gap:6px;"></div>');
             var $dateInp = $('<input type="date" id="md-ref-date" class="md-input" value="' + (currentRef.date || '') + '">');
             var $dateInp = $('<input type="date" id="md-ref-date" class="md-input" value="' + sanitizeHTML(currentRef.date || '') + '">');
             var $todayBtn = $('<button type="button" class="md-btn-icon" style="padding:4px 8px; font-size:0.75rem;" title="Set Hari Ini">Set Hari Ini</button>');
             var $todayBtn = $('<button type="button" class="md-btn-icon" style="padding:4px 8px; font-size:0.75rem;" title="Set Hari Ini">Hari Ini</button>');
             $todayBtn.on('click', function() { $dateInp.val(getTodayString()); });
             $todayBtn.on('click', function() { $dateInp.val(getTodayString()); });
             $dateInpWrap.append($dateInp).append($todayBtn);
             $dateInpWrap.append($dateInp).append($todayBtn);
Baris 699: Baris 715:
             $form.append($refArea);
             $form.append($refArea);


             // TOMBOL AKSI FORM
             $form.append(`
                <div class="md-cc0-notice">
                    <b>Perhatian Lisensi:</b> Setiap data yang diterbitkan di sini akan terlihat publik dan dirilis di bawah lisensi <b>Creative Commons Zero (CC0)</b>. Jika Anda tidak ingin suntingan Anda digunakan secara bebas dan publik tanpa batas, jangan klik Terbitkan. <span class="md-help-icon" data-help="Dengan menerbitkan, Anda melepaskan seluruh hak cipta atas input data ini ke domain publik murni sesuai prinsip Wikidata.">${svgHelp}</span>
                </div>
                <div class="md-edit-meta">
                    <label style="font-size:0.85rem; font-weight:700;">Ringkasan Suntingan <span class="md-help-icon" data-help="Jelaskan secara singkat apa yang Anda ubah atau tambahkan. Contoh: Menambah data tanggal lahir rumi.">${svgHelp}</span></label>
                    <input type="text" id="md-edit-summary" class="md-input" placeholder="Jelaskan perubahan Anda secara singkat...">
                    <label style="font-size:0.85rem; cursor:pointer; font-weight:700; margin-top:5px; display:inline-flex; align-items:center; gap:6px;"><input type="checkbox" id="md-minor-edit"> Ini adalah suntingan kecil (minor)</label>
                </div>
            `);
 
             var $actions = $('<div class="md-form-actions"></div>');
             var $actions = $('<div class="md-form-actions"></div>');
             var $btnSave = $('<button class="md-btn md-btn-save">Simpan Data<span class="md-spinner"></span></button>');
             var $btnSave = $('<button class="md-btn md-btn-save">Terbitkan <span class="md-spinner"></span></button>');
            var $btnDraft = $('<button class="md-btn md-btn-draft">Simpan Draft</button>');
             var $btnCancel = $('<button class="md-btn md-btn-cancel">Batal</button>');
             var $btnCancel = $('<button class="md-btn md-btn-cancel">Batal</button>');
              
              
             $actions.append($btnSave).append($btnCancel);
             $actions.append($btnSave).append($btnDraft).append($btnCancel);
              
              
            if (draftData && isNew) {
                var $btnDelDraft = $('<button class="md-btn" style="background:#eab308; color:#fff;">Hapus Draft</button>');
                $btnDelDraft.on('click', function() {
                    localStorage.removeItem(DRAFT_KEY);
                    alert("Draft berhasil dihapus!");
                    $(this).hide();
                });
                $actions.append($btnDelDraft);
            }
             if (!isNew) {
             if (!isNew) {
                 var $btnDelete = $('<button class="md-btn md-btn-delete">Hapus Baris Ini<span class="md-spinner"></span></button>');
                 var $btnDelete = $('<button class="md-btn md-btn-delete">Hapus Data <span class="md-spinner"></span></button>');
                 $btnDelete.on('click', function() {
                 $btnDelete.on('click', function() {
                     if(confirm('Hapus permanen data ini?')) {
                     if(confirm('Yakin ingin menghapus item data ini?')) {
                         dataItems.splice(index, 1);
                         dataItems.splice(index, 1);
                         saveData('Menghapus data', $(this), rawContent);
                         saveData('Menghapus data', $(this), rawContent, $('#md-edit-summary').val(), $('#md-minor-edit').is(':checked'));
                     }
                     }
                 });
                 });
Baris 719: Baris 756:
             $form.append($actions);
             $form.append($actions);
             $container.append($form);
             $container.append($form);
            initTooltips();


             $('#md-chk-person').on('change', function() {
             $('#md-chk-person').on('change', function() {
                 if($(this).is(':checked')) $('#md-social-box').slideDown(200).css('display', 'grid');
                 if($(this).is(':checked')) $('#md-social-box').css('display', 'grid');
                 else $('#md-social-box').slideUp(200);
                 else $('#md-social-box').hide();
             });
             });


             $('html, body').animate({ scrollTop: $form.offset().top - 80 }, 300);
             $('html, body').animate({ scrollTop: $form.offset().top - 60 }, 250);
             $btnCancel.on('click', function() { $container.empty(); });
             $btnCancel.on('click', function() { $container.empty(); });
            $btnDraft.on('click', function() {
                var socObj = {};
                if ($('#md-chk-person').is(':checked')) {
                    Object.keys(SOCIAL_PLATFORMS).forEach(function(k) {
                        var valU = $('#md-soc-' + k).val().trim();
                        if (valU) socObj[k] = valU;
                    });
                }
                var draftObj = {
                    prop: $('#md-inp-prop').val().trim(),
                    val: $('#md-inp-val').val().trim(),
                    link: $('#md-inp-link').is(':checked'),
                    linkSplit: $('#md-inp-split').is(':checked'),
                    linkTarget: $('#md-inp-target').val().trim(),
                    isPersonOrg: $('#md-chk-person').is(':checked'),
                    socials: socObj,
                    ref: {
                        type: $('#md-ref-type').val(), subType: $('#md-ref-subtype').val(),
                        url: ensureHttps($('#md-ref-url').val()), title: $('#md-ref-title').val().trim(),
                        site: $('#md-ref-site').val().trim(), author: $('#md-ref-author').val().trim(),
                        publisher: $('#md-ref-publisher').val().trim(), date: $('#md-ref-date').val()
                    }
                };
                localStorage.setItem(DRAFT_KEY, JSON.stringify(draftObj));
                alert("Draft berhasil disimpan di memori peramban Anda!");
            });


             $btnSave.on('click', function() {
             $btnSave.on('click', function() {
Baris 733: Baris 798:


                 if (!newProp || !newVal) {
                 if (!newProp || !newVal) {
                     showToast("Harap isi Label dan Nilai!", "error"); return;
                     alert("Label Data dan Nilai wajib diisi!"); return;
                }
 
                // Cek Duplikat Label (Hanya Peringatan, tidak di-block)
                if(isNew && dataItems.some(function(item) { return item.prop.toLowerCase() === newProp.toLowerCase(); })) {
                    if(!confirm('Label "' + newProp + '" sudah ada. Lanjutkan menyimpan?')) return;
                 }
                 }


Baris 765: Baris 825:


                 var newItem = {
                 var newItem = {
                     prop: newProp,
                     prop: newProp, val: newVal,
                    val: newVal,
                     link: $('#md-inp-link').is(':checked'),
                     link: $('#md-inp-link').is(':checked'),
                     linkSplit: $('#md-inp-split').is(':checked'),
                     linkSplit: $('#md-inp-split').is(':checked'),
Baris 778: Baris 837:
                 else dataItems[index] = newItem;  
                 else dataItems[index] = newItem;  


                 saveData(isNew ? 'Tambah data' : 'Edit data', $(this), rawContent);
                 saveData(isNew ? 'Tambah data' : 'Edit data', $(this), rawContent, $('#md-edit-summary').val().trim(), $('#md-minor-edit').is(':checked'));
             });
             });
         }
         }


         // 10. JSON EXPORT & IMPORT MODAL
         // 10. JSON EXPORT & IMPORT MODAL (ASLI UTUH)
         function showJsonModal(rawContent) {
         function showJsonModal(rawContent) {
             var $container = $('#md-form-container');
             var $container = $('#md-form-container').empty();
            $container.empty();


             var jsonStr = JSON.stringify(dataItems, null, 2);
             var jsonStr = JSON.stringify(dataItems, null, 2);
             var $box = $('<div class="md-form-box"></div>');
             var $box = $('<div class="md-form-box"></div>');
             $box.append('<h4 class="md-form-title">Ekspor / Impor JSON (Tingkat Lanjut)</h4>');
             $box.append('<h4 class="md-form-title">Ekspor / Impor JSON Data</h4>');
             $box.append('<p style="font-size:0.82rem; color:var(--md-text-muted); margin-bottom:10px;">Salin JSON di bawah untuk cadangan, atau timpa teks untuk melakukan Impor Massal.</p>');
             $box.append('<p style="font-size:0.82rem; color:#64748b; margin-bottom:10px;">Anda dapat menyalin struktur JSON di bawah untuk cadangan atau menempelkan JSON dari artikel lain.</p>');
              
              
             var $txt = $('<textarea class="md-textarea" rows="12" style="font-family:monospace; font-size:0.8rem;"></textarea>').val(jsonStr);
             var $txt = $('<textarea class="md-textarea" rows="10" style="font-family:monospace; font-size:0.8rem;"></textarea>').val(jsonStr);
             $box.append($txt);
             $box.append($txt);


             var $actions = $('<div class="md-form-actions"></div>');
             var $actions = $('<div class="md-form-actions"></div>');
             var $btnImport = $('<button class="md-btn md-btn-save">Simpan Perubahan JSON <span class="md-spinner"></span></button>');
             var $btnImport = $('<button class="md-btn md-btn-save">Impor JSON & Simpan <span class="md-spinner"></span></button>');
             var $btnCancel = $('<button class="md-btn md-btn-cancel">Tutup</button>');
             var $btnCancel = $('<button class="md-btn md-btn-cancel">Tutup</button>');


Baris 802: Baris 860:
             $box.append($actions);
             $box.append($actions);
             $container.append($box);
             $container.append($box);
            $('html, body').animate({ scrollTop: $box.offset().top - 80 }, 300);


             $btnCancel.on('click', function() { $container.empty(); });
             $btnCancel.on('click', function() { $container.empty(); });
Baris 811: Baris 867:
                     if (Array.isArray(parsed)) {
                     if (Array.isArray(parsed)) {
                         dataItems = parsed;
                         dataItems = parsed;
                         saveData('Impor data dari JSON', $(this), rawContent);
                         saveData('Impor data dari JSON', $(this), rawContent, 'Impor struktur data JSON', false);
                     } else {
                     } else {
                         showToast("JSON harus berupa Array List!", "error");
                         alert("Format JSON harus berupa Array items!");
                     }
                     }
                 } catch(e) {
                 } catch(e) {
                     showToast("Format JSON Salah! Error: " + e.message, "error");
                     alert("Format JSON tidak valid: " + e.message);
                 }
                 }
             });
             });
Baris 1.301: Baris 1.357:
             '<div style="font-size:11px; color:#718096; font-weight:800; text-transform:uppercase; letter-spacing:1px; margin-bottom:10px;">Lisensi, Atribusi & Penggunaan Data</div>' +
             '<div style="font-size:11px; color:#718096; font-weight:800; text-transform:uppercase; letter-spacing:1px; margin-bottom:10px;">Lisensi, Atribusi & Penggunaan Data</div>' +
             '<p style="margin:0 0 10px; font-size:13px; color:#4a5568; line-height:1.6;">' +
             '<p style="margin:0 0 10px; font-size:13px; color:#4a5568; line-height:1.6;">' +
             'Seluruh data terstruktur yang tersaji dalam repositori ini merupakan milik publik dan tersedia di bawah lisensi resmi ' +
             'Seluruh data terstruktur yang tersaji dalam repositori ini merupakan milik publik dan tersedia di bawah ' +
             '<a href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank" style="color:#6a5acd; text-decoration:none; font-weight:700;">Creative Commons Attribution-ShareAlike 4.0 International</a>.' +
             '<a href="https://creativecommons.org/publicdomain/zero/1.0/"target="_blank" style="color:#6a5acd; text-decoration:none; font-weight:700;">Lisensi Creative Commons CC0</a>.' +
             '</p>' +
             '</p>' +
             '<p style="margin:0; font-size:12px; color:#a0aec0;">Akses API dan penggunaan data secara massal wajib mencantumkan atribusi kepada <strong>Mippedia Community</strong> selaku pengelola proyek.</p></div>';
             '<p style="margin:0; font-size:12px; color:#a0aec0;">Akses API dan penggunaan data secara massal wajib mencantumkan atribusi kepada <strong>Mippedia Community</strong> selaku pengelola proyek.</p></div>';