Sistema de notificações para UserScripts.
Этот скрипт недоступен для установки пользователем. Он является библиотекой, которая подключается к другим скриптам мета-ключом // @require https://update.greasyfork.org/scripts/549920/1775992/Script%20Notifier.js
// ==UserScript==
// @name Script Notifier
// @namespace http://github.com/0H4S
// @version 2.6
// @author OHAS
// @description Sistema de notificação para UserScripts.
// @license CC-BY-NC-ND-4.0
// @copyright 2025-2026 OHAS. All Rights Reserved. (https://gist.github.com/0H4S/ae2fa82957a089576367e364cbf02438)
// ==/UserScript==
/**
* Copyright Notice & Terms of Use
* Copyright © 2025-2026 OHAS. All rights reserved.
*
* This software is the exclusive property of OHAS and is licensed for personal, non-commercial use only.
*
* You may:
* - Install, use, and inspect the code for learning or personal purposes.
*
* You may not, without prior written authorization from OHAS:
* - Copy, redistribute, or republish this software.
* - Modify, sell, or use this software for commercial purposes.
* - Create derivative works that distribute this code.
*
* By downloading, installing, executing, or in any way using this software, in whole or in part, you acknowledge that you have read, understood, and fully accepted the terms set forth herein. If you do not agree with any of the conditions described, do not use this software.
* Any use, action, or purpose not expressly stated in this document shall be considered unauthorized. The absence of explicit mention does not imply the granting of permission.
*
* For questions, permission requests, or alternative licensing, please contact via
* - GitHub: https://github.com/0H4S
* - Ko-fi: https://ko-fi.com/ohas
* - Greasy Fork: https://greasyfork.org/users/1464180
*
* This software is provided “as is”, without warranties of any kind. Under no circumstances shall the author be held liable for any damages resulting from its use.
*/
class ScriptNotifier{constructor({notificationsUrl:t,scriptVersion:i,currentLang:e,runtimePolicy:o}){this.NOTIFICATIONS_URL=t,this.SCRIPT_VERSION=i,this.forcedLang=e,this.currentLang="en",this.STAGGER_DELAY=70,this.DISMISSED_NOTIFICATIONS_KEY="DismissedNotifications",this.NOTIFICATIONS_ENABLED_KEY="NotificationsEnabled",this.LANG_STORAGE_KEY="UserScriptLang",this.USAGE_COUNT_KEY="ScriptUsageCount",this.USAGE_CAP=1e3,this.hostElement=null,this.shadowRoot=null,this.activeNotifications=[],this.currentUsageCount=0,this.uiStrings={},this.icons=this._getIcons(),this.mediaCache=new Map,this.scriptPolicy=o||this._createPolicy()}_fetchResourceAsBlobUrl(t){if(this.mediaCache.has(t))return this.mediaCache.get(t);const i=new Promise(((i,e)=>{GM_xmlhttpRequest({method:"GET",url:t,responseType:"blob",anonymous:!0,onload:o=>{if(o.status>=200&&o.status<300){const t=URL.createObjectURL(o.response);i(t)}else this.mediaCache.delete(t),e(new Error(`HTTP error ${o.status}`))},onerror:i=>{this.mediaCache.delete(t),e(i)}})}));return this.mediaCache.set(t,i),i}async _processMediaInContainer(t){const i=[...t.querySelectorAll('img[src^="http"]'),...t.querySelectorAll('video[src^="http"], source[src^="http"]')];await Promise.all(i.map((async t=>{const i=t.src||t.getAttribute("src");if(i)try{const e=await this._fetchResourceAsBlobUrl(i);if(t.src=e,"SOURCE"===t.tagName){const i=t.closest("video");i&&i.load()}}catch(t){}})))}async _incrementUsageCount(){let t=await GM_getValue(this.USAGE_COUNT_KEY,0);return t>=this.USAGE_CAP?this.USAGE_CAP:(t++,await GM_setValue(this.USAGE_COUNT_KEY,t),t)}async run(){await this._initializeLanguage(),this.currentUsageCount=await this._incrementUsageCount(),await this._registerUserCommands(),setTimeout((()=>this.checkForNotifications()),1500)}forceShowAllNotifications(){this.checkForNotifications(!0)}checkForNotifications(t=!1){this.NOTIFICATIONS_URL&&!this.NOTIFICATIONS_URL.includes("SEU_USUARIO")&&GM_xmlhttpRequest({method:"GET",url:`${this.NOTIFICATIONS_URL}?t=${(new Date).getTime()}`,onload:async i=>{if(i.status<200||i.status>=300)return;let e;if(this.NOTIFICATIONS_URL.includes("gist.github.com/")&&!this.NOTIFICATIONS_URL.includes("usercontent"))try{const t=new DOMParser,o=this.scriptPolicy?this.scriptPolicy.createHTML(i.responseText):i.responseText,a=t.parseFromString(o,"text/html").querySelectorAll("table.highlight .blob-code-inner");if(0===a.length)return;e=Array.from(a).map((t=>t.innerText)).join("\n")}catch(t){return}else e=i.responseText;try{const i=JSON.parse(e).notifications||[];t&&(this.activeNotifications.forEach((t=>t.element.remove())),this.activeNotifications=[]),await this._cleanupDismissedNotifications(i);const o=await GM_getValue(this.DISMISSED_NOTIFICATIONS_KEY,[]);i.filter((i=>{if(this.activeNotifications.some((t=>t.id===i.id)))return!1;if(!t&&o.includes(i.id))return!1;if(i.expires&&new Date(i.expires)<new Date)return!1;if("number"==typeof i.minUsageCount&&this.currentUsageCount<i.minUsageCount)return!1;if("number"==typeof i.maxUsageCount&&this.currentUsageCount>i.maxUsageCount)return!1;const e=i.targetVersion,a=this.SCRIPT_VERSION;if(e&&"all"!==e){let t=!1;if("string"==typeof e)if(e.includes(",")){e.split(",").map((t=>t.trim())).includes(a)&&(t=!0)}else if(e.startsWith("*")){const i=e.substring(1);this._compareVersions(a,i)<=0&&(t=!0)}else if(e.endsWith("*")){const i=e.slice(0,-1);this._compareVersions(a,i)>=0&&(t=!0)}else e===a&&(t=!0);if(!t)return!1}return!i.targetHostname||window.location.hostname===i.targetHostname})).forEach(((t,i)=>{setTimeout((()=>this.displayNotification(t)),200*i)}))}catch(t){}},onerror:()=>{}})}async displayNotification(t){this._ensureHostElement();const i=await GM_getValue(this.NOTIFICATIONS_ENABLED_KEY,!0);if("high"!==t.priority&&!i)return;const e=`notification-${t.id}`;if(this.shadowRoot.getElementById(e))return;const o=this._getTranslatedText(t.title),a=this._getTranslatedText(t.message);if(!o&&!a)return;const r=document.createElement("div");r.id=e,r.className="notification-container";const n=t.type||"info";r.dataset.type=n;const s=this._resolveThemeColor(t.customColor);s&&(r.style.borderLeftColor=s,r.style.setProperty("--type-color",s));let c=this.icons[n]||this.icons.info;t.customIconSvg&&(c=this._sanitizeAndStyleSvg(t.customIconSvg));const l=t.imageUrl?`<img src="${t.imageUrl}" class="notification-image" alt="Notification Image">`:`<div class="notification-icon">${c}</div>`;let d="";if(t.expanded&&t.expanded.content){const t='<svg viewBox="0 0 24 24" fill="currentColor" width="20" height="20"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>';d=`<button class="expand-button" title="${this._getUIText("expandButtonTitle")}">${t}</button>`}const h=`${l} <div class="notification-content"><h3 class="notification-title">${this._prepareMessageHTML(o)}</h3><div class="notification-message">${this._prepareMessageHTML(a)}</div></div><div class="notification-actions"> ${d} <button class="dismiss-button" title="${this._getUIText("closeButtonTitle")}"><svg viewBox="0 0 24 24" fill="currentColor" width="20" height="20"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></svg></button></div>\n `;if(this._setSafeInnerHTML(r,h),t.buttons&&t.buttons.length>0){const i=this._createButtons(t.buttons,t.id,t);r.querySelector(".notification-content").appendChild(i)}this.shadowRoot.appendChild(r),this._processMediaInContainer(r),this.activeNotifications.push({id:t.id,element:r,isNew:!0}),this._updateNotificationPositions(),r.querySelector(".dismiss-button").onclick=i=>{i.stopPropagation(),this._dismissNotification(t.id)};const m=r.querySelector(".expand-button");m&&(m.onclick=i=>{i.stopPropagation(),this._openExpandedView(t)})}_resolveThemeColor(t){if(!t)return null;if("string"==typeof t)return t;if("object"==typeof t){return window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?t.te||t.tc:t.tc||t.te}return null}_openExpandedView(t){if(this._ensureHostElement(),this.shadowRoot.getElementById("sn-expanded-modal"))return;const i=document.createElement("div");i.id="sn-expanded-modal",i.className="modal-overlay";const e=t.expanded||{},o=this._getTranslatedText(e.content)||"Conteúdo indisponível.",a=this._getTranslatedText(e.title)||this._getTranslatedText(t.title),r=e.headerImage||null,n=this._getTranslatedText(e.summary)||null,s=r?`<img src="${r}" class="modal-hero-img" alt="Header">`:"",c=n?`<div class="modal-summary">${this._prepareMessageHTML(n)}</div>`:"",l=`<div class="modal-card"><button class="modal-close-btn floating" title="Fechar"><svg viewBox="0 0 24 24" fill="currentColor" width="24" height="24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></svg></button> ${s} <div class="modal-inner-content"><div class="modal-header"><h1 class="modal-title">${this._prepareMessageHTML(a)}</h1> ${c} </div><div class="modal-body"> ${o} </div></div></div>`;this._setSafeInnerHTML(i,l),this.shadowRoot.appendChild(i),this._processMediaInContainer(i),requestAnimationFrame((()=>{i.classList.add("animate-in")}));i.querySelector(".modal-close-btn").onclick=()=>{i.classList.remove("animate-in"),i.classList.add("animate-out"),setTimeout((()=>i.remove()),300)},i.querySelector(".modal-card").onclick=t=>{"IMG"===t.target.tagName&&(t.stopPropagation(),this._openLightbox(t.target.src))}}_openLightbox(t){const i=document.createElement("div");i.className="lightbox-overlay";const e=document.createElement("img");e.src=t,e.className="lightbox-img",e.draggable=!1,i.appendChild(e),this.shadowRoot.appendChild(i);let o,a,r=1,n=!1,s=0,c=0;const l=()=>{e.style.transform=`translate3d(${s}px, ${c}px, 0) scale(${r})`},d=()=>{i.classList.remove("visible"),document.removeEventListener("keydown",h),setTimeout((()=>i.remove()),300)},h=t=>{"Escape"===t.key&&d()};document.addEventListener("keydown",h),i.onclick=t=>{t.target===i&&d()},i.onwheel=t=>{t.preventDefault();const i=t.deltaY>0?-.2:.2,e=Math.min(Math.max(1,r+i),5);e!==r&&(r=e,1===r&&(s=0,c=0),l())},e.onpointerdown=t=>{r>1&&(n=!0,e.classList.add("dragging"),o=t.clientX-s,a=t.clientY-c,e.setPointerCapture(t.pointerId))},e.onpointermove=t=>{n&&(s=t.clientX-o,c=t.clientY-a,requestAnimationFrame(l))},e.onpointerup=()=>{n=!1,e.classList.remove("dragging")},requestAnimationFrame((()=>i.classList.add("visible")))}_createButtons(t,i,e){const o=document.createElement("div");return o.className="notification-buttons",t.forEach(((t,a)=>{const r=document.createElement("button"),n=this._getTranslatedText(t.text);this._setSafeInnerHTML(r,this._prepareMessageHTML(n)),r.className="notification-button";const s=this._resolveThemeColor(t.backgroundColor);s?(r.style.backgroundColor=s,r.classList.add("custom-bg")):0===a&&r.classList.add("primary");const c=this._resolveThemeColor(t.textColor);c&&(r.style.color=c),r.onclick=o=>{if(o.stopPropagation(),t.action)switch(t.action){case"open_url":window.location.href=t.value;break;case"open_url_new_tab":window.open(t.value,"_blank");break;case"open_expanded_view":e&&e.expanded&&e.expanded.content&&this._openExpandedView(e)}this._dismissNotification(i)},o.appendChild(r)})),o}async _dismissNotification(t){this._ensureHostElement();const i=this.activeNotifications.find((i=>i.id===t));if(!i)return;const e=await GM_getValue(this.DISMISSED_NOTIFICATIONS_KEY,[]);e.includes(t)||(e.push(t),await GM_setValue(this.DISMISSED_NOTIFICATIONS_KEY,e)),i.element.classList.remove("animate-in"),i.element.classList.add("animate-out"),setTimeout((()=>{this.activeNotifications=this.activeNotifications.filter((i=>i.id!==t)),i.element.remove(),this._updateNotificationPositions()}),600)}_updateNotificationPositions(){this._ensureHostElement();const t=parseInt(getComputedStyle(this.shadowRoot.host).getPropertyValue("--sn-spacing"))||20;let i=t;this.activeNotifications.forEach(((e,o)=>{const{element:a}=e;a.style.top=`${i}px`,a.style.transitionDelay=o*this.STAGGER_DELAY+"ms",e.isNew&&(requestAnimationFrame((()=>{a.classList.add("animate-in")})),delete e.isNew),i+=a.offsetHeight+t/2}))}_compareVersions(t,i){const e=t.split(".").map((t=>parseInt(t,10)||0)),o=i.split(".").map((t=>parseInt(t,10)||0)),a=Math.max(e.length,o.length);for(let t=0;t<a;t++){const i=e[t]||0,a=o[t]||0;if(i>a)return 1;if(i<a)return-1}return 0}_ensureHostElement(){const t="script-notifier-host";if(this.hostElement=document.getElementById(t),this.hostElement||(this.hostElement=document.createElement("div"),this.hostElement.id=t,document.body.appendChild(this.hostElement)),this.hostElement.shadowRoot)this.shadowRoot=this.hostElement.shadowRoot;else{this.shadowRoot=this.hostElement.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent=this._getNotifierStyles(),this.shadowRoot.appendChild(t)}}async _initializeLanguage(){let t=this.forcedLang||await GM_getValue(this.LANG_STORAGE_KEY)||navigator.language||"en";t.startsWith("pt")?t="pt-BR":t.startsWith("zh")?t="zh-CN":t.startsWith("ckb")?t="ckb":t.startsWith("en")?t="en":t.startsWith("es")?t="es":t.startsWith("fr")?t="fr":t.startsWith("ru")?t="ru":t.startsWith("ja")?t="ja":t.startsWith("ko")?t="ko":t.startsWith("ar")?t="ar":t.startsWith("be")?t="be":t.startsWith("bg")?t="bg":t.startsWith("cs")?t="cs":t.startsWith("da")?t="da":t.startsWith("de")?t="de":t.startsWith("el")?t="el":t.startsWith("eo")?t="eo":t.startsWith("fi")?t="fi":t.startsWith("he")?t="he":t.startsWith("hr")?t="hr":t.startsWith("hu")?t="hu":t.startsWith("id")?t="id":t.startsWith("it")?t="it":t.startsWith("ka")?t="ka":t.startsWith("mr")?t="mr":t.startsWith("nl")?t="nl":t.startsWith("pl")?t="pl":t.startsWith("ro")?t="ro":t.startsWith("sk")?t="sk":t.startsWith("sr")?t="sr":t.startsWith("sv")?t="sv":t.startsWith("th")?t="th":t.startsWith("tr")?t="tr":t.startsWith("uk")?t="uk":t.startsWith("ug")?t="ug":t.startsWith("vi")?t="vi":(t.startsWith("nb")||t.startsWith("no"))&&(t="nb"),this.currentLang=["pt-BR","zh-CN","ckb","ar","be","bg","cs","da","de","el","en","eo","es","fi","fr","he","hr","hu","id","it","ja","ka","ko","mr","nb","nl","pl","ro","ru","sk","sr","sv","th","tr","uk","ug","vi"].includes(t)?t:"en",this.uiStrings=this._getUIStrings()}async _cleanupDismissedNotifications(t){const i=await GM_getValue(this.DISMISSED_NOTIFICATIONS_KEY,[]);if(0===i.length)return;const e=new Set(t.filter((t=>!t.expires||new Date(t.expires)>=new Date)).map((t=>t.id))),o=i.filter((t=>e.has(t)));o.length<i.length&&await GM_setValue(this.DISMISSED_NOTIFICATIONS_KEY,o)}async _registerUserCommands(){const t=await GM_getValue(this.NOTIFICATIONS_ENABLED_KEY,!0)?this._getUIText("disableNotificationsCmd"):this._getUIText("enableNotificationsCmd");GM_registerMenuCommand(this._getUIText("showAllNotificationsCmd"),(()=>this.forceShowAllNotifications())),GM_registerMenuCommand(t,(async()=>{const t=await GM_getValue(this.NOTIFICATIONS_ENABLED_KEY,!0);await GM_setValue(this.NOTIFICATIONS_ENABLED_KEY,!t),window.location.reload()}))}_createPolicy(){if(!window.trustedTypes||!window.trustedTypes.createPolicy)return null;try{return window.trustedTypes.createPolicy("script-notifier-fallback",{createHTML:t=>t})}catch(t){return null}}_getUIText(t){return this.uiStrings[t]?.[this.currentLang]||this.uiStrings[t]?.en||""}_setSafeInnerHTML(t,i){t&&(t.innerHTML=this.scriptPolicy?this.scriptPolicy.createHTML(i):i)}_getTranslatedText(t){return t?"string"==typeof t?t:t[this.currentLang]||t[this.currentLang.split("-")[0]]||t.en||"":""}_prepareMessageHTML(t){return t||""}_sanitizeAndStyleSvg(t){try{const i=document.createElement("div");this._setSafeInnerHTML(i,t);const e=i.querySelector("svg");return e?(e.setAttribute("fill","currentColor"),e.removeAttribute("width"),e.removeAttribute("height"),e.removeAttribute("style"),e.removeAttribute("class"),e.outerHTML):""}catch(t){return""}}_getUIStrings(){return{showAllNotificationsCmd:{"pt-BR":"🔔 Notificações","zh-CN":"🔔 通知",ckb:"🔔 ئاگادارکردنەوەکان",ar:"🔔 الإشعارات",be:"🔔 Апавяшчэнні",bg:"🔔 Известия",cs:"🔔 Upozornění",da:"🔔 Notifikationer",de:"🔔 Benachrichtigungen",el:"🔔 Ειδοποιήσεις",en:"🔔 Notifications",eo:"🔔 Sciigoj",es:"🔔 Notificaciones",fi:"🔔 Ilmoitukset",fr:"🔔 Notifications",he:"🔔 התראות",hr:"🔔 Obavijesti",hu:"🔔 Értesítések",id:"🔔 Notifikasi",it:"🔔 Notifiche",ja:"🔔 通知",ka:"🔔 შეტყობინებები",ko:"🔔 알림",mr:"🔔 सूचना",nb:"🔔 Varsler",nl:"🔔 Meldingen",pl:"🔔 Powiadomienia",ro:"🔔 Notificări",ru:"🔔 Уведомления",sk:"🔔 Upozornenia",sr:"🔔 Обавештења",sv:"🔔 Aviseringar",th:"🔔 การแจ้งเตือน",tr:"🔔 Bildirimler",uk:"🔔 Сповіщення",ug:"🔔 ئۇقتۇرۇشلار",vi:"🔔 Thông báo"},disableNotificationsCmd:{"pt-BR":"❌ Desativar Notificações","zh-CN":"❌ 禁用通知",ckb:"❌ ناچالاککردنی ئاگادارکردنەوەکان",ar:"❌ تعطيل الإشعارات",be:"❌ Адключыць аπαвяшчэнні",bg:"❌ Изключване на известия",cs:"❌ Vypnout upozornění",da:"❌ Deaktiver notifikationer",de:"❌ Benachrichtigungen deaktivieren",el:"❌ Απενεργοποίηση ειδοποιήσεων",en:"❌ Disable Notifications",eo:"❌ Malŝalti Sciigojn",es:"❌ Desactivar Notificaciones",fi:"❌ Poista ilmoitukset käytöstä",fr:"❌ Désactiver les notifications",he:"❌ השבת התראות",hr:"❌ Onemogući obavijesti",hu:"❌ Értesítések kikapcsolása",id:"❌ Nonaktifkan Notifikasi",it:"❌ Disattiva notifiche",ja:"❌ 通知を無効にする",ka:"❌ შეტყობინებების გამორთვა",ko:"❌ 알림 비활성화",mr:"❌ सूचना अक्षम करा",nb:"❌ Slå av varsler",nl:"❌ Meldingen uitschakelen",pl:"❌ Wyłącz powiadomienia",ro:"❌ Dezactivează notificările",ru:"❌ Отключить уведомления",sk:"❌ Vypnúť upozornenia",sr:"❌ Онемогући обавештења",sv:"❌ Inaktivera aviseringar",th:"❌ ปิดการแจ้งเตือน",tr:"❌ Bildirimleri Kapat",uk:"❌ Вимкнути сповіщення",ug:"❌ ئۇقتۇرۇشلارنى چەكلەش",vi:"❌ Tắt thông báo"},enableNotificationsCmd:{"pt-BR":"✅ Ativar Notificações","zh-CN":"✅ 启用通知",ckb:"✅ چالاککردنی ئاگادارکردنەوەکان",ar:"✅ تفعيل الإشعارات",be:"✅ Уключыць апавяшчэнні",bg:"✅ Включване на известия",cs:"✅ Zapnout upozornění",da:"✅ Aktiver notifikationer",de:"✅ Benachrichtigungen aktivieren",el:"✅ Ενεργοποίηση ειδοποιήσεων",en:"✅ Enable Notifications",eo:"✅ Ŝalti Sciigojn",es:"✅ Activar Notificaciones",fi:"✅ Ota ilmoitukset käyttöön",fr:"✅ Activer les notifications",he:"✅ הפעל התראות",hr:"✅ Omogući obavijesti",hu:"✅ Értesítések bekapcsolása",id:"✅ Aktifkan Notifikasi",it:"✅ Attiva notifiche",ja:"✅ 通知を有効にする",ka:"✅ შეტყობინებების ჩართვა",ko:"✅ 알림 활성화",mr:"✅ सूचना सक्षम करा",nb:"✅ Slå på varsler",nl:"✅ Meldingen inschakelen",pl:"✅ Włącz powiadomienia",ro:"✅ Activează notificările",ru:"✅ Включить уведомления",sk:"✅ Zapnúť upozornenia",sr:"✅ Омогући обавештења",sv:"✅ Aktivera aviseringar",th:"✅ เปิดการแจ้งเตือน",tr:"✅ Bildirimleri Aç",uk:"✅ Увімкнути сповіщення",ug:"✅ ئۇقتۇرۇشلارنى قوزغىتىش",vi:"✅ Bật thông báo"},expandButtonTitle:{"pt-BR":"Expandir","zh-CN":"展开",ckb:"بەرینکردنەوە",ar:"توسيع",be:"Разгарнуць",bg:"Разширяване",cs:"Rozbalit",da:"Udvid",de:"Erweitern",el:"Επέκταση",en:"Expand",eo:"Etendi",es:"Expandir",fi:"Laajenna",fr:"Développer",he:"הexpand",hr:"Proširi",hu:"Kibontás",id:"Perluas",it:"Espandi",ja:"展開",ka:"გაშლა",ko:"확장",mr:"विस्तार करा",nb:"Utvid",nl:"Uitvouwen",pl:"Rozwiń",ro:"Extinde",ru:"Развернуть",sk:"Rozbaliť",sr:"Proširi",sv:"Expandera",th:"ขยาย",tr:"Genişlet",uk:"Розгорнути",ug:"كېڭەيتىش",vi:"Mở rộng"},closeButtonTitle:{"pt-BR":"Fechar","zh-CN":"关闭",ckb:"داخستن",ar:"إغلاق",be:"Закрыць",bg:"Затвори",cs:"Zavřít",da:"Luk",de:"Schließen",el:"Κλείσιμο",en:"Close",eo:"Fermi",es:"Cerrar",fi:"Sulje",fr:"Fermer",he:"סגור",hr:"Zatvori",hu:"Bezárás",id:"Tutup",it:"Chiudi",ja:"閉じる",ka:"დახურვა",ko:"닫기",mr:"बंद करा",nb:"Lukk",nl:"Sluiten",pl:"Zamknij",ro:"Închide",ru:"Закрыть",sk:"Zavrieť",sr:"Затвори",sv:"Stäng",th:"ปิด",tr:"Kapat",uk:"Закрити",ug:"تاقاش",vi:"Đóng"}}}_getIcons(){return{success:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path></svg>',warning:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"></path></svg>',info:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"></path></svg>'}}_getNotifierStyles(){return':host{--sn-font-family:"Roboto Slab",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Microsoft YaHei","PingFang SC","Hiragino Sans GB","Heiti SC","Apple SD Gothic Neo","Noto Sans CJK SC",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--sn-font-family-code:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace,var(--sn-font-family);--sn-font-size-title:16px;--sn-font-size-body:14px;--sn-font-weight-title:600;--sn-color-background:#fff;--sn-color-text-primary:#000;--sn-color-text-secondary:#333;--sn-color-border:#ddd;--sn-color-link:currentColor;--sn-color-link-underline:currentColor;--sn-color-dismiss:#999;--sn-color-dismiss-hover:#ff4d4d;--sn-color-expand-hover:#007bff;--sn-shadow-default:0 8px 20px rgba(0,0,0,0.15);--sn-shadow-button-hover:0 4px 10px rgba(0,0,0,0.2);--sn-card-background:rgba(0,0,0,0.05);--sn-card-border:#ccc;--sn-color-background-overlay:hsla(0,0%,100%,0.75);--sn-scrollbar-track:#f1f1f1;--sn-scrollbar-thumb:#ccc;--sn-scrollbar-thumb-hover:#aaa;--sn-button-hover-bg:#555;--sn-button-hover-text:#fff;--sn-border-radius:12px;--sn-border-radius-small:6px;--sn-padding:16px;--sn-notification-width:380px;--sn-spacing:20px;--sn-icon-size:24px;--sn-image-size:48px;--sn-message-max-height:110px;--sn-animation-duration-fast:0.2s;--sn-animation-duration-medium:0.4s;--sn-animation-duration-slow:0.8s;--sn-code-bg:rgba(0,0,0,0.06);--sn-code-text:#c7254e;--sn-code-block-bg:#f8f9fa;--sn-code-block-border:#e9ecef;--sn-table-border:#dee2e6;--sn-table-stripe:rgba(0,0,0,0.02);--sn-table-header-bg:rgba(0,0,0,0.04)}@media (prefers-color-scheme:dark){:host{--sn-color-background:#292929;--sn-color-text-primary:#fff;--sn-color-text-secondary:#ddd;--sn-color-border:#444;--sn-color-dismiss:#aaa;--sn-color-expand-hover:#3b82f6;--sn-shadow-default:0 8px 20px rgba(0,0,0,0.5);--sn-shadow-button-hover:0 4px 12px rgba(0,0,0,0.4);--sn-card-background:rgba(0,0,0,0.1);--sn-card-border:#555;--sn-scrollbar-track:#444;--sn-scrollbar-thumb:#666;--sn-scrollbar-thumb-hover:#888;--sn-button-hover-bg:#777;--sn-code-bg:hsla(0,0%,100%,0.15);--sn-code-text:#ff7b72;--sn-code-block-bg:rgba(0,0,0,0.3);--sn-code-block-border:#444;--sn-table-border:#555;--sn-table-stripe:hsla(0,0%,100%,0.05);--sn-table-header-bg:hsla(0,0%,100%,0.1);--sn-color-background-overlay:rgba(0,0,0,0.75)}}.modal-card,.modal-card *,.notification-container,.notification-container *{font-family:var(--sn-font-family)!important;box-sizing:border-box}.modal-card code,.modal-card kbd,.modal-card pre,.modal-card samp,.notification-container code,.notification-container kbd,.notification-container pre,.notification-container samp{font-family:var(--sn-font-family-code)!important}.notification-container{position:fixed;top:0;right:var(--sn-spacing);z-index:2147483647;width:var(--sn-notification-width);font-family:var(--sn-font-family)!important;background-color:var(--sn-color-background);color:var(--sn-color-text-secondary);border-radius:var(--sn-border-radius);box-shadow:var(--sn-shadow-default);border:1px solid var(--sn-color-border);display:flex;padding:var(--sn-padding);box-sizing:border-box;border-left:5px solid transparent;opacity:0;transform:translateX(120%);will-change:transform,opacity,top;align-items:flex-start;padding-right:8px}.notification-container.animate-in{opacity:1;transform:translateX(0);transition:transform var(--sn-animation-duration-slow) cubic-bezier(.22,1.6,.5,1),opacity var(--sn-animation-duration-medium) ease-out,top var(--sn-animation-duration-slow) cubic-bezier(.22,1.6,.5,1)}.notification-container.animate-out{opacity:0;transform:translateX(120%);transition:transform var(--sn-animation-duration-medium) cubic-bezier(.6,-.28,.735,.045),opacity var(--sn-animation-duration-medium) ease-out,top var(--sn-animation-duration-medium) ease-out}.notification-container[data-type=success]{--type-color:#22c55e}.notification-container[data-type=warning]{--type-color:#f97316}.notification-container[data-type=info]{--type-color:#3b82f6}.notification-container[data-type]{border-left-color:var(--type-color)}.notification-icon{width:var(--sn-icon-size);height:var(--sn-icon-size);margin-right:12px;flex-shrink:0;color:var(--type-color)}.notification-image{width:var(--sn-image-size);height:var(--sn-image-size);border-radius:var(--sn-border-radius-small);object-fit:cover;flex-shrink:0;margin-right:15px}.notification-content{flex-grow:1;word-break:break-word}.notification-title{margin:0 0 8px;font-size:var(--sn-font-size-title);font-weight:var(--sn-font-weight-title);color:var(--sn-color-text-primary)}.notification-message{font-size:var(--sn-font-size-body);line-height:1.5;max-height:var(--sn-message-max-height);overflow-y:auto;padding-right:8px}.notification-message ol,.notification-message ul{padding-left:1.5rem!important;margin:0 0 16px 16px!important}.notification-message blockquote{margin:.5em 0;padding:.5em 1em;border-radius:0;background-color:var(--sn-card-background);border-left:4px solid var(--sn-card-border)}.notification-message a,.notification-title a{color:var(--sn-color-link);text-decoration:none}.notification-message a:hover,.notification-title a:hover{text-decoration:underline;text-decoration-color:var(--sn-color-link-underline)}.dismiss-button,.expand-button{background:none;border:none;color:var(--sn-color-dismiss);cursor:pointer;padding:4px;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:background-color .2s,color .2s,transform .2s;align-self:flex-start}.dismiss-button:hover,.expand-button:hover{background-color:rgba(0,0,0,.05);transform:scale(1.1)}.dismiss-button:hover{color:var(--sn-color-dismiss-hover);transform:rotate(90deg)}.expand-button:hover{color:var(--sn-color-expand-hover)}.expand-button:active{transform:scale(.95)}.notification-actions{display:flex;flex-direction:row;align-items:center;gap:4px;margin-left:8px;flex-shrink:0}.notification-buttons{margin-top:12px;display:flex;gap:8px;flex-wrap:wrap}.notification-button{background-color:var(--sn-color-border);color:var(--sn-color-text-secondary);border:none;border-radius:var(--sn-border-radius-small);padding:6px 12px;font-size:var(--sn-font-size-body);font-weight:500;cursor:pointer;transition:transform var(--sn-animation-duration-fast) ease-in-out,box-shadow var(--sn-animation-duration-fast) ease-in-out,background-color var(--sn-animation-duration-fast) ease-in-out,filter var(--sn-animation-duration-fast) ease-in-out,color var(--sn-animation-duration-fast) ease-in-out}.notification-button:hover{transform:translateY(-2px);box-shadow:var(--sn-shadow-button-hover);filter:brightness(1.15)}.notification-button:not(.custom-bg):hover{background-color:var(--sn-button-hover-bg);color:var(--sn-button-hover-text);filter:brightness(1)}.notification-button:active{transform:translateY(0);box-shadow:none;transition-duration:.1s}.notification-button.primary,.notification-button.primary:hover{background-color:var(--sn-color-link);color:#fff}.notification-button.primary:hover{filter:brightness(1.1)}.notification-button.custom-bg:hover{filter:brightness(1.15)}.modal-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:var(--sn-color-background-overlay);z-index:2147483648;display:flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;backdrop-filter:blur(4px);transition:opacity .3s ease,visibility .3s}.modal-overlay.animate-in{opacity:1;visibility:visible}.modal-overlay.animate-out{opacity:0;visibility:hidden}.modal-card{background-color:var(--sn-color-background);color:var(--sn-color-text-primary);width:95%;max-width:900px;height:auto;max-height:95vh;border-radius:16px;box-shadow:0 15px 40px rgba(0,0,0,.4);display:flex;flex-direction:column;overflow:hidden;transform:scale(.9);opacity:0;transition:transform .4s cubic-bezier(.19,1,.22,1),opacity .4s ease;border:1px solid var(--sn-color-text-primary);padding:0;position:relative}.modal-overlay.animate-in .modal-card{transform:scale(1);opacity:1}.modal-overlay.animate-out .modal-card{transform:scale(.9);opacity:0}.modal-hero-img{width:100%;height:auto;max-height:150px;object-fit:cover;display:block;border-bottom:1px solid var(--sn-color-text-primary);cursor:zoom-in;flex-shrink:0}.modal-close-btn.floating{position:absolute;top:20px;right:20px;z-index:10;background-color:rgba(0,0,0,.6);border:none;cursor:pointer;color:#fff;padding:8px;border-radius:50%;transition:all .2s;display:flex;backdrop-filter:blur(4px)}.modal-close-btn.floating:hover{background-color:var(--sn-color-dismiss-hover);transform:scale(1.1)}.modal-inner-content{display:flex;flex-direction:column;overflow:hidden;height:100%}.modal-header{padding:25px;background-color:var(--sn-color-background);display:block;text-align:left;flex-shrink:0;border-bottom:1px solid var(--sn-color-text-primary)}.modal-title{margin:0;font-size:26px;font-weight:700;line-height:1.2;color:var(--sn-color-text-primary)}.modal-summary{margin-top:10px;font-size:16px;color:var(--sn-color-text-secondary);line-height:1.5}.modal-body{padding:25px;overflow-y:auto;font-size:16px;line-height:1.7;text-align:left;color:var(--sn-color-text-primary)}.modal-body img,.modal-body video{display:block;margin:25px auto;max-width:100%;max-height:400px;border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15);cursor:zoom-in}.modal-body ol,.modal-body ul{padding-left:1.5rem!important;margin:0 0 16px 16px!important}.modal-body blockquote{margin:1em 0;padding:.5em 1em;border-radius:0;background-color:var(--sn-card-background);border-left:4px solid var(--sn-card-border)}.modal-body h1,h2,h3,h4,h5,h6{margin:0 0 16px}.modal-body hr{margin-top:16px;margin-bottom:16px}.lightbox-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.95);z-index:2147483649;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s ease;cursor:zoom-out;overflow:hidden;touch-action:none}.lightbox-overlay.visible{opacity:1}.lightbox-img{max-width:95vw;max-height:95vh;object-fit:contain;border-radius:4px;box-shadow:0 0 20px rgba(0,0,0,.8);transform:scale(.9);transition:transform .3s cubic-bezier(.2,0,.2,1);cursor:grab;will-change:transform;user-select:none}.lightbox-img.dragging{transition:none!important;cursor:grabbing}.lightbox-overlay.visible .lightbox-img{transform:scale(1)}.modal-body::-webkit-scrollbar{width:8px}.modal-body::-webkit-scrollbar-track{background:transparent}.modal-body::-webkit-scrollbar-thumb{background:#bbb;border-radius:4px}.modal-body::-webkit-scrollbar-thumb:hover{background:#999}.notification-message::-webkit-scrollbar{width:6px}.notification-message::-webkit-scrollbar-track{background:var(--sn-scrollbar-track);border-radius:3px}.notification-message::-webkit-scrollbar-thumb{background:var(--sn-scrollbar-thumb);border-radius:3px}.notification-message::-webkit-scrollbar-thumb:hover{background:var(--sn-scrollbar-thumb-hover)}.modal-body code,.notification-message code{font-size:.9em!important;color:var(--sn-code-text);background-color:var(--sn-code-bg);padding:2px 5px;border-radius:4px;word-wrap:break-word}.modal-body pre,.notification-message pre{background-color:var(--sn-code-block-bg);border:1px solid var(--sn-code-block-border);border-radius:var(--sn-border-radius-small);padding:12px;margin:10px 0;font-size:.85em!important;color:var(--sn-color-text-primary);white-space:pre-wrap!important;word-wrap:break-word!important;word-break:break-word!important;max-height:300px;overflow-y:auto}.modal-body pre code,.notification-message pre code{background-color:transparent!important;color:inherit!important;padding:0!important;border-radius:0!important;font-size:inherit!important;background-color:transparent;color:inherit;padding:0;border-radius:0}.modal-body table,.notification-message table{width:100%;border-collapse:collapse;margin:12px 0;font-size:.9em;background-color:transparent}.modal-body td,.modal-body th,.notification-message td,.notification-message th{padding:8px 10px;border:1px solid var(--sn-table-border);text-align:center;vertical-align:middle}.modal-body th,.notification-message th{background-color:var(--sn-table-header-bg);font-weight:600;color:var(--sn-color-text-primary)}.modal-body tr:nth-child(2n),.notification-message tr:nth-child(2n){background-color:var(--sn-table-stripe)}.notification-message pre::-webkit-scrollbar{width:6px;height:6px}.notification-message pre::-webkit-scrollbar-track{background:transparent}.notification-message pre::-webkit-scrollbar-thumb{background:var(--sn-scrollbar-thumb);border-radius:3px}.notification-message pre::-webkit-scrollbar-thumb:hover{background:var(--sn-scrollbar-thumb-hover)}'}}