1<!DOCTYPE html> 2<html lang="ar" dir="rtl"> 3 4<head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> 7 8 9 10 <title>Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© - أخبار</title> 11 <meta name="title" content="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© - أخبار" /> 12 <meta name="description" content=" ÙÙØ¯Ù اÙÙ Ø¹Ø§ÙØ¬Ø§Øª Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© ÙØ§ÙتØÙÙÙØ§Øª اÙÙ Ø¹Ù ÙØ© اÙ٠رتبطة Ø¨Ø§ÙØ´Ø£Ù اÙÙÙØ³Ø·ÙÙÙ ÙØªØ£Ø«Ùرات٠إÙÙÙÙ ÙØ§ ÙØ¯ÙÙÙØ§ عبر ÙÙØ§Ùب ØªØ±ÙØ² عÙ٠اÙÙ ÙÙÙØ©" /> 13 <meta name="author" content="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©" /> 14 <meta name="keywords" content="Ø´Ø¨ÙØ© ÙØ¯Ø³,ÙÙØ§ÙØ© ÙØ¯Ø³,صØÙÙØ© اÙÙØ¯Ø³,jerusalem,أخبار اÙÙØ¯Ø³,اÙÙØ¯Ø³ عاص٠ة,أخبار,ÙÙØ³Ø·ÙÙ,غزة,اÙÙØ¯Ø³ Ø§ÙØ´Ø±ÙÙØ©,اÙÙØ¯Ø³ Ø§ÙØºØ±Ø¨ÙØ©,ÙØ¯Ø³Ùا,Ø§ÙØ¶ÙØ©,ÙÙØ³Ø¨ÙÙ ÙØ¯Ø³,ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©,خبر,خبر برس,برس,ØµÙØØ© ÙÙØ³Ø¨ÙÙ,أخبار ÙÙØ³Ø¨ÙÙ,Ø£ÙØ¨Ø§Ø¡ ÙØ¯Ø³,Ø£ÙØ±Ø´Ø§ÙÙÙ ,Ø¬ÙØ±ÙزاÙÙÙ ,Ø¥ÙØªØØ§Ù ,Ø¥ÙÙØ¬Ø§Ø±,ÙØµÙ,إختطاÙ,Ø¥Ø¹ØªÙØ§Ù,٠عتÙÙ,Ø£Ø³ÙØ±,أسرÙ,Ø§ÙØ¥ØØªÙاÙ,ÙØ¯Ø³ ÙØª,Ø§ÙØªØ®Ø§Ø¨Ø§Øª,Ø§ÙØªØ®Ø§Ø¨Ø§Øª ÙÙØ³Ø·ÙÙ,ØÙ اس,ÙØªØ,Ø§ÙØ¬Ùاد,Ø³Ø±Ø§ÙØ§,ÙØ³Ø§Ù ,اÙÙØ¯Ø³" /> 15 <meta name="theme-color" content="#2b74bd"> 16 17 18 <meta property="og:type" content="website" /> 19 <meta property="og:site_name" content="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©" /> 20 <meta property="og:title" content="أخبار" /> 21 <meta property="og:description" content="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©Ø Ø¹Ø§Ø¬Ù ÙØªØÙÙÙØ§Øª Ø§ÙØ£Ø®Ø¨Ø§Ø± ٠٠اÙÙØ¯Ø³ ÙÙÙØ³Ø·Ù٠إÙÙ Ø§ÙØ¹Ø§ÙÙ Ø§ÙØ¢Ù | ÙÙØ§ÙØ©Ø ØµØÙÙØ© Ø¥ÙÙØªØ±ÙÙÙØ©Ø Ù ÙÙØ¹Ø ÙÙØ³Ø¨ÙÙØ ÙØª Quds News Network" /> 22 <meta property="og:locale" content="ar_AR" /> 23 <meta property="og:image" content="https://qudsn.co/og/02dbfcf970eda8d246bd275c321840b0407d1f5b.jpg" /> 24 <meta property="og:image:secure_url" content="https://qudsn.co/og/02dbfcf970eda8d246bd275c321840b0407d1f5b.jpg" /> 25 <meta property="og:image:alt" content="أخبار" /> 26 <meta property="og:url" content="https://qudsn.co/category_news/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1" /> 27 28 29 <meta name="twitter:card" content="summary_large_image" /> 30 <meta name="twitter:title" content="أخبار" /> 31 <meta name="twitter:description" content="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©Ø Ø¹Ø§Ø¬Ù ÙØªØÙÙÙØ§Øª Ø§ÙØ£Ø®Ø¨Ø§Ø± ٠٠اÙÙØ¯Ø³ ÙÙÙØ³Ø·Ù٠إÙÙ Ø§ÙØ¹Ø§ÙÙ Ø§ÙØ¢Ù | ÙÙØ§ÙØ©Ø ØµØÙÙØ© Ø¥ÙÙØªØ±ÙÙÙØ©Ø Ù ÙÙØ¹Ø ÙÙØ³Ø¨ÙÙØ ÙØª Quds News Network" /> 32 <meta name="twitter:image" content="https://qudsn.co/og/02dbfcf970eda8d246bd275c321840b0407d1f5b.jpg" /> 33 <meta name="twitter:image:alt" content="أخبار" /> 34 <meta name="twitter:site" content="@QudsN" /> 35 <meta name="twitter:creator" content="@QudsN" /> 36 37 38 <link rel="canonical" href="https://qudsn.co/category_news/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1" /> 39 <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" /> 40 41 42 <link rel="alternate" type="application/rss+xml" title="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© RSS" 43 href="https://qudsn.co/rss/category/all" /> 44 45 46
46<script type="application/ld+json"> 47 {"@context":"https://schema.org","@type":"NewsMediaOrganization","name":"Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©","url":"https://qudsn.co","logo":"https://fsn1.your-objectstorage.com/qudsn/uploads/2026/08/file_6a6f0b281cbc8.png"} 48 </script>
48 49
49<script type="application/ld+json"> 50 {"@context":"https://schema.org","@type":"WebSite","name":"Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©","url":"https://qudsn.co","inLanguage":"ar","potentialAction":{"@type":"SearchAction","target":"https://qudsn.co/search_page?search={search_term_string}","query-input":"required name=search_term_string"}} 51 </script>
51 52 53 <link rel="shortcut icon" type="image/png" 54 href="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/08/file_6a6f0b463c00e.ico" /> 55 56 <link rel="manifest" href="https://qudsn.co/manifest.webmanifest"> 57 <link rel="apple-touch-icon" href="/assets/main/quds_ar/img/apple-touch-icon.png"> 58 <meta name="apple-mobile-web-app-capable" content="yes"> 59 <meta name="mobile-web-app-capable" content="yes"> 60 <meta name="apple-mobile-web-app-title" content="ÙØ¯Ø³"> 61 62 63 64 65 <link rel="preload" href="/assets/main/quds_ar/fonts/ibm-plex-sans-arabic/plex-arabic-400-core.woff2" as="font" type="font/woff2" crossorigin> 66 <link rel="preload" href="/assets/main/quds_ar/fonts/ibm-plex-sans-arabic/plex-arabic-600-core.woff2" as="font" type="font/woff2" crossorigin> 67 <link rel="preload" href="/assets/main/quds_ar/fonts/ibm-plex-sans-arabic/plex-arabic-700-core.woff2" as="font" type="font/woff2" crossorigin> 68 <link rel="preload" href="/assets/main/quds_ar/vendor/fontawesome/webfonts/fa-solid-900-subset.woff2" as="font" type="font/woff2" crossorigin> 69 <link rel="preload" href="/assets/main/quds_ar/vendor/fontawesome/webfonts/fa-regular-400-subset.woff2" as="font" type="font/woff2" crossorigin> 70 71 72 <link rel="stylesheet" data-fa-full data-href="/assets/main/quds_ar/vendor/fontawesome/css/all.min.css?v=1789735121"> 73 <noscript><link rel="stylesheet" href="/assets/main/quds_ar/vendor/fontawesome/css/all.min.css?v=1789735121"></noscript> 74 <link rel="stylesheet" href="/assets/main/quds_ar/vendor/fontawesome/css/fa.subset.css?v=1789735121"> 75 <link rel="stylesheet" href="/assets/main/quds_ar/vendor/swiper/swiper.subset.css?v=1789735121"> 76 <link rel="stylesheet" href="/assets/main/quds_ar/vendor/aos/aos.subset.css?v=1789735121"> 77 78 79 <link rel="stylesheet" href="/assets/main/quds_ar/css/style.css?v=1790873097"> 80 <link rel="stylesheet" href="/assets/main/quds_ar/css/pages.css?v=1790796903"> 81 82 83
83<script> 84 (function () { 85 var root = document.documentElement, t; 86 try { t = localStorage.getItem('qd_theme'); } catch (e) {} 87 if (t !== 'dark' && t !== 'light') { 88 t = (window.matchMedia && matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; 89 } 90 root.setAttribute('data-qtheme', t); 91 })(); 92 </script>
92 93 <link rel="stylesheet" href="/assets/main/quds_ar/css/modes.css?v=1787676073"> 94 95 96 <style> 97 .clamp-2, .clamp-3 { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; } 98 .clamp-2 { -webkit-line-clamp: 2; line-clamp: 2; } 99 .clamp-3 { -webkit-line-clamp: 3; line-clamp: 3; } 100 101 /* live search suggestions (autocomplete dropdown) */ 102 .search-suggest { margin-top: 16px; display: flex; flex-direction: column; gap: 4px; max-height: 360px; overflow-y: auto; } 103 .search-suggest__item { display: flex; flex-direction: column; gap: 3px; padding: 11px 14px; border-radius: 10px; border: 1px solid transparent; transition: .15s; cursor: pointer; } 104 .search-suggest__item:hover, .search-suggest__item.is-active { background: var(--bg-blue); border-color: var(--line); } 105 .search-suggest__cat { font-size: 11.5px; font-weight: 700; color: var(--accent); } 106 .search-suggest__cat i { margin-inline-end: 5px; } 107 .search-suggest__item--podcast .search-suggest__cat { color: #7c3aed; } 108 .search-suggest__item--video .search-suggest__cat { color: #dc2626; } 109 .search-suggest__item--tag .search-suggest__cat { color: var(--muted); } 110 .search-suggest__title { font-size: 14.5px; font-weight: 600; color: var(--ink); line-height: 1.55; } 111 .search-suggest__state { padding: 16px 6px; text-align: center; color: var(--muted); font-size: 14px; } 112 .search-suggest__state i { color: var(--accent); margin-inline-end: 6px; } 113 114 /* newsletter inline error */ 115 .news-form__error { margin-top: 10px; color: #fff; background: rgba(220,53,69,.92); padding: 8px 14px; border-radius: 10px; font-size: 13.5px; font-weight: 600; } 116 117 /* most-read tabs (24h / week / all-time) */ 118 [x-cloak] { display: none !important; } 119 .mr-tabs { display: flex; flex-wrap: wrap; gap: 8px; } 120 .mr-tab { font-size: 13px; font-weight: 700; color: var(--muted); background: var(--bg); border: 1px solid var(--line); padding: 7px 15px; border-radius: 30px; cursor: pointer; transition: .15s; font-family: inherit; } 121 .mr-tab:hover { color: var(--ink); border-color: var(--accent); } 122 .mr-tab.is-active { background: var(--accent); color: #fff; border-color: var(--accent); } 123 .mr-item { display: flex; align-items: center; gap: 12px; } 124 125 /* read-aloud (TTS) bar */ 126 .tts-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 16px 0 6px; } 127 .tts-bar__play { display: inline-flex; align-items: center; gap: 9px; background: var(--accent); color: #fff; border: none; font-family: inherit; font-weight: 700; font-size: 14.5px; padding: 10px 20px; border-radius: 30px; cursor: pointer; transition: .15s; } 128 .tts-bar__play:hover { filter: brightness(1.07); } 129 .tts-bar__play.is-active { background: var(--accent-dark, #1f5fa8); } 130 .tts-bar__controls { display: inline-flex; align-items: center; gap: 6px; } 131 .tts-bar__btn { width: 36px; height: 36px; border-radius: 50%; border: 1px solid var(--line); background: var(--bg); color: var(--ink); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; } 132 .tts-bar__btn:hover { border-color: var(--accent); color: var(--accent); } 133 .tts-bar__sep { width: 1px; height: 22px; background: var(--line); margin: 0 4px; } 134 .tts-bar__rate { border: 1px solid var(--line); background: var(--bg); color: var(--muted); font-family: inherit; font-weight: 700; font-size: 12.5px; padding: 6px 11px; border-radius: 20px; cursor: pointer; } 135 .tts-bar__rate.is-active { background: var(--accent); color: #fff; border-color: var(--accent); } 136 137 /* ===== audio news digest Â«Ù ÙØ¬Ø² Ø§ÙØ£Ø®Ø¨Ø§Ø±Â» ===== */ 138 .newsbrief { display: grid; grid-template-columns: 1fr; border-radius: 20px; overflow: hidden; box-shadow: var(--shadow-card, 0 18px 44px rgba(15, 35, 60, .14)); border: 1px solid var(--line); background: var(--bg); } 139 @media (min-width: 900px) { .newsbrief { grid-template-columns: minmax(330px, 38%) 1fr; } } 140 .newsbrief__player { position: relative; overflow: hidden; padding: 30px 28px; color: #fff; background: linear-gradient(145deg, #0f2a48 0%, var(--accent-dark, #1c4a70) 55%, var(--accent, #2f7fcf) 150%); display: flex; flex-direction: column; } 141 .newsbrief__blob { position: absolute; width: 240px; height: 240px; border-radius: 50%; background: radial-gradient(circle, rgba(255,255,255,.16), transparent 65%); inset-block-start: -90px;
141 inset-inline-start: -70px; pointer-events: none; } 142 .newsbrief__badge { position: relative; align-self: flex-start; display: inline-flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 800; letter-spacing: .3px; background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.28); padding: 6px 14px; border-radius: 30px; } 143 .newsbrief__title { position: relative; font-size: 28px; font-weight: 800; margin: 16px 0 6px; } 144 .newsbrief__sub { position: relative; font-size: 13.5px; color: #d6e6f6; margin-bottom: 22px; } 145 .newsbrief__controls { position: relative; margin-top: auto; display: flex; align-items: center; gap: 14px; } 146 .newsbrief__play { flex: none; width: 58px; height: 58px; border-radius: 50%; border: none; cursor: pointer; background: var(--bg); color: var(--accent-dark, #1f5fa8); font-size: 20px; box-shadow: 0 8px 22px rgba(0,0,0,.25); transition: transform .15s; display: inline-flex; align-items: center; justify-content: center; } 147 .newsbrief__play:hover { transform: scale(1.06); } 148 .newsbrief__eq { display: inline-flex; align-items: flex-end; gap: 3px; height: 24px; } 149 .newsbrief__eq span { width: 3px; height: 7px; background: rgba(255,255,255,.55); border-radius: 2px; } 150 .newsbrief__player.is-playing .newsbrief__eq span { animation: nbEq .9s ease-in-out infinite; } 151 .newsbrief__player.is-playing .newsbrief__eq span:nth-child(2) { animation-delay: .12s; } 152 .newsbrief__player.is-playing .newsbrief__eq span:nth-child(3) { animation-delay: .24s; } 153 .newsbrief__player.is-playing .newsbrief__eq span:nth-child(4) { animation-delay: .36s; } 154 .newsbrief__player.is-playing .newsbrief__eq span:nth-child(5) { animation-delay: .48s; } 155 @keyframes nbEq { 0%, 100% { height: 7px; } 50% { height: 22px; } } 156 .newsbrief__track { flex: 1; height: 6px; border-radius: 6px; background: rgba(255,255,255,.22); overflow: hidden; } 157 .newsbrief__progress { width: 0; height: 100%; background: var(--bg); border-radius: 6px; transition: width .25s linear; } 158 .newsbrief__time { font-size: 12.5px; font-weight: 700; color: #d6e6f6; min-width: 38px; } 159 .newsbrief__list { margin: 0; padding: 12px 10px; list-style: none; display: flex; flex-direction: column; } 160 .newsbrief__list li + li { border-top: 1px solid var(--line); } 161 .newsbrief__list a { display: flex; align-items: center; gap: 14px; padding: 13px 14px; border-radius: 12px; transition: background .15s; } 162 .newsbrief__list a:hover { background: var(--bg-blue, #f3f7fb); } 163 .newsbrief__num { flex: none; font-size: 13px; font-weight: 800; color: var(--accent); width: 26px; } 164 .newsbrief__headline { flex: 1; font-size: 15px; font-weight: 600; color: var(--ink); line-height: 1.55; } 165 .newsbrief__go { color: var(--muted-3, #a4a9b2); font-size: 14px; } 166 .newsbrief__list a:hover .newsbrief__go { color: var(--accent); } 167 </style> 168 169 170 <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 96 bytes, lines 170-171
170 171<script type="text/devlo-deferred" async data-src="https://www.googletagmanager.com/gtag/js?id=
171UA-38391677-1
vendor: 12 bytes, line 171
171"></script>
172<script> 173
vendor: 134 bytes, lines 173-177
173window.dataLayer = window.dataLayer || []; 174 function gtag(){dataLayer.push(arguments);} 175 gtag('js', new Date()); 176 177 gtag('config', '
177UA-38391677-1
vendor: 4 bytes, line 177
177');
178</script>
178 179
180<script type="text/devlo-deferred" async data-src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8563461161168276" 181 crossorigin="anonymous"></script>
181 182
183<script>function coronavirus(){var TotalCases=JSON.parse(this.responseText);document.querySelector("#TotalCases").innerHTML=TotalCases.data.TotalCases;var TotalActiveCases=JSON.parse(this.responseText);document.querySelector("#TotalActiveCases").innerHTML=TotalActiveCases.data.TotalActiveCases;var TotalRecovery=JSON.parse(this.responseText);document.querySelector("#TotalRecovery").innerHTML=TotalRecovery.data.TotalRecovery;var TotalCriticalCases=JSON.parse(this.responseText);document.querySelector("#TotalCriticalCases").innerHTML=TotalCriticalCases.data.TotalCriticalCases;var TotalDeath=JSON.parse(this.responseText);document.querySelector("#TotalDeath").innerHTML=TotalDeath.data.TotalDeath;} var coronavirusupdate=new XMLHttpRequest();coronavirusupdate.addEventListener("load",coronavirus);coronavirusupdate.open("GET","https://corona.ps/API/summary");coronavirusupdate.send();</script>
183 184 185<meta name="google-adsense-account" content="ca-pub-8563461161168276">
186<script> 187/* Replays the third-party
187<script src> tags above once the page has loaded. 188 Order is preserved; async/defer/crossorigin and every data-* attribute other 189 than data-src are carried over untouched. */ 190(function () { 191 if (window.__devloDeferredCode) { return; } 192 window.__devloDeferredCode = true; 193 194 function idle(fn, timeout) { 195 if (window.requestIdleCallback) requestIdleCallback(fn, { timeout: timeout || 2000 }); 196 else setTimeout(fn, 0); 197 } 198 199 /* 200 * ONE AT A TIME, each in its own idle slot. 201 * 202 * Releasing them together only moves the pile-up: analytics and the ad 203 * stack then boot in the same burst and hold the main thread through it, 204 * which is exactly the stall this defer exists to avoid â just later in the 205 * page's life, where it lands on a reader who has started scrolling. 206 * Waiting for each to finish before asking for the next slot leaves gaps 207 * the browser can spend on input instead. 208 * 209 * Errors and blocked requests (an ad blocker, an offline visitor) resolve 210 * the same way a load does, so one refused script can never strand the 211 * ones behind it. 212 */ 213 function next(tags, i) { 214 if (i >= tags.length) { return; } 215 216 var old = tags[i]; 217 var s = document.createElement('script'); 218 for (var a = 0; a < old.attributes.length; a++) { 219 var at = old.attributes[a]; 220 if (at.name === 'type' || at.name === 'data-src') { continue; } 221 s.setAttribute(at.name, at.value); 222 } 223 224 var moved = false; 225 function advance() { 226 if (moved) { return; } 227 moved = true; 228 idle(function () { next(tags, i + 1); }, 1000); 229 } 230 s.addEventListener('load', advance, { once: true }); 231 s.addEventListener('error', advance, { once: true }); 232 // A script that never fires either event must not strand the queue. 233 setTimeout(advance, 4000); 234 235 s.src = old.getAttribute('data-src'); 236 old.parentNode.insertBefore(s, old); 237 old.parentNode.removeChild(old); 238 } 239 240 function run() { 241 next(document.querySelectorAll('script[type="text/devlo-deferred"]'), 0); 242 } 243 244 /* 245 * "After load" stopped being late enough. 246 * 247 * Once the page got lighter the load event moved from ~1.2s to ~0.45s, so 248 * releasing on load put the ad stack back on the main thread WHILE the 249 * article was still painting â the exact contention this defer exists to 250 * avoid, just reached sooner. Wait for the largest contentful paint to 251 * settle instead: that is the frame the reader came for, and it is the 252 * honest definition of "the page is ready for someone else's code". 253 * 254 * The observer reports a new candidate each time a bigger element paints, 255 * so the signal is not the first entry but a quiet gap after one. A 6s cap 256 * from load runs them regardless â on a browser with no LCP support, a page 257 * that never produces a candidate, or a reader who just sits still. 258 */ 259 function whenContentSettled(cb) { 260 var fired = false; 261 function go() { 262 if (fired) { return; } 263 fired = true; 264 idle(cb, 2000); 265 } 266 267 setTimeout(go, 6000); 268 269 try { 270 var quiet = null; 271 var po = new PerformanceObserver(function () { 272 clearTimeout(quiet); 273 quiet = setTimeout(function () { 274 try { po.disconnect(); } catch (e) { /* already gone */ } 275 go(); 276 }, 700); 277 }); 278 po.observe({ type: 'largest-contentful-paint', buffered: true }); 279 } catch (e) { 280 // No LCP observer here: fall back to a short settle after load. 281 setTimeout(go, 1500); 282 } 283 } 284 285 if (document.readyState === 'complete') { whenContentSettled(run); } 286 else { window.addEventListener('load', function () { whenContentSettled(run); }, { once: true }); } 287})(); 288</script>
288 289
289<script> 290 (function () { 291 // Relative on purpose: this HTML gets written to disk and replayed, so a 292 // baked absolute URL would carry whatever scheme/host the seeding render 293 // computed â an http:// APP_URL behind Cloudflare TLS turns the refresh 294 // into blocked mixed content on every visitor. 295 var ENDPOINT = '\/__csrf'; 296 297 /* 298 * Livewire's getCsrfToken() tries meta[name="csrf-token"], then 299 * [data-csrf], then window.livewireScriptConfig.csrf, and takes the 300 * first that exists. Only four themes emit the meta tag; on the rest the 301 * live value is the data-csrf attribute Livewire puts on its own script 302 * tag, so patching the meta alone would fix nothing there. Read and 303 * write all of them, in that same order. 304 */ 305 function currentToken() { 306 var tag = document.querySelector('meta[name="csrf-token"]'); 307 if (tag) { 308 return tag.getAttribute('content'); 309 } 310 var holder = document.querySelector('[data-csrf]'); 311 if (holder) { 312 return holder.getAttribute('data-csrf'); 313 } 314 return (window.livewireScriptConfig && window.livewireScriptConfig.csrf) || null; 315 } 316 317 function apply(token) { 318 var i; 319 var metas = document.querySelectorAll('meta[name="csrf-token"]'); 320 for (i = 0; i < metas.length; i++) { 321 metas[i].setAttribute('content', token); 322 } 323 var holders = document.querySelectorAll('[data-csrf]'); 324 for (i = 0; i < holders.length; i++) { 325 holders[i].setAttribute('data-csrf', token); 326 } 327 // Plain form POSTs (the newsletter) carry their own baked copy. 328 var fields = document.querySelectorAll('input[name="_token"]'); 329 for (i = 0; i < fields.length; i++) { 330 fields[i].value = token; 331 } 332 if (window.livewireScriptConfig) { 333 window.livewireScriptConfig.csrf = token; 334 } 335 } 336 337 // The token the server last confirmed is live for this visitor's session. 338 // Survives wire:navigate: this
338<script> is byte-identical on every page, 339 // and Livewire's mergeNewHead skips head assets it already has, so this 340 // closure is never re-created and no listener is ever bound twice. 341 var known = null; 342 var pending = null; 343 344 /** 345 * Resolves with the live token, or null. One request at a time: a 346 * caller that arrives while one is in the air waits on the same one. 347 */ 348 function refresh() { 349 if (pending) { 350 return pending; 351 } 352 353 try { 354 pending = fetch(ENDPOINT, { 355 headers: { 'Accept': 'application/json' }, 356 credentials: 'same-origin', 357 // This runs while the <head> is still parsing, so without a 358 // hint the browser schedules it alongside the stylesheets 359 // and the LCP image. Nothing waits on the token â it only 360 // has to land before the first interaction â so let the 361 // render-critical requests go first. Ignored where Priority 362 // Hints are unsupported, which just restores the old timing. 363 priority: 'low', 364 }) 365 .then(function (r) { return r.ok ? r.json() : null; }) 366 .then(function (data) { 367 pending = null; 368 if (!data || !data.token) { 369 return null; 370 } 371 known = data.token; 372 apply(known); 373 // This runs from <head>, and both the _token fields and 374 // Livewire's data-csrf script tag live further down the 375 // page â they may not exist yet when the fetch lands. 376 if (document.readyState === 'loading') { 377 document.addEventListener('DOMContentLoaded', function () { 378 apply(known); 379 }, { once: true }); 380 } 381 382 return known; 383 }) 384 .catch(function () { pending = null; return null; }); 385 } catch (e) { 386 // No fetch (ancient browser) â leave the baked token alone. 387 pending = null; 388 389 return Promise.resolve(null); 390 } 391 392 return pending; 393 } 394 395 function hasXsrfCookie() { 396 return /(^|;\s*)XSRF-TOKEN=/.test(document.cookie); 397 } 398 399 /* 400 * Two signals now, because the cookie alone was wrong for the visitor 401 * who matters most here. 402 * 403 * No cookie still means «this HTML came off disk», and it is known 404 * while the <head> is still parsing â so that fetch goes out as early 405 * as it always did. 406 * 407 * The second signal is the page's own token, and it is the exact one: 408 * a cached copy carries NO token at all, since PageCsrfToken::strip 409 * empties every holder before the file is written. A reader who 410 * already held an XSRF-TOKEN from an earlier live page used to be 411 * taken for a live render and left with the token the file was seeded 412 * with, so their next click answered 419 â «This page has expired», a 413 * maktoob reader on the archive's pagination, 2026-09-22. Read after 414 * DOMContentLoaded on purpose: on the themes that emit no meta tag the 415 * live value is Livewire's data-csrf attribute, and that script tag is 416 * at the end of <body>, nowhere near this one. 417 */ 418 if (!hasXsrfCookie()) { 419 refresh(); 420 } else if (document.readyState === 'loading') { 421 document.addEventListener('DOMContentLoaded', adopt, { once: true }); 422 } else { 423 adopt(); 424 } 425 426 /** This page's own token, when it has one: it IS the session's. */ 427 function adopt() { 428 var baked = currentToken(); 429 430 if (baked) { 431 // Recording it costs nothing and gives the navigation check 432 // below a baseline. 433 known = baked; 434 } else {
435 watchForIntent(); 436 } 437 } 438 439 /* 440 * A cached page in the hands of a visitor who already has a session. 441 * Asking for the token on load would put one request â and one row in 442 * a `sessions` table that reached 8.6M on maktoob â behind every view 443 * of the most-visited pages on the site, which is the cost these 444 * caches exist to remove. So the token is fetched the moment the 445 * visitor reaches for something that will need it, and a reader who 446 * only reads never asks at all. A click that lands before the answer 447 * does is what the 419 net below is for. 448 */ 449 var watching = false; 450 451 function watchForIntent() { 452 if (watching) { 453 return; 454 } 455 watching = true; 456 457 ['pointerdown', 'focusin', 'keydown'].forEach(function (name) { 458 document.addEventListener(name, onIntent, true); 459 }); 460 } 461 462 function onIntent(event) { 463 if (!event.target || !needsToken(event.target)) { 464 return; 465 } 466 467 ['pointerdown', 'focusin', 'keydown'].forEach(function (name) { 468 document.removeEventListener(name, onIntent, true); 469 }); 470 watching = false; 471 472 refresh(); 473 } 474 475 /** A `wire:` control or a form â anything else needs no token. */ 476 function needsToken(target) { 477 for (var el = target; el && el.nodeType === 1; el = el.parentElement) { 478 if (el.tagName === 'FORM') { 479 return true; 480 } 481 482 for (var i = 0; i < el.attributes.length; i++) { 483 if (el.attributes[i].name.indexOf('wire:') === 0) { 484 return true; 485 } 486 } 487 } 488 489 return false; 490 } 491 492 /* 493 * wire:navigate does not preserve the fix. mergeNewHead() treats only 494 *
494<script>/<style>/stylesheet <link> as assets and deletes every other 495 * head child, so a patched meta is dropped for the incoming page's own â 496 * and the body, data-csrf script tag included, is swapped wholesale. 497 * Whenever that incoming page is itself a cache HIT the token is stale 498 * again. But the session's token does not change between navigations, so 499 * a token we already fetched can simply be re-applied â instant, and one 500 * request for the whole visit instead of one per cached page. Only a 501 * visitor who has never held a live token asks the server. 502 */ 503 document.addEventListener('livewire:navigated', function () { 504 var now = currentToken(); 505 506 if (!known) { 507 // Nothing held yet: the incoming page's own token, if it has 508 // one, is the session's; a cached one has none and must ask. 509 if (now) { 510 known = now; 511 } else if (hasXsrfCookie()) { 512 watchForIntent(); 513 } else { 514 refresh(); 515 } 516 517 return; 518 } 519 520 if (now !== known) { 521 apply(known); 522 } 523 }); 524 525 /* 526 * The net under all of it. 527 * 528 * Whatever is repaired above, a token can still be wrong when the 529 * request goes out: a tab left open until `sessions:prune` removed its 530 * row, a cached file written before this shipped, a click that landed 531 * while the fetch was still in the air. Livewire answers a 419 with a 532 * native confirm() â «This page has expired. Would you like to refresh 533 * the page?» â which blocks the JS thread, so whatever the reader 534 * pressed also stays frozen behind the dialog. 535 * 536 * So the dialog is suppressed, a fresh token fetched, and the action 537 * that failed sent once more. The 419 stopped the request at the CSRF 538 * middleware, before the component ran, so nothing happened twice. 539 */ 540 var recoveries = 0; 541 var hooked = false; 542 543 function hookLivewire() { 544 if (hooked || !window.Livewire || !window.Livewire.hook) { 545 return; 546 } 547 hooked = true; 548 549 var sent = []; 550 551 window.Livewire.hook('commit', function (context) { 552 var entry = { component: context.component, commit: context.commit, done: false }; 553 554 sent.push(entry); 555 if (sent.length > 10) { 556 sent.shift(); 557 } 558 559 context.succeed(function () { entry.done = true; }); 560 }); 561 562 window.Livewire.hook('request', function (context) { 563 context.fail(function (failure) { 564 if (failure.status !== 419) { 565 return; 566 } 567 568 // No confirm(); the request's finish hooks then run as 569 // usual, so wire:loading states release. 570 failure.preventDefault(); 571 572 // Twice, so a token that is somehow wrong again stops 573 // instead of looping. 574 if (recoveries >= 2) { 575 return; 576 } 577 recoveries++; 578 579 var again = sent.filter(function (entry) { return !entry.done; }); 580 sent = []; 581 582 known = null; 583 584 refresh().then(function (token) { 585 if (token) { 586 again.forEach(replay); 587 } 588 }); 589 }); 590 }); 591 } 592 593 /** Send a failed commit again, now that the page holds a live token. */ 594 function replay(entry) { 595 var wire = entry.component && entry.component.$wire; 596 if (!wire) { 597 return; 598 } 599 600 var updates = entry.commit.updates || {}; 601 var calls = (entry.commit.calls || []).filter(function (call) { 602 // `$set` IS the updates below â replaying it as a call would 603 // send the magic method with no arguments. 604 return call.method && call.method !== '$set'; 605 }); 606 607 // Everything fired in this tick coalesces into one request.
608 Object.keys(updates).forEach(function (name) { 609 try { wire.set(name, updates[name]); } catch (e) {} 610 }); 611 612 calls.forEach(function (call) { 613 try { wire.call.apply(wire, [call.method].concat(call.params || [])); } catch (e) {} 614 }); 615 } 616 617 document.addEventListener('livewire:init', hookLivewire); 618 hookLivewire(); 619 })(); 620</script>
620 621 622 623
623<script> 624 (function () { 625 var URL = '\/__view'; 626 var ARMED = []; 627 var PAGE = JSON.parse('{\u0022k\u0022:\u0022category\u0022,\u0022p\u0022:\u0022\\\/category_news\\\/\\u0623\\u062e\\u0628\\u0627\\u0631\u0022,\u0022s\u0022:\u0022a2ecc61e448a84913f26a4118fa3792a\u0022}'); 628 var sent = {}; 629 var pending = {}; 630 var pageTimers = []; 631 632 function enc(v) { return encodeURIComponent(v); } 633 634 function send(body) { 635 try { 636 if (navigator.sendBeacon && navigator.sendBeacon(URL, new Blob([body], {type: 'application/x-www-form-urlencoded'}))) return; 637 } catch (e) {} 638 try { 639 fetch(URL, { 640 method: 'POST', 641 body: body, 642 headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 643 credentials: 'same-origin', 644 keepalive: true 645 }).catch(function () {}); 646 } catch (e) {} 647 } 648 649 // `phase`: 'o' = opened it, 'r' = stayed on it. 650 function itemBody(p, phase) { 651 return 't=' + enc(p.t) + '&i=' + enc(p.i) + '&s=' + enc(p.s) + '&p=' + phase; 652 } 653 function pageBody() { 654 if (!PAGE) return ''; 655 return 'k=' + enc(PAGE.k) + '&pp=' + enc(PAGE.p) + '&ps=' + enc(PAGE.s) 656 + '&tt=' + enc((document.title || '').slice(0, 180)); 657 } 658 659 function post(p, phase) { 660 var key = phase + ':' + p.t + ':' + p.i; 661 if (sent[key]) return; 662 sent[key] = 1; 663 send(itemBody(p, phase)); 664 } 665 666 // Visible-time timer: accumulates only while `wanted` AND the tab is 667 // visible; calls done() once `need` ms have been reached. need = 0 is 668 // "as soon as the page is really on screen", which is what an open is. 669 function timer(need, done) { 670 var acc = 0, since = null, handle = null, dead = false, wanted = true; 671 function elapsed() { return acc + (since === null ? 0 : Date.now() - since); } 672 function check() { 673 if (dead) return; 674 if (elapsed() >= need) { dead = true; clearTimeout(handle); done(); } 675 else schedule(); 676 } 677 function schedule() { clearTimeout(handle); handle = setTimeout(check, Math.max(50, need - elapsed())); } 678 function sync() { 679 if (dead) return; 680 var run = wanted && !document.hidden; 681 if (run && since === null) { since = Date.now(); schedule(); } 682 else if (!run && since !== null) { acc += Date.now() - since; since = null; clearTimeout(handle); } 683 } 684 document.addEventListener('visibilitychange', sync); 685 sync(); 686 return { 687 pause: function () { wanted = false; sync(); }, 688 resume: function () { wanted = true; sync(); }, 689 cancel: function () { dead = true; clearTimeout(handle); } 690 }; 691 } 692 693 // ââ The load report: the page, plus the open of what it shows. One 694 // request when both exist â an article page must not cost more 695 // round-trips than it did before the page stat existed. 696 pageTimers.push(timer(0, function () { 697 var page = pageBody(); 698 var first = ARMED.length ? ARMED[0] : null; 699 700 if (first) { 701 sent['o:' + first.t + ':' + first.i] = 1; 702 send(itemBody(first, 'o') + (page ? '&' + page : '')); 703 } else if (page) { 704 send(page); 705 } 706 707 for (var i = 1; i < ARMED.length; i++) post(ARMED[i], 'o'); 708 })); 709 710 // ââ The read report: one per armed item, after its dwell. 711 ARMED.forEach(function (p) { 712 pageTimers.push(timer((p.d || 0) * 1000, function () { post(p, 'r'); })); 713 }); 714 715 function hitEl(target) { 716 return target && target.closest ? target.closest('[data-view-hit]') : null; 717 } 718 function payloadOf(el) { 719 try { return JSON.parse(el.getAttribute('data-view-hit')); } catch (e) { return null; } 720 } 721 function arm(el, media) { 722 var p = payloadOf(el); 723 if (!p) return; 724 var key = p.t + ':' + p.i; 725 if (sent['r:' + key]) return; 726 // Touching it IS opening it â the dwell below decides the read. 727 post(p, 'o'); 728 if (pending[key]) { pending[key].resume(); return; } 729 var need = (p.d || 0) * 1000; 730 // A clip shorter than the dwell counts at 80% of its own length. 731 if (media && isFinite(media.duration) && media.duration > 0) {
732 need = Math.min(need, media.duration * 800); 733 } 734 pending[key] = timer(need, function () { delete pending[key]; post(p, 'r'); }); 735 } 736 737 // Capture phase: a theme handler that stops propagation (a deck or a 738 // modal opener) must not be able to hide the click from the counter. 739 document.addEventListener('click', function (e) { 740 var el = hitEl(e.target); 741 if (el && (el.getAttribute('data-view-on') || 'click') === 'click') arm(el, null); 742 }, true); 743 // A click INSIDE an embedded player (YouTube / Instagram iframe) never 744 // reaches this document; the focus moving into the iframe does. 745 window.addEventListener('blur', function () { 746 setTimeout(function () { 747 var a = document.activeElement; 748 if (!a || a.tagName !== 'IFRAME') return; 749 var el = hitEl(a); 750 if (el && (el.getAttribute('data-view-on') || 'click') === 'click') arm(el, null); 751 }, 0); 752 }); 753 // Media events do not bubble â capture them. 754 document.addEventListener('play', function (e) { 755 var el = hitEl(e.target); 756 if (el && el.getAttribute('data-view-on') === 'play') arm(el, e.target); 757 }, true); 758 document.addEventListener('pause', function (e) { 759 var el = hitEl(e.target), p = el && payloadOf(el); 760 if (p && pending[p.t + ':' + p.i]) pending[p.t + ':' + p.i].pause(); 761 }, true); 762 763 document.addEventListener('livewire:navigating', function () { 764 pageTimers.forEach(function (t) { t.cancel(); }); 765 for (var k in pending) pending[k].cancel(); 766 pending = {}; 767 }, {once: true}); 768 })(); 769</script>
769 770 771 772<style> 773 /* !important so the clamp wins even when a theme rule (e.g. a compound 774 selector like `.card--featured .excerpt{display:block}`) has higher 775 specificity than this single-class utility. Only ever applied to text 776 containers (titles/excerpts), so forcing the display is safe. */ 777 .line-clamp-1,.line-clamp-2,.line-clamp-3,.line-clamp-4{display:-webkit-box!important;-webkit-box-orient:vertical!important;overflow:hidden!important} 778 .line-clamp-1{-webkit-line-clamp:1!important} 779 .line-clamp-2{-webkit-line-clamp:2!important} 780 .line-clamp-3{-webkit-line-clamp:3!important} 781 .line-clamp-4{-webkit-line-clamp:4!important} 782</style> 783<meta name="generator" content="Devlo CMS"/> 784<!-- Livewire Styles --><style >[wire\:loading][wire\:loading], [wire\:loading\.delay][wire\:loading\.delay], [wire\:loading\.list-item][wire\:loading\.list-item], [wire\:loading\.inline-block][wire\:loading\.inline-block], [wire\:loading\.inline][wire\:loading\.inline], [wire\:loading\.block][wire\:loading\.block], [wire\:loading\.flex][wire\:loading\.flex], [wire\:loading\.table][wire\:loading\.table], [wire\:loading\.grid][wire\:loading\.grid], [wire\:loading\.inline-flex][wire\:loading\.inline-flex] {display: none;}[wire\:loading\.delay\.none][wire\:loading\.delay\.none], [wire\:loading\.delay\.shortest][wire\:loading\.delay\.shortest], [wire\:loading\.delay\.shorter][wire\:loading\.delay\.shorter], [wire\:loading\.delay\.short][wire\:loading\.delay\.short], [wire\:loading\.delay\.default][wire\:loading\.delay\.default], [wire\:loading\.delay\.long][wire\:loading\.delay\.long], [wire\:loading\.delay\.longer][wire\:loading\.delay\.longer], [wire\:loading\.delay\.longest][wire\:loading\.delay\.longest] {display: none;}[wire\:offline][wire\:offline] {display: none;}[wire\:dirty]:not(textarea):not(input):not(select) {display: none;}:root {--livewire-progress-bar-color: #2299dd;}[x-cloak] {display: none !important;}[wire\:cloak] {display: none !important;}dialog#livewire-error::backdrop {background-color: rgba(0, 0, 0, .6);}</style> 785</head> 786 787<body data-page=""> 788 789<div class="topbar"> 790 <div class="container topbar__inner"> 791 <div class="topbar__meta"> 792 <span><i class="fa-regular fa-calendar" aria-hidden="true"></i> 793 Ø§ÙØ¬Ù Ø¹Ø©Ø 2 Ø£ÙØªÙبر 2026</span> 794 </div> 795 <div class="topbar__social"> 796 <a href="https://tiktok.com/@qudsn" target="_blank" rel="noopener" aria-label="Tiktok" class="social-link"><i class="fab fa-tiktok" aria-hidden="true"></i></a> 797 <a href="https://t.me/QudsN" target="_blank" rel="noopener" aria-label="Facebook" class="social-link"><i class="fab fa-facebook-f" aria-hidden="true"></i></a> 798 <a href="https://www.instagram.com/qudsn" target="_blank" rel="noopener" aria-label="Instagram" class="social-link"><i class="fab fa-instagram" aria-hidden="true"></i></a> 799 <a href="https://www.youtube.com/user/QudsNetwork" target="_blank" rel="noopener" aria-label="Youtube-play" class="social-link"><i class="fab fa-youtube" aria-hidden="true"></i></a> 800 <a href="https://t.me/QudsN" target="_blank" rel="noopener" aria-label="ÙÙØ§Ø© تÙÙÙØºØ±Ø§Ù " class="social-link"><i class="fab fa-telegram" aria-hidden="true"></i></a> 801 <a href="https://whatsapp.com/channel/0029VbCpgXo8fewqkgDTLM2z" target="_blank" rel="noopener" aria-label="ÙÙØ§Ø© ÙØ§ØªØ³Ø§Ø¨" class="social-link"><i class="fab fa-whatsapp" aria-hidden="true"></i></a> 802 <a href="https://twitter.com/QudsN" target="_blank" rel="noopener" aria-label="Twitter" class="social-link"><i class="fab fa-x-twitter" aria-hidden="true"></i></a> 803 <a href="https://t.me/Qudsn_hebrew" target="_blank" rel="noopener" aria-label="Telegram " class="social-link"><i class="fab fa-telegram" aria-hidden="true"></i></a> 804 <span class="topbar__sep" aria-hidden="true"></span> 805 <a href="https://qudsnen.com" class="topbar__lang" target="_blank" rel="noopener">English</a> 806 </div> 807 </div> 808</div> 809 810 811<header class="site-header"> 812 <div class="container header__inner"> 813 <a href="https://qudsn.co" class="brand" 814 aria-label="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© â Ø§ÙØµÙØØ© Ø§ÙØ±Ø¦ÙØ³ÙØ©"> 815 816 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/08/file_6a6f0b281cbc8.png" alt="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©" class="brand__logo" width="90" height="38" 817 decoding="async" srcset="https://qudsn.co/media/img/200/uploads/2026/08/file_6a6f0b281cbc8.png.webp 200w, https://qudsn.co/media/img/400/uploads/2026/08/file_6a6f0b281cbc8.png.webp 400w" sizes="98px" > 818 </a> 819 820 821 <nav class="cat-nav" id="catNav" aria-label="Ø£ÙØ³Ø§Ù اÙÙ ÙÙØ¹"> 822 <div class="cat-nav__inner"> 823 <a href="/" 824 class="cat-link">Ø§ÙØ±Ø¦ÙØ³ÙØ©</a> 825 <a href="/category_news/أخبار" 826 class="cat-link">أخبار</a> 827 <a href="/category_news/٠تابعات ÙØ¯Ø³" 828 class="cat-link">٠تابعات</a> 829 <a href="/category_news/ØªÙØ§Ø±Ùر ÙØ¯Ø³" 830 class="cat-link">ØªÙØ§Ø±Ùر</a> 831 <a href="/category_news/٠دÙÙÙØ§Øª" 832 class="cat-link">٠دÙÙÙØ§Øª</a> 833 <a href="/category_news/ترج٠ات Ø¹Ø¨Ø±ÙØ©" 834 class="cat-link">ترج٠ات</a> 835 <a href="/all_podcast" 836 class="cat-link">Ø¨ÙØ¯Ùاست ÙØ¯Ø³</a> 837 <a href="/contact_us" 838 class="cat-link">Ø§ØªØµÙ Ø¨ÙØ§</a> 839 <a href="/special_page/3" 840 class="cat-link">Ù Ù ÙØÙ</a> 841 842 </div> 843 844 845 <div class="cat-more" id="catMore" hidden> 846 <button type="button" class="cat-link cat-more__btn" aria-haspopup="true" aria-expanded="false"> 847 اÙÙ Ø²ÙØ¯ <i class="fa-solid fa-chevron-down" aria-hidden="true"></i> 848 </button> 849 <div class="cat-more__menu" role="menu" hidden></div> 850 </div> 851 </nav> 852 853 <div class="header__actions"> 854 855 <button type="button" class="icon-btn qd-theme-toggle" id="qdThemeToggle" 856 aria-label="تبدÙ٠اÙÙØ¶Ø¹ اÙÙÙÙÙ ÙØ§ÙÙÙØ§Ø±Ù" aria-pressed="false"> 857
858 <span class="theme-icon" aria-hidden="true"> 859 <svg class="theme-icon__moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" 860 stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"> 861 <path d="M20.4 13.2A8.2 8.2 0 1 1 10.8 3.6a6.6 6.6 0 0 0 9.6 9.6z"/> 862 </svg> 863 <svg class="theme-icon__sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" 864 stroke-width="1.9" stroke-linecap="round"> 865 <circle cx="12" cy="12" r="4"/> 866 <path d="M12 2.6v2.1M12 19.3v2.1M2.6 12h2.1M19.3 12h2.1M5.4 5.4l1.5 1.5M17.1 17.1l1.5 1.5M18.6 5.4l-1.5 1.5M6.9 17.1l-1.5 1.5"/> 867 </svg> 868 </span> 869 </button> 870 <button type="button" class="icon-btn" id="searchOpen" aria-label="ÙØªØ Ø§ÙØ¨ØØ«" aria-haspopup="dialog"> 871 <i class="fa-solid fa-magnifying-glass" aria-hidden="true"></i> 872 </button> 873 874 <a href="https://t.me/QudsN" class="btn btn--primary" target="_blank" rel="noopener" aria-label="اشتر٠Ù٠اÙÙÙØ§Ø©"> 875 <i class="fa-regular fa-paper-plane" aria-hidden="true"></i><span>اشتر٠Ù٠اÙÙÙØ§Ø©</span> 876 </a> 877 <button type="button" class="icon-btn nav-toggle" id="navToggle" aria-label="ÙØªØ اÙÙØ§Ø¦Ù Ø©" 878 aria-expanded="false" aria-controls="catNav"> 879 <i class="fa-solid fa-bars" aria-hidden="true"></i> 880 </button> 881 </div> 882 </div> 883 884</header> 885 886
887<script> 888/* ========================================================================== 889 NAV OVERFLOW â move whatever will not fit into the «اÙÙ Ø²ÙØ¯Â» dropdown 890 The menu is dashboard-driven, so no CSS breakpoint can know when it stops 891 fitting: the row is measured instead. Links keep their DOM order; only 892 their parent changes, so a link never disappears â worst case it is one 893 click deeper. 894 ========================================================================== */ 895(function () { 896 'use strict'; 897 var inner = document.querySelector('.header__inner .cat-nav__inner'); 898 var more = document.getElementById('catMore'); 899 if (!inner || !more) return; 900 901 var btn = more.querySelector('.cat-more__btn'); 902 var menu = more.querySelector('.cat-more__menu'); 903 // Snapshot the original order once: after the first pass the links live in 904 // two parents, and re-reading the row would lose the ones already moved. 905 var links = [].slice.call(inner.querySelectorAll(':scope > .cat-link')); 906 if (!links.length) return; 907 908 function close() { 909 if (menu.hidden) return; 910 menu.hidden = true; 911 btn.setAttribute('aria-expanded', 'false'); 912 } 913 914 var bucketed = false; // true once a pass has moved links into the menu 915 916 // Start from "everything fits" so the row can grow back when the window 917 // widens or a link is removed from the dashboard. Only when a previous pass 918 // actually moved something: re-appending every link on the first pass (all of 919 // them still in the row) dirtied the header's layout, and the measurement 920 // right after it then forced a synchronous layout of the whole page. 921 function restore() { 922 if (!bucketed) return; 923 links.forEach(function (l) { inner.appendChild(l); }); 924 more.hidden = true; 925 bucketed = false; 926 } 927 928 function layout() { 929 // Below the burger breakpoint the drawer lists everything; putting links 930 // in the dropdown too would show them twice. 931 if (window.matchMedia('(max-width: 768px)').matches) { 932 restore(); 933 close(); 934 return; 935 } 936 937 close(); 938 restore(); 939 940 var fits = function () { return inner.scrollWidth <= inner.clientWidth + 1; }; 941 if (fits()) return; // it all fits â no bucket needed 942 943 // The button is a flex sibling of the row, so revealing it SHRINKS the 944 // row. Reveal it first and re-measure every pass â a width cached before 945 // this point is too generous and leaves one link half-cut. 946 more.hidden = false; 947 948 // Push links off the end until the row fits, prepending each one so the 949 // dropdown reads in the same order as the bar. 950 var moved = 0; 951 for (var i = links.length - 1; i >= 0 && !fits(); i--) { 952 menu.insertBefore(links[i], menu.firstChild); 953 moved++; 954 } 955 956 bucketed = true; 957 if (!moved) { // nothing moved: the bucket is dead weight 958 more.hidden = true; 959 } 960 } 961 962 btn.addEventListener('click', function (e) { 963 e.stopPropagation(); 964 menu.hidden = !menu.hidden; 965 btn.setAttribute('aria-expanded', menu.hidden ? 'false' : 'true'); 966 }); 967 document.addEventListener('click', function (e) { 968 if (!more.contains(e.target)) close(); 969 }); 970 document.addEventListener('keydown', function (e) { 971 if (e.key === 'Escape') close(); 972 }); 973 974 layout(); 975 // Fonts land after first paint and change every link's width, so a single 976 // pass at DOMContentLoaded measures the wrong row. 977 if (document.fonts && document.fonts.ready) { 978 document.fonts.ready.then(layout).catch(function () {}); 979 } 980 var t; 981 window.addEventListener('resize', function () { 982 clearTimeout(t); 983 t = setTimeout(layout, 150); 984 }); 985})(); 986</script>
986 987 988 989 990<main id="main"> 991 <div wire:snapshot="{"data":{"search_query":[[],{"s":"arr"}],"category_title":"\u0623\u062e\u0628\u0627\u0631","paginators":[{"page":1},{"s":"arr"}]},"memo":{"id":"m6BynpwEL16eyfuKBnm3","name":"main.quds-ar.category-news","path":"category_news\/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1","method":"GET","release":"a-a-a","children":[],"scripts":[],"assets":[],"errors":[],"locale":"ar","islands":[]},"checksum":"939b83511967fbe97f43631a66dadd1524f5dd45c581442ec63b67f1621c7653"}" wire:effects="{"url":{"paginators.page":{"as":"page","use":"push","alwaysShow":false,"except":null}}}" wire:id="m6BynpwEL16eyfuKBnm3" wire:name="main.quds-ar.category-news"> 992 993 <!-- breadcrumb --> 994 <nav class="breadcrumb" aria-label="٠سار Ø§ÙØªØµÙÙØ"> 995 <div class="container"> 996 <ol class="breadcrumb__list"> 997 <li><a href="https://qudsn.co">Ø§ÙØ±Ø¦ÙØ³ÙØ©</a></li> 998 <li><i class="fa-solid fa-angle-left breadcrumb__sep" aria-hidden="true"></i></li> 999 <li class="breadcrumb__current">أخبار</li> 1000 </ol> 1001 </div> 1002 </nav> 1003 1004 <!-- page hero --> 1005 <section class="page-hero page-hero--light"> 1006 <div class="container" data-aos="fade-up"> 1007 <span class="page-hero__eyebrow"><i class="fa-solid fa-folder-open" aria-hidden="true"></i>ÙØ³Ù </span> 1008 <h1 class="page-hero__title">أخبار</h1> 1009 <p class="page-hero__sub">آخر Ù Ø³ØªØ¬Ø¯ÙØ§Øª ÙØ°Ø§ اÙÙØ³Ù عÙÙ Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©Ø Ù ØØ¯Ùثة Ø£ÙÙØ§Ù بأÙ٠٠٠اÙÙØ¯Ø³ ÙÙÙØ³Ø·Ù٠إÙÙ Ø§ÙØ¹Ø§ÙÙ .</p> 1010 </div> 1011 <span class="page-hero__blob page-hero__blob--1" aria-hidden="true"></span> 1012 <span class="page-hero__blob page-hero__blob--2" aria-hidden="true"></span> 1013 </section> 1014 1015 <section class="section"> 1016 <div class="container"> 1017 1018 <!-- search filter --> 1019 <div class="filter-section" style="margin-bottom:24px"> 1020 <div class="filter-item" style="position:relative;max-width:360px"> 1021 <input type="text" wire:model.live="search_query.search_text" class="filter-input" 1022 placeholder="Ø¨ØØ« Ù٠اÙÙØ³Ù " style="width:100%;padding:12px 40px 12px 16px;border:1px solid #e0e0e0;border-radius:8px"/> 1023 <i class="fa fa-search" style="position:absolute;left:14px;top:50%;transform:translateY(-50%);color:#999"></i> 1024 </div> 1025 </div> 1026 1027 <!-- cards grid --> 1028 <div class="cards-grid" data-aos="fade-up"> 1029 1030 <!--[if BLOCK]><![endif]--> <article class="card"> 1031 <a href="https://qudsn.co/post?id=217934&slug=%D8%B9%D8%B4%D8%B1%D8%A7%D8%AA-%D8%A2%D9%84%D8%A7%D9%81-%D8%A7%D9%84%D9%85%D8%B5%D9%84%D9%8A%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B3%D8%AC%D8%AF-%D8%A7%D9%84%D8%A3%D9%82%D8%B5%D9%89-%D8%B1%D8%BA%D9%85-%D8%AA%D8%B6%D9%8A%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1032 1033 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf8db042e81.webp" style="" alt="" loading="lazy" decoding="async" 1034 width="400" height="250" 1035 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf8db042e81.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf8db042e81.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abf8db042e81.webp.webp 800w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf8db042e81.webp 1000w" sizes="(max-width: 560px) 100v
1035w, (max-width: 992px) 50vw, 380px" > 1036 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1037 <span class="card__body"> 1038 <a href="https://qudsn.co/post?id=217934&slug=%D8%B9%D8%B4%D8%B1%D8%A7%D8%AA-%D8%A2%D9%84%D8%A7%D9%81-%D8%A7%D9%84%D9%85%D8%B5%D9%84%D9%8A%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B3%D8%AC%D8%AF-%D8%A7%D9%84%D8%A3%D9%82%D8%B5%D9%89-%D8%B1%D8%BA%D9%85-%D8%AA%D8%B6%D9%8A%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84" class="card__title clamp-3">عشرات Ø¢ÙØ§Ù اÙ٠صÙÙÙ Ù٠اÙ٠سجد Ø§ÙØ£Ùص٠رغ٠تضÙÙÙØ§Øª Ø§ÙØ§ØØªÙاÙ</a> 1039 1040 1041 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1042</article> 1043 <article class="card"> 1044 <a href="https://qudsn.co/post?id=217933&slug=%D8%A7%D8%B3%D8%AA%D8%B4%D9%87%D8%A7%D8%AF-%D9%81%D9%84%D8%B3%D8%B7%D9%8A%D9%86%D9%8A-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A9-%D8%A2%D8%AE%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D9%87%D8%AF%D8%A7%D9%81-%D9%85%D8%B3%D9%8A%D8%B1%D8%A9-%D8%BA%D8%B1%D8%A8%D9%8A-%D8%BA%D8%B2%D8%A9" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1045 1046 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf89c9cf555.webp" style="" alt="" loading="lazy" decoding="async" 1047 width="400" height="250" 1048 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf89c9cf555.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf89c9cf555.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abf89c9cf555.webp.webp 800w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf89c9cf555.webp 846w" sizes="(max-width: 560px) 100v
1048w, (max-width: 992px) 50vw, 380px" > 1049 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1050 <span class="card__body"> 1051 <a href="https://qudsn.co/post?id=217933&slug=%D8%A7%D8%B3%D8%AA%D8%B4%D9%87%D8%A7%D8%AF-%D9%81%D9%84%D8%B3%D8%B7%D9%8A%D9%86%D9%8A-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A9-%D8%A2%D8%AE%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D9%87%D8%AF%D8%A7%D9%81-%D9%85%D8%B3%D9%8A%D8%B1%D8%A9-%D8%BA%D8%B1%D8%A8%D9%8A-%D8%BA%D8%B2%D8%A9" class="card__title clamp-3">Ø§Ø³ØªØ´ÙØ§Ø¯ ÙÙØ³Ø·ÙÙÙ ÙØ¥ØµØ§Ø¨Ø© آخر Ø¨Ø§Ø³ØªÙØ¯Ø§Ù Ù Ø³ÙØ±Ø© غرب٠غزة</a> 1052 1053 1054 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1055</article> 1056 <article class="card"> 1057 <a href="https://qudsn.co/post?id=217932&slug=%D9%83%D9%88%D8%B4%D9%86%D8%B1-%D9%8A%D8%B3%D8%AA%D9%81%D9%8A%D8%AF-%D9%85%D9%86-%D8%B4%D8%B1%D9%83%D8%A7%D8%AA-%D8%AA%D8%B2%D9%88%D8%AF-%D8%AC%D9%8A%D8%B4-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D8%A8%D9%80456-%D9%85%D9%84%D9%8A%D9%88%D9%86-%D8%AF%D9%88%D9%84%D8%A7%D8%B1" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1058 1059 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf73fc902c2.webp" style="" alt="" loading="lazy" decoding="async" 1060 width="400" height="250" 1061 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf73fc902c2.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf73fc902c2.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abf73fc902c2.webp.webp 800w, https://qudsn.co/media/img/1200/uploads/2026/10/file_6abf73fc902c2.webp.webp 1200w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf73fc902c2.webp 1920w" sizes="(max-width: 560px) 100v
1061w, (max-width: 992px) 50vw, 380px" > 1062 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1063 <span class="card__body"> 1064 <a href="https://qudsn.co/post?id=217932&slug=%D9%83%D9%88%D8%B4%D9%86%D8%B1-%D9%8A%D8%B3%D8%AA%D9%81%D9%8A%D8%AF-%D9%85%D9%86-%D8%B4%D8%B1%D9%83%D8%A7%D8%AA-%D8%AA%D8%B2%D9%88%D8%AF-%D8%AC%D9%8A%D8%B4-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D8%A8%D9%80456-%D9%85%D9%84%D9%8A%D9%88%D9%86-%D8%AF%D9%88%D9%84%D8%A7%D8%B1" class="card__title clamp-3">ÙÙØ´Ùر ÙØ³ØªÙÙØ¯ Ù Ù Ø´Ø±ÙØ§Øª ØªØ²ÙØ¯ Ø¬ÙØ´ Ø§ÙØ§ØØªÙا٠بÙ456 Ù ÙÙÙ٠دÙÙØ§Ø±</a> 1065 1066 1067 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1068</article> 1069 <article class="card"> 1070 <a href="https://qudsn.co/post?id=217931&slug=%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D9%8A%D8%AD%D8%AA%D8%AC%D8%B2-37-%D8%B5%D8%AD%D9%81%D9%8A%D8%A7%D9%8B-%D9%81%D9%8A-%D8%B3%D8%AC%D9%88%D9%86%D9%87-%D8%A8%D9%8A%D9%86%D9%87%D9%85-21-%D9%81%D9%8A-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%82%D8%A7%D9%84-%D8%A7%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D9%8A" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1071 1072 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf720e19a06.webp" style="" alt="" loading="lazy" decoding="async" 1073 width="400" height="250" 1074 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf720e19a06.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf720e19a06.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abf720e19a06.webp.webp 800w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf720e19a06.webp 864w" sizes="(max-width: 560px) 100v
1074w, (max-width: 992px) 50vw, 380px" > 1075 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1076 <span class="card__body"> 1077 <a href="https://qudsn.co/post?id=217931&slug=%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D9%8A%D8%AD%D8%AA%D8%AC%D8%B2-37-%D8%B5%D8%AD%D9%81%D9%8A%D8%A7%D9%8B-%D9%81%D9%8A-%D8%B3%D8%AC%D9%88%D9%86%D9%87-%D8%A8%D9%8A%D9%86%D9%87%D9%85-21-%D9%81%D9%8A-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%82%D8%A7%D9%84-%D8%A7%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D9%8A" class="card__title clamp-3">Ø§ÙØ§ØØªÙØ§Ù ÙØØªØ¬Ø² 37 صØÙÙØ§Ù Ù٠سجÙÙ٠بÙÙÙÙ 21 ÙÙ Ø§ÙØ§Ø¹ØªÙØ§Ù Ø§ÙØ¥Ø¯Ø§Ø±Ù</a> 1078 1079 1080 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1081</article> 1082 <article class="card"> 1083 <a href="https://qudsn.co/post?id=217930&slug=%D8%BA%D8%A7%D8%B1%D8%A7%D8%AA-%D9%88%D9%82%D8%B5%D9%81-%D9%88%D9%86%D8%B3%D9%81-%D8%A5%D8%B3%D8%B1%D8%A7%D8%A6%D9%8A%D9%84%D9%8A-%D9%85%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D9%81%D9%8A-%D8%BA%D8%B2%D8%A9-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86%D9%87%D8%A7-%D8%B7%D9%81%D9%84%D8%A9-%D9%88%D9%85%D8%B3%D9%86%D8%A9" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1084 1085 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf6e708d8b7.webp" style="" alt="" loading="lazy" decoding="async" 1086 width="400" height="250" 1087 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf6e708d8b7.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf6e708d8b7.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abf6e708d8b7.webp.webp 800w, https://qudsn.co/media/img/1200/uploads/2026/10/file_6abf6e708d8b7.webp.webp 1200w" sizes="(max-width: 560px) 100v
1087w, (max-width: 992px) 50vw, 380px" > 1088 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1089 <span class="card__body"> 1090 <a href="https://qudsn.co/post?id=217930&slug=%D8%BA%D8%A7%D8%B1%D8%A7%D8%AA-%D9%88%D9%82%D8%B5%D9%81-%D9%88%D9%86%D8%B3%D9%81-%D8%A5%D8%B3%D8%B1%D8%A7%D8%A6%D9%8A%D9%84%D9%8A-%D9%85%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D9%81%D9%8A-%D8%BA%D8%B2%D8%A9-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86%D9%87%D8%A7-%D8%B7%D9%81%D9%84%D8%A9-%D9%88%D9%85%D8%B3%D9%86%D8%A9" class="card__title clamp-3">غارات ÙÙØµÙ ÙÙØ³Ù إسرائÙÙÙ Ù ØªÙØ§ØµÙ Ù٠غزة ÙØ¥ØµØ§Ø¨Ø§Øª بÙÙÙØ§ Ø·ÙÙØ© ÙÙ Ø³ÙØ©</a> 1091 1092 1093 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1094</article> 1095 <article class="card"> 1096 <a href="https://qudsn.co/post?id=217928&slug=%D8%A7%D9%84%D8%A3%D8%B3%D9%8A%D8%B1%D8%A9-%D8%A3%D8%A8%D9%88-%D8%AF%D9%8A%D8%A9-%D8%AA%D8%B1%D9%88%D9%8A-%D8%A3%D9%88%D8%B6%D8%A7%D8%B9%D9%8B%D8%A7-%D8%B3%D9%8A%D8%A6%D8%A9-%D8%AC%D8%AF%D9%8B%D8%A7-%D9%81%D9%8A-%D8%B3%D8%AC%D9%86-%D8%A7%D9%84%D8%AF%D8%A7%D9%85%D9%88%D9%86" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1097 1098 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf6ab2d06f2.webp" style="" alt="" loading="lazy" decoding="async" 1099 width="400" height="250" 1100 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf6ab2d06f2.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf6ab2d06f2.webp.webp 400w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf6ab2d06f2.webp 503w" sizes="(max-width: 560px) 100v
1100w, (max-width: 992px) 50vw, 380px" > 1101 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1102 <span class="card__body"> 1103 <a href="https://qudsn.co/post?id=217928&slug=%D8%A7%D9%84%D8%A3%D8%B3%D9%8A%D8%B1%D8%A9-%D8%A3%D8%A8%D9%88-%D8%AF%D9%8A%D8%A9-%D8%AA%D8%B1%D9%88%D9%8A-%D8%A3%D9%88%D8%B6%D8%A7%D8%B9%D9%8B%D8%A7-%D8%B3%D9%8A%D8%A6%D8%A9-%D8%AC%D8%AF%D9%8B%D8%A7-%D9%81%D9%8A-%D8%B3%D8%AC%D9%86-%D8%A7%D9%84%D8%AF%D8%A7%D9%85%D9%88%D9%86" class="card__title clamp-3">Ø§ÙØ£Ø³Ùرة Ø£Ø¨Ù Ø¯ÙØ© ترÙÙ Ø£ÙØ¶Ø§Ø¹Ùا Â«Ø³ÙØ¦Ø© Ø¬Ø¯ÙØ§Â» ÙÙ Ø³Ø¬Ù Ø§ÙØ¯Ø§Ù ÙÙ</a> 1104 1105 1106 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1107</article> 1108 <article class="card"> 1109 <a href="https://qudsn.co/post?id=217925&slug=%D8%A8%D8%A7%D9%84%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D9%8A%D8%B9%D8%AA%D9%82%D9%84-6-%D9%81%D9%84%D8%B3%D8%B7%D9%8A%D9%86%D9%8A%D9%8A%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D9%85%D8%AF%D8%A7%D9%87%D9%85%D8%A7%D8%AA-%D8%A8%D8%A7%D9%84%D8%B6%D9%81%D8%A9-%D8%A7%D9%84%D8%BA%D8%B1%D8%A8%D9%8A%D8%A9" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1110 1111 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf5e9662434.webp" style="" alt="" loading="lazy" decoding="async" 1112 width="400" height="250" 1113 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf5e9662434.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf5e9662434.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abf5e9662434.webp.webp 800w, https://qudsn.co/media/img/1200/uploads/2026/10/file_6abf5e9662434.webp.webp 1200w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf5e9662434.webp 1800w" sizes="(max-width: 560px) 100v
1113w, (max-width: 992px) 50vw, 380px" > 1114 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1115 <span class="card__body"> 1116 <a href="https://qudsn.co/post?id=217925&slug=%D8%A8%D8%A7%D9%84%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D9%8A%D8%B9%D8%AA%D9%82%D9%84-6-%D9%81%D9%84%D8%B3%D8%B7%D9%8A%D9%86%D9%8A%D9%8A%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D9%85%D8%AF%D8%A7%D9%87%D9%85%D8%A7%D8%AA-%D8%A8%D8%A7%D9%84%D8%B6%D9%81%D8%A9-%D8%A7%D9%84%D8%BA%D8%B1%D8%A8%D9%8A%D8%A9" class="card__title clamp-3">Ø¨Ø§ÙØ£Ø³Ù اء.. Ø§ÙØ§ØØªÙØ§Ù ÙØ¹ØªÙÙ 6 ÙÙØ³Ø·ÙÙÙÙÙ Ø®ÙØ§Ù ٠داÙ٠ات Ø¨Ø§ÙØ¶ÙØ© Ø§ÙØºØ±Ø¨ÙØ©</a> 1117 1118 1119 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1120</article> 1121 <article class="card"> 1122 <a href="https://qudsn.co/post?id=217924&slug=%D8%AE%D9%84%D8%A7%D9%84-%D8%A3%D9%8A%D9%84%D9%88%D9%84-2051-%D8%A7%D8%B9%D8%AA%D8%AF%D8%A7%D8%A1%D9%8B-%D9%86%D9%81%D8%B0%D9%87%D8%A7-%D8%AC%D9%8A%D8%B4-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%88%D8%B7%D9%86%D9%88%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D8%B6%D9%81%D8%A9" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1123 1124 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf5d3e3e02b.webp" style="" alt="" loading="lazy" decoding="async" 1125 width="400" height="250" 1126 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abf5d3e3e02b.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abf5d3e3e02b.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abf5d3e3e02b.webp.webp 800w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abf5d3e3e02b.webp 1200w" sizes="(max-width: 560px) 100v
1126w, (max-width: 992px) 50vw, 380px" > 1127 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1128 <span class="card__body"> 1129 <a href="https://qudsn.co/post?id=217924&slug=%D8%AE%D9%84%D8%A7%D9%84-%D8%A3%D9%8A%D9%84%D9%88%D9%84-2051-%D8%A7%D8%B9%D8%AA%D8%AF%D8%A7%D8%A1%D9%8B-%D9%86%D9%81%D8%B0%D9%87%D8%A7-%D8%AC%D9%8A%D8%B4-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%88%D8%B7%D9%86%D9%88%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D8%B6%D9%81%D8%A9" class="card__title clamp-3">Ø®ÙØ§Ù Ø£ÙÙÙÙ.. 2051 اعتداء٠ÙÙØ°Ùا Ø¬ÙØ´ Ø§ÙØ§ØØªÙØ§Ù ÙØ§ÙÙ Ø³ØªÙØ·ÙÙÙ ÙÙ Ø§ÙØ¶ÙØ©</a> 1130 1131 1132 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1133</article> 1134 <article class="card"> 1135 <a href="https://qudsn.co/post?id=217923&slug=9081-%D9%85%D8%B3%D8%AA%D9%88%D8%B7%D9%86%D8%A7%D9%8B-%D8%AE%D9%84%D8%A7%D9%84-6-%D8%A3%D9%8A%D8%A7%D9%85-%D8%B9%D9%8A%D8%AF-%D8%A7%D9%84%D8%B9%D8%B1%D8%B4-%D9%8A%D8%BA%D9%8A%D9%91%D8%B1-%D9%85%D8%B4%D9%87%D8%AF-%D8%A7%D9%84%D8%A7%D9%82%D8%AA%D8%AD%D8%A7%D9%85%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%A3%D9%82%D8%B5%D9%89" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1136 1137 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abebad573384.webp" style="" alt="" loading="lazy" decoding="async" 1138 width="400" height="250" 1139 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abebad573384.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abebad573384.webp.webp 400w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abebad573384.webp 770w" sizes="(max-width: 560px) 100v
1139w, (max-width: 992px) 50vw, 380px" > 1140 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1141 <span class="card__body"> 1142 <a href="https://qudsn.co/post?id=217923&slug=9081-%D9%85%D8%B3%D8%AA%D9%88%D8%B7%D9%86%D8%A7%D9%8B-%D8%AE%D9%84%D8%A7%D9%84-6-%D8%A3%D9%8A%D8%A7%D9%85-%D8%B9%D9%8A%D8%AF-%D8%A7%D9%84%D8%B9%D8%B1%D8%B4-%D9%8A%D8%BA%D9%8A%D9%91%D8%B1-%D9%85%D8%B4%D9%87%D8%AF-%D8%A7%D9%84%D8%A7%D9%82%D8%AA%D8%AD%D8%A7%D9%85%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%A3%D9%82%D8%B5%D9%89" class="card__title clamp-3">9081 Ù Ø³ØªÙØ·ÙØ§Ù Ø®ÙØ§Ù 6 Ø£ÙØ§Ù .. Ø¹ÙØ¯ Ø§ÙØ¹Ø±Ø´ ÙØºÙÙØ± Ù Ø´ÙØ¯ Ø§ÙØ§ÙØªØØ§Ù ات ÙÙ Ø§ÙØ£ÙصÙ</a> 1143 1144 1145 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1146</article> 1147 <article class="card"> 1148 <a href="https://qudsn.co/post?id=217922&slug=%D8%B9%D9%88%D8%B1%D8%AA%D8%A7-%D8%AA%D8%AD%D8%AA-%D9%87%D8%AC%D9%88%D9%85-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%88%D8%B7%D9%86%D9%8A%D9%86-%D8%B1%D8%B5%D8%A7%D8%B5-%D9%88%D8%A7%D8%B9%D8%AA%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A7%D8%AA-%D8%A8%D8%A7%D9%84%D8%BA%D8%A7%D8%B2" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1149 1150 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abeb8523997f.webp" style="" alt="" loading="lazy" decoding="async" 1151 width="400" height="250" 1152 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abeb8523997f.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abeb8523997f.webp.webp 400w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abeb8523997f.webp 770w" sizes="(max-width: 560px) 100v
1152w, (max-width: 992px) 50vw, 380px" > 1153 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1154 <span class="card__body"> 1155 <a href="https://qudsn.co/post?id=217922&slug=%D8%B9%D9%88%D8%B1%D8%AA%D8%A7-%D8%AA%D8%AD%D8%AA-%D9%87%D8%AC%D9%88%D9%85-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%88%D8%B7%D9%86%D9%8A%D9%86-%D8%B1%D8%B5%D8%A7%D8%B5-%D9%88%D8%A7%D8%B9%D8%AA%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A7%D8%AA-%D8%A8%D8%A7%D9%84%D8%BA%D8%A7%D8%B2" class="card__title clamp-3">Ø¹ÙØ±ØªØ§ ØªØØª ÙØ¬Ù٠اÙÙ Ø³ØªÙØ·ÙÙÙ.. رصاص ÙØ§Ø¹ØªÙØ§ÙØ§Øª ÙØ¥ØµØ§Ø¨Ø§Øª Ø¨Ø§ÙØºØ§Ø²</a> 1156 1157 1158 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1159</article> 1160 <article class="card"> 1161 <a href="https://qudsn.co/post?id=217921&slug=%D8%AD%D9%88%D8%A7%D8%AC%D8%B2-%D9%84%D8%A7-%D8%AA%D9%86%D8%AA%D9%87%D9%8A-%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%8A%D8%AF-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D8%B1%D8%B3%D9%85-%D8%B7%D8%B1%D9%82-%D8%A7%D9%84%D9%81%D9%84%D8%B3%D8%B7%D9%8A%D9%86%D9%8A%D9%8A%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D8%B6%D9%81%D8%A9%D8%9F" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1162 1163 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abeb51d0480b.webp" style="" alt="" loading="lazy" decoding="async" 1164 width="400" height="250" 1165 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abeb51d0480b.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abeb51d0480b.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abeb51d0480b.webp.webp 800w, https://qudsn.co/media/img/1200/uploads/2026/10/file_6abeb51d0480b.webp.webp 1200w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abeb51d0480b.webp 1280w" sizes="(max-width: 560px) 100v
1165w, (max-width: 992px) 50vw, 380px" > 1166 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1167 <span class="card__body"> 1168 <a href="https://qudsn.co/post?id=217921&slug=%D8%AD%D9%88%D8%A7%D8%AC%D8%B2-%D9%84%D8%A7-%D8%AA%D9%86%D8%AA%D9%87%D9%8A-%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%8A%D8%AF-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%84%D8%A7%D9%84-%D8%B1%D8%B3%D9%85-%D8%B7%D8%B1%D9%82-%D8%A7%D9%84%D9%81%D9%84%D8%B3%D8%B7%D9%8A%D9%86%D9%8A%D9%8A%D9%86-%D9%81%D9%8A-%D8%A7%D9%84%D8%B6%D9%81%D8%A9%D8%9F" class="card__title clamp-3">ØÙاجز ÙØ§ ØªÙØªÙÙ.. ÙÙÙ ÙØ¹Ùد Ø§ÙØ§ØØªÙا٠رس٠طر٠اÙÙÙØ³Ø·ÙÙÙÙÙ ÙÙ Ø§ÙØ¶ÙØ©Ø</a> 1169 1170 1171 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1172</article> 1173 <article class="card"> 1174 <a href="https://qudsn.co/post?id=217920&slug=%D8%B4%D9%87%D9%8A%D8%AF-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A7%D8%AA-%D8%A8%D8%BA%D8%A7%D8%B1%D8%A9-%D8%A5%D8%B3%D8%B1%D8%A7%D8%A6%D9%8A%D9%84%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D9%85%D9%88%D8%A7%D8%B5%D9%8A-%D8%AE%D8%A7%D9%86%D9%8A%D9%88%D9%86%D8%B3" class="card__media zoom" tabindex="-1" aria-hidden="true"> 1175 1176 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abeb1dfdc570.webp" style="" alt="" loading="lazy" decoding="async" 1177 width="400" height="250" 1178 srcset="https://qudsn.co/media/img/200/uploads/2026/10/file_6abeb1dfdc570.webp.webp 200w, https://qudsn.co/media/img/400/uploads/2026/10/file_6abeb1dfdc570.webp.webp 400w, https://qudsn.co/media/img/800/uploads/2026/10/file_6abeb1dfdc570.webp.webp 800w, https://qudsn.co/media/img/1200/uploads/2026/10/file_6abeb1dfdc570.webp.webp 1200w, https://fsn1.your-objectstorage.com/qudsn/uploads/2026/10/file_6abeb1dfdc570.webp 1280w" sizes="(max-width: 560px) 100v
1178w, (max-width: 992px) 50vw, 380px" > 1179 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </a> 1180 <span class="card__body"> 1181 <a href="https://qudsn.co/post?id=217920&slug=%D8%B4%D9%87%D9%8A%D8%AF-%D9%88%D8%A5%D8%B5%D8%A7%D8%A8%D8%A7%D8%AA-%D8%A8%D8%BA%D8%A7%D8%B1%D8%A9-%D8%A5%D8%B3%D8%B1%D8%A7%D8%A6%D9%8A%D9%84%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D9%85%D9%88%D8%A7%D8%B5%D9%8A-%D8%AE%D8%A7%D9%86%D9%8A%D9%88%D9%86%D8%B3" class="card__title clamp-3">Ø´ÙÙØ¯ ÙØ¥ØµØ§Ø¨Ø§Øª بغارة إسرائÙÙÙØ© عÙÙ Ø®ÙÙ Ø© ÙÙ Ù ÙØ§ØµÙ خاÙÙÙÙØ³</a> 1182 1183 1184 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> </span> 1185</article> 1186 <!--[if ENDBLOCK]><![endif]--> 1187 </div> 1188 1189 <!-- pagination --> 1190 <div class="pagination"> 1191 <!--[if BLOCK]><![endif]--> <nav class="pagination" role="navigation" aria-label="ترÙÙÙ Ø§ÙØµÙØØ§Øª"> 1192 1193 <!--[if BLOCK]><![endif]--> <span class="is-disabled" aria-disabled="true"><i class="fa-solid fa-angle-right" aria-hidden="true"></i><span 1194 class="sr-only">Ø§ÙØ³Ø§Ø¨Ù</span></span> 1195 <!--[if ENDBLOCK]><![endif]--> 1196 1197 1198 <!--[if BLOCK]><![endif]--><!--[if ENDBLOCK]><![endif]--> 1199 1200 <!--[if BLOCK]><![endif]--> <!--[if BLOCK]><![endif]--> <span class="is-current" aria-current="page">1</span> 1201 <!--[if ENDBLOCK]><![endif]--> <!--[if BLOCK]><![endif]--> <a href="https://qudsn.co/category_news/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1?page=2">2</a> 1202 <!--[if ENDBLOCK]><![endif]--> <!--[if ENDBLOCK]><![endif]--> 1203 1204 <!--[if BLOCK]><![endif]--> <!--[if BLOCK]><![endif]--> <span class="pagination__dots pagination__edge" aria-hidden="true">â¦</span> 1205 <!--[if ENDBLOCK]><![endif]--> <a href="https://qudsn.co/category_news/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1?page=5540" class="pagination__edge">5540</a> 1206 <!--[if ENDBLOCK]><![endif]--> 1207 1208 <!--[if BLOCK]><![endif]--> <a href="https://qudsn.co/category_news/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1?page=2" rel="next" aria-label="Ø§ÙØªØ§ÙÙ"><i class="fa-solid fa-angle-left" 1209 aria-hidden="true"></i></a> 1210 <!--[if ENDBLOCK]><![endif]--> </nav> 1211<!--[if ENDBLOCK]><![endif]--> 1212 </div> 1213 1214 </div> 1215 </section> 1216 1217</div> 1218</main> 1219 1220<footer class="site-footer"> 1221 <div class="container footer__grid"> 1222 <div class="footer__col"> 1223 <a href="https://qudsn.co" class="footer__brand" aria-label="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©"> 1224 <img src="https://fsn1.your-objectstorage.com/qudsn/uploads/2026/08/file_6a6f0b28738ed.png" alt="Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©" loading="lazy" decoding="async" width="90" height="38" 1225 srcset="https://qudsn.co/media/img/200/uploads/2026/08/file_6a6f0b28738ed.png.webp 200w, https://qudsn.co/media/img/400/uploads/2026/08/file_6a6f0b28738ed.png.webp 400w" sizes="94px" > 1226 </a> 1227 <p class="footer__about"> 1228 ÙÙØ¯Ù اÙÙ Ø¹Ø§ÙØ¬Ø§Øª Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© ÙØ§ÙتØÙÙÙØ§Øª اÙÙ Ø¹Ù ÙØ© اÙ٠رتبطة Ø¨Ø§ÙØ´Ø£Ù اÙÙÙØ³Ø·ÙÙÙ ÙØªØ£Ø«Ùرات٠إÙÙÙÙ ÙØ§ ÙØ¯ÙÙÙØ§ عبر ÙÙØ§Ùب ØªØ±ÙØ² عÙ٠اÙÙ ÙÙÙØ© 1229 </p> 1230 <div class="footer__social"> 1231 <a href="https://tiktok.com/@qudsn" target="_blank" rel="noopener" aria-label="Tiktok" class="footer__social-link"><i class="fab fa-tiktok" aria-hidden="true"></i></a> 1232 <a href="https://t.me/QudsN" target="_blank" rel="noopener" aria-label="Facebook" class="footer__social-link"><i class="fab fa-facebook-f" aria-hidden="true"></i></a> 1233 <a href="https://www.instagram.com/qudsn" target="_blank" rel="noopener" aria-label="Instagram" class="footer__social-link"><i class="fab fa-instagram" aria-hidden="true"></i></a> 1234 <a href="https://www.youtube.com/user/QudsNetwork" target="_blank" rel="noopener" aria-label="Youtube-play" class="footer__social-link"><i class="fab fa-youtube" aria-hidden="true"></i></a> 1235 <a href="https://t.me/QudsN" target="_blank" rel="noopener" aria-label="ÙÙØ§Ø© تÙÙÙØºØ±Ø§Ù " class="footer__social-link"><i class="fab fa-telegram" aria-hidden="true"></i></a> 1236 <a href="https://whatsapp.com/channel/0029VbCpgXo8fewqkgDTLM2z" target="_blank" rel="noopener" aria-label="ÙÙØ§Ø© ÙØ§ØªØ³Ø§Ø¨" class="footer__social-link"><i class="fab fa-whatsapp" aria-hidden="true"></i></a> 1237 <a href="https://twitter.com/QudsN" target="_blank" rel="noopener" aria-label="Twitter" class="footer__social-link"><i class="fab fa-x-twitter" aria-hidden="true"></i></a> 1238 <a href="https://t.me/Qudsn_hebrew" target="_blank" rel="noopener" aria-label="Telegram " class="footer__social-link"><i class="fab fa-telegram" aria-hidden="true"></i></a> 1239 </div> 1240 </div> 1241
1242 <nav class="footer__col" aria-label="Ø§ÙØ£Ùسا٠"> 1243 <h3 class="footer__title">Ø§ÙØ£Ùسا٠</h3> 1244 <ul class="footer__links"> 1245 <li><a 1246 href="https://qudsn.co/category_news/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1">أخبار</a> 1247 </li> 1248 <li><a 1249 href="https://qudsn.co/category_news/%D9%85%D8%AF%D9%88%D9%91%D9%86%D8%A7%D8%AA">٠دÙÙÙØ§Øª</a> 1250 </li> 1251 <li><a 1252 href="https://qudsn.co/category_news/%D8%AA%D8%B1%D8%AC%D9%85%D8%A7%D8%AA%20%D8%B9%D8%A8%D8%B1%D9%8A%D8%A9">ترج٠ات Ø¹Ø¨Ø±ÙØ©</a> 1253 </li> 1254 <li><a 1255 href="https://qudsn.co/category_news/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA">Ù ÙØ§Ùات</a> 1256 </li> 1257 <li><a 1258 href="https://qudsn.co/category_news/%D8%AA%D9%82%D8%A7%D8%B1%D9%8A%D8%B1%20%D9%82%D8%AF%D8%B3">ØªÙØ§Ø±Ùر ÙØ¯Ø³</a> 1259 </li> 1260 <li><a 1261 href="https://qudsn.co/category_news/%D9%85%D8%AA%D8%A7%D8%A8%D8%B9%D8%A7%D8%AA%20%D9%82%D8%AF%D8%B3">٠تابعات ÙØ¯Ø³</a> 1262 </li> 1263 <li><a href="https://qudsn.co/all_podcast">Ø¨ÙØ¯Ùاست ÙØ¯Ø³</a></li> 1264 </ul> 1265 </nav> 1266 1267 <nav class="footer__col" aria-label="Ø±ÙØ§Ø¨Ø·"> 1268 <h3 class="footer__title">Ø±ÙØ§Ø¨Ø·</h3> 1269 <ul class="footer__links"> 1270 <li><a href="https://qudsn.co/about_us">Ù Ù ÙØÙ</a></li> 1271 <li><a href="https://qudsn.co/contact_us">ØªÙØ§ØµÙ Ù Ø¹ÙØ§</a></li> 1272 <li><a href="https://qudsn.co/all_posts">Ù٠اÙÙ ÙØ§Ùات</a></li> 1273 <li><a href="https://qudsn.co/all_videos">ÙØ¯Ø³ ÙÙØ¯ÙÙ</a></li> 1274 <li><a href="https://qudsnen.com" target="_blank" rel="noopener">English</a></li> 1275 </ul> 1276 </nav> 1277 1278 1279 <div class="footer__col"> 1280 <h3 class="footer__title">تابعÙÙØ§ ٠باشرة</h3> 1281 1282 <a href="https://t.me/QudsN" class="footer-channel" 1283 style="--ch:#26a5e4" target="_blank" rel="noopener"> 1284 <i class="fab fa-telegram" aria-hidden="true"></i> 1285 <span><span class="footer-channel__name">ÙÙØ§Ø© تÙÙÙØºØ±Ø§Ù </span> 1286 <span class="footer-channel__sub">آخر Ø§ÙØ£Ø®Ø¨Ø§Ø± Ø§ÙØ¹Ø§Ø¬ÙØ©</span> 1287 </span> 1288 </a> 1289 1290 <a href="https://whatsapp.com/channel/0029VbCpgXo8fewqkgDTLM2z" class="footer-channel" 1291 style="--ch:#25d366" target="_blank" rel="noopener"> 1292 <i class="fab fa-whatsapp" aria-hidden="true"></i> 1293 <span><span class="footer-channel__name">ÙÙØ§Ø© ÙØ§ØªØ³Ø§Ø¨</span> 1294 <span class="footer-channel__sub">Ø§ÙØ¶Ù Ø§ÙØ¢Ù</span> 1295 </span> 1296 </a> 1297 </div> 1298 </div> 1299 1300 <div class="container footer__bottom"> 1301 <p>Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© Ø¬Ù ÙØ¹ ØÙÙ٠اÙÙØ´Ø± Ù ØÙÙØ¸Ø© © 2026</p> 1302 <p>تص٠ÙÙ ÙØªØ·ÙÙØ± Ø¨Ø¹ÙØ§ÙØ© ÙØªØ¬Ø±Ø¨Ø© ÙØ±Ø§Ø¡Ø© Ø£ÙØ¶Ù</p> 1303 </div> 1304</footer> 1305 1306 1307 <div class="breaking-float" id="qdBreakingFloat" hidden 1308 data-endpoint="/breaking_latest" 1309 data-interval="90" role="status" aria-live="polite"> 1310 <div class="breaking-float__inner">
1311 <span class="breaking-float__label"><span class="breaking-float__pulse" aria-hidden="true"></span>عاجÙ</span> 1312 <a class="breaking-float__title" href="#"></a> 1313 <button type="button" class="breaking-float__close" aria-label="Ø¥ØºÙØ§Ù Ø´Ø±ÙØ· Ø§ÙØ¹Ø§Ø¬Ù"> 1314 <i class="fa-solid fa-xmark" aria-hidden="true"></i> 1315 </button> 1316 </div> 1317 </div> 1318 1319 1320<div class="search-overlay" id="searchOverlay" role="dialog" aria-modal="true" aria-label="Ø§ÙØ¨ØØ« ÙÙ Ø´Ø¨ÙØ© ÙØ¯Ø³" hidden> 1321 <div class="search-box" role="document"> 1322 <div class="search-box__head"> 1323 <h3 class="search-box__title">Ø§Ø¨ØØ« ÙÙ Ø´Ø¨ÙØ© ÙØ¯Ø³ Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ©</h3> 1324 <button type="button" class="icon-btn" id="searchClose" aria-label="Ø¥ØºÙØ§Ù Ø§ÙØ¨ØØ«"><i 1325 class="fa-solid fa-xmark" aria-hidden="true"></i></button> 1326 </div> 1327 <form class="search-box__field" role="search" action="https://qudsn.co/search_page" method="get"> 1328 <i class="fa-solid fa-magnifying-glass" aria-hidden="true"></i> 1329 <label class="sr-only" for="searchInput">ÙÙÙ Ø© Ø§ÙØ¨ØØ«</label> 1330 <input id="searchInput" name="search" type="search" autocomplete="off" 1331 role="combobox" aria-expanded="false" aria-controls="searchSuggest" 1332 placeholder="Ø§Ø¨ØØ« ÙÙ Ø§ÙØ£Ø®Ø¨Ø§Ø± ÙØ§ÙØªÙØ§Ø±Ùر ÙØ§ÙÙ ÙØ§Ùات..."> 1333 </form> 1334 1335 1336 <div class="search-suggest" id="searchSuggest" role="listbox" aria-label="Ø§ÙØªØ±Ø§ØØ§Øª Ø§ÙØ¨ØØ«" hidden></div> 1337 1338 1339 <div class="search-box__trending" id="searchTrending"> 1340 <span class="search-box__trending-label">Ø§ÙØ£Ùثر Ø¨ØØ«Ùا</span> 1341 <div class="search-box__tags"> 1342 <a href="https://qudsn.co/search_page?search=%D8%BA%D8%B2%D8%A9" class="tag">غزة</a> 1343 <a href="https://qudsn.co/search_page?search=%D8%A7%D9%84%D8%B6%D9%81%D8%A9+%D8%A7%D9%84%D8%BA%D8%B1%D8%A8%D9%8A%D8%A9" class="tag">Ø§ÙØ¶ÙØ© Ø§ÙØºØ±Ø¨ÙØ©</a> 1344 <a href="https://qudsn.co/search_page?search=%D8%A7%D9%84%D9%82%D8%AF%D8%B3" class="tag">اÙÙØ¯Ø³</a> 1345 <a href="https://qudsn.co/search_page?search=%D8%A7%D9%84%D8%A3%D8%B3%D8%B1%D9%89" class="tag">Ø§ÙØ£Ø³Ø±Ù</a> 1346 <a href="https://qudsn.co/search_page?search=%D9%88%D9%82%D9%81+%D8%A5%D8%B7%D9%84%D8%A7%D9%82+%D8%A7%D9%84%D9%86%D8%A7%D8%B1" class="tag">ÙÙÙ Ø¥Ø·ÙØ§Ù اÙÙØ§Ø±</a> 1347 <a href="https://qudsn.co/search_page?search=%D8%AA%D8%B1%D8%AC%D9%85%D8%A7%D8%AA+%D8%B9%D8%A8%D8%B1%D9%8A%D8%A9" class="tag">ترج٠ات Ø¹Ø¨Ø±ÙØ©</a> 1348 </div> 1349 </div> 1350 </div> 1351</div> 1352 1353
1354<script src="/assets/main/quds_ar/js/main.js?v=1790338511" data-swiper-src="/assets/main/quds_ar/vendor/swiper/swiper-bundle.min.js?v=1789735121" defer></script>
1354 1355 1356
1357<script> 1358(function () { 1359 var input = document.getElementById('searchInput'); 1360 var box = document.getElementById('searchSuggest'); 1361 var trending = document.getElementById('searchTrending'); 1362 if (!input || !box) return; 1363 1364 1365 var endpoint = "\/search_suggest"; 1366 var timer = null, controller = null, activeIdx = -1; 1367 1368 function esc(s) { 1369 return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) { 1370 return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]; 1371 }); 1372 } 1373 function expanded(v) { input.setAttribute('aria-expanded', v ? 'true' : 'false'); } 1374 function showTrending() { 1375 box.hidden = true; box.innerHTML = ''; activeIdx = -1; expanded(false); 1376 if (trending) trending.hidden = false; 1377 } 1378 function state(html) { 1379 if (trending) trending.hidden = true; 1380 box.hidden = false; expanded(true); 1381 box.innerHTML = '<div class="search-suggest__state">' + html + '</div>'; 1382 } 1383 function setActive(i) { 1384 var nodes = box.querySelectorAll('.search-suggest__item'); 1385 nodes.forEach(function (n) { n.classList.remove('is-active'); }); 1386 if (i >= 0 && i < nodes.length) { activeIdx = i; nodes[i].classList.add('is-active'); nodes[i].scrollIntoView({ block: 'nearest' }); } 1387 else { activeIdx = -1; } 1388 } 1389 function render(items) { 1390 if (trending) trending.hidden = true; 1391 box.hidden = false; expanded(true); activeIdx = -1; 1392 if (!items || !items.length) { 1393 box.innerHTML = '<div class="search-suggest__state">ÙØ§ ØªÙØ¬Ø¯ ÙØªØ§Ø¦Ø¬ Ù Ø·Ø§Ø¨ÙØ© â Ø§Ø¶ØºØ· Enter ÙÙØ¨ØØ« اÙÙØ§Ù Ù</div>'; 1394 return; 1395 } 1396 var ICONS = { article: 'fa-newspaper', podcast: 'fa-microphone', video: 'fa-play', tag: 'fa-hashtag' }; 1397 box.innerHTML = items.map(function (it) { 1398 var ic = ICONS[it.type] || 'fa-newspaper'; 1399 return '<a class="search-suggest__item search-suggest__item--' + (it.type || 'article') + '" role="option" href="' + esc(it.url) + '">' + 1400 '<span class="search-suggest__cat"><i class="fa-solid ' + ic + '" aria-hidden="true"></i>' + esc(it.category) + '</span>' + 1401 '<span class="search-suggest__title">' + esc(it.title) + '</span></a>'; 1402 }).join(''); 1403 } 1404 function fetchSuggest(q) { 1405 if (controller) controller.abort(); 1406 controller = new AbortController(); 1407 state('<i class="fa-solid fa-spinner fa-spin" aria-hidden="true"></i> Ø¬Ø§Ø±Ù Ø§ÙØ¨ØØ«â¦'); 1408 fetch(endpoint + '?q=' + encodeURIComponent(q), { signal: controller.signal, headers: { 'X-Requested-With': 'XMLHttpRequest' } }) 1409 .then(function (r) { return r.json(); }) 1410 .then(function (d) { render(d.items || []); }) 1411 .catch(function (e) { if (e.name !== 'AbortError') showTrending(); }); 1412 } 1413 1414 input.addEventListener('input', function () { 1415 var q = input.value.trim(); 1416 clearTimeout(timer); 1417 if (q.length < 2) { showTrending(); return; } 1418 timer = setTimeout(function () { fetchSuggest(q); }, 220); 1419 }); 1420 input.addEventListener('keydown', function (e) { 1421 var nodes = box.querySelectorAll('.search-suggest__item'); 1422 if (box.hidden || !nodes.length) return; 1423 if (e.key === 'ArrowDown') { e.preventDefault(); setActive(Math.min(activeIdx + 1, nodes.length - 1)); } 1424 else if (e.key === 'ArrowUp') { e.preventDefault(); setActive(Math.max(activeIdx - 1, 0)); } 1425 else if (e.key === 'Enter' && activeIdx >= 0) { e.preventDefault(); window.location.href = nodes[activeIdx].getAttribute('href'); } 1426 }); 1427})(); 1428</script>
1428 1429 1430
1431<script> 1432(function () { 1433 var forms = document.querySelectorAll('.js-news-form'); 1434 if (!forms.length) return; 1435 // Path only, not route()'s absolute URL. That URL is built from APP_URL, so 1436 // an http:// value behind an https:// site makes the browser block the 1437 // request as mixed content and the form reports Â«ØªØ¹Ø°ÙØ± Ø§ÙØ§ØªØµØ§Ù Ø¨Ø§ÙØ®Ø§Ø¯Ù » 1438 // even though the endpoint is fine. A relative path always matches the 1439 // scheme and host the visitor is actually on. 1440 var endpoint = "\/newsletter_subscribe"; 1441 1442 forms.forEach(function (form) { 1443 form.addEventListener('submit', function (e) { 1444 e.preventDefault(); 1445 var wrap = form.closest('.newsletter__form-wrap') || form.parentNode; 1446 var input = form.querySelector('input[type="email"], input[name="email"]'); 1447 var success = wrap.querySelector('.news-form__success'); 1448 var error = wrap.querySelector('.news-form__error'); 1449 var btn = form.querySelector('button[type="submit"]'); 1450 if (error) { error.hidden = true; error.textContent = ''; } 1451 if (input && !input.checkValidity()) { input.reportValidity(); return; } 1452 1453 var email = input ? input.value.trim() : ''; 1454 if (btn) btn.disabled = true; 1455 1456 fetch(endpoint, { 1457 method: 'POST', 1458 headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, 1459 body: JSON.stringify({ email: email }) 1460 }) 1461 .then(function (r) { return r.json().then(function (d) { return { ok: r.ok, body: d }; }); }) 1462 .then(function (res) { 1463 if (res.ok && res.body && res.body.ok) { 1464 form.hidden = true; 1465 if (success) success.hidden = false; 1466 } else { 1467 if (error) { error.textContent = (res.body && res.body.message) || 'ØªØ¹Ø°ÙØ± Ø§ÙØ§Ø´ØªØ±Ø§ÙØ ØØ§Ù٠٠رة أخرÙ.'; error.hidden = false; } 1468 if (btn) btn.disabled = false; 1469 } 1470 }) 1471 .catch(function () { 1472 if (error) { error.textContent = 'ØªØ¹Ø°ÙØ± Ø§ÙØ§ØªØµØ§Ù Ø¨Ø§ÙØ®Ø§Ø¯Ù Ø ØØ§Ù٠٠رة أخرÙ.'; error.hidden = false; } 1473 if (btn) btn.disabled = false; 1474 }); 1475 }); 1476 }); 1477})(); 1478</script>
1478 1479 1480 1481 1482 <style> 1483 /* ---------- Carousel ---------- */ 1484 .post-gallery { margin: 1.5em auto; max-width: 100%; } 1485 .pg-carousel { position: relative; border-radius: 12px; overflow: hidden; background: #0b0f1a; } 1486 .pg-viewport { overflow: hidden; } 1487 .pg-track { display: flex; transition: transform .4s cubic-bezier(.22,.61,.36,1); will-change: transform; } 1488 .pg-slide { flex: 0 0 100%; min-width: 100%; } 1489 .pg-slide img { 1490 display: block; width: 100%; height: 100%; 1491 aspect-ratio: 16 / 9; object-fit: cover; cursor: zoom-in; margin: 0; 1492 } 1493 /* Grid layout â media side by side instead of one at a time. */ 1494 .pg-grid { 1495 display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); 1496 gap: 10px; margin: 28px auto; max-width: 100%; 1497 } 1498 /* Wider grid, opt-in via data-pg-layout="grid-3". */ 1499 .pg-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } 1500 /* Mosaic: the lead photo carries the block, the rest support it â the 1501 shape newsrooms actually use for a photo set. */ 1502 .pg-mosaic { grid-template-columns: repeat(4, minmax(0, 1fr)); } 1503 .pg-mosaic .pg-cell:first-child { grid-column: span 2; grid-row: span 2; } 1504 .pg-grid .pg-cell { position: relative; min-width: 0; border-radius: 10px; overflow: hidden; background: #0b1220; } 1505 .pg-grid .pg-cell img, 1506 .pg-grid .pg-cell video { 1507 display: block; width: 100%; height: 100%; 1508 aspect-ratio: 16 / 9; object-fit: cover; margin: 0; 1509 } 1510 .pg-grid .pg-cell video { object-fit: contain; background: #000; } 1511 .pg-grid .pg-cell img { cursor: zoom-in; } 1512 .pg-grid .pg-cell--doc { display: grid; place-items: center; aspect-ratio: 16 / 9; padding: 14px; } 1513 /* A lone item should not sit in a half-width column. */ 1514 .pg-grid .pg-cell:only-child { grid-column: 1 / -1; } 1515 @media (max-width: 640px) { 1516 .pg-grid, .pg-grid--3 { grid-template-columns: 1fr; } 1517 /* Mosaic keeps two columns on a phone â one column would erase it. */ 1518 .pg-mosaic { grid-template-columns: repeat(2, minmax(0, 1fr)); } 1519 } 1520 1521 /* ---------- Aspect ratio (data-pg-ratio) ---------- 1522 Absent = 16/9 cover, exactly as every gallery authored before this. */ 1523 [data-pg-ratio="4-3"] .pg-slide img, [data-pg-ratio="4-3"] .pg-cell img, 1524 [data-pg-ratio="4-3"] .pg-slide video, [data-pg-ratio="4-3"] .pg-cell video { aspect-ratio: 4 / 3; } 1525 [data-pg-ratio="1-1"] .pg-slide img, [data-pg-ratio="1-1"] .pg-cell img, 1526 [data-pg-ratio="1-1"] .pg-slide video, [data-pg-ratio="1-1"] .pg-cell video { aspect-ratio: 1 / 1; } 1527 /* "auto" = never crop. Portrait photography survives; the cap keeps a tall 1528 shot from pushing the article off the screen. */ 1529 [data-pg-ratio="auto"] .pg-slide img, [data-pg-ratio="auto"] .pg-cell img { 1530 aspect-ratio: auto; height: auto; max-height: 72vh; object-fit: contain; background: #0b0f1a; 1531 } 1532 [data-pg-ratio="auto"].pg-grid .pg-cell { background: transparent; } 1533 1534 /* ---------- Captions ---------- 1535 Carousel: ONE strip under the viewport that follows the active slide, so 1536 slide heights stay uniform (a per-slide caption made the track jump). 1537 Grid: a caption under each cell. */ 1538 .pg-cap { 1539 font-size: 13px; line-height: 1.65; color: #475569; 1540 padding: 8px 12px 0; text-align: center; 1541 } 1542 .pg-cap:empty { display: none; } 1543 .pg-grid .pg-cap { text-align: start; padding: 6px 2px 0; font-size: 12.5px; } 1544 /* The cell is the caption's parent, so it must not clip it. */ 1545 .pg-grid .pg-cell--captioned { overflow: visible; background: transparent; } 1546 .pg-grid .pg-cell--captioned > img, 1547 .pg-grid .pg-cell--captioned > video { border-radius: 10px; } 1548 1549 /* ---------- "+N more" overflow badge ---------- */ 1550 .pg-more { 1551 position: absolute; inset: 0; display: grid; place-items: center; 1552 background: rgba(6, 9, 18, .62); color: #fff; 1553 font-size: 22px; font-weight: 800; letter-spacing: .02em; 1554 cursor: zoom-in; direction: ltr; border: 0; width: 100%; padding: 0; 1555 } 1556 .pg-more:hover { background: rgba(6, 9, 18, .74); } 1557 1558 /* Video slide: same 16/9 frame as an image slide, native controls. */ 1559 .pg-slide video { 1560 display: block; width: 100%; height: 100%; 1561 aspect-ratio: 16 / 9; object-fit: contain; background: #000; margin: 0; 1562 } 1563 /* Audio slide: a centred player with the track name above it. */ 1564 .pg-slide--audio, .pg-grid .pg-cell--audio { 1565 display: grid; place-items: center; align-content: center; gap: 10px; 1566 aspect-ratio: 16 / 9; padding: 18px; 1567 } 1568 .pg-slide--audio audio, .pg-grid .pg-cell--audio audio { 1569 width: min(100%, 420px); height: 40px; display: block; margin: 0; 1570 } 1571 /* Track name comes from data-pg-name; ::before keeps the markup a lone <audio>. */ 1572 .pg-slide--audio::before, .pg-grid .pg-cell--audio::before { 1573 content: attr(data-pg-label); 1574 font-size: 13px; font-weight: 700; color: #e2e8f0; text-align: center; 1575 max-width: 90%; line-height: 1.6; word-break: break-word; 1576 } 1577 .pg-slide--audio:not([data-pg-label])::before, 1578 .pg-grid .pg-cell--audio:not([data-pg-label])::before { content: none; } 1579 1580 /* Document slide (PDF / Word / anything else): a card, not a preview. */ 1581 .pg-slide--doc { display: grid; place-items: center; aspect-ratio: 16 / 9; padding: 18px; } 1582 .pg-doc { 1583 display: flex; flex-direction: column; align-items: center; gap: 6px; 1584 max-width: 90%; padding: 18px 22px; border-radius: 12px; text-decoration: none; 1585 background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.16); 1586 color: #f1f5f9; text-align: center; transition: background .15s ease, transform .15s ease; 1587 } 1588 .pg-doc:hover { background: rgba(255,255,255,.12); transform: translateY(-1px); } 1589 /* The glyph is drawn in CSS so no icon font is required by any theme. */ 1590 .pg-doc::before { 1591 content: ''; width: 34px; height: 42px; margin-bottom: 4px; 1592 background: #e2e8f0; border-radius: 3px; 1593 clip-path: polygon(0 0, 68% 0, 100% 26%, 100% 100%, 0 100%); 1594 } 1595 .pg-doc__name { font-size: 14px; font-weight: 700; word-break: break-word; line-height: 1.5; } 1596 .pg-doc__meta { font-size: 11.5px; opacity: .75; direction: ltr; } 1597 1598 .pg-arrow { 1599 position: absolute; top: 50%; transform: translateY(-50%); 1600 width: 42px; height: 42px; border: none; border-radius: 50%; 1601 background: rgba(0,0,0,.5); color: #fff; font-size: 22px; line-height: 1; 1602 cursor: pointer; display: grid; place-items: center; z-index: 2; padding: 0; 1603 transition: background .15s ease, opacity .15s ease; 1604 } 1605 .pg-arrow:hover { background: rgba(0,0,0,.78); } 1606 .pg-prev { inset-inline-start: 10px; } 1607 .pg-next { inset-inline-end: 10px; } 1608 .pg-counter { 1609 position: absolute; top: 10px; inset-inline-end: 12px; z-index: 2; 1610 background: rgba(0,0,0,.55); color: #fff; font-size: 12px; font-weight: 600; 1611 padding: 3px 9px; border-radius: 999px; direction: ltr; 1612 } 1613 .pg-dots { display: flex; gap: 2px; justify-content: center; padding: 10px; flex-wrap: wrap; } 1614 /* a11y target-size: same 8px visual dot, but a 24x24 hit area (the dot is 1615 drawn as a centered radial gradient inside the bigger button) */ 1616 .pg-dot { 1617 width: 24px; height: 24px; border-radius: 50%; border: none; padding: 0; cursor: pointer; 1618 background: radial-gradient(circle 4px at center, rgba(255,255,255,.35) 100%, transparent 0); 1619 transition: background .15s ease, transform .15s ease; 1620 } 1621 .pg-dot.is-active { background: radial-gradient(circle 5px at center, #fff 100%, transparent 0); } 1622 .pg-carousel--single .pg-arrow, .pg-carousel--single .pg-dots, .pg-carousel--single .pg-counter { display: none; } 1623 1624 /* ---------- Lightbox ---------- */ 1625 .pg-lightbox { 1626 position: fixed; inset: 0; z-index: 2147483000; 1627 background: rgba(6,8,15,.94); display: none; 1628 align-items: center; justify-content: center; 1629 opacity: 0; transition: opacity .2s ease; 1630 touch-action: none; 1631 } 1632 .pg-lightbox.is-open { display: flex; opacity: 1; } 1633 .pg-lb-stage { position: relative; width: 100%; height: 100%; display: grid; place-items: center; padding: 56px 16px; } 1634 .pg-lb-img { max-width: 94vw; max-height: 86vh; object-fit: contain; border-radius: 6px; box-shadow: 0 10px 40px rgba(0,0,0,.5); user-select: none; } 1635 .pg-lb-btn { 1636 position: absolute; border: none; background: rgba(255,255,255,.12); color: #fff; 1637 cursor: pointer; display: grid; place-items: center; border-radius: 50%; 1638 padding: 0; line-height: 1; transition: background .15s ease; 1639 /* The â® / ⯠ornaments are Bidi_Mirrored=Yes â inside an RTL page they get 1640 flipped by the text engine. Force LTR so the glyph renders as authored. 1641 (Buttons are positioned with physical left/right, so this is safe.) */ 1642 direction: ltr; 1643 } 1644 .pg-lb-btn:hover { background: rgba(255,255,255,.26); } 1645 .pg-lb-close { top: 16px; left: 50%; transform: translateX(-50%); width: 44px; height: 44px; font-size: 26px; } 1646 .pg-lb-nav { top: 50%; transform: translateY(-50%); width: 52px; height: 52px; font-size: 30px; } 1647 /* Physical left/right (NOT logical) so the arrows always sit & point outward, 1648 immune to however a theme sets direction on the page or its buttons. */
1649 .pg-lb-prev { left: 16px; } 1650 .pg-lb-next { right: 16px; } 1651 .pg-lb-counter { position: absolute; top: 24px; inset-inline-start: 18px; color: #e5e7eb; font-size: 13px; font-weight: 600; direction: ltr; } 1652 /* Zoom: the image scales inside the stage, which then pans by drag. */ 1653 .pg-lb-img { transition: transform .18s ease; transform-origin: center center; } 1654 .pg-lb-img.is-zoomed { cursor: grab; max-width: none; max-height: none; } 1655 .pg-lb-tools { 1656 position: absolute; top: 16px; inset-inline-end: 18px; 1657 display: flex; align-items: center; gap: 6px; direction: ltr; 1658 } 1659 .pg-lb-tool { 1660 width: 34px; height: 34px; border: 0; border-radius: 8px; cursor: pointer; 1661 background: rgba(255,255,255,.12); color: #fff; font-size: 16px; line-height: 1; 1662 display: grid; place-items: center; text-decoration: none; padding: 0; 1663 transition: background .15s ease; 1664 } 1665 .pg-lb-tool:hover { background: rgba(255,255,255,.26); } 1666 .pg-lb-zoomlabel { color: #cbd5e1; font-size: 12px; font-weight: 700; min-width: 40px; text-align: center; } 1667 .pg-lb-caption { 1668 position: absolute; bottom: 14px; inset-inline: 0; text-align: center; 1669 color: #e5e7eb; font-size: 14px; padding: 0 60px; line-height: 1.5; 1670 text-shadow: 0 1px 3px rgba(0,0,0,.8); 1671 } 1672 @media (max-width: 576px) { 1673 .pg-slide img { aspect-ratio: 4 / 3; } 1674 .pg-lb-nav { width: 42px; height: 42px; font-size: 24px; } 1675 .pg-lb-caption { font-size: 12.5px; padding: 0 16px; bottom: 8px; } 1676 } 1677</style>
1678<script> 1679(function () { 1680 if (window.__postGalleryReady) return; 1681 window.__postGalleryReady = true; 1682 1683 // Control labels come from the SITE's lang files. They used to be baked 1684 // into this script â an Arabic dot label ("Ø§ÙØ§ÙØªÙØ§Ù Ø¥ÙÙ Ø§ÙØµÙرة") shipped 1685 // to English sites, and English Previous/Next/Close shipped to Arabic 1686 // ones. Defaults keep the partial safe if a key is ever missing. 1687 var T = Object.assign({ 1688 prev: 'Previous', next: 'Next', close: 'Close', 1689 goTo: 'Go to image', zoomIn: 'Zoom in', zoomOut: 'Zoom out', 1690 openOriginal: 'Open the original', 1691 }, {"prev":"\u0627\u0644\u0633\u0627\u0628\u0642","next":"\u0627\u0644\u062a\u0627\u0644\u064a","close":"\u0625\u063a\u0644\u0627\u0642","goTo":"\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0635\u0648\u0631\u0629","zoomIn":"\u062a\u0643\u0628\u064a\u0631","zoomOut":"\u062a\u0635\u063a\u064a\u0631","openOriginal":"\u0641\u062a\u062d \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0623\u0635\u0644\u064a\u0629"} || {}); 1692 1693 // Direction is read from each element's OWN computed `direction` â never from 1694 // <html>. Some themes keep dir="rtl" on <html> but render the body/overlay LTR 1695 // via CSS; reading the element keeps the arrow GLYPH, its logical POSITION and 1696 // the swipe/key LOGIC all derived from one source, so they can never disagree. 1697 function elRTL(el) { try { return getComputedStyle(el).direction === 'rtl'; } catch (e) { return false; } } 1698 // prev sits on the inline-start edge, next on inline-end, so the glyph that 1699 // "points outward" flips with direction. LTR: prev â® / next â¯. RTL: mirrored. 1700 function prevGlyph(rtl) { return rtl ? '❯' : '❮'; } 1701 function nextGlyph(rtl) { return rtl ? '❮' : '❯'; } 1702 // Images eligible for the lightbox: gallery slides, editor figures, and the 1703 // usual content wrappers. Header/footer/logo images are excluded by scope. 1704 var IMG_SELECTOR = [ 1705 '[data-post-gallery] img', 1706 'figure.post-image-figure img', 1707 '.post-content img', '.article-content img', '.entry-content img', 1708 '.single-post img', '[data-post-body] img' 1709 ].join(','); 1710 1711 // ...but those wrappers are PAGE-level: `.article-content` on several 1712 // themes wraps the header too, so the byline avatar and the share 1713 // control's icon sat inside it and the lightbox happily opened them as 1714 // photographs. An <img> that lives inside an interactive control or a 1715 // byline is chrome, never a picture the reader asked to enlarge. 1716 var CHROME_SELECTOR = [ 1717 'button', '[role="button"]', 1718 '.share-wrap', '.share-menu', '.social-share__link', 1719 '.post-meta', '.article-meta', '.author-face', 1720 '[data-pg-skip]' 1721 ].join(','); 1722 1723 /** 1724 * Is this <img> something the lightbox should open? 1725 * Explicit gallery markup always wins; otherwise the image must sit in a 1726 * content wrapper, outside chrome, and be big enough to be a photograph. 1727 */ 1728 function isLightboxImage(img) { 1729 if (!img || !img.matches || !img.matches(IMG_SELECTOR)) return false; 1730 if (img.closest('[data-post-gallery]')) return true; 1731 if (img.closest(CHROME_SELECTOR)) return false; 1732 // An icon is not a photograph. Measured, not guessed â and only when 1733 // the image actually has a box, so a not-yet-laid-out image is kept. 1734 var r = img.getBoundingClientRect(); 1735 if (r.width && r.height && r.width < 40 && r.height < 40) return false; 1736 return true; 1737 } 1738 1739 /* ----------------------------- Carousel ----------------------------- */ 1740 // A slide can be an image, a video, or a document card. Images keep being 1741 // plain <img> children (so galleries authored before this stayed valid and 1742 // the lightbox still finds them); the other kinds are opt-in markup emitted 1743 // by the editor. Direct children only â never reaches into a card's insides. 1744 var MEDIA_SELECTOR = ':scope > img, :scope > video, :scope > audio, :scope > [data-pg-doc]'; 1745 function galleryMedia(gal) { 1746 try { 1747 return Array.prototype.slice.call(gal.querySelectorAll(MEDIA_SELECTOR)); 1748 } catch (e) { 1749 // :scope is unsupported on very old engines â fall back to filtering. 1750 return Array.prototype.filter.call(gal.children, function (el) { 1751 return el.matches && el.matches('img, video, audio, [data-pg-doc]'); 1752 }); 1753 } 1754 } 1755 1756 /** Slide modifier for a media node â images get none (the default look). */ 1757 function slideKindClass(node) {
1758 if (node.tagName === 'VIDEO') return 'pg-slide--video'; 1759 if (node.tagName === 'AUDIO') return 'pg-slide--audio'; 1760 if (node.hasAttribute && node.hasAttribute('data-pg-doc')) return 'pg-slide--doc'; 1761 return ''; 1762 } 1763 1764 /** Audio slides label themselves from the node's data-pg-name (CSS ::before). */ 1765 function applySlideLabel(wrapper, node) { 1766 if (node.tagName !== 'AUDIO') return; 1767 var name = node.getAttribute('data-pg-name'); 1768 if (name) wrapper.setAttribute('data-pg-label', name); 1769 } 1770 1771 /** A media node's caption, authored on the node itself as data-pg-caption. */ 1772 function mediaCaption(node) { 1773 return (node.getAttribute && node.getAttribute('data-pg-caption') || '').trim(); 1774 } 1775 1776 /** 1777 * Below-the-fold gallery images should not block the article's own render. 1778 * The editor now stamps loading/decoding at insert time, but EVERY gallery 1779 * authored before that is still out there â mark them here. The first item 1780 * stays eager: it is often the one in view. 1781 */ 1782 function applyLoadingHints(media) { 1783 media.forEach(function (node, i) { 1784 if (node.tagName !== 'IMG' || node.hasAttribute('loading')) return; 1785 if (i > 0) node.setAttribute('loading', 'lazy'); 1786 node.setAttribute('decoding', 'async'); 1787 }); 1788 } 1789 1790 function enhanceGalleries(root) { 1791 var scope = root || document; 1792 var galleries = scope.querySelectorAll('[data-post-gallery]:not([data-pg-ready])'); 1793 galleries.forEach(function (gal) { 1794 var media = galleryMedia(gal); 1795 if (!media.length) { gal.setAttribute('data-pg-ready', '1'); return; } 1796 1797 applyLoadingHints(media); 1798 1799 // Grid family: everything side by side, no arrows/dots/counter. 1800 // Opt-in via data-pg-layout â a block WITHOUT the attribute stays a 1801 // carousel, which is every gallery authored before this existed, 1802 // and "grid" keeps meaning exactly the two-column layout it always 1803 // did. New values are additive only. 1804 var layout = gal.getAttribute('data-pg-layout') || ''; 1805 var GRIDS = { 'grid': '', 'grid-3': 'pg-grid--3', 'mosaic': 'pg-mosaic' }; 1806 if (layout in GRIDS) { 1807 gal.classList.add('pg-grid'); 1808 if (GRIDS[layout]) gal.classList.add(GRIDS[layout]); 1809 gal.setAttribute('data-pg-ready', '1'); 1810 1811 // data-pg-max caps how many cells are drawn; the last visible one 1812 // wears a "+N" badge that opens the lightbox at the first hidden 1813 // item, so nothing becomes unreachable. 1814 var max = parseInt(gal.getAttribute('data-pg-max') || '0', 10); 1815 var shown = (max > 0 && max < media.length) ? max : media.length; 1816 var hidden = media.length - shown; 1817 1818 var cells = document.createDocumentFragment(); 1819 media.forEach(function (node, i) { 1820 var cap = mediaCaption(node); 1821 if (i >= shown) { 1822 // Kept in the DOM (hidden) so the lightbox list still 1823 // contains it â only its cell is not drawn. 1824 node.style.display = 'none'; 1825 cells.appendChild(node); 1826 return; 1827 } 1828 var cell = document.createElement('div'); cell.className = 'pg-cell'; 1829 var cellCls = slideKindClass(node).replace('pg-slide--', 'pg-cell--'); 1830 if (cellCls) cell.classList.add(cellCls); 1831 if (cap) cell.classList.add('pg-cell--captioned'); 1832 applySlideLabel(cell, node); 1833 cell.appendChild(node); 1834 if (cap) { 1835 var c = document.createElement('div'); c.className = 'pg-cap'; c.textContent = cap; 1836 cell.appendChild(c); 1837 } 1838 if (hidden > 0 && i === shown - 1) { 1839 var more = document.createElement('button'); 1840 more.type = 'button'; more.className = 'pg-more'; 1841 more.setAttribute('data-pg-more', String(shown)); 1842 more.textContent = '+' + hidden; 1843 cell.appendChild(more); 1844 } 1845 cells.appendChild(cell); 1846 }); 1847 gal.innerHTML = ''; 1848 gal.appendChild(cells); 1849 // Images keep their [data-post-gallery] img ancestry, so the 1850 // lightbox picks them up here exactly as in a carousel. 1851 return; 1852 } 1853 1854 gal.classList.add('pg-carousel'); 1855 gal.setAttribute('data-pg-ready', '1'); 1856 if (media.length === 1) gal.classList.add('pg-carousel--single'); 1857 1858 var viewport = document.createElement('div'); viewport.className = 'pg-viewport'; 1859 var track = document.createElement('div'); track.className = 'pg-track';
1860 media.forEach(function (node) { 1861 var slide = document.createElement('div'); slide.className = 'pg-slide'; 1862 var kindCls = slideKindClass(node); 1863 if (kindCls) slide.classList.add(kindCls); 1864 applySlideLabel(slide, node); 1865 slide.appendChild(node); 1866 track.appendChild(slide); 1867 }); 1868 viewport.appendChild(track); 1869 gal.innerHTML = ''; 1870 gal.appendChild(viewport); 1871 1872 // ONE caption strip under the viewport, refreshed per slide â a 1873 // per-slide caption made every slide a different height and the 1874 // track jumped on each move. 1875 if (media.some(function (n) { return mediaCaption(n); })) { 1876 var capEl = document.createElement('div'); 1877 capEl.className = 'pg-cap'; 1878 gal.appendChild(capEl); 1879 } 1880 1881 gal.setAttribute('data-pg-index', '0'); 1882 var galRTL = elRTL(gal); 1883 var counter = document.createElement('div'); counter.className = 'pg-counter'; 1884 // <bdo dir="ltr"> stops the Bidi_Mirrored â®/⯠from being flipped by an 1885 // RTL page, while the button keeps its logical (direction-aware) position. 1886 var prev = document.createElement('button'); prev.type = 'button'; prev.className = 'pg-arrow pg-prev'; prev.setAttribute('data-pg-go', 'prev'); prev.setAttribute('aria-label', T.prev); prev.innerHTML = '<bdo dir="ltr">' + prevGlyph(galRTL) + '</bdo>'; 1887 var next = document.createElement('button'); next.type = 'button'; next.className = 'pg-arrow pg-next'; next.setAttribute('data-pg-go', 'next'); next.setAttribute('aria-label', T.next); next.innerHTML = '<bdo dir="ltr">' + nextGlyph(galRTL) + '</bdo>'; 1888 var dots = document.createElement('div'); dots.className = 'pg-dots'; 1889 media.forEach(function (_, i) { 1890 var d = document.createElement('button'); d.type = 'button'; d.className = 'pg-dot' + (i === 0 ? ' is-active' : ''); d.setAttribute('data-pg-dot', i); 1891 d.setAttribute('aria-label', T.goTo + ' ' + (i + 1)); 1892 dots.appendChild(d); 1893 }); 1894 gal.appendChild(counter); gal.appendChild(prev); gal.appendChild(next); gal.appendChild(dots); 1895 applyCarousel(gal); 1896 }); 1897 } 1898 1899 // Controls are handled by the ONE delegated listener below â not per-button 1900 // listeners â so navigation keeps working even when Livewire/theme scripts 1901 // re-render the post body and drop per-node listeners (that's exactly why the 1902 // lightbox survived but the arrows didn't). State lives on the DOM element. 1903 function applyCarousel(gal) { 1904 var track = gal.querySelector('.pg-track'); 1905 if (!track) return; 1906 var count = track.children.length || 1; 1907 var index = parseInt(gal.getAttribute('data-pg-index') || '0', 10); 1908 index = ((index % count) + count) % count; 1909 gal.setAttribute('data-pg-index', index); 1910 track.style.transform = 'translateX(' + ((elRTL(gal) ? 1 : -1) * index * 100) + '%)'; 1911 var counter = gal.querySelector('.pg-counter'); if (counter) counter.textContent = (index + 1) + ' / ' + count; 1912 gal.querySelectorAll('.pg-dot').forEach(function (d, i) { d.classList.toggle('is-active', i === index); }); 1913 var capEl = gal.querySelector(':scope > .pg-cap'); 1914 if (capEl) { 1915 var active = track.children[index]; 1916 var node = active && active.firstElementChild; 1917 capEl.textContent = node ? mediaCaption(node) : ''; 1918 } 1919 pauseHiddenVideos(gal); 1920 } 1921 function moveCarousel(gal, delta) { 1922 gal.setAttribute('data-pg-index', parseInt(gal.getAttribute('data-pg-index') || '0', 10) + delta); 1923 applyCarousel(gal); 1924 } 1925 1926 // Leaving a slide stops its video or audio, so navigating never leaves sound 1927 // playing behind the reader. No-op on galleries that hold only images. 1928 function pauseHiddenVideos(gal) { 1929 var index = parseInt(gal.getAttribute('data-pg-index') || '0', 10);
1930 gal.querySelectorAll('.pg-slide').forEach(function (slide, i) { 1931 if (i === index) return; 1932 slide.querySelectorAll('video, audio').forEach(function (v) { 1933 try { if (!v.paused) v.pause(); } catch (e) {} 1934 }); 1935 }); 1936 } 1937 1938 /* ----------------------------- Lightbox ----------------------------- */ 1939 var lb, lbImg, lbCaption, lbCounter, lbList = [], lbIndex = 0, lbTouchX = 0; 1940 function buildLightbox() { 1941 if (lb) return; 1942 lb = document.createElement('div'); lb.className = 'pg-lightbox'; lb.setAttribute('role', 'dialog'); 1943 document.body.appendChild(lb); 1944 // Fullscreen viewer = universal physical layout: left button sits on the 1945 // left and points left (= previous), right sits right and points right 1946 // (= next), in every theme/locale. No direction logic â can't be reversed. 1947 lb.innerHTML = 1948 '<div class="pg-lb-stage">' + 1949 '<button type="button" class="pg-lb-btn pg-lb-close" aria-label="' + T.close + '">×</button>' + 1950 '<button type="button" class="pg-lb-btn pg-lb-nav pg-lb-prev" aria-label="' + T.prev + '">❮</button>' + 1951 '<img class="pg-lb-img" alt="">' + 1952 '<button type="button" class="pg-lb-btn pg-lb-nav pg-lb-next" aria-label="' + T.next + '">❯</button>' + 1953 '<div class="pg-lb-counter"></div>' + 1954 '<div class="pg-lb-tools">' + 1955 '<button type="button" class="pg-lb-tool" data-pg-zoom="-1" aria-label="' + T.zoomOut + '" title="' + T.zoomOut + '">−</button>' + 1956 '<span class="pg-lb-zoomlabel">100%</span>' + 1957 '<button type="button" class="pg-lb-tool" data-pg-zoom="1" aria-label="' + T.zoomIn + '" title="' + T.zoomIn + '">+</button>' + 1958 '<a class="pg-lb-tool pg-lb-original" target="_blank" rel="noopener" aria-label="' + T.openOriginal + '" title="' + T.openOriginal + '">↗</a>' + 1959 '</div>' + 1960 '<div class="pg-lb-caption"></div>' + 1961 '</div>'; 1962 lbImg = lb.querySelector('.pg-lb-img'); 1963 lbCaption = lb.querySelector('.pg-lb-caption'); 1964 lbCounter = lb.querySelector('.pg-lb-counter'); 1965 lb.querySelector('.pg-lb-close').addEventListener('click', close); 1966 lb.querySelector('.pg-lb-prev').addEventListener('click', function (e) { e.stopPropagation(); step(-1); }); 1967 lb.querySelector('.pg-lb-next').addEventListener('click', function (e) { e.stopPropagation(); step(1); }); 1968 lb.addEventListener('click', function (e) { if (e.target === lb || e.target.classList.contains('pg-lb-stage')) close(); }); 1969 lb.addEventListener('touchstart', function (e) { lbTouchX = e.changedTouches[0].clientX; }, { passive: true }); 1970 lb.addEventListener('touchend', function (e) { 1971 // A zoomed image is being panned, not swiped between photos. 1972 if (lbZoom > 1) return; 1973 var d = e.changedTouches[0].clientX - lbTouchX; 1974 if (Math.abs(d) > 45) step(d < 0 ? 1 : -1); 1975 }); 1976 document.addEventListener('keydown', function (e) { 1977 if (!lb.classList.contains('is-open')) return; 1978 if (e.key === 'Escape') close(); 1979 else if (e.key === 'ArrowRight') step(1); 1980 else if (e.key === 'ArrowLeft') step(-1); 1981 else if (e.key === '+' || e.key === '=') setZoom(lbZoom + .25); 1982 else if (e.key === '-') setZoom(lbZoom - .25); 1983 else if (e.key === '0') setZoom(1); 1984 }); 1985 1986 // Zoom controls, the wheel, and double-click-to-toggle. 1987 lb.addEventListener('click', function (e) { 1988 var z = e.target.closest && e.target.closest('[data-pg-zoom]'); 1989 if (!z) return; 1990 e.stopPropagation(); 1991 setZoom(lbZoom + (parseFloat(z.getAttribute('data-pg-zoom')) * .25)); 1992 }); 1993 lb.addEventListener('wheel', function (e) { 1994 if (!lb.classList.contains('is-open')) return; 1995 e.preventDefault(); 1996 setZoom(lbZoom + (e.deltaY < 0 ? .2 : -.2)); 1997 }, { passive: false }); 1998 lbImg.addEventListener('dblclick', function (e) { 1999 e.stopPropagation(); 2000 setZoom(lbZoom > 1 ? 1 : 2); 2001 }); 2002 2003 // Pan a zoomed image by dragging it. 2004 var panning = false, panX = 0, panY = 0; 2005 lbImg.addEventListener('pointerdown', function (e) { 2006 if (lbZoom <= 1) return; 2007 panning = true; panX = e.clientX - lbPanX; panY = e.clientY - lbPanY; 2008 try { lbImg.setPointerCapture(e.pointerId); } catch (err) {} 2009 }); 2010 lbImg.addEventListener('pointermove', function (e) { 2011 if (!panning) return; 2012 lbPanX = e.clientX - panX; lbPanY = e.clientY - panY; 2013 applyZoom(); 2014 }); 2015 ['pointerup', 'pointercancel'].forEach(function (evt) { 2016 lbImg.addEventListener(evt, function () { panning = false; }); 2017 }); 2018 } 2019 2020 /* Zoom state lives beside the viewer, reset on every image change so a 2021 reader never lands on the next photo already scaled and off-centre. */ 2022 var lbZoom = 1, lbPanX = 0, lbPanY = 0; 2023 function applyZoom() { 2024 if (!lbImg) return; 2025 lbImg.style.transform = 'translate(' + lbPanX + 'px,' + lbPanY + 'px) scale(' + lbZoom + ')'; 2026 lbImg.classList.toggle('is-zoomed', lbZoom > 1); 2027 var label = lb && lb.querySelector('.pg-lb-zoomlabel'); 2028 if (label) label.textContent = Math.round(lbZoom * 100) + '%'; 2029 } 2030 function setZoom(z) { 2031 lbZoom = Math.min(4, Math.max(1, Math.round(z * 100) / 100)); 2032 if (lbZoom === 1) { lbPanX = 0; lbPanY = 0; } 2033 applyZoom(); 2034 } 2035 function showAt(i) { 2036 lbIndex = (i + lbList.length) % lbList.length; 2037 var src = lbList[lbIndex]; 2038 // Reset zoom per image: landing on the next photo already scaled and 2039 // panned off-centre is disorienting. 2040 setZoom(1); 2041 lbImg.src = src.full; 2042 lbImg.alt = src.alt || ''; 2043 var orig = lb.querySelector('.pg-lb-original'); 2044 if (orig) orig.setAttribute('href', src.full); 2045 lbCaption.textContent = src.caption || ''; 2046 lbCaption.style.display = src.caption ? '' : 'none'; 2047 lbCounter.textContent = lbList.length > 1 ? (lbIndex + 1) + ' / ' + lbList.length : ''; 2048 lb.querySelector('.pg-lb-prev').style.display = lbList.length > 1 ? '' : 'none'; 2049 lb.querySelector('.pg-lb-next').style.display = lbList.length > 1 ? '' : 'none'; 2050 } 2051 function step(d) { showAt(lbIndex + d); } 2052 function open(list, i) { 2053 buildLightbox(); 2054 lbList = list; showAt(i); 2055 lb.classList.add('is-open'); 2056 document.documentElement.style.overflow = 'hidden'; 2057 } 2058 function close() { 2059 if (!lb) return; 2060 lb.classList.remove('is-open'); 2061 document.documentElement.style.overflow = ''; 2062 lbImg.src = ''; 2063 } 2064 2065 // Build the eligible-image list (deduped, DOM order) and open at the clicked one. 2066 function openFromImage(target) { 2067 var nodes = Array.prototype.slice.call(document.querySelectorAll(IMG_SELECTOR)).filter(isLightboxImage); 2068 var seen = [], list = [], startIndex = 0, found = false;
2069 nodes.forEach(function (img) { 2070 if (!img.src || seen.indexOf(img) !== -1) return; 2071 seen.push(img); 2072 // Caption sources, in order: the gallery caption authored on the 2073 // node itself, then a sibling <figcaption> for ordinary article 2074 // figures. 2075 var cap = mediaCaption(img); 2076 if (!cap) { 2077 var fig = img.closest('figure'); 2078 if (fig) { var fc = fig.querySelector('figcaption'); if (fc && !fc.hasAttribute('data-caption-placeholder')) cap = fc.textContent.trim(); } 2079 } 2080 list.push({ full: img.getAttribute('src'), alt: img.alt || '', caption: cap }); 2081 if (img === target) { startIndex = list.length - 1; found = true; } 2082 }); 2083 if (list.length) open(list, found ? startIndex : 0); 2084 } 2085 2086 // One delegated listener handles carousel controls AND lightbox-eligible 2087 // images (now and future) â survives any later DOM re-render. 2088 document.addEventListener('click', function (e) { 2089 var t = e.target; 2090 if (!t || !t.closest) return; 2091 var goBtn = t.closest('[data-pg-go]'); 2092 if (goBtn) { 2093 var g = goBtn.closest('[data-post-gallery]'); 2094 if (g) { e.preventDefault(); moveCarousel(g, goBtn.getAttribute('data-pg-go') === 'next' ? 1 : -1); } 2095 return; 2096 } 2097 // "+N" badge: open the viewer at the first item the grid did not draw. 2098 var moreBtn = t.closest('[data-pg-more]'); 2099 if (moreBtn) { 2100 e.preventDefault(); 2101 var gm = moreBtn.closest('[data-post-gallery]'); 2102 var imgs = gm ? gm.querySelectorAll('img') : []; 2103 var at = parseInt(moreBtn.getAttribute('data-pg-more'), 10) || 0; 2104 if (imgs[at]) openFromImage(imgs[at]); 2105 return; 2106 } 2107 var dotBtn = t.closest('[data-pg-dot]'); 2108 if (dotBtn) { 2109 var g2 = dotBtn.closest('[data-post-gallery]'); 2110 if (g2) { e.preventDefault(); g2.setAttribute('data-pg-index', dotBtn.getAttribute('data-pg-dot')); applyCarousel(g2); } 2111 return; 2112 } 2113 var img = t.closest('img'); 2114 if (isLightboxImage(img)) { e.preventDefault(); openFromImage(img); } 2115 }); 2116 2117 // Swipe â also delegated, for the same resilience. 2118 var swGal = null, swX = 0, swDX = 0; 2119 document.addEventListener('touchstart', function (e) { 2120 var v = e.target.closest ? e.target.closest('.pg-viewport') : null; 2121 swGal = v ? v.closest('[data-post-gallery]') : null; 2122 if (swGal) { swX = e.touches[0].clientX; swDX = 0; } 2123 }, { passive: true }); 2124 document.addEventListener('touchmove', function (e) { if (swGal) swDX = e.touches[0].clientX - swX; }, { passive: true }); 2125 document.addEventListener('touchend', function () { 2126 if (swGal && Math.abs(swDX) > 40) moveCarousel(swGal, (swDX < 0) !== elRTL(swGal) ? 1 : -1); 2127 swGal = null; 2128 }); 2129 2130 /* ----------------------------- Boot ----------------------------- */ 2131 function boot() { try { enhanceGalleries(document); } catch (e) {} } 2132 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); 2133 else boot(); 2134 // Re-enhance content rendered later (Livewire navigations, lazy sections). 2135 if (window.MutationObserver) { 2136 var mo = new MutationObserver(function (muts) { 2137 for (var i = 0; i < muts.length; i++) { 2138 if (muts[i].addedNodes && muts[i].addedNodes.length) { enhanceGalleries(document); break; } 2139 } 2140 }); 2141 try { mo.observe(document.body, { childList: true, subtree: true }); } catch (e) {} 2142 } 2143 document.addEventListener('livewire:navigated', boot); 2144})(); 2145</script>
2145 2146 2147 2148<div class="qd-modal" id="qdMediaModal" hidden> 2149 <div class="qd-modal__backdrop" data-media-close></div> 2150 2151 <div class="qd-modal__dialog" role="dialog" aria-modal="true" aria-labelledby="qdMediaTitle"> 2152 2153 <div class="qd-modal__bar"> 2154 <button type="button" class="qd-modal__close" data-media-close aria-label="Ø¥ØºÙØ§Ù"> 2155 <i class="fa-solid fa-xmark" aria-hidden="true"></i> 2156 </button> 2157 2158 2159 <div class="qd-modal__nav" id="qdMediaNav" hidden> 2160 <button type="button" class="qd-modal__step" data-media-prev aria-label="Ø§ÙØ³Ø§Ø¨Ù"> 2161 <i class="fa-solid fa-chevron-right" aria-hidden="true"></i> 2162 </button> 2163 <span class="qd-modal__count" id="qdMediaCount"></span> 2164 <button type="button" class="qd-modal__step" data-media-next aria-label="Ø§ÙØªØ§ÙÙ"> 2165 <i class="fa-solid fa-chevron-left" aria-hidden="true"></i> 2166 </button> 2167 </div> 2168 </div> 2169 2170 <div class="qd-modal__stage"> 2171 <div class="qd-modal__player" id="qdMediaPlayer"></div> 2172 2173 2174 <span class="qd-modal__rail qd-modal__rail--start" data-media-swipe aria-hidden="true"></span> 2175 <span class="qd-modal__rail qd-modal__rail--end" data-media-swipe aria-hidden="true"></span> 2176 </div> 2177 2178 2179 <div class="qd-modal__updown" id="qdMediaUpDown" hidden> 2180 <button type="button" class="qd-modal__step" data-media-prev aria-label="Ø§ÙØ³Ø§Ø¨Ù"> 2181 <i class="fa-solid fa-chevron-up" aria-hidden="true"></i> 2182 </button> 2183 <span class="qd-modal__count" id="qdMediaCountV"></span> 2184 <button type="button" class="qd-modal__step" data-media-next aria-label="Ø§ÙØªØ§ÙÙ"> 2185 <i class="fa-solid fa-chevron-down" aria-hidden="true"></i> 2186 </button> 2187 </div> 2188 2189 <div class="qd-modal__body"> 2190 <h2 class="qd-modal__title" id="qdMediaTitle"></h2> 2191 <p class="qd-modal__desc" id="qdMediaDesc"></p> 2192 2193 <button type="button" class="qd-modal__more" id="qdMediaMore" hidden> 2194 <span>عرض اÙÙ Ø²ÙØ¯</span><i class="fa-solid fa-chevron-down" aria-hidden="true"></i> 2195 </button> 2196 </div> 2197 </div> 2198</div> 2199 2200<style> 2201 .qd-modal { position: fixed; inset: 0; z-index: 1000; display: grid; place-items: center; padding: 20px; } 2202 .qd-modal[hidden] { display: none; } 2203 .qd-modal__backdrop { position: absolute; inset: 0; background: rgba(8, 14, 24, .72); backdrop-filter: blur(3px); } 2204 .qd-modal__dialog { position: relative; width: min(880px, 100%); max-height: 90vh; overflow-y: auto; 2205 background: var(--bg, #fff); border-radius: var(--r-lg, 16px); box-shadow: 0 30px 80px rgba(0, 0, 0, .35); } 2206 /* Its own strip, so nothing of ours sits on the player's controls. */ 2207 .qd-modal__bar { display: flex; justify-content: space-between; align-items: center; gap: 10px; 2208 padding: 8px 10px; background: #0d1117; border-radius: var(--r-lg, 16px) var(--r-lg, 16px) 0 0; } 2209 .qd-modal__close, .qd-modal__step { width: 36px; height: 36px; border: 0; border-radius: 50%; cursor: pointer; 2210 background: rgba(255, 255, 255, .12); color: #fff; font-size: 16px; display: grid; place-items: center; 2211 transition: background .2s; } 2212 .qd-modal__close:hover, .qd-modal__step:hover:not(:disabled) { background: rgba(255, 255, 255, .25); } 2213 .qd-modal__step:disabled { opacity: .3; cursor: default; } 2214 .qd-modal__nav { display: flex; align-items: center; gap: 8px; } 2215 .qd-modal__count { color: rgba(255, 255, 255, .65); font-size: 12.5px; font-weight: 700; 2216 font-variant-numeric: tabular-nums; min-width: 52px; text-align: center; } 2217 .qd-modal__player { background: #000; overflow: hidden; } 2218 .qd-modal__player iframe, .qd-modal__player video { display: block; width: 100%; border: 0; } 2219 /* Video keeps 16:9; an audio player is short and must not be stretched. */ 2220 .qd-modal__player[data-kind="youtube"] iframe, 2221 .qd-modal__player[data-kind="iframe"] iframe { aspect-ratio: 16 / 9; height: auto; } 2222 .qd-modal__stage { position: relative; } 2223 .qd-modal__rail { display: none; } 2224 .qd-modal__updown { display: none; } 2225 2226 /* ââ REEL VIEWER ââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2227 A reel is the whole thing: no card around it, no copy under it. The 2228 dialog becomes the video's own 9:16 frame, sized to the viewport so it 2229 never scrolls, with the controls floating clear of it. */ 2230 .qd-modal__dialog[data-ratio="vertical"] { 2231 width: auto; max-height: none; overflow: visible; 2232 background: transparent; box-shadow: none; 2233 display: flex; align-items: center; gap: 14px; 2234 } 2235 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__bar { 2236 position: absolute; inset-block-start: -52px; inset-inline-end: 0; 2237 background: transparent; padding: 0; z-index: 3; 2238 } 2239 /* The horizontal pager belongs to the wide player; a reel gets the 2240 up/down column beside it instead. */ 2241 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__nav, 2242 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__body { display: none; } 2243 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__updown { 2244 display: flex; flex-direction: column; align-items: center; gap: 12px; 2245 } 2246 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__stage { 2247 /* 9:16, bounded by the shorter of the two axes so the frame always fits. */ 2248 height: min(86vh, calc((100vw - 140px) * 16 / 9)); 2249 aspect-ratio: 9 / 16; 2250 border-radius: 18px; overflow: hidden; background: #000; 2251 box-shadow: 0 30px 80px rgba(0, 0, 0, .5); 2252 } 2253 /* The iframe is exactly the frame â no scaling, no clipping. An earlier 2254 version built it 16:9 at full height and let it overflow sideways, to 2255 trade YouTube's letterboxing for a fuller picture; it magnified the video
2256 instead and cut the captions burnt into it off both edges. Whatever 2257 YouTube pads around a Short is better than showing part of it. */ 2258 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__player { height: 100%; } 2259 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__player[data-kind="youtube"] iframe, 2260 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__player[data-kind="iframe"] iframe { 2261 width: 100%; height: 100%; aspect-ratio: auto; 2262 } 2263 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__rail { 2264 display: block; position: absolute; inset-block: 0; width: 56px; z-index: 2; 2265 touch-action: pan-y; 2266 } 2267 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__rail--start { inset-inline-start: 0; } 2268 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__rail--end { inset-inline-end: 0; } 2269 /* «5 / 12», not «12 / 5»: the slash makes RTL reorder the two numbers. */ 2270 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__count { 2271 min-width: 0; font-size: 12px; direction: ltr; 2272 } 2273 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__step { 2274 width: 44px; height: 44px; font-size: 17px; 2275 background: rgba(255, 255, 255, .14); backdrop-filter: blur(6px); 2276 } 2277 2278 /* On a phone the reel takes the screen and everything of ours floats on top 2279 of it: there is no room for a bar above or a column beside. */ 2280 @media (max-width: 560px) { 2281 .qd-modal { padding: 0; } 2282 .qd-modal__dialog[data-ratio="vertical"] { gap: 0; width: 100%; } 2283 /* The height decides the width here â aspect-ratio derives it â so the 2284 modal's own 12px padding has to come out of the height, or the frame 2285 ends up 24px wider than the space it sits in and hangs off the left. */ 2286 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__stage { 2287 width: auto; 2288 height: min(calc(100dvh - 24px), calc((100vw - 24px) * 16 / 9)); 2289 border-radius: 12px; 2290 } 2291 /* Above the frame there is only the browser's own chrome, so the close 2292 button came to rest off-screen. It sits inside the frame now. */ 2293 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__bar { 2294 inset-block-start: 10px; inset-inline-end: 10px; z-index: 4; 2295 } 2296 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__close { 2297 background: rgba(0, 0, 0, .55); backdrop-filter: blur(6px); 2298 } 2299 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__updown { 2300 position: absolute; inset-inline-start: 10px; inset-block-start: 50%; 2301 transform: translateY(-50%); z-index: 3; gap: 10px; 2302 } 2303 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__step { width: 40px; height: 40px; } 2304 /* Narrower rails: on a phone the arrows already occupy one side, and a 2305 56px strip over a 375px screen would swallow a third of the video. */ 2306 .qd-modal__dialog[data-ratio="vertical"] .qd-modal__rail { width: 40px; } 2307 } 2308 .qd-modal__player[data-kind="soundcloud"] { background: transparent; } 2309 .qd-modal__player[data-kind="soundcloud"] iframe { height: 166px; } 2310 .qd-modal__player[data-kind="file"] { background: transparent; padding: 18px 20px 0; } 2311 /* An uploaded clip plays in place, letterboxed like the embeds above it. */ 2312 .qd-modal__player[data-kind="video"] video { display: block; width: 100%; max-height: 78vh; background: #000; } 2313 .qd-modal__body { padding: 20px 24px 26px; } 2314 .qd-modal__title { margin: 0 0 10px; font-size: clamp(17px, 2vw, 21px); font-weight: 800; line-height: 1.6; color: var(--ink, #15181d); } 2315 .qd-modal__desc { margin: 0; color: var(--muted, #5b626e); line-height: 1.95; font-size: 15px; white-space: pre-line; } 2316 .qd-modal__desc:empty { display: none; } 2317 .qd-modal__more { display: none; } 2318 body.qd-modal-open { overflow: hidden; } 2319 2320 /* On a phone the episode blurb ran longer than the video itself, pushing the 2321 player off-screen the moment the modal opened. Collapsed to a few lines 2322 with a toggle; the class only ever goes on when the text really overflows, 2323 so short descriptions get no button. */ 2324 @media (max-width: 640px) { 2325 .qd-modal { padding: 12px; } 2326 .qd-modal__body { padding: 16px 18px 20px; } 2327 .qd-modal__desc.is-clamped { 2328 display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden; 2329 } 2330 .qd-modal__more { 2331 display: inline-flex; align-items: center; gap: 6px; margin-top: 10px; 2332 padding: 7px 14px; border: 1px solid var(--line, #e3e6ea); border-radius: 999px; 2333 background: transparent; color: var(--accent, #2f7fcf); 2334 font: inherit; font-size: 13px; font-weight: 700; cursor: pointer; 2335 } 2336 .qd-modal__more i { font-size: 11px; transition: transform .2s; } 2337 .qd-modal__more[aria-expanded="true"] i { transform: rotate(180deg); } 2338 } 2339</style> 2340
2341<script> 2342 (function () { 2343 var modal = document.getElementById('qdMediaModal'); 2344 if (!modal) return; 2345 2346 var player = document.getElementById('qdMediaPlayer'); 2347 var titleEl = document.getElementById('qdMediaTitle'); 2348 var descEl = document.getElementById('qdMediaDesc'); 2349 var moreBtn = document.getElementById('qdMediaMore'); 2350 var dialog = modal.querySelector('.qd-modal__dialog'); 2351 var navEl = document.getElementById('qdMediaNav'); 2352 var upDownEl = document.getElementById('qdMediaUpDown'); 2353 var countEls = [document.getElementById('qdMediaCount'), document.getElementById('qdMediaCountV')]; 2354 var prevBtns = [].slice.call(modal.querySelectorAll('[data-media-prev]')); 2355 var nextBtns = [].slice.call(modal.querySelectorAll('[data-media-next]')); 2356 var narrow = window.matchMedia('(max-width: 640px)'); 2357 var lastFocus = null; 2358 2359 // The open trigger's siblings, so Â«Ø§ÙØªØ§ÙÙ» walks the grid the reader 2360 // was looking at rather than every player on the page. 2361 var siblings = []; 2362 var index = -1; 2363 2364 /** 2365 * Collect the playable cards around a trigger. 2366 * 2367 * Scoped to the nearest list container â a swiper wrapper, a grid â so a 2368 * reel opened from the video rail steps through that rail. Swiper clones 2369 * its slides for looping, and a clone carries the same attributes as the 2370 * original, so they are filtered out or the reader would meet the same 2371 * video twice. 2372 */ 2373 function collectSiblings(trigger) { 2374 var scope = trigger.closest('.swiper-wrapper, .cards-grid, .video-grid, .section, .container') || document; 2375 var all = [].slice.call(scope.querySelectorAll('[data-media-open][data-media-src]')); 2376 2377 siblings = all.filter(function (el) { 2378 return !el.closest('.swiper-slide-duplicate'); 2379 }); 2380 2381 index = siblings.indexOf(trigger); 2382 if (index === -1 && siblings.length) { 2383 // A duplicate slide was clicked: match the original by source. 2384 var src = trigger.getAttribute('data-media-src'); 2385 index = siblings.findIndex(function (el) { 2386 return el.getAttribute('data-media-src') === src; 2387 }); 2388 } 2389 2390 var many = siblings.length > 1 && index > -1; 2391 navEl.hidden = !many; 2392 upDownEl.hidden = !many; 2393 if (many) syncNav(); 2394 } 2395 2396 /** Reflect the current position on both control sets. */ 2397 function syncNav() { 2398 prevBtns.forEach(function (b) { b.disabled = index <= 0; }); 2399 nextBtns.forEach(function (b) { b.disabled = index >= siblings.length - 1; }); 2400 countEls.forEach(function (el) { 2401 if (el) el.textContent = (index + 1) + ' / ' + siblings.length; 2402 }); 2403 } 2404 2405 function step(delta) { 2406 var target = siblings[index + delta]; 2407 if (!target) return; 2408 open(target, true); 2409 } 2410 2411 prevBtns.forEach(function (b) { b.addEventListener('click', function () { step(-1); }); }); 2412 nextBtns.forEach(function (b) { b.addEventListener('click', function () { step(1); }); }); 2413 2414 /* ââ Gestures, for the reel viewer ââââââââââââââââââââââââââââââââ 2415 A swipe up means Â«Ø§ÙØªØ§ÙÙ», the way every reel feed behaves. The 2416 listeners live on the side rails because the player's iframe keeps 2417 every touch that lands on it; the wheel is read off the dialog, 2418 which does see it. */ 2419 var touchY = null; 2420 2421 modal.addEventListener('touchstart', function (e) { 2422 if (!e.target.closest('[data-media-swipe]')) return; 2423 touchY = e.changedTouches[0].clientY; 2424 }, { passive: true }); 2425 2426 modal.addEventListener('touchend', function (e) { 2427 if (touchY === null) return; 2428 var dy = e.changedTouches[0].clientY - touchY; 2429 touchY = null; 2430 if (Math.abs(dy) < 45) return; // a tap, or a hesitation 2431 step(dy < 0 ? 1 : -1); // swipe up â next 2432 }, { passive: true }); 2433 2434 // One notch of a trackpad can fire dozens of events; ignore the tail. 2435 var wheelLock = false;
2436 modal.addEventListener('wheel', function (e) { 2437 if (dialog.getAttribute('data-ratio') !== 'vertical') return; 2438 if (Math.abs(e.deltaY) < 20 || wheelLock) return; 2439 wheelLock = true; 2440 setTimeout(function () { wheelLock = false; }, 600); 2441 step(e.deltaY > 0 ? 1 : -1); 2442 }, { passive: true }); 2443 2444 /** 2445 * Collapse the description if it is long enough to be worth collapsing. 2446 * Measured after the modal is visible â a hidden element reports zero 2447 * height, which would clamp everything or nothing. 2448 */ 2449 function setupClamp() { 2450 descEl.classList.remove('is-clamped'); 2451 moreBtn.hidden = true; 2452 moreBtn.setAttribute('aria-expanded', 'false'); 2453 moreBtn.querySelector('span').textContent = 'عرض اÙÙ Ø²ÙØ¯'; 2454 2455 if (!narrow.matches || !descEl.textContent.trim()) return; 2456 2457 descEl.classList.add('is-clamped'); 2458 if (descEl.scrollHeight - descEl.clientHeight > 4) { 2459 moreBtn.hidden = false; 2460 } else { 2461 descEl.classList.remove('is-clamped'); 2462 } 2463 } 2464 2465 moreBtn.addEventListener('click', function () { 2466 var expanded = descEl.classList.toggle('is-clamped') === false; 2467 moreBtn.setAttribute('aria-expanded', String(expanded)); 2468 moreBtn.querySelector('span').textContent = expanded ? 'عرض Ø£ÙÙ' : 'عرض اÙÙ Ø²ÙØ¯'; 2469 }); 2470 2471 function close() { 2472 modal.hidden = true; 2473 document.body.classList.remove('qd-modal-open'); 2474 // Emptying the container stops playback â a paused iframe would keep 2475 // running audio behind the closed modal. 2476 player.innerHTML = ''; 2477 player.removeAttribute('data-kind'); 2478 if (lastFocus && lastFocus.focus) lastFocus.focus(); 2479 } 2480 2481 /** 2482 * Start playing as soon as the player appears. 2483 * 2484 * The modal only ever opens from a click, so this is the reader asking 2485 * to watch â they should not have to ask twice. `playsinline` keeps a 2486 * phone from taking the video fullscreen on its own, and `rel=0` stops 2487 * YouTube ending on a wall of other channels' videos. 2488 * 2489 * A browser that refuses unmuted autoplay simply shows YouTube's own 2490 * play button, which is exactly where this started â no regression. 2491 */ 2492 function withAutoplay(src, kind) { 2493 if (kind !== 'youtube' && kind !== 'iframe') return src; 2494 if (src.indexOf('autoplay=') !== -1) return src; 2495 2496 return src + (src.indexOf('?') === -1 ? '?' : '&') + 'autoplay=1&playsinline=1&rel=0'; 2497 } 2498 2499 function open(trigger, stepping) { 2500 var kind = trigger.getAttribute('data-media-kind') || 'iframe'; 2501 var src = trigger.getAttribute('data-media-src') || ''; 2502 if (!src) return false; 2503 2504 if (stepping) { 2505 index = siblings.indexOf(trigger); 2506 syncNav(); 2507 } else { 2508 lastFocus = trigger; 2509 collectSiblings(trigger); 2510 } 2511 2512 // A reel is vertical; the dialog follows the video's shape. 2513 dialog.setAttribute('data-ratio', 2514 trigger.getAttribute('data-media-ratio') === 'vertical' ? 'vertical' : 'wide'); 2515 2516 player.setAttribute('data-kind', kind); 2517 2518 if (kind === 'file') { 2519 var audio = document.createElement('audio'); 2520 audio.src = src; 2521 audio.controls = true; 2522 audio.style.width = '100%'; 2523 player.innerHTML = ''; 2524 player.appendChild(audio); 2525 } else if (kind === 'video') { 2526 // An uploaded clip â a podcast episode filmed rather than 2527 // recorded, or a local video material. An <iframe> would show 2528 // the browser's bare file viewer instead of our player. 2529 var video = document.createElement('video'); 2530 video.src = src; 2531 video.controls = true; 2532 video.autoplay = true;
2533 video.playsInline = true; 2534 video.preload = 'metadata'; 2535 player.innerHTML = ''; 2536 player.appendChild(video); 2537 } else { 2538 var frame = document.createElement('iframe'); 2539 frame.src = withAutoplay(src, kind); 2540 frame.setAttribute('allow', 'autoplay; accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture'); 2541 frame.setAttribute('allowfullscreen', ''); 2542 // Not lazy: this frame is created because the reader just asked 2543 // for it, and a deferred load is a beat of nothing on screen. 2544 frame.setAttribute('loading', 'eager'); 2545 frame.setAttribute('title', trigger.getAttribute('data-media-title') || ''); 2546 if (kind === 'soundcloud') frame.setAttribute('scrolling', 'no'); 2547 player.innerHTML = ''; 2548 player.appendChild(frame); 2549 } 2550 2551 titleEl.textContent = trigger.getAttribute('data-media-title') || ''; 2552 descEl.textContent = trigger.getAttribute('data-media-desc') || ''; 2553 2554 modal.hidden = false; 2555 document.body.classList.add('qd-modal-open'); 2556 setupClamp(); 2557 modal.querySelector('.qd-modal__close').focus(); 2558 return true; 2559 } 2560 2561 document.addEventListener('click', function (e) { 2562 if (e.target.closest('[data-media-close]')) { close(); return; } 2563 2564 var trigger = e.target.closest('[data-media-open]'); 2565 if (!trigger) return; 2566 2567 // Only swallow the navigation if a player actually opened, so a card 2568 // with nothing playable still follows its link. 2569 if (open(trigger)) e.preventDefault(); 2570 }); 2571 2572 document.addEventListener('keydown', function (e) { 2573 if (modal.hidden) return; 2574 if (e.key === 'Escape') { close(); return; } 2575 2576 // A reel is a vertical feed, so it answers to Up/Down; the wide 2577 // player pages sideways. RTL puts Â«Ø§ÙØªØ§ÙÙ» on the left. 2578 if (dialog.getAttribute('data-ratio') === 'vertical') { 2579 if (e.key === 'ArrowDown') { e.preventDefault(); step(1); } 2580 if (e.key === 'ArrowUp') { e.preventDefault(); step(-1); } 2581 return; 2582 } 2583 if (e.key === 'ArrowLeft') { step(1); } 2584 if (e.key === 'ArrowRight') { step(-1); } 2585 }); 2586 2587 // Leaving the page via SPA navigation must not leave a player running. 2588 document.addEventListener('livewire:navigating', close); 2589 })(); 2590</script>
2590 2591 2592 2593<button type="button" id="pushBell" class="push-bell" hidden 2594 aria-label="ÙØ¹Ù٠إشعارات Ø§ÙØ£Ø®Ø¨Ø§Ø±" title="ÙØ¹Ù٠إشعارات Ø§ÙØ£Ø®Ø¨Ø§Ø±"> 2595 <svg width="19" height="19" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 16a2 2 0 0 0 2-2H6a2 2 0 0 0 2 2m.995-14.901a1 1 0 1 0-1.99 0A5 5 0 0 0 3 6c0 1.098-.5 6-2 7h14c-1.5-1-2-5.902-2-7a5 5 0 0 0-4.005-4.901"/></svg> 2596 <span>ÙØ¹Ù٠إشعارات Ø§ÙØ£Ø®Ø¨Ø§Ø±</span> 2597 </button> 2598 2599 <style> 2600 .push-bell { position: fixed; bottom: 18px; inset-inline-start: 18px; z-index: 1040; display: inline-flex; align-items: center; gap: 8px; padding: 10px 16px; border: 0; border-radius: 999px; background: #111827; color: #fff; font-size: 13px; font-weight: 700; cursor: pointer; box-shadow: 0 10px 26px rgba(15,23,42,.3); transition: transform .15s ease, opacity .3s ease; } 2601 .push-bell:hover { transform: translateY(-2px); } 2602 .push-bell.is-done { background: #16a34a; pointer-events: none; } 2603 @media (max-width: 576px) { .push-bell span { display: none; } .push-bell { padding: 12px; } } 2604 </style> 2605 2606
2606<script> 2607 (function () { 2608 if (!('serviceWorker' in navigator) || !('PushManager' in window) || !('Notification' in window)) return; 2609 if (Notification.permission === 'denied') return; 2610 2611 var bell = document.getElementById('pushBell'); 2612 if (!bell) return; 2613 var KEY = "BJnWZnZxWLKyMjku-jgiENmso1_txj1AJ6tB8oC7X9mfjitbIg1-_JwEqzDRjxlP3BFkMQ0lhrs9rJBROYrneMo"; 2614 2615 function b64ToU8(s) { 2616 var pad = '='.repeat((4 - s.length % 4) % 4); 2617 var raw = atob((s + pad).replace(/-/g, '+').replace(/_/g, '/')); 2618 var arr = new Uint8Array(raw.length); 2619 for (var i = 0; i < raw.length; i++) arr[i] = raw.charCodeAt(i); 2620 return arr; 2621 } 2622 2623 navigator.serviceWorker.register('/push-sw.js').then(function (reg) { 2624 return reg.pushManager.getSubscription().then(function (sub) { 2625 if (sub) return; // already subscribed â stay hidden 2626 bell.hidden = false; 2627 }); 2628 }).catch(function () {}); 2629 2630 bell.addEventListener('click', function () { 2631 Notification.requestPermission().then(function (perm) { 2632 if (perm !== 'granted') { bell.hidden = true; return; } 2633 navigator.serviceWorker.ready.then(function (reg) { 2634 reg.pushManager.subscribe({ 2635 userVisibleOnly: true, 2636 applicationServerKey: b64ToU8(KEY) 2637 }).then(function (sub) { 2638 return fetch('/push/subscribe', { 2639 method: 'POST', 2640 headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, 2641 body: JSON.stringify(sub.toJSON()) 2642 }); 2643 }).then(function () { 2644 bell.classList.add('is-done'); 2645 bell.querySelector('span') && (bell.querySelector('span').textContent = "\u062a\u0645 \u0627\u0644\u062a\u0641\u0639\u064a\u0644 \u2713"); 2646 setTimeout(function () { bell.hidden = true; }, 2500); 2647 }).catch(function () { bell.hidden = true; }); 2648 }); 2649 }); 2650 }); 2651 })(); 2652 </script>
2652 2653 2654
2655<script> 2656 (function () { 2657 if (!document.querySelector('blockquote.twitter-tweet')) return; 2658 if (document.getElementById('twitter-wjs')) return; 2659 var s = document.createElement('script'); 2660 s.id = 'twitter-wjs'; 2661 s.async = true; 2662 s.charset = 'utf-8'; 2663 s.src = 'https://platform.twitter.com/widgets.js'; 2664 document.body.appendChild(s); 2665 })(); 2666</script>
vendor: 1 bytes, line 2666
2666
2667<script src="https://qudsn.co/vendor/livewire/livewire.min.js?id=f4724cc4" data-csrf="FwhjVF8VnIHAm1fm62oWkmwyjFldH3nyRu8RxfAl" data-module-url="https://qudsn.co/livewire-dcd59c78" data-update-uri="https://qudsn.co/livewire-dcd59c78/update" data-navigate-once="true"></script>
vendor: 1 bytes, line 2667
2667
2668<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"afc00504e7c949c9b1d808ce2fc6fc19","r":1,"spa":2}' crossorigin="anonymous"></script>
2668 2669</body> 2670 2671</html>
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.