PageSourceSearch

https://scunthorpe-united.co.uk/_next/static/chunks/1psn3mi9rnh2m.js

js scunthorpe-united.co.uk collected 2026-09-25 00:38:38 UTC 24,026 bytes, 486 lines download raw bytes

1(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push([typeof document === "object" ? document.currentScript : undefined,
294179, ((__turbopack_context__) => {
3"use strict";
4
5var __TURBOPACK__imported__module__43476__ = __turbopack_context__.i(43476);
6var __TURBOPACK__imported__module__25913__ = __turbopack_context__.i(25913);
7var __TURBOPACK__imported__module__47163__ = __turbopack_context__.i(47163);
8;
9;
10;
11const badgeVariants = (0, __TURBOPACK__imported__module__25913__["cva"])("inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap [&>svg]:pointer-events-none [&>svg]:size-3", {
12    variants: {
13        variant: {
14            default: "bg-primary text-primary-foreground",
15            secondary: "bg-secondary text-secondary-foreground",
16            destructive: "bg-destructive/10 text-destructive",
17            outline: "border-border text-foreground",
18            ghost: "hover:bg-muted hover:text-muted-foreground",
19            link: "text-primary underline-offset-4 hover:underline"
20        }
21    },
22    defaultVariants: {
23        variant: "default"
24    }
25});
26function Badge({ className, variant = "default", ...props }) {
27    return /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("span", {
28        className: (0, __TURBOPACK__imported__module__47163__["cn"])(badgeVariants({
29            variant
30        }), className),
31        ...props
32    });
33}
34;
35__turbopack_context__.s([
36    "Badge",
37    0,
38    Badge
39]);
40}),
4160340, ((__turbopack_context__) => {
42"use strict";
43
44// MERGED MODULE: [project]/node_modules/lucide-react/dist/esm/icons/lock.js [app-client] (ecmascript) <export default as Lock>
45;
46// MERGED MODULE: [project]/node_modules/lucide-react/dist/esm/icons/lock.js [app-client] (ecmascript)
47;
48/**
49 * @license lucide-react v1.7.0 - ISC
50 *
51 * This source code is licensed under the ISC license.
52 * See the LICENSE file in the root directory of this source tree.
53 */ var __TURBOPACK__imported__module__75254__ = __turbopack_context__.i(75254);
54;
55const __iconNode = [
56    [
57        "rect",
58        {
59            width: "18",
60            height: "11",
61            x: "3",
62            y: "11",
63            rx: "2",
64            ry: "2",
65            key: "1w4ew1"
66        }
67    ],
68    [
69        "path",
70        {
71            d: "M7 11V7a5 5 0 0 1 10 0v4",
72            key: "fwvmzm"
73        }
74    ]
75];
76const Lock = (0, __TURBOPACK__imported__module__75254__["default"])("lock", __iconNode);
77;
78__turbopack_context__.s([
79    "Lock",
80    0,
81    Lock
82], 60340);
83}),
8499833, ((__turbopack_context__) => {
85"use strict";
86
87// Build a news article URL matching WordPress structure: /news/2026/may/article-slug
88// date may be "YYYY-MM-DD" or "YYYY-MM-DDTHH:MM" — always extract just the date part
89function newsUrl(date, slug) {
90    const datePart = date.split("T")[0];
91    const d = new Date(datePart + "T12:00:00");
92    const year = d.getFullYear();
93    const month = d.toLocaleString("en-GB", {
94        month: "long"
95    }).toLowerCase();
96    return `/news/${year}/${month}/${slug}`;
97}
98__turbopack_context__.s([
99    "newsUrl",
100    0,
101    newsUrl
102]);
103}),
10471128, ((__turbopack_context__) => {
105"use strict";
106
107var __TURBOPACK__imported__module__43476__ = __turbopack_context__.i(43476);
108var __TURBOPACK__imported__module__57688__ = __turbopack_context__.i(57688);
109var __TURBOPACK__imported__module__22016__ = __turbopack_context__.i(22016);
110var __TURBOPACK__imported__module__60340__ = __turbopack_context__.i(60340);
111var __TURBOPACK__imported__module__94179__ = __turbopack_context__.i(94179);
112var __TURBOPACK__imported__module__99833__ = __turbopack_context__.i(99833);
113"use client";
114;
115;
116;
117;
118;
119;
120function NewsCard({ article, index = 0, isMember }) {
121    const isLocked = article.membersOnly && !isMember;
122    const href = article.membersOnly ? isMember ? article.href || "/membership/insider" : "/membership/join" : (0, __TURBOPACK__imported__module__99833__["newsUrl"])(article.date, article.slug);
123    return /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(__TURBOPACK__imported__module__22016__["default"], {
124        href: href,
125        className: "block",
126        children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("article", {
127            className: "group cursor-pointer bg-bg-card rounded-xl overflow-hidden border border-iron-blue/10 hover:border-iron-blue/30 transition-all duration-300 hover:-translate-y-1",
128            style: {
129                animation: `fadeInUp 0.5s ease-out ${index * 0.1}s both`
130            },
131            children: [
132                /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
133                    className: "relative h-48 overflow-hidden",
134                    children: [
135                        article.image ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(__TURBOPACK__imported__module__57688__["default"], {
136                            src: article.image,
137                            alt: article.title,
138                            fill: true,
139                            className: `object-cover transition-transform duration-500 ${isLocked ? "blur-sm scale-105" : "group-hover:scale-105"}`,
140                            sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
141                            unoptimized: true
142                        }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
143                            className: "absolute inset-0 bg-gradient-to-br from-claret/30 via-bg-card to-iron-blue/20 flex items-center justify-center",
144                            children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("span", {
145                                className: "text-4xl opacity-20",
146                                children: "⚽"
147                            })
148                        }),
149                        /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
150                            className: "absolute inset-0 bg-gradient-to-t from-bg-card via-trans
150parent"
151                        }),
152                        isLocked ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(__TURBOPACK__imported__module__43476__["Fragment"], {
153                            children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
154                                className: "absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/40",
155                                children: [
156                                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(__TURBOPACK__imported__module__60340__["Lock"], {
157                                        className: "w-10 h-10 text-white drop-shadow-lg"
158                                    }),
159                                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("span", {
160                                        className: "text-white font-black text-sm tracking-widest uppercase drop-shadow-lg text-center px-4",
161                                        children: "Iron Insider Content"
162                                    })
163                                ]
164                            })
165                        }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(__TURBOPACK__imported__module__94179__["Badge"], {
166                            className: "absolute top-3 left-3 bg-claret/90 text-white text-[10px] border-0",
167                            children: article.category
168                        })
169                    ]
170                }),
171                /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
172                    className: "p-5",
173                    children: [
174                        /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("h3", {
175                            className: "font-bold text-white group-hover:text-claret-light transition-colors mb-2 line-clamp-2",
176                            children: article.title
177                        }),
178                        /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("p", {
179                            className: "text-sm text-gray-400 line-clamp-2 mb-3",
180                            children: article.excerpt
181                        }),
182                        isLocked ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("p", {
183                            className: "text-xs text-claret-light font-medium",
184                            children: "Members only — join to read"
185                        }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("time", {
186                            className: "text-xs text-gray-500",
187                            children: new Date(article.date).toLocaleDateString("en-GB", {
188                                day: "numeric",
189                                month: "long",
190                                year: "numeric"
191                            })
192                        })
193                    ]
194                })
195            ]
196        })
197    });
198}
199__turbopack_context__.s([
200    "default",
201    0,
202    NewsCard
203]);
204}),
20537540, ((__turbopack_context__) => {
206"use strict";
207
208var __TURBOPACK__imported__module__43476__ = __turbopack_context__.i(43476);
209var __TURBOPACK__imported__module__71645__ = __turbopack_context__.i(71645);
210var __TURBOPACK__imported__module__71128__ = __turbopack_context__.i(71128);
211"use client";
212;
213;
214;
215function NewsSkeleton() {
216    return /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
217        className: "bg-bg-card rounded-xl overflow-hidden border border-iron-blue/10",
218        children: [
219            /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
220                className: "h-48 bg-white/5 animate-pulse"
221            }),
222            /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
223                className: "p-5 space-y-3",
224                children: [
225                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
226                        className: "h-4 bg-white/5 rounded animate-pulse w-4/5"
227                    }),
228                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
229                        className: "h-3 bg-white/5 rounded animate-pulse"
230                    }),
231                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
232                        className: "h-3 bg-white/5 rounded animate-pulse w-2/3"
233                    }),
234                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
235                        className: "h-3 bg-white/5 rounded animate-pulse w-1/4 mt-2"
236                    })
237                ]
238            })
239        ]
240    });
241}
242const CATEGORIES = [
243    "All",
244    "Club News",
245    "Match Reports",
246    "Match Previews",
247    "Interviews",
248    "History",
249    "Community",
250    "Commercial",
251    "Events",
252    "Fixture News",
253    "Voice of the Fans",
254    "Videos",
255    "Statistical Preview"
256];
257const DESKTOP_PAGE = 6;
258const MOBILE_PAGE = 3;
259const articleKey = (a)=>`${a.title}:${a.date}`;
260function NewsFilterClient({ articles: initialArticles, isMember }) {
261    const [activeCategory, setActiveCategory] = (0, __TURBOPACK__imported__module__71645__["useState"])("All");
262    const [searchQuery, setSearchQuery] = (0, __TURBOPACK__imported__module__71645__["useState"])("");
263    const [articles, setArticles] = (0, __TURBOPACK__imported__module__71645__["useState"])(initialArticles);
264    const [loading, setLoading] = (0, __TURBOPACK__imported__module__71645__["useState"])(false);
265    const [hasMore, setHasMore] = (0, __TURBOPACK__imported__module__71645__["useState"])(true);
266    const [nextSkip, setNextSkip] = (0, __TURBOPACK__imported__module__71645__["useState"])(initialArticles.length);
267    const [pageSize, setPageSize] = (0, __TURBOPACK__imported__module__71645__["useState"])(DESKTOP_PAGE);
268    const sentinelRef = (0, __TURBOPACK__imported__module__71645__["useRef"])(null);
269    const fetchingRef = (0, __TURBOPACK__imported__module__71645__["useRef"])(false);
270    const shownKeys = (0, __TURBOPACK__imported__module__71645__["useRef"])(new Set(initialArticles.map(articleKey)));
271    (0, __TURBOPACK__imported__module__71645__["useEffect"])(()=>{
272        setPageSize(window.innerWidth >= 768 ? DESKTOP_PAGE : MOBILE_PAGE);
273    }, []);
274    const fetchMore = (0, __TURBOPACK__imported__module__71645__["useCallback"])(async (cat, skip, append)=>{
275        if (fetchingRef.current) return;
276        fetchingRef.current = true;
277        if (!append) setLoading(true);
278        try {
279            const params = new URLSearchParams({
280                limit: String(pageSize)
281            });
282            if (cat !== "All") params.set("category", cat);
283            if (skip > 0) params.set("skip", String(skip));
284            const res = await fetch(`/api/news?${params}`);
285            if (res.ok) {
286                const data = await res.json();
287                const mapped = (data.articles || []).map((n)=>({
288                        id: 0,
289                        title: n.title,
290                        excerpt: n.excerpt,
291                        image: n.image,
292                        date: n.date,
293                        category: n.category,
294                        slug: n.slug,
295                        membersOnly: n.membersOnly || undefined
296                    }));
297                if (append) {
298                    const fresh = mapped.filter((a)=>!shownKeys.current.has(articleKey(a)));
299                    fresh.forEach((a)=>shownKeys.current.add(articleKey(a)));
300                    if (fresh.length) setArticles((prev)=>[
301                            ...prev,
302                            ...fresh
303                        ]);
304                    setNextSkip(skip + mapped.length);
305                    setHasMore(mapped.length >= pageSize);
306                } else {
307                    shownKeys.current = new Set(mapped.map(articleKey));
308                    setArticles(mapped);
309                    setNextSkip(mapped.length);
310                    setHasMore(mapped.length >= pageSize);
311                }
312            }
313        } catch  {}
314        setLoading(false);
315        fetchingRef.current = false;
316    }, [
317        pageSize
318    ]);
319    // Reset when category changes
320    (0, __TURBOPACK__imported__module__71645__["useEffect"])(()=>{
321        setSearchQuery("");
322        setHasMore(true);
323        if (activeCategory === "All") {
324            setArticles(initialArticles);
325            setNextSkip(initialArticles.length);
326            setHasMore(true);
327        } else {
328            fetchMore(activeCategory, 0, false);
329        }
330    }, [
331        activeCategory,
332        initialArticles,
333        fetchMore
334    ]);
335    // Scroll-based load more via IntersectionObserver
336    (0, __TURBOPACK__imported__module__71645__["useEffect"])(()=>{
337        const sentinel = sentinelRef.current;
338        if (!sentinel || !hasMore || searchQuery) return;
339        const observer = new IntersectionObserver(([entry])=>{
340            if (entry.isIntersecting) fetchMore(activeCategory, nextSkip, true);
341        }, {
342            rootMargin: "300px"
343        });
344        observer.observe(sentinel);
345        return ()=>observer.disconnect();
346    }, [
347        hasMore,
348        nextSkip,
349        activeCategory,
350        searchQuery,
351        fetchMore
352    ]);
353    const displayed = searchQuery.trim() ? articles.filter((a)=>{
354        const q = searchQuery.toLowerCase();
355        return a.title.toLowerCase().includes(q) || a.excerpt.toLowerCase().includes(q);
356    }) : articles;
357    return /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])(__TURBOPACK__imported__module__43476__["Fragment"], {
358        children: [
359            /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
360                className: "space-y-4 mb-10",
361                style: {
362                    animation: "fadeInUp 0.5s ease-out 0.2s both"
363                },
364                children: [
365                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
366                        className: "relative",
367                        children: [
368                            /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("svg", {
369                                className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-500",
370                                fill: "none",
371                                viewBox: "0 0 24 24",
372                                stroke: "currentColor",
373                                children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("path", {
374                                    strokeLinecap: "round",
375                                    strokeLinejoin: "round",
376                                    strokeWidth: 2,
377                                    d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
378                                })
379                            }),
380                            /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("input", {
381                                type: "text",
382                                value: searchQuery,
383                                onChange: (e)=>setSearchQuery(e.target.value),
384                                placeholder: "Search news articles...",
385                                className: "w-full pl-10 pr-4 py-2.5 bg-bg-card border border-iron-blue/10 rounded-xl text-sm text-white placeholder:text-gray-500 focus:outline-none focus:border-iron-blue/30 transition-colors"
386                            }),
387                            searchQuery && /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("button", {
388                                onClick: ()=>setSearchQuery(""),
389                                className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-white transition-colors",
390                                children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("svg", {
391                                    className: "w-4 h-4",
392                                    fill: "none",
393                                    viewBox: "0 0 24 24",
394                                    stroke: "currentColor",
395                                    children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("path", {
396                                        strokeLinecap: "round",
397                                        strokeLinejoin: "round",
398                                        strokeWidth: 2,
399                                        d: "M6 18L18 6M6 6l12 12"
400                                    })
401                                })
402                            })
403                        ]
404                    }),
405                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
406                        className: "flex flex-wrap gap-2",
407                        children: CATEGORIES.map((cat)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("button", {
408                                onClick: ()=>setActiveCategory(cat),
409                                className: `px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200 ${activeCategory === cat ? "bg-claret text-white" : "bg-bg-card text-gray-400 border border-iron-blue/10 hover:border-iron-blue/30 hover:text-white"}`,
410                                children: cat
411                            }, cat))
412                    }),
413                    (activeCategory !== "All" || searchQuery) && /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
414                        className: "flex items-center gap-2 text-xs text-gray-500",
415                        children: [
416                            /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("span", {
417                                children: [
418                                    displayed.length,
419                                    " article",
420                                    displayed.length !== 1 ? "s" : "",
421                                    activeCategory !== "All" && ` in ${activeCategory}`,
422                                    searchQuery && ` matching "${searchQuery}"`
423                                ]
424                            }),
425                            (activeCategory !== "All" || searchQuery) && /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("button", {
426                                onClick: ()=>{
427                                    setActiveCategory("All");
428                                    setSearchQuery("");
429                                },
430                                className: "text-iron-blue hover:text-white transition-colors",
431                                children: "Clear filters"
432                            })
433                        ]
434                    })
435                ]
436            }),
437            loading ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
438                className: "flex items-center justify-center py-16",
439                children: [
440                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
441                        className: "w-6 h-6 border-2 border-iron-blue border-t-transparent rounded-full animate-spin"
442                    }),
443                    /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("span", {
444                        className: "text-sm text-gray-500 ml-3",
445                        children: "Loading..."
446                    })
447                ]
448            }) : displayed.length === 0 ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
449                className: "text-center py-16",
450                children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("p", {
451                    className: "text-gray-500 text-lg",
452                    children: searchQuery ? `No articles matching "${searchQuery}"` : "No articles found in this category."
453                })
454            }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(__TURBOPACK__imported__module__43476__["Fragment"], {
455                children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])("div", {
456                    className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6",
457                    children: [
458                        displayed.map((article, i)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(__TURBOPACK__imported__module__71128__["default"], {
459                                article: article,
460                                index: i < pageSize ? i : 0,
461                                isMember: isMember
462                            }, article.id || article.slug || `news-${i}`)),
463                        hasMore && !searchQuery && /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsxs"])(__TURBOPACK__imported__module__43476__["Fragment"], {
464                            children: [
465                                /*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])("div", {
466                                    ref: sentinelRef,
467                                    className: "col-span-full h-0"
468                                }),
469                                Array.from({
470                                    length: Math.min(pageSize, 3)
471                                }).map((_, i)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__43476__["jsx"])(NewsSkeleton, {}, `skel-${nextSkip}-${i}`))
472                            ]
473                        })
474                    ]
475                })
476            })
477        ]
478    });
479}
480__turbopack_context__.s([
481    "default",
482    0,
483    NewsFilterClient
484]);
485}),
486]);

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.