PageSourceSearch

https://www.realmadryt.pl/build/assets/commentsArticle-B8kbwKrk.js

js realmadryt.pl collected 2026-09-24 23:44:20 UTC 59,605 bytes, 192 lines download raw bytes

1import{a as Wt,d as Vn,f as zn,m as Kn,p as s,t as x,u as Wn}from"./main-CdoCcVHu.js";import{a as Yt,i as W,r as mt}from"./dom-D-RC8ux5.js";import{i as Yn,o as Gn,r as Xn}from"./roleBadge-CqjTk1lz.js";import{n as Pe,t as Oe}from"./commentContent-BgnCYHHH.js";import{a as Zn,n as Gt,r as Qn}from"./helpers-DcCzO-oe.js";import{r as Xt}from"./fixedBottomOverlay-BdYsn9S4.js";import{C as eo,E as Zt,S as Qt,T as en,_ as tn,a as Se,b as to,c as ke,d as no,f as oo,g as ao,h as so,i as ro,l as io,m as co,n as mo,o as de,p as lo,r as uo,s as nn,t as ge,u as po,v as Je,w as fo,x as bo,y as on}from"./socioCommentFilter-Zd75KDvw.js";import{S as _o,_ as an,a as go,b as ho,c as lt,f as ue,g as sn,h as rn,i as cn,n as vo,o as yo,p as $o,s as Ve,u as Eo,v as re,x as wo,y as Co}from"./ignoredUsers-DcURTPJ9.js";var So=0;function bt(_){_.querySelectorAll("[data-comment-access-dialog]").forEach(m=>{m.remove(),m.open&&m.close()})}function ko(_,m,p){const $=document.activeElement instanceof HTMLElement?document.activeElement:null;bt(_);const h=document.createElement("dialog");h.className="ban-modal-dialog comment-access-dialog",h.dataset.commentAccessDialog="";const B=document.createElement("div");B.className="ban-modal",p.triggerHtml?.trim()&&(B.innerHTML=p.triggerHtml);const O=B.querySelector(".conversion-trigger");if(O){B.replaceChildren(O);const E=O.querySelector(".conversion-trigger__heading, h1, h2, h3");E&&(E.id=`comment-access-title-${++So}`,O.setAttribute("aria-labelledby",E.id),h.setAttribute("aria-labelledby",E.id))}else{const E=document.createElement("p");E.className="ban-modal__info",E.textContent=p.error||s("comments:policy.socio_only"),B.replaceChildren(E)}h.hasAttribute("aria-labelledby")||h.setAttribute("aria-label",p.error||s("comments:policy.socio_only"));const c=document.createElement("button");c.type="button",c.className="btn btn--ghost btn--icon btn--lg comment-access-dialog__close",c.dataset.commentAccessClose="",c.setAttribute("aria-label",s("common:buttons.close")),c.textContent="×",c.addEventListener("click",()=>h.close());const pe=document.createElement("div");pe.className="comment-access-dialog__header";const he=O?.querySelector(".conversion-trigger__eyebrow");he&&pe.append(he),pe.append(c),B.prepend(pe),h.append(B),h.addEventListener("cancel",E=>{E.preventDefault(),h.close()}),h.addEventListener("click",E=>{if(E.target!==h)return;const M=h.getBoundingClientRect();(E.clientX<M.left||E.clientX>M.right||E.clientY<M.top||E.clientY>M.bottom)&&h.close()}),h.addEventListener("close",()=>{const E=h.isConnected;h.remove(),E&&queueMicrotask(()=>{if(!m.isConnected||_.querySelector("[data-comment-access-dialog]"))return;const M=D=>D?.isConnected===!0&&!D.matches(":disabled")&&D.getClientRects().length>0,G=m.querySelector(".ProseMirror")??m.querySelector("textarea"),v=$&&m.contains($)&&M($)?$:G;M(v)&&v.focus({preventScroll:!0})})},{once:!0}),_.append(h),h.showModal(),h.tabIndex=-1,h.focus()}function dt(_,m,p){if(!p.code||!["socio_required","comments_not_open","comments_closed","comment_editing_disabled"].includes(p.code))return!1;if(!_.isConnected||!m.isConnected)return!0;if(_.querySelector("[data-comment-access-notice]")?.remove(),p.code==="socio_required")return ko(_,m,p),!0;bt(_);const $=document.createElement("div");$.dataset.commentAccessNotice="",$.setAttribute("role","status");const h=document.createElement("p");return h.className="comments__error",h.textContent=p.error||s("comments:toast.add_error"),$.append(h),m.after($),!0}function To(_,m){if(_.querySelector("[data-comment-policy]")?.remove(),!m)return;const p=[],$=O=>new Intl.DateTimeFormat("pl-PL",{dateStyle:"short",timeStyle:"short",timeZone:"Europe/Warsaw"}).format(new Date(O));if(m.socioOnly&&p.push(s("comments:policy.socio_only")),m.opensAt&&p.push(s("comments:policy.opens_at",{date:$(m.opensAt)})),m.closesAt&&p.push(s("comments:policy.closes_at",{date:$(m.closesAt)})),m.editingDisabled&&p.push(s("comments:policy.editing_disabled")),!p.length)return;const h=document.createElement("p");h.dataset.commentPolicy="",h.className="rich-editor__hint",h.textContent=p.join(" ");const B=_.querySelector(".comments__header");B?B.after(h):_.prepend(h)}function C(_){return _.type!=="sponsored"}function ee(_){return _.flatMap(m=>[m.id,...ee(m.replies??[])])}
1function ft(_,m){for(const p of _){if(p.id===m)return[p];const $=ft(p.replies??[],m);if($)return[p,...$]}return null}var mn=5,Te=3,ut=500;function Lo(_){try{const m=JSON.parse(_.dataset.internalEmbeds??"[]");return Array.isArray(m)?m:[]}catch{return[]}}var N=null,Le=null,ln="/api/v1/comment/{id}/like",dn="/api/v1/comment/{id}/flag",un="/api/v1/comment/{id}",xo="/api/v1/moderator/comment/{id}",Y=!1,pn=!1,xe=!1,I=sessionStorage.getItem("moderationMode")==="true",ze=()=>Y&&I,Ke=null;function Io(_){return sessionStorage.getItem(`comment${_}`)==="true"}function Ao(_){sessionStorage.setItem(`comment${_}`,"true")}function No(_){sessionStorage.removeItem(`comment${_}`)}async function jo(_){const m=_??mt('[data-ui="comments-article"]');if(!m)return;let p=!1;if(await zn("comments"),p)return;const $=m.dataset.endpoint||"",h=m.querySelector(".comments__list");if(!$||!h)return;const B=m.querySelector("[data-comments-sentinel]"),O=m.querySelector("[data-comments-loader]");Le=m.dataset.postEndpoint||"",ln=m.dataset.likeEndpoint||"/api/v1/comment/{id}/like",dn=m.dataset.flagEndpoint||"/api/v1/comment/{id}/flag",un=m.dataset.editEndpoint||"/api/v1/comment/{id}";const c=h,pe=ho(c);Gn(c),uo(c,"comments");const he=m.dataset.disableAds==="true",E=m.querySelector("[data-comments-trigger]");let M=sessionStorage.getItem("commentSort")||"newest",G=!1,v=[],D=NaN,Ae=!1,X=0,We=()=>{},Ye=!1,ie=!1,te=null,Ne=null,ve=[],Ge=()=>{},Xe=null;const ce=new AbortController,U=new Map,Ze=()=>Array.from(U.values()).flatMap(e=>e.comment?[e.comment]:[]);let ne=0,Me=null,ye=null,qe=null,j=null,He=!1,$e=null,oe=new Set,Qe=0;function _t(e){const t=Ve(e);if(oe.size===0||!t.replies)return t;const o=t.replies.filter(a=>!oe.has(a.id)).map(_t);return o.length===t.replies.length&&o.every((a,n)=>a===t.replies[n])?t:{...t,replies:o}}const Q=(e,t=Y&&I)=>e.filter(o=>t||!C(o)||!oe.has(o.id)).map(o=>C(o)&&!t?ue(_t(o)):o);function gt(){v=Q(v),ve=Q(ve);for(const[e,t]of U){if(!t.comment)continue;const o=Q([t.comment])[0];U.set(e,{...t,comment:o&&C(o)?o:null})}}let K=[];const fn=vo(c,()=>{K=K.map(e=>{if(e.type!=="swap")return e;const t=ue(e.comment);return{...e,comment:t,html:P(t,t.parentCommentId===null?0:St(e.html))}}),gt()},()=>Y&&I,{comments:()=>[...v.filter(C),...Ze()],render:(e,t)=>P(e,t,!1),afterChange:()=>{x(),J(c)}}),ht=e=>{const t=e.filter(C);return G?ge(t):t},bn=(e=ce.signal)=>({itemSelector:"article.comment",repliesSelector:".comment__replies",highlightClass:to,renderTombstone:(t,o)=>Dt({id:t},o),trigger:E,cleanupSignal:e,collapsedVisibleCount:Te,formatHiddenReplies:t=>s("comments:show_more",{count:t,word:s("comments:reply_word",{count:t})}),afterInsert:t=>{x();for(const o of t)J(o);Wt()},afterSwap:t=>{x(),J(t)},afterTriggerMove:Wt});function et(e,t=ce.signal){const o=bo(c,e,bn(t)),a=new Set(e.filter(n=>n.type==="swap"||n.type==="remove").map(n=>n.id));if(K=[...K.filter(n=>!a.has(n.id)),...o.deferredOperations],o.removedIds.length>0)for(const n of o.removedIds)c.querySelector(`[data-comment-target-root="${n}"]`)?.remove(),U.delete(n);return o}function Ee(e,t,o=0){et(Qt({previous:[e??{...t,replies:[]}],next:[t],tombstoneIds:[],render:(a,n)=>P(a,o+n),changed:e?void 0:()=>!0})),x(),J(c)}function tt(e){const t=new Set(K.filter(a=>a.type==="remove").map(a=>a.id)),o=(a,n)=>{t.has(a.id)&&!a.isDeleted&&Ee(null,a,n);for(const r of a.replies??[])o(r,n+1)};for(const a of e){if(!C(a)||a.isDeleted)continue;const n=U.get(a.id),r=c.querySelector(`:scope > #comment${a.id}`)&&!v.some(i=>i.id===a.id);(n&&!n.comment||r)&&(Ee(null,a),t.delete(a.id),n?U.set(a.id,{...n,comment:a}):v=[...v,a]),t.size>0&&o(a,0)}}const Re=new MutationObserver(()=>{K.length!==0&&(Re.disconnect(),et(K),Re.observe(c,{childList:!0,subtree:!0}))});Re.observe(c,{childList:!0,subtree:!0});const nt=()=>{te?.stop(),Ne?.dispose(),Ge(),Xe?.abort(),te=null,Ne=null,Xe=null,Ge=()=>{}},_n=()=>{p=!0,bt(m),X+=1,Fe(),ce.abort(),Re.disconnect(),oe.clear(),K=[],j?.remove(),U.clear(),nt(),We(),m.querySelector(".comments__sort")?.remove(),m.querySelector(".moderation-toggle")?.remove(),document.getElementById("ban-modal")?.remove(),pe(),fn(),c.classList.remove("is-loading"),Oe(c,!1),c.innerHTML="",me&&de(me)},Z=mt('[data-ui="comment-form"]',m),me=Z?.querySelector('textarea[name="content"]'),vt=Z?.querySelector('button[type="submit"]'),gn=mt('[data-ui="char-count"]',m);Z&&me&&vt&&Z.dataset.commentsFormBound!=="true"&&(Z.dataset.commentsFormBound="true",Sn(Z,me,vt,gn,c));function hn(){if(m.querySelector(".comments__sort"))return;const e=document.createElement("div");
1e.className="comments__sort";const t=document.createElement("button");t.type="button",t.className=`btn btn--tab${M==="newest"?" btn--tab--active":""}`,t.dataset.sort="newest",t.textContent=s("comments:sort.newest");const o=document.createElement("button");o.type="button",o.className=`btn btn--tab${M==="best"?" btn--tab--active":""}`,o.dataset.sort="best",o.textContent=s("comments:sort.best"),e.appendChild(t),e.appendChild(o),c.before(e),e.addEventListener("click",a=>{const n=a.target.closest("[data-sort]");!n||n.dataset.sort===M||(M=n.dataset.sort,sessionStorage.setItem("commentSort",M),e.querySelectorAll(".btn--tab").forEach(r=>r.classList.remove("btn--tab--active")),n.classList.add("btn--tab--active"),we())}),mo(e,{label:s("comments:socio_filter.label"),onToggle:a=>{G=a,Et()}})}function yt(e,t=0){let o="";return e.forEach((a,n)=>{a.type==="sponsored"?o+=In(a):o+=P(a,0);const r=t+n;!he&&r===4&&(o+=Xt("optad360-article-comments-sg2","750x300","360x300")),!he&&r===9&&(o+=Xt("optad360-article-comments-sg3","750x300","360x300"))}),o}function fe(e){const t=e.nextElementSibling;return t instanceof HTMLElement&&t.classList.contains("comment__replies")?t:e}function vn(e){let t=e;for(;t.parentElement!==c;){const o=t.parentElement?.closest(".comment__replies");if(!o||!c.contains(o))break;t=o}return t.classList.contains("comment")?fe(t):t}function $t(e){if(E&&e.length>0){const t=c.querySelectorAll(":scope > .comment"),o=t[Math.min(2,t.length-1)];E.removeAttribute("hidden"),o&&fe(o).insertAdjacentElement("afterend",E)}c.querySelectorAll(".sponsor-comment[data-sponsor-id]").forEach(t=>{!t.dataset.adCampaign||!t.dataset.adPlacementId||Vn(t,{campaign_id:Number.parseInt(t.dataset.adCampaign,10),placement_type:"comment",placement_id:Number.parseInt(t.dataset.adPlacementId,10),context:"article",device:window.matchMedia("(max-width: 1365px)").matches?"mobile":"desktop"})}),x(),J(c)}function Et(){K=K.filter(a=>c.querySelector(`#comment${a.id}`)?.closest("[data-comment-target-root]"));const e=G?ge(v):v,t=Ot(e),o=G?s("comments:socio_filter.empty"):s("comments:empty");c.innerHTML=yt(e)||`<p class="comments__empty">${o}</p>`,Jt(t);for(const a of U.values())c.append(a.element);$t(e)}function yn(e){const t=c.contains(document.activeElement)?document.activeElement:null;tt(e);const o=new Map(v.map(d=>[String(d.id),d])),a=new Map(e.map(d=>[String(d.id),d]));for(const d of e){const u=o.get(String(d.id));u&&C(u)&&C(d)&&c.querySelector(`:scope > #comment${d.id}`)&&Ee(u,d)}const n=e.filter(d=>!o.has(String(d.id))),r=G?ge(v).length:v.length;v=[...v.map(d=>a.get(String(d.id))??d),...n],te?.acknowledge(ee(e.filter(C)));const i=G?ge(n):n;if(i.length===0)return!1;c.querySelector(".comments__empty")?.remove();const l=Ot(i),f=c.querySelector(":scope > [data-comment-target-root]"),b=yt(i,r);return f?f.insertAdjacentHTML("beforebegin",b):c.insertAdjacentHTML("beforeend",b),Jt(l),$t(G?ge(v):v),t?.isConnected&&document.activeElement!==t&&t.focus({preventScroll:!0}),!0}function ot(e,t=null){const o=new URLSearchParams({page:String(e)});return I&&o.set("moderation","1"),M!=="newest"&&o.set("sort",M),e===1&&t&&o.set("target",String(t)),`${$}${$.includes("?")?"&":"?"}${o}`}async function wt(e){const t=X;for(let o=0;o<2;o+=1){const a=Qe,[n]=await Promise.all([fetch(ot(e.page,e.target),{headers:{Accept:"application/json"},credentials:"same-origin",signal:e.signal}),lt()]);if(!n.ok)throw new Error(`HTTP ${n.status}`);const r=await n.json();if(p||t!==X||e.signal?.aborted)return null;if(a===Qe)return r}return null}function Ct(e,t){if(t<1&&!e.isHiddenByIgnore)return null;let o=e.isHiddenByIgnore?0:1;const a=[];for(const n of e.replies??[]){const r=Ct(n,t-o);r&&(a.push(r.comment),o+=r.count)}return{comment:{...e,replies:a},count:o}}function $n(e,t){let o=t;const a=[];for(const n of e){if(n.type!=="prepend-root"&&n.type!=="insert-reply"){a.push(n);continue}const r=an([n.comment]).length;if(o<1&&r>0)continue;if(r<=o){a.push(n),o-=r;continue}const i=Ct(n.comment,o);i&&(a.push({...n,comment:i.comment,html:P(i.comment,n.type==="prepend-root"?0:Math.max(1,St(n.html)))}),o-=i.count)}return a}function St(e){const t=e.match(/comment--depth-(\d+)/);return t?Number.parseInt(t[1],10):1}function En(e){const t=r=>String(r.id),o=new Set(ve.map(t)),a=new Set(e.map(t)),n=v.filter(r=>{const i=t(r);return!a.has(i)&&(!o.has(i)||C(r)&&c.querySelector(`:scope > #comment${r.id}`)!==null)});v=[...e,...n],ve=[...e]}function wn(e){nt();const t=new AbortController;Xe=t,ve=[...e];const o=m.dataset.commentsMetaEndpoint||"",a=Date.parse(m.dataset.publishedAt||""),n=I||new URLSearchParams(window.location.search).get("moderation")==="1";if(!co({enabled:m.dataset.commentsRefreshEnabled==="true"&&o!=="",sort:M,moderation:n,publishedAt:a}
1))return;const r=document.createElement("p");r.className="comments-refresh__notice",r.setAttribute("role","status"),r.hidden=!0,c.before(r);const i=async u=>{const[g]=await Promise.all([fetch(ot(1),{headers:{Accept:"application/json"},credentials:"same-origin",signal:u}),lt()]);if(!g.ok)throw new Error(`HTTP ${g.status}`);const S=await g.json();if(S.status!=="ok"||!S.data.comments)throw new Error("Invalid response");return S},l=lo({enabled:!0,moderation:n,initialMode:"badge",initialKnownIds:ee(e.filter(C)),fetchMeta:async u=>{const g=await fetch(o,{headers:{Accept:"application/json"},credentials:"same-origin",signal:u});if(!g.ok)throw new Error(`HTTP ${g.status}`);return so(await g.json())},fetchList:i,deliveredIds:u=>ee(u.data.comments.filter(C)),apply:(u,g,S)=>{$o(c);const w=new Set(n?[]:g.tombstoneIds);(w.size!==oe.size||[...w].some(L=>!oe.has(L)))&&(Qe+=1),oe=w;const k=Q(u.data.comments);tt(k);const q=ht([...v,...Ze()]),H=ht(k),y=new Set(ee(v.filter(C))),V=$n(Qt({previous:q,next:H,tombstoneIds:n?[]:g.tombstoneIds,render:P}),S);V.some(L=>L.type.includes("insert")||L.type==="prepend-root")&&c.querySelector(".comments__empty")?.remove(),gt();const z=et(V,t.signal),ae=ee(k.filter(C)),A=new Set(ee(H)),se=new Set(an(H)),De=ae.filter(L=>!y.has(L)&&!A.has(L)),_e=ae.filter(L=>!y.has(L)&&A.has(L)&&!se.has(L)),it=z.insertedIds.some(L=>se.has(L)&&!c.querySelector(`#comment${L}`));r.textContent=[De.length>0?s("comments:refresh.hidden_filter"):"",_e.length>0?s("comments:refresh.hidden_ignore"):"",it?s("comments:refresh.collapsed"):""].filter(Boolean).join(" "),r.hidden=!r.textContent;const ct=new Set([...y,...z.insertedIds,...De,..._e]);return En(k),{insertedIds:z.insertedIds.filter(L=>se.has(L)),knownIds:ae.filter(L=>ct.has(L)),removedIds:z.removedIds}},onChange:u=>Ne?.render(u),onStaleCycle:u=>Kn("article",u)}),f=oo({root:m,list:c,labels:{loading:(u,g)=>s("comments:refresh.loading",{count:g}),banner:(u,g)=>s("comments:refresh.banner",{count:g,word:s("comments:refresh.comment_word",{count:u})}),pill:(u,g)=>s("comments:refresh.pill",{count:g,word:s("comments:refresh.comment_word",{count:u})}),capped:s("comments:refresh.capped"),manual:s("comments:refresh.manual")},onSeen:l.markSeen,onActivate:l.optIn,onReload:()=>window.location.reload()});te=l,Ne=f;const b=()=>l.setVisible(document.visibilityState==="visible"),d=()=>l.interact();document.addEventListener("visibilitychange",b),window.addEventListener("wheel",d,{passive:!0}),window.addEventListener("touchmove",d,{passive:!0}),m.addEventListener("pointerdown",d),m.addEventListener("keydown",d),m.addEventListener("input",d),Ge=()=>{r.remove(),document.removeEventListener("visibilitychange",b),window.removeEventListener("wheel",d),window.removeEventListener("touchmove",d),m.removeEventListener("pointerdown",d),m.removeEventListener("keydown",d),m.removeEventListener("input",d)},l.setVisible(document.visibilityState==="visible"),l.start()}function Be(){const e=!ie&&Number.isFinite(D);B&&(B.hidden=!e)}function be(){ie||p?(We(),Ye=!1):B&&!Ye&&!Ae&&(We=no({sentinel:B,loadMore:Cn}),Ye=!0),Be()}async function Cn(){if(p||ie||Ae||!Number.isFinite(D))return!1;Ae=!0;const e=X;O&&(O.hidden=!1),c.setAttribute("aria-busy","true");try{const t=await wt({page:D});if(!t||(t.status==="ok"&&(t.data.comments=Q(t.data.comments,t.data.isCurrentUserModerator&&I),t.data.targetComment&&!(t.data.isCurrentUserModerator&&I)&&(t.data.targetComment=ue(t.data.targetComment))),p||e!==X))return!1;if(t.status!=="ok"||!t.data.comments)throw new Error("Invalid response");yn(t.data.comments),D=t.data.pager&&t.data.pager.currentPage<t.data.pager.nbPages?t.data.pager.currentPage+1:NaN}catch(t){!p&&e===X&&(console.error("Failed to load more comments:",t),D=NaN)}finally{Ae=!1,O&&(O.hidden=!0),c.setAttribute("aria-busy","false"),be()}return Number.isFinite(D)}async function we(){if(p)return;He=!1,Fe(),oe.clear(),K=[],U.clear(),j?.remove(),j=null;const e=st();ie=e!==null,be(),nt();const t=++X;D=NaN,Be(),c.classList.add("is-loading"),c.setAttribute("aria-busy","true"),Oe(c,!1),c.textContent="";const o=document.createElement("div");o.className="spinner",c.appendChild(o);try{const[a]=await Promise.all([fetch(ot(1,e),{headers:{Accept:"application/json"},credentials:"same-origin"}),lt()]);if(!a.ok)throw new Error(`HTTP ${a.status}`);const n=await a.json();if(n.status==="ok"&&(n.data.comments=Q(n.data.comments,n.data.isCurrentUserModerator&&I),n.data.targetComment&&!(n.data.isCurrentUserModerator&&I)&&(n.data.targetComment=ue(n.data.targetComment))),p||t!==X)return;if(n.status==="ok"&&n.data.comments){N=n.data.csrfToken,Y=n.data.isCurrentUserModerator,pn=n.data.isCurrentUserSocio===!0,xe=n.data.richEditorEnabled===!0,To(m,n.data.commentPolicy),po(n.data.embedLimit??1),me&&(xe?nn(me):de(me));const r=sessionStorage.getItem("moderationMode");if(Y&&r!==null&&(I=r==="true"),Y&&sessionStorage.getItem("moderationMode")===null){I=!0,sessionStorage.setItem("moderationMode","true"),we();return}if(Y&&!m.querySelector(".moderation-toggle")){const i=document.createElement("label");i.className="moderation-toggle";const l=document.createElement("input");l.type="checkbox",l.checked=I,l.className="moderation-toggle__checkbox";const f=document.createTextNode(` ${s("comments:moderation.label")}`);i.appendChild(l),i.appendChild(f);const b=m.querySelector(".comments__header");b?b.appendChild(i):c.before(i),l.addEventListener("change",()=>{I=l.checked,sessionStorage.setItem("moderationMode",String(I)),we()})}if(n.data.isCurrentUserBanned&&Z){const i=n.data.banEndsAt?`<p class="comment-ban-notice__countdown">${s("comments:ban.unban_countdown",{time:Gt(n.data.banEndsAt)})}</p>`:"",l=n.data.banMessageToUser?`<p class="comment-ban-notice__message">${R(n.data.banMessageToUser)}</p>`:"";Z.outerHTML=`
2            <div class="comment-ban-notice">
3              <div class="comment-ban-notice__icon"><i data-lucide="ban" class="icon" aria-hidden="true"></i></div>
4              <div class="comment-ban-notice__content">
5                <h4>${s("comments:ban.title")}</h4>
6                <p>${s("comments:ban.description")}</p>
7                ${l}
8                ${i}
9                <p class="comment-ban-notice__appeal">${s("comments:ban.appeal")}</p>
10              </div>
11            </div>`}if(Z&&N){const i=Z.querySelector('input[name="_csrf_token"]');i&&(i.value=N)}hn(),v=n.data.comments,Et(),wn(n.data.comments),D=n.data.pager&&n.data.pager.currentPage<n.data.pager.nbPages?n.data.pager.currentPage+1:NaN,Be(),He=!0,rt(e===st()?n:void 0)}else throw new Error("Invalid response")}catch(a){if(p||t!==X)return;console.error("Failed to load comments:",a),c.innerHTML=`<p class="comments__error">${s("comments:load_error")}</p>`,D=NaN,Be()}finally{!p&&t===X&&(c.classList.remove("is-loading"),c.setAttribute("aria-busy","false"))}}function Sn(e,t,o,a,n){const r=()=>{o.disabled=!ke(Se(t))||Je(o)};t.addEventListener("input",r),e.addEventListener("submit",async i=>{i.preventDefault();const l=Se(t);if(!(!ke(l)||!Le)&&!Je(o)){o.disabled=!0,o.textContent=s("comments:form.sending");try{const f=await pt("add_comment"),b=new FormData;b.append("content",l.content),l.format==="rich"&&b.append("format","rich"),b.append("_csrf_token",N||""),b.append("recaptcha_token",f);const d=await fetch(Le,{method:"POST",body:b,credentials:"same-origin"}),u=await d.json(),g=tn(d.status,u);if(p)return;if(g!==null&&on(o,g,r),u.status==="ok"&&u.data?.comment){m.querySelector("[data-comment-access-notice]")?.remove(),ro(t),o.disabled=!0,v=[u.data.comment,...v];const S=P(u.data.comment,0);n.querySelector(".comments__empty")?n.innerHTML=S:n.insertAdjacentHTML("afterbegin",S),x(),J(n);const w=n.firstElementChild?.querySelector(".comment__action--reply");w&&Ie(w,s("comments:toast.added")),te?.ownPost(u.data.comment.id)}else g===null&&(dt(m,e,u)||F(u.error||s("comments:toast.add_error"),"error"))}catch(f){console.error("Failed to add comment:",f),F(s("errors.generic"),"error")}finally{r(),o.textContent=s("comments:form.submit")}}})}function J(e){Oe(e,!0),W(".comment__action--like",e).forEach(t=>{t.removeEventListener("click",It),t.addEventListener("click",It)}),W(".comment__action--flag",e).forEach(t=>{t.removeEventListener("click",Ht),t.addEventListener("click",Ht)}),W(".comment__action--reply",e).forEach(t=>{t.removeEventListener("click",Rt),t.addEventListener("click",Rt)}),W(".comment__action--edit",e).forEach(t=>{t.removeEventListener("click",Bt),t.addEventListener("click",Bt)}),W(".comment__action--delete",e).forEach(t=>{t.removeEventListener("click",At),t.addEventListener("click",At)}),W(".comment__action--restore",e).forEach(t=>{t.removeEventListener("click",Nt),t.addEventListener("click",Nt)}),W(".comment__action--ban",e).forEach(t=>{t.removeEventListener("click",Mt),t.addEventListener("click",Mt)}),W(".comment__action--link",e).forEach(t=>{t.removeEventListener("click",Ft),t.addEventListener("click",Ft)}),W(".comment__show-more",e).forEach(t=>{t.removeEventListener("click",Tt),t.addEventListener("click",Tt)}),W(".comment__collapse",e).forEach(t=>{t.removeEventListener("click",Lt),t.addEventListener("click",Lt)}),W(".comment__expand-text",e).forEach(t=>{t.removeEventListener("click",xt),t.addEventListener("click",xt)})}function kt(e,t){return Y&&I?e:Q(e).filter(C).map(o=>ue(o,void 0,t.hidden===!0))}function Tt(e){const t=e.currentTarget,o=t.dataset.commentId,a=t.dataset.allReplies;if(!(!o||!a))try{const n=JSON.parse(a),r=t.closest(".comment__replies");if(!r)return;const i=kt(n,r);Ao(parseInt(o,10)),r.dataset.allReplies=a,r.innerHTML=i.map(l=>P(l,1)).join("")+`<button type="button" class="comment__collapse" data-comment-id="${o}">${s("comments:collapse")}</button>`,r.removeAttribute("data-collapsed"),x(),J(c)}catch(n){console.error("Failed to expand replies:",n)}}function Lt(e){const t=e.currentTarget,o=t.dataset.commentId,a=t.closest(".comment__replies");if(!o||!a)return;const n=a.dataset.allReplies;if(n)try{const r=kt(JSON.parse(n),a);No(parseInt(o,10));const i=cn(r,Te),l=Math.max(0,r.filter(d=>!d.isHiddenByIgnore).length-Te),f=i.map(d=>
11P(d,1)).join(""),b=s("comments:reply_word",{count:l});a.innerHTML=f+`<button type="button" class="comment__show-more" data-comment-id="${o}" data-all-replies="${T(n)}">
12          ${s("comments:show_more",{count:l,word:b})}
13        </button>`,a.setAttribute("data-collapsed","true"),a.removeAttribute("data-all-replies"),x(),J(c)}catch(r){console.error("Failed to collapse replies:",r)}}function xt(e){const t=e.currentTarget,o=t.closest(".comment");if(!o)return;const a=o.querySelector(".comment__content");if(!a)return;const n=t.dataset.expanded==="true",r=t.dataset.isReply==="true",i=a.dataset.fullText;if(a.dataset.contentFormat==="rich"){a.classList.toggle("rich-comment--collapsed",n),t.textContent=n?r?s("rich_comments.truncate.expand_reply"):s("rich_comments.truncate.expand_comment"):r?s("rich_comments.truncate.collapse_reply"):s("rich_comments.truncate.collapse_comment"),t.dataset.expanded=n?"false":"true";return}if(!i)return;const l=JSON.parse(a.dataset.mentions??"{}"),f=JSON.parse(a.dataset.mentionBadges??"{}"),b=Lo(a);n?(a.innerHTML=Pe({contentFormat:"plain",textContent:jt(i,ut),plainText:"",mentions:l,mentionBadges:f,embeds:[],internalEmbeds:b}),t.textContent=r?s("rich_comments.truncate.expand_reply"):s("rich_comments.truncate.expand_comment"),t.dataset.expanded="false"):(a.innerHTML=Pe({contentFormat:"plain",textContent:i,plainText:"",mentions:l,mentionBadges:f,embeds:[],internalEmbeds:b}),t.textContent=r?s("rich_comments.truncate.collapse_reply"):s("rich_comments.truncate.collapse_comment"),t.dataset.expanded="true")}async function It(e){const t=e.currentTarget,o=t.dataset.commentId;if(!o||!N)return;const a=`${o}:like`,n=en(c,a)??{active:t.classList.contains("comment__action--active"),count:parseInt(t.querySelector(".comment__like-count")?.textContent||"0",10)},r=n.active,i=ln.replace("{id}",o),l=n.count??0,f=r?Math.max(0,l-1):l+1,b=N;await Zt({root:c,key:a,before:n,optimistic:{active:!r,count:f},update:({active:d,count:u=0})=>{sn(c,{id:Number(o),isLikedByUser:d,likesCount:u});const g=c.querySelector(`.comment__action--like[data-comment-id="${o}"]`);g?.classList.toggle("comment__action--active",d);const S=g?.querySelector(".comment__like-count");S&&(S.textContent=u>0?String(u):"")},request:async d=>{try{const u=new FormData;u.append("_csrf_token",b);const g=await(await fetch(i,{method:r?"DELETE":"POST",body:u,credentials:"same-origin"})).json();if(g.status==="ok")return{active:g.data?.isLikedByUser??!r,count:g.data?.likesCount??Math.max(0,(d.count??0)+ +!r-Number(d.active))};F(g.error||s("comments:toast.update_error"),"error")}catch(u){console.error("Like action failed:",u)}}})}function at(e,t){return new Promise(o=>{const a=document.createElement("div");a.className="modal__backdrop";const n=document.createElement("div");n.className="modal__content";const r=document.createElement("p");r.className="modal__message",r.textContent=e,n.appendChild(r);const i=document.createElement("div");i.className="modal__actions";const l=document.createElement("button");l.type="button",l.className="modal__btn",l.textContent=s("comments:confirm.cancel");const f=document.createElement("button");f.type="button",f.className="modal__btn modal__btn--danger",f.textContent=t,i.appendChild(l),i.appendChild(f),n.appendChild(i),a.appendChild(n),document.body.appendChild(a);function b(u){a.remove(),document.removeEventListener("keydown",d),o(u)}function d(u){u.key==="Escape"&&b(!1)}l.addEventListener("click",()=>b(!1)),f.addEventListener("click",()=>b(!0)),a.addEventListener("click",u=>{u.target===a&&b(!1)}),document.addEventListener("keydown",d),requestAnimationFrame(()=>f.focus())})}async function At(e){const t=e.currentTarget.dataset.commentId;if(!t||!N||!await at(s("comments:confirm.delete"),s("comments:actions.delete")))return;const o=xo.replace("{id}",t);try{const a=new FormData;a.append("_csrf_token",N);const n=await(await fetch(o,{method:"DELETE",body:a,credentials:"same-origin"})).json();if(n.status==="ok"){const r=document.getElementById(`comment${t}`);if(r){const i=r.classList.contains("comment--reply")?1:0;r.outerHTML=`
14            <article class="comment comment--deleted${i>0?` comment--reply comment--depth-${Math.min(i,3)}`:""}" id="comment${t}">
15              <div class="comment__body">
16                <p class="comment__deleted-message">${s("comments:deleted")}</p>
17              </div>
18            </article>
19          `}F(s("comments:toast.deleted"),"success")}else F(n.error||s("comments:toast.delete_error"),"error")}catch(a){console.error("Delete action failed:",a),F(s("comments:toast.delete_error"),"error")}}async function Nt(e){const t=e.currentTarget.dataset.commentId;if(!(!t||!N)&&await at(s("comments:confirm.restore"),s("comments:actions.restore")))try{const o=new FormData;o.append("_csrf_token",N);const a=await(await fetch(`/api/v1/moderator/comment/${t}/restore`,{method:"POST",body:o,credentials:"same-origin"})).json();if(a.status==="ok"){const n=document.getElementById(`comment${t}`);if(n){n.classList.remove("comment--mod-deleted"),n.querySelector(".comment__deleted-badge")?.remove();const r=n.querySelector(".comment__action--restore");r&&ze()&&(r.outerHTML=`<button type="button" class="comment__action comment__action--delete" data-comment-id="${t}" aria-label="${s("comments:actions.delete")}">
20              <i data-lucide="trash-2" class="icon" aria-hidden="true"></i>
21              ${s("comments:actions.delete")}
22            </button>`,x(),J(c))}F(s("comments:toast.restored"),"success")}else F(a.error||s("comments:toast.restore_error"),"error")}catch(o){console.error("Restore action failed:",o),F(s("comments:toast.restore_error"),"error")}}async function Mt(e){const t=e.currentTarget,o=t.dataset.commentId,a=t.dataset.userId,n=t.dataset.displayName??"";if(!o||!a||!N)return;const r=t.dataset.activeBanEndsAt||null,i=t.dataset.activeBanReason||null;if(r){Tn(n,r,i,a);return}try{Ln(o,n,await kn(),a)}catch(l){console.error("Failed to load ban reasons:",l),F(s("comments:toast.ban_load_error"),"error")}}async function kn(){if(Ke)return Ke;
22const e=await fetch("/api/v1/moderator/ban-reasons",{credentials:"same-origin",headers:{Accept:"application/json"}});if(!e.ok)throw new Error(`HTTP ${e.status}`);return Ke=(await e.json()).data||[],Ke}function Tn(e,t,o,a){const n=qt(),r=Gt(t);n.innerHTML=`
23      <form method="dialog" class="ban-modal">
24        <h3 class="ban-modal__title">${s("comments:ban_modal.already_banned_title",{name:R(e)})}</h3>
25        <p class="ban-modal__info">${s("comments:ban_modal.already_banned_until",{time:R(r)})}</p>
26        ${o?`<p class="ban-modal__info"><strong>${s("comments:ban_modal.reason_label")}:</strong> ${R(o)}</p>`:""}
27        <div class="ban-modal__actions">
28          <a class="btn btn--secondary" href="/mietek/ban?user_id=${encodeURIComponent(a)}" target="_blank" rel="noopener">${s("comments:ban_modal.advanced")}</a>
29          <button type="submit" class="btn btn--primary" value="close">${s("comments:ban_modal.close")}</button>
30        </div>
31      </form>`,n.showModal()}function Ln(e,t,o,a){const n=qt(),r=o.map(f=>`<option value="${f.id}">${R(f.shortDescription)}</option>`).join(""),i=[{value:"1d",label:s("comments:ban_modal.duration.1d")},{value:"3d",label:s("comments:ban_modal.duration.3d")},{value:"7d",label:s("comments:ban_modal.duration.7d")},{value:"30d",label:s("comments:ban_modal.duration.30d")},{value:"90d",label:s("comments:ban_modal.duration.90d")},{value:"1y",label:s("comments:ban_modal.duration.1y")},{value:"5y",label:s("comments:ban_modal.duration.5y")}].map((f,b)=>`
32          <label class="ban-modal__radio">
33            <input type="radio" name="duration" value="${f.value}"${b===0?" checked":""}>
34            <span>${R(f.label)}</span>
35          </label>`).join("");n.innerHTML=`
36      <form class="ban-modal" data-comment-id="${e}">
37        <h3 class="ban-modal__title">${s("comments:ban_modal.title",{name:R(t)})}</h3>
38
39        <label class="ban-modal__field">
40          <span class="ban-modal__label">${s("comments:ban_modal.reason_label")}</span>
41          <select name="reason_id" required>
42            <option value="" disabled selected>${s("comments:ban_modal.reason_placeholder")}</option>
43            ${r}
44          </select>
45        </label>
46
47        <fieldset class="ban-modal__field">
48          <legend class="ban-modal__label">${s("comments:ban_modal.duration_label")}</legend>
49          <div class="ban-modal__radios">${i}</div>
50        </fieldset>
51
52        <label class="ban-modal__field">
53          <span class="ban-modal__label">${s("comments:ban_modal.message_label")}</span>
54          <textarea name="message_to_user" rows="3" maxlength="500" placeholder="${s("comments:ban_modal.message_placeholder")}"></textarea>
55        </label>
56
57        <label class="ban-modal__check">
58          <input type="checkbox" name="delete_comment" checked>
59          <span>${s("comments:ban_modal.delete_comment")}</span>
60        </label>
61
62        <p class="ban-modal__error" hidden></p>
63
64        <div class="ban-modal__actions">
65          <a class="ban-modal__advanced" href="/mietek/ban/new?user_id=${encodeURIComponent(a)}&comment_id=${encodeURIComponent(e)}" target="_blank" rel="noopener">${s("comments:ban_modal.advanced")}</a>
66          <button type="button" class="btn btn--secondary" data-action="cancel">${s("comments:ban_modal.cancel")}</button>
67          <button type="submit" class="btn btn--primary">${s("comments:ban_modal.submit")}</button>
68        </div>
69      </form>`;const l=n.querySelector("form");l.querySelector('[data-action="cancel"]').addEventListener("click",()=>n.close()),l.addEventListener("submit",f=>{f.preventDefault(),xn(l,n)}),n.showModal()}async function xn(e,t){const o=e.dataset.commentId;if(!o||!N)return;const a=e.querySelector(".ban-modal__error");a.hidden=!0;const n=new FormData(e);n.append("_csrf_token",N),n.get("delete_comment")?n.set("delete_comment","1"):n.set("delete_comment","0");const r=e.querySelector('button[type="submit"]');r.disabled=!0;try{const i=await(await fetch(`/api/v1/moderator/comment/${o}/ban`,{method:"POST",body:n,credentials:"same-origin"})).json();i.status==="ok"?(t.close(),F(s("comments:ban_modal.toast_success"),"success"),we()):(a.textContent=i.error||s("comments:ban_modal.toast_error"),a.hidden=!1,r.disabled=!1)}catch(i){console.error("Ban submit failed:",i),a.textContent=s("comments:ban_modal.toast_error"),a.hidden=!1,r.disabled=!1}}function qt(){let e=document.getElementById("ban-modal");return e||(e=document.createElement("dialog"),e.id="ban-modal",e.className="ban-modal-dialog",document.body.appendChild(e)),e}async function Ht(e){const t=e.currentTarget,o=t.dataset.commentId;if(!o||!N)return;const a=`${o}:flag`,n=()=>c.querySelector(`.comment__action--flag[data-comment-id="${o}"]`)??t,r=()=>en(c,a)??{active:n().classList.contains("comment__action--active")};let i=r();if(!i.active&&(!await at(s("comments:confirm.flag"),s("comments:confirm.confirm"))||(i=r(),i.active)))return;const l=i.active,f=dn.replace("{id}",o),b=N;await Zt({root:c,key:a,before:i,optimistic:{active:!l},update:({active:d})=>{sn(c,{id:Number(o),isFlaggedByUser:d}),n().classList.toggle("comment__action--active",d)},request:async()=>{try{const d=new FormData;d.append("_csrf_token",b);const u=await(await fetch(f,{method:l?"DELETE":"POST",body:d,credentials:"same-origin"})).json();if(u.status==="ok")return l||Ie(n(),s("comments:toast.flagged")),{active:u.data?.isFlaggedByUser??!l};Ie(n(),u.error||s("comments:toast.flag_error"))}catch(d){console.error("Flag action failed:",d)}}})}function Rt(e){const t=e.currentTarget,o=t.dataset.commentId;if(!o)return;const a=t.closest(".comment");
69if(!a)return;let n=c.querySelector(`.reply-form[data-reply-to="${o}"]`);if(n){const d=n.querySelector("textarea");d instanceof HTMLTextAreaElement&&de(d),n.nextElementSibling?.matches("[data-comment-access-notice]")&&n.nextElementSibling.remove(),n.remove();return}n=document.createElement("form"),n.className="reply-form",n.dataset.replyTo=o,n.innerHTML=`
70      <div class="reply-form__content">
71        <textarea name="content" class="form-control form-control--textarea" placeholder="${s("comments:form.reply_placeholder")}" rows="2" minlength="3" maxlength="16383" required></textarea>
72        <div class="reply-form__actions">
73          <button type="button" class="btn btn--secondary btn--sm reply-form__cancel">${s("buttons.cancel")}</button>
74          <button type="submit" class="btn btn--primary btn--sm" disabled>
75            <i data-lucide="send" class="icon" aria-hidden="true"></i>
76            ${s("comments:actions.reply")}
77          </button>
78        </div>
79      </div>
80    `,vn(a).insertAdjacentElement("afterend",n),x();const r=n.querySelector("textarea"),i=n.querySelector('button[type="submit"]'),l=n.querySelector(".reply-form__cancel"),f=a.querySelector(".comment__username")?.textContent?.trim()||"";io(r,f,xe),f&&(i.disabled=!1);const b=()=>{i.disabled=!ke(Se(r))||Je(i)};r.addEventListener("input",b),l.addEventListener("click",()=>{de(r),n?.nextElementSibling?.matches("[data-comment-access-notice]")&&n.nextElementSibling.remove(),n?.remove()}),n.addEventListener("submit",async d=>{if(d.preventDefault(),!Le)return;const u=Se(r);if(!ke(u)||Je(i))return;i.disabled=!0,i.innerHTML='<span class="spinner spinner--sm"></span>';let g=!1;try{const S=await pt("add_comment"),w=new FormData;w.append("content",u.content),u.format==="rich"&&w.append("format","rich"),w.append("parentCommentId",o),w.append("_csrf_token",N||""),w.append("recaptcha_token",S);const k=await fetch(Le,{method:"POST",body:w,credentials:"same-origin"}),q=await k.json(),H=tn(k.status,q);if(p)return;if(H!==null&&on(i,H,b),q.status==="ok"&&q.data?.comment){g=!0,m.querySelector("[data-comment-access-notice]")?.remove();const y=c.querySelector(`#comment${o}`),V=Y&&I,z=!V&&Eo(c,{parentId:Number(o),parent:y}),ae=V?q.data.comment:ue(q.data.comment,void 0,z);if(y){let A=y.nextElementSibling;A?.classList.contains("comment__replies")||(A=document.createElement("div"),A.className="comment__replies",A.dataset.commentId=o,y.after(A)),z&&(A.hidden=!0,A.dataset.ignoredThread=""),A.insertAdjacentHTML("beforeend",P(ae,1)),x(),J(c);const se=A.lastElementChild?.querySelector(".comment__action--reply");se&&Ie(se,s("comments:toast.reply_added"))}fo(c,{parentId:Number(o),reply:ae,itemSelector:"article.comment",repliesSelector:".comment__replies",formatHiddenReplies:A=>s("comments:show_more",{count:A,word:s("comments:reply_word",{count:A})})}),te?.ownPost(q.data.comment.id)}else H===null&&(dt(m,n,q)||F(q.error||s("comments:toast.reply_error"),"error"),i.disabled=!1),i.innerHTML=`<i data-lucide="send" class="icon" aria-hidden="true"></i> ${s("comments:actions.reply")}`,x()}catch(S){console.error("Failed to add reply:",S),F(s("errors.generic"),"error")}finally{g?(de(r),n?.remove()):(b(),i.innerHTML=`<i data-lucide="send" class="icon" aria-hidden="true"></i> ${s("comments:actions.reply")}`,x())}})}function Bt(e){const t=e.currentTarget,o=t.dataset.commentId;if(!o)return;const a=t.closest(".comment"),n=a?.querySelector(".comment__content");if(!a||!n)return;const r=n.innerHTML,i=n.dataset.rawContent??"",l=n.dataset.contentFormat==="rich"?"rich":"plain",f=n.dataset.richEditorForEdit==="true";n.innerHTML=`
81      <form class="edit-form">
82        <textarea name="content" class="form-control form-control--textarea" rows="3" minlength="3" maxlength="16383" required>${R(i)}</textarea>
83        <div class="edit-form__actions">
84          <button type="button" class="btn btn--secondary btn--sm edit-form__cancel">${s("buttons.cancel")}</button>
85          <button type="submit" class="btn btn--primary btn--sm">
86            <i data-lucide="check" class="icon" aria-hidden="true"></i>
87            ${s("comments:edit.save")}
88          </button>
89        </div>
90      </form>
91    `;const b=n.querySelector(".edit-form"),d=b.querySelector("textarea"),u=b.querySelector(".edit-form__cancel"),g=f?nn(d,l):null;x(),g?g.focus("end"):d.focus(),u.addEventListener("click",()=>{de(d),n.innerHTML=r}),b.addEventListener("submit",async S=>{S.preventDefault();const w=Se(d);if(!ke(w))return;const k=b.querySelector('button[type="submit"]');k.disabled=!0,k.innerHTML='<span class="spinner spinner--sm"></span>';try{const q=await pt("edit_comment"),H=new FormData;H.append("content",w.content),(w.format==="rich"||l==="rich")&&H.append("format","rich"),H.append("_csrf_token",N||""),H.append("recaptcha_token",q);const y=await(await fetch(un.replace("{id}",o),{method:"PUT",body:H,credentials:"same-origin"})).json();if(p)return;if(y.status==="ok"&&y.data?.comment){if(eo(c,y.data.comment,{itemSelector:"article.comment",repliesSelector:".comment__replies"}),de(d),!n.isConnected||!c.contains(n))return;n.innerHTML=Pe(y.data.comment),Oe(n,!0),n.dataset.contentFormat=y.data.comment.contentFormat,n.toggleAttribute("data-rich-editor-for-edit",y.data.comment.contentFormat==="plain"?xe:y.data.comment.richEditorForEdit===!0),n.dataset.mentions=JSON.stringify(y.data.comment.mentions),n.dataset.mentionBadges=JSON.stringify(y.data.comment.mentionBadges??{}),n.dataset.internalEmbeds=JSON.stringify(y.data.comment.internalEmbeds??[]),n.classList.toggle("rich-comment",y.data.comment.contentFormat==="rich");const V=a.querySelector(".comment__content");V&&y.data.comment.textContent&&(V.dataset.fullText=y.data.comment.textContent),V&&typeof y.data.comment.rawContent=="string"&&(V.dataset.rawContent=y.data.comment.rawContent);const z=a.querySelector(".comment__action--edit");z&&Ie(z,s("comments:toast.updated"))}else dt(m,b,y)||F(y.error||s("comments:toast.update_error"),"error"),k.disabled=!1,k.innerHTML=`<i data-lucide="check" class="icon" aria-hidden="true"></i> ${s("comments:edit.save")}`,x()}catch(q){console.error("Failed to edit comment:",q),F(s("errors.generic"),"error"),k.disabled=!1,k.innerHTML=`<i data-lucide="check" class="icon" aria-hidden="true"></i> ${s("comments:edit.save")}`,x()}})}async function Ft(e){const t=e.currentTarget,o=t.dataset.commentId;if(!o)return;const a=`${window.location.origin}${window.location.pathname}#comment${o}`;await ao(t,a,s("comments:toast.link_copied"))}function In(e){const t=e.User.avatar?`<img src="${T(e.User.avatar)}" alt="${R(e.User.displayName)}" class="avatar" loading="lazy">`:`<span class="avatar avatar--fallback">${e.User.displayName.charAt(0).toUpperCase()}</span>`,o=e.clickTag||e.cta.url,a=e.campaignId&&e.placementId?` data-ad-campaign="${e.campaignId}" data-ad-placement-type="comment" data-ad-placement-id="${e.placementId}" data-ad-context="article"`:"",n=e.campaignId?' data-ad-link="true"':` data-sponsor-id="${e.sponsoredCommentId}"`,r=e.disclosure?`<div class="sponsor-comment__disclosure">${R(e.disclosure)}</div>`:"",i=e.impressionTag&&Wn(e.placementId??`sponsored:${e.sponsoredCommentId}`)?`<div class="sponsor-comment__pixel" aria-hidden="true" style="display:none">${e.impressionTag}</div>`:"";return`
92      <article class="comment sponsor-comment" data-sponsor-id="${e.sponsoredCommentId}"${a}>
93        <div class="comment__avatar">${t}</div>
94        <div class="comment__body">
95          <header class="comment__header">
96            <div class="comment__user">
97              <strong class="comment__username">${R(e.User.displayName)}</strong>
98              <span class="sponsor-comment__badge">${s("comments:sponsored")}</span>
99            </div>
100          </header>
101          <div class="sponsor-comment__content">${e.textContent}</div>
102          <div class="sponsor-comment__cta-wrapper">
103            <a href="${T(o)}" class="sponsor-comment__cta"${n} target="_blank" rel="noopener sponsored">${R(e.cta.text)}</a>
104          </div>
105          ${r}
106          ${i}
107        </div>
108      </article>`}function P(e,t,o=!0){if(e=Y&&I?Ve(e):ue(e),e.isIgnored||e.isHiddenByIgnore)return yo(e,"comment",t).outerHTML+(o?Ut(e,t):"");if(e.showAsDeleted&&!(e.isDeleted&&Y&&I))return Dt(e,t);const a=Zn(e.createdAt),n=e.contentFormat??"plain",r=e.mentions??{},i=e.mentionBadges??{},l=e.embeds??[],f=e.internalEmbeds??[],b=e.plainText??e.textContent.replace(/<[^>]*>/g,""),d=Qn(a),u=An(e.User),g=Xn(e.User,"comments",{revealSocioNumber:!0}),S=Yn(e.User),w=e.User.profileUrl?"a":"div",k=e.User.profileUrl?` href="${T(e.User.profileUrl)}"`:"",q=Nn(e.User),H=t>0?` comment--reply comment--depth-${Math.min(t,3)}`:"",y=e.isRecommended?" comment--recommended":"",V=e.likesCount>=5?" comment--has-likes":"",z=e.likesCount>=25?" comment--popular":"",ae=e.isDeleted?" comment--mod-deleted":"",A=e.isLikedByUser?" comment__action--active":"",se=e.isFlaggedByUser?" comment__action--active":"",De=Mn(e.User),_e=e.isEditable&&(n==="plain"||e.richEditorForEdit===!0),it=_e?`<button type="button" class="comment__action comment__action--edit" data-comment-id="${e.id}" aria-label="${s("comments:actions.edit")}">
109           <i data-lucide="${re.edit}" class="icon" aria-hidden="true"></i>
110           <span class="comment-actions-overflow__label">${s("comments:actions.edit")}</span>
111         </button>`:"",ct=_e&&e.isOwnComment&&e.remainingEditTime>0?`<span class="comment__edit-time" title="${s("comments:edit.time_remaining")}">${Hn(e.remainingEditTime)}</span>`:"",L=_e&&typeof e.rawContent=="string"?` data-raw-content="${T(e.rawContent)}"`:"",le=(n==="rich"?b.length:qn(e.textContent))>ut,Fn=Pe({contentFormat:n,plainText:b,mentions:r,mentionBadges:i,embeds:l,internalEmbeds:f,textContent:n==="plain"&&le?jt(e.textContent,ut):e.textContent}),Un=n==="rich"?` rich-comment${le?" rich-comment--collapsed":""}`:"",Dn=[n==="rich"?' data-content-format="rich"':"",(n==="plain"?xe:e.richEditorForEdit===!0)?' data-rich-editor-for-edit="true"':"",n==="plain"&&le&&Object.keys(r).length>0?` data-mentions="${T(JSON.stringify(r))}"`:"",n==="plain"&&le&&Object.keys(i).length>0?` data-mention-badges="${T(JSON.stringify(i))}"`:"",n==="plain"&&le&&f.length>0?` data-internal-embeds="${T(JSON.stringify(f))}"`:""].join(""),jn=e.isDeleted?`<span class="comment__deleted-badge">${s("comments:badge.deleted")}</span>`:"",Pn=e.banId?`<span class="comment__ban-badge" title="${s("comments:moderation.ban_badge_title")}">${s("comments:moderation.ban_badge")}</span>`:"",On=ze()&&e.User.isBanned?`<span class="comment__user-banned-badge" title="${s("comments:moderation.user_banned_title")}">${s("comments:moderation.user_banned_badge")}</span>`:"",je=Co({id:`article-comment-actions-${e.id}`,label:s("comments:actions.more"),triggerClass:"comment__action"});je.panel.innerHTML=`
112      ${De}
113      ${go(e.User.id,e.isOwnComment,"comment")}
114      ${it}
115      <button type="button" class="comment__action comment__action--flag${se}" data-comment-id="${e.id}" aria-label="${s("comments:actions.flag")}">
116        <i data-lucide="${re.flag}" class="icon" aria-hidden="true"></i>
117        <span class="comment-actions-overflow__label">${s("comments:actions.flag")}</span>
118      </button>${ze()?e.isDeleted?`
119      <button type="button" class="comment__action comment__action--restore" data-comment-id="${e.id}" aria-label="${s("comments:actions.restore")}">
120         <i data-lucide="${re.restore}" class="icon" aria-hidden="true"></i>
121        <span class="comment-actions-overflow__label">${s("comments:actions.restore")}</span>
122      </button>`:`
123      <button type="button" class="comment__action comment__action--delete" data-comment-id="${e.id}" aria-label="${s("comments:actions.delete")}">
124         <i data-lucide="${re.delete}" class="icon" aria-hidden="true"></i>
125        <span class="comment-actions-overflow__label">${s("comments:actions.delete")}</span>
126      </button>`:""}${ze()?`
127      <button type="button" class="comment__action comment__action--ban" data-comment-id="${e.id}" data-user-id="${e.User.id??""}" data-display-name="${T(e.User.displayName)}"${e.User.activeBan?` data-active-ban-ends-at="${T(e.User.activeBan.endsAt??"")}" data-active-ban-reason="${T(e.User.activeBan.reason??"")}"`:""} aria-label="${s("comments:actions.ban")}">
128        <i data-lucide="${re.ban}" class="icon" aria-hidden="true"></i>
129        <span class="comment-actions-overflow__label">${s("comments:actions.ban")}</span>
130      </button>`:""}
131      <button type="button" class="comment__action comment__action--link" data-comment-id="${e.id}" aria-label="${s("comments:actions.link")}">
132        <i data-lucide="${re.link}" class="icon" aria-hidden="true"></i>
133        <span class="comment-actions-overflow__label">${s("comments:actions.link_short")}</span>
134      </button>`,_o(je.panel),wo(je.panel,".comment__action--link");const Jn=je.root.outerHTML;return`
135      <article class="comment${H}${y}${V}${z}${ae}" id="comment${e.id}" data-comment-id="${e.id}" data-ignore-author="${e.User.id??""}" data-ignore-name="${T(e.User.displayName)}" data-ignore-profile="${T(e.User.profileUrl??"")}"${e.isIgnoreRevealed?" data-ignore-revealed":""}>
136        <${w} class="comment__avatar${S}"${k}>
137          ${u}
138        </${w}>
139        <div class="comment__body">
140          <header class="comment__header">
141            <div class="comment__user">
142              ${q}
143              ${g}
144              ${On}
145              ${jn}
146              ${Pn}
147            </div>
148            <time class="comment__time" datetime="${e.createdAt}" title="${a.toLocaleString("pl-PL")}">
149              ${d}
150            </time>
151            ${ct}
152          </header>
153          <div class="comment__content${Un}"${Dn}${n==="plain"&&le?` data-full-text="${T(e.textContent)}"`:""}${L}>
154            ${Fn}
155          </div>${le?`
156          <button type="button" class="comment__show-more comment__expand-text" data-comment-id="${e.id}" data-expanded="false" data-is-reply="${t>0?"true":"false"}">${t>0?s("rich_comments.truncate.expand_reply"):s("rich_comments.truncate.expand_comment")}</button>`:""}
157          <footer class="comment__footer">
158            <button type="button" class="comment__action comment__action--like${A}" data-comment-id="${e.id}" aria-label="${s("comments:actions.like")}">
159              <i data-lucide="thumbs-up" class="icon" aria-hidden="true"></i>
160              <span class="comment__like-count">${e.likesCount>0?e.likesCount:""}</span>
161            </button>
162            <button type="button" class="comment__action comment__action--reply" data-comment-id="${e.id}" aria-label="${s("comments:actions.reply")}">
163              <i data-lucide="message-circle" class="icon" aria-hidden="true"></i>
164              ${s("comments:actions.reply")}
165            </button>
166            ${Jn}
167            ${rn(e,"comment")}
168          </footer>
169        </div>
170      </article>
171    `+(o?Ut(e,t):"")}function Ut(e,t){let o="";const a=e.isHiddenByIgnore?" hidden data-ignored-thread":"";if(e.replies&&e.replies.length>0)if(t===0&&e.replies.filter(n=>!n.isHiddenByIgnore).length>mn&&!Io(e.id)){const n=cn(e.replies,Te),r=Math.max(0,e.replies.filter(f=>!f.isHiddenByIgnore).length-Te),i=n.map(f=>P(f,t+1)).join(""),l=s("comments:reply_word",{count:r});o+=`<div class="comment__replies"${a} data-comment-id="${e.id}" data-collapsed="true">
172          ${i}
173          <button type="button" class="comment__show-more" data-comment-id="${e.id}" data-all-replies="${T(JSON.stringify(Ve(e).replies))}">
174            ${s("comments:show_more",{count:r,word:l})}
175          </button>
176        </div>`}else{const n=e.replies.map(f=>P(f,t+1)).join(""),r=t===0&&e.replies.filter(f=>!f.isHiddenByIgnore).length>mn,i=r?`<button type="button" class="comment__collapse" data-comment-id="${e.id}">${s("comments:collapse")}</button>`:"",l=r?` data-all-replies="${T(JSON.stringify(Ve(e).replies))}"`:"";o+=`<div class="comment__replies"${a}${l}>${n}${i}</div>`}return o}function Dt(e,t){return`
177      <article class="comment comment--deleted${t>0?` comment--reply comment--depth-${Math.min(t,3)}`:""}" id="comment${e.id}
177" data-comment-id="${e.id}" data-ignore-author="${e.User?.id??""}" data-ignore-name="${T(e.User?.displayName??"")}" data-ignore-profile="${T(e.User?.profileUrl??"")}"${e.isIgnoreRevealed?" data-ignore-revealed":""}>
178        <div class="comment__body">
179          <p class="comment__deleted-message">${s("comments:deleted")}</p>
180          ${e.isIgnoreRevealed?`<footer class="comment__footer">${rn(e,"comment")}</footer>`:""}
181        </div>
182      </article>
183    `}function An(e){if(e.avatar&&e.avatar!=="/img/avatar-placeholder.png")return`<img src="${T(e.avatar)}" alt="${R(e.displayName)}" class="avatar" loading="lazy">`;const t=e.displayName.charAt(0).toUpperCase();return`<span class="avatar avatar--fallback" aria-label="${T(s("comments:avatar_label",{name:e.displayName}))}">${t}</span>`}function Nn(e){return e.profileUrl?`<a class="comment__username" href="${T(e.profileUrl)}">${R(e.displayName)}</a>`:`<strong class="comment__username">${R(e.displayName)}</strong>`}function Mn(e){return e.profileUrl?pn?`<a class="comment__action comment__action--history" href="${T(e.profileUrl)}#historia-komentarzy"><i data-lucide="${re.history}" class="icon" aria-hidden="true"></i><span class="comment-actions-overflow__label">${s("comments:actions.history")}</span></a>`:`<details class="comment-history-lock">
184      <summary class="comment__action comment__action--history"><i data-lucide="${re.lockedHistory}" class="icon" aria-hidden="true"></i><span class="comment-actions-overflow__label">${s("comments:actions.history")}</span></summary>
185      <div class="tooltip tooltip--socio comment-history-lock__tip">${s("comments:history_lock")}</div>
186    </details>`:""}function qn(e){return e.replace(/<br \/>/g,`
187`).length}function jt(e,t){let o=0,a=0,n=!1;for(;a<e.length&&o<t;)if(e[a]==="<"){const r=e.indexOf(">",a);if(r===-1)break;const i=e.slice(a,r+1);/^<a\b/i.test(i)?n=!0:/^<\/a>/i.test(i)?n=!1:/^<br\b/i.test(i)&&o++,a=r+1}else o++,a++;if(n){const r=e.toLowerCase().indexOf("</a>",a);r!==-1&&(a=r+4)}return`${e.slice(0,a)}...`}function Hn(e){return`${Math.floor(e/60)}:${(e%60).toString().padStart(2,"0")}`}function st(){const e=window.location.hash.match(/^#comment(\d+)$/)?.[1],t=Number(e);return Number.isSafeInteger(t)&&t>0?t:null}function Fe(){ne+=1,Me?.abort(),Me=null,ye!==null&&cancelAnimationFrame(ye),ye=null,qe!==null&&clearTimeout(qe),qe=null,c.querySelectorAll(".comment--highlighted").forEach(e=>{e.classList.remove("comment--highlighted")})}function Rn(){Fe(),ie=!1,be(),window.history.replaceState(window.history.state,"",window.location.pathname+window.location.search),j?.remove(),j=null,c.tabIndex=-1,c.focus({preventScroll:!0}),$e!==null?window.scrollTo({top:$e,behavior:"auto"}):Yt(c,{block:"start"}),$e=null}function Pt(e,t=!1){const o=document.createElement("div"),a=document.createElement("p");a.setAttribute("role","status"),a.textContent=e;const n=document.createElement("div");n.className="comments__target-actions";const r=document.createElement("button");if(r.type="button",r.className="btn btn--secondary",r.dataset.commentTargetBack="",r.textContent=s("comments:target.back"),r.addEventListener("click",Rn,{signal:ce.signal}),n.append(r),t){const i=document.createElement("button");i.type="button",i.className="btn btn--secondary",i.textContent=s("comments:target.retry"),i.addEventListener("click",()=>{rt()},{signal:ce.signal}),n.append(i)}return o.append(a,n),o}function Ce(e,t=!1){return j?.remove(),j=document.createElement("div"),j.className="comments__target-context",j.append(Pt(e,t)),c.before(j),j}function Ot(e){const t=new Map;for(const o of e){const a=U.get(Number(o.id));!a||!C(o)||(Ee(a.comment,o),t.set(o.id,Array.from(a.element.childNodes).slice(1)),a.element.remove(),U.delete(Number(o.id)))}return t}function Jt(e){for(const[t,o]of e){const a=c.querySelector(`#comment${t}`);if(!a)continue;const n=fe(a);n!==a&&n.remove(),a.replaceWith(...o)}}function Bn(e){const t=U.get(e.id),o=t?.comment??v.find(r=>C(r)&&r.id===e.id);if((t||o&&C(o))&&c.querySelector(`#comment${e.id}`)){Ee(o&&C(o)?o:null,e),v=v.map(r=>r===o?e:r),t&&U.set(e.id,{...t,comment:e}),te?.acknowledge(ee([e])),x(),J(c);return}const a=document.createElement("section");
187a.className="comments__target-context",a.dataset.commentTargetRoot=String(e.id);const n=G&&ge([e]).length===0;a.append(Pt(s(n?"comments:target.outside_filter":"comments:target.label"))),a.insertAdjacentHTML("beforeend",P(e,0)),U.set(e.id,{comment:e,element:a}),c.append(a),te?.acknowledge(ee([e])),x(),J(c)}function Vt(e){const t=e.find(n=>n.isHiddenByIgnore),o=(t??e[e.length-1]).id;for(const n of e){const r=c.querySelector(`.comment__show-more[data-all-replies][data-comment-id="${n.id}"]`);if(!r||r.closest("[hidden]"))continue;const i=r.parentElement,l=Array.from(i.querySelectorAll(":scope > article.comment")).map(f=>({item:f,end:fe(f)}));r.click();for(let f=l.length-1;f>=0;f-=1){const{item:b,end:d}=l[f],u=d===b?[b]:[b,d],g=i.querySelector(`#${b.id}`);if(!g){if(!u.some(k=>k.querySelector(".reply-form, .edit-form")))continue;const w=l.slice(0,f).reverse().map(({item:k})=>i.querySelector(`#${k.id}`)).find(k=>k!==null);w?fe(w).after(...u):i.prepend(...u);continue}const S=fe(g);S!==g&&S.remove(),g.replaceWith(...u)}if(n===t)break}const a=c.querySelector(`#comment${o}`);return a&&!a.closest("[hidden]")?a:null}function Ue(e,t){ye=requestAnimationFrame(()=>{ye=null,!(p||t!==ne||!e.isConnected)&&(e.tabIndex=-1,e.focus({preventScroll:!0}),Yt(e,{block:"center"}),e.matches("article.comment")&&!e.closest("[data-comment-target-root]")&&(ie=!1,be()),e.classList.add("comment--highlighted"),qe=setTimeout(()=>e.classList.remove("comment--highlighted"),5e3))})}async function rt(e){Fe();const t=st();if(zt(),ie=t!==null,be(),!t||!He||p)return;const o=ne;let a=ft([...v.filter(C),...Q(Ze()).filter(C)],t),n=a?Vt(a):null;if(!n)try{let r=e;if(!r&&!a){const i=new AbortController;Me=i,Ce(s("comments:target.loading"));const l=await wt({page:1,target:t,signal:i.signal});if(!l)throw new Error("Comment visibility changed");if(r=l,i.signal.aborted||o!==ne||p)return;if(r.status!=="ok"||!Array.isArray(r.data?.comments))throw new Error("Invalid response")}if(o!==ne||p)return;if(r){const i=[...r.data.comments.filter(C),...r.data.targetComment?[r.data.targetComment]:[]],l=Q(i,r.data.isCurrentUserModerator&&I).filter(C);tt(l),a=ft(l,t)}a&&!a.some(i=>i.isHiddenByIgnore)&&(Bn(a[0]),n=Vt(a))}catch{if(o!==ne||p)return;Ue(Ce(s("comments:target.error"),!0),o);return}finally{o===ne&&(Me=null)}if(!(o!==ne||p)){if(zt(),a?.some(r=>r.isHiddenByIgnore)){Ue(Ce(s("comments:target.ignored")),o);return}if(!n){Ue(Ce(s("comments:target.unavailable")),o);return}n.closest("[data-comment-target-root]")||Ce(s("comments:target.label")),Ue(n,o)}}function zt(){j?.remove(),j=null}const Kt=()=>{$e===null&&He&&($e=window.scrollY),rt()};return window.addEventListener("hashchange",Kt,{signal:ce.signal}),window.addEventListener("comments:target",Kt,{signal:ce.signal}),be(),we(),_n}async function pt(_){const m=window.RECAPTCHA_SITE_KEY;return!m||!window.grecaptcha?"":new Promise(p=>{window.grecaptcha?.ready(()=>{window.grecaptcha?.execute(m,{action:_}).then(p).catch(()=>p(""))})})}function Ie(_,m){_.querySelector(".comment-action-flash")?.remove();const p=document.createElement("span");p.className="comment-action-flash",p.textContent=m,_.appendChild(p),setTimeout(()=>{p.classList.add("comment-action-flash--fade-out"),setTimeout(()=>p.remove(),200)},1200)}function F(_,m="success"){const p=document.createElement("div");p.className=`toast toast--${m}`,p.innerHTML=`
188    <span class="toast__message">${R(_)}</span>
189    <button type="button" class="toast__close" aria-label="${s("toast.close_label")}">
190      <i data-lucide="x" class="icon"></i>
191    </button>
192  `;let $=document.querySelector(".toast-container");$||($=document.createElement("div"),$.className="toast-container",document.body.appendChild($)),$.appendChild(p),x(),p.querySelector(".toast__close")?.addEventListener("click",()=>{p.remove()}),setTimeout(()=>{p.classList.add("toast--fade-out"),setTimeout(()=>p.remove(),300)},5e3)}function R(_){const m=document.createElement("div");return m.textContent=_,m.innerHTML}function T(_){return _.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}export{jo as initCommentsArticle};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.