PageSourceSearch

https://qudsn.co/category_news/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1

html qudsn.co collected 2026-10-02 11:25:26 UTC 158,059 bytes, 2,671 lines download raw bytes

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="{&quot;data&quot;:{&quot;search_query&quot;:[[],{&quot;s&quot;:&quot;arr&quot;}],&quot;category_title&quot;:&quot;\u0623\u062e\u0628\u0627\u0631&quot;,&quot;paginators&quot;:[{&quot;page&quot;:1},{&quot;s&quot;:&quot;arr&quot;}]},&quot;memo&quot;:{&quot;id&quot;:&quot;m6BynpwEL16eyfuKBnm3&quot;,&quot;name&quot;:&quot;main.quds-ar.category-news&quot;,&quot;path&quot;:&quot;category_news\/%D8%A3%D8%AE%D8%A8%D8%A7%D8%B1&quot;,&quot;method&quot;:&quot;GET&quot;,&quot;release&quot;:&quot;a-a-a&quot;,&quot;children&quot;:[],&quot;scripts&quot;:[],&quot;assets&quot;:[],&quot;errors&quot;:[],&quot;locale&quot;:&quot;ar&quot;,&quot;islands&quot;:[]},&quot;checksum&quot;:&quot;939b83511967fbe97f43631a66dadd1524f5dd45c581442ec63b67f1621c7653&quot;}" wire:effects="{&quot;url&quot;:{&quot;paginators.page&quot;:{&quot;as&quot;:&quot;page&quot;,&quot;use&quot;:&quot;push&quot;,&quot;alwaysShow&quot;:false,&quot;except&quot;: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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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 { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[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 ? '&#10095;' : '&#10094;'; }
1701    function nextGlyph(rtl) { return rtl ? '&#10094;' : '&#10095;'; }
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 + '">&times;</button>' +
1950                '<button type="button" class="pg-lb-btn pg-lb-nav pg-lb-prev" aria-label="' + T.prev + '">&#10094;</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 + '">&#10095;</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 + '">&minus;</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 + '">&#8599;</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.