<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dunedb.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Operator</id>
	<title>Dune Awakening DB - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://dunedb.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Operator"/>
	<link rel="alternate" type="text/html" href="https://dunedb.com/Special:Contributions/Operator"/>
	<updated>2026-05-19T22:56:50Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://dunedb.com/index.php?title=MediaWiki:Gadget-ResourcePage.js&amp;diff=1173</id>
		<title>MediaWiki:Gadget-ResourcePage.js</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=MediaWiki:Gadget-ResourcePage.js&amp;diff=1173"/>
		<updated>2025-06-04T05:51:37Z</updated>

		<summary type="html">&lt;p&gt;Operator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * ResourcePage Gadget - Complete Fixed Version&lt;br /&gt;
 * Handles recipe popups and search functionality for resource pages&lt;br /&gt;
 * &lt;br /&gt;
 * @requires jquery&lt;br /&gt;
 * @requires mediawiki.api&lt;br /&gt;
 * @requires mediawiki.util&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
(function($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Only run on pages with resource page elements&lt;br /&gt;
    if (!$(&#039;.crafting-section, .recipe-table&#039;).length) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    console.log(&#039;[ResourcePage] Gadget loading...&#039;);&lt;br /&gt;
    &lt;br /&gt;
    // Cache for storing recipe data&lt;br /&gt;
    var recipeCache = {&lt;br /&gt;
        craftedWith: null,&lt;br /&gt;
        craftedFrom: null&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    // Initialize module&lt;br /&gt;
    function init() {&lt;br /&gt;
        console.log(&#039;[ResourcePage] Initializing...&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Add required styles&lt;br /&gt;
        injectRequiredStyles();&lt;br /&gt;
        &lt;br /&gt;
        // Add table search functionality&lt;br /&gt;
        initTableSearch();&lt;br /&gt;
        &lt;br /&gt;
        // Add popup handlers - FIXED VERSION&lt;br /&gt;
        initPopupHandlers();&lt;br /&gt;
        &lt;br /&gt;
        // Format tables&lt;br /&gt;
        formatTables();&lt;br /&gt;
        &lt;br /&gt;
        // Add animation styles&lt;br /&gt;
        addAnimationStyles();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Inject required CSS&lt;br /&gt;
    function injectRequiredStyles() {&lt;br /&gt;
        if ($(&#039;#resourcePageGadgetStyles&#039;).length === 0) {&lt;br /&gt;
            var styles = `&amp;lt;style id=&amp;quot;resourcePageGadgetStyles&amp;quot;&amp;gt;&lt;br /&gt;
                /* Span button styles */&lt;br /&gt;
                .dune-action-button {&lt;br /&gt;
                    display: inline-block !important;&lt;br /&gt;
                    cursor: pointer !important;&lt;br /&gt;
                    user-select: none !important;&lt;br /&gt;
                    -webkit-user-select: none !important;&lt;br /&gt;
                    -moz-user-select: none !important;&lt;br /&gt;
                    -ms-user-select: none !important;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Loading spinner */&lt;br /&gt;
                .loading-spinner {&lt;br /&gt;
                    font-size: 48px;&lt;br /&gt;
                    animation: spin 1s linear infinite;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                @keyframes spin {&lt;br /&gt;
                    from { transform: rotate(0deg); }&lt;br /&gt;
                    to { transform: rotate(360deg); }&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Sort indicators */&lt;br /&gt;
                .recipe-popup-table th {&lt;br /&gt;
                    cursor: pointer;&lt;br /&gt;
                    user-select: none;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                .recipe-popup-table th.sort-asc::after {&lt;br /&gt;
                    content: &amp;quot; ↑&amp;quot;;&lt;br /&gt;
                    color: #fce7c8;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                .recipe-popup-table th.sort-desc::after {&lt;br /&gt;
                    content: &amp;quot; ↓&amp;quot;;&lt;br /&gt;
                    color: #fce7c8;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Popup note */&lt;br /&gt;
                .popup-note {&lt;br /&gt;
                    background: rgba(252,231,200,.1);&lt;br /&gt;
                    border: 1px solid rgba(252,231,200,.3);&lt;br /&gt;
                    padding: 10px;&lt;br /&gt;
                    margin-bottom: 15px;&lt;br /&gt;
                    color: #E3BB7A;&lt;br /&gt;
                    text-align: center;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Recipe count */&lt;br /&gt;
                .recipe-count {&lt;br /&gt;
                    position: absolute;&lt;br /&gt;
                    right: 60px;&lt;br /&gt;
                    top: 50%;&lt;br /&gt;
                    transform: translateY(-50%);&lt;br /&gt;
                    color: #E3BB7A;&lt;br /&gt;
                    font-size: 14px;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Popup stats */&lt;br /&gt;
                .popup-stats {&lt;br /&gt;
                    color: #E3BB7A;&lt;br /&gt;
                    font-size: 13px;&lt;br /&gt;
                    margin-left: 15px;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Popup controls */&lt;br /&gt;
                .popup-controls {&lt;br /&gt;
                    display: flex;&lt;br /&gt;
                    align-items: center;&lt;br /&gt;
                    margin-bottom: 15px;&lt;br /&gt;
                    gap: 15px;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                .popup-search-container {&lt;br /&gt;
                    flex: 1;&lt;br /&gt;
                }&lt;br /&gt;
            &amp;lt;/style&amp;gt;`;&lt;br /&gt;
            &lt;br /&gt;
            $(&#039;head&#039;).append(styles);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format tables to ensure proper styling&lt;br /&gt;
    function formatTables() {&lt;br /&gt;
        $(&#039;.recipe-table&#039;).each(function() {&lt;br /&gt;
            var $table = $(this);&lt;br /&gt;
            &lt;br /&gt;
            // Ensure proper header styling&lt;br /&gt;
            $table.find(&#039;thead tr&#039;).addClass(&#039;tr-dark&#039;);&lt;br /&gt;
            &lt;br /&gt;
            // Add wrapper if missing&lt;br /&gt;
            if (!$table.parent().hasClass(&#039;dune-table-wrapper&#039;)) {&lt;br /&gt;
                $table.wrap(&#039;&amp;lt;div class=&amp;quot;dune-table-wrapper&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Initialize table search functionality&lt;br /&gt;
    function initTableSearch() {&lt;br /&gt;
        // Create search inputs if they don&#039;t exist&lt;br /&gt;
        $(&#039;.crafting-section&#039;).each(function() {&lt;br /&gt;
            var $section = $(this);&lt;br /&gt;
            var $table = $section.find(&#039;.recipe-table&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if ($table.length &amp;amp;&amp;amp; !$section.find(&#039;.recipe-search-container&#039;).length) {&lt;br /&gt;
                var searchHtml = &#039;&amp;lt;div class=&amp;quot;recipe-search-container&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;recipe-search-input&amp;quot; placeholder=&amp;quot;Search recipes...&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
                $section.find(&#039;.dune-card-description&#039;).after(searchHtml);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Bind search functionality&lt;br /&gt;
        $(document).on(&#039;input&#039;, &#039;.recipe-search-input&#039;, function() {&lt;br /&gt;
            var $input = $(this);&lt;br /&gt;
            var $table = $input.closest(&#039;.crafting-section&#039;).find(&#039;.recipe-table&#039;);&lt;br /&gt;
            filterTable($table, $input.val());&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Filter table rows based on search input&lt;br /&gt;
    function filterTable($table, searchTerm) {&lt;br /&gt;
        var term = searchTerm.toLowerCase();&lt;br /&gt;
        &lt;br /&gt;
        $table.find(&#039;tbody tr&#039;).each(function() {&lt;br /&gt;
            var $row = $(this);&lt;br /&gt;
            var text = $row.text().toLowerCase();&lt;br /&gt;
            &lt;br /&gt;
            if (text.indexOf(term) &amp;gt; -1) {&lt;br /&gt;
                $row.show();&lt;br /&gt;
            } else {&lt;br /&gt;
                $row.hide();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // FIXED: Initialize popup handlers with event delegation&lt;br /&gt;
    function initPopupHandlers() {&lt;br /&gt;
        console.log(&#039;[ResourcePage] Setting up popup handlers...&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // View All Crafted With - using event delegation&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.view-all-crafted-with&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            console.log(&#039;[ResourcePage] View All Crafted With clicked&#039;);&lt;br /&gt;
            &lt;br /&gt;
            var $element = $(this);&lt;br /&gt;
            var resourceName = $element.data(&#039;resource&#039;) || $element.attr(&#039;data-resource&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (!resourceName) {&lt;br /&gt;
                console.error(&#039;[ResourcePage] No resource name found!&#039;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            showRecipePopup(&#039;craftedWith&#039;, resourceName);&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // View All Crafted From - using event delegation&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.view-all-crafted-from&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            console.log(&#039;[ResourcePage] View All Crafted From clicked&#039;);&lt;br /&gt;
            &lt;br /&gt;
            var $element = $(this);&lt;br /&gt;
            var resourceName = $element.data(&#039;resource&#039;) || $element.attr(&#039;data-resource&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (!resourceName) {&lt;br /&gt;
                console.error(&#039;[ResourcePage] No resource name found!&#039;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            showRecipePopup(&#039;craftedFrom&#039;, resourceName);&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Close popup - overlay click&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.recipe-popup-overlay&#039;, function(e) {&lt;br /&gt;
            if (e.target === this) {&lt;br /&gt;
                console.log(&#039;[ResourcePage] Overlay clicked - closing popup&#039;);&lt;br /&gt;
                closeRecipePopup();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Close popup - close button&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.popup-close&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            console.log(&#039;[ResourcePage] Close button clicked&#039;);&lt;br /&gt;
            closeRecipePopup();&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Escape key to close popup&lt;br /&gt;
        $(document).on(&#039;keydown&#039;, function(e) {&lt;br /&gt;
            if (e.key === &#039;Escape&#039; &amp;amp;&amp;amp; $(&#039;.recipe-popup-overlay&#039;).length &amp;gt; 0) {&lt;br /&gt;
                console.log(&#039;[ResourcePage] Escape key pressed - closing popup&#039;);&lt;br /&gt;
                closeRecipePopup();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Prevent text selection on span buttons&lt;br /&gt;
        $(document).on(&#039;selectstart&#039;, &#039;.dune-action-button&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Add hover logging for debugging&lt;br /&gt;
        $(document).on(&#039;mouseenter&#039;, &#039;.dune-action-button&#039;, function() {&lt;br /&gt;
            console.log(&#039;[ResourcePage] Hovering over button:&#039;, $(this).text());&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Show recipe popup&lt;br /&gt;
    function showRecipePopup(type, resourceName) {&lt;br /&gt;
        console.log(&#039;[ResourcePage] Showing popup for:&#039;, type, resourceName);&lt;br /&gt;
        &lt;br /&gt;
        var title = type === &#039;craftedWith&#039; &lt;br /&gt;
            ? &#039;All Recipes Using &#039; + resourceName&lt;br /&gt;
            : &#039;All Recipes Creating &#039; + resourceName;&lt;br /&gt;
        &lt;br /&gt;
        // Show loading state&lt;br /&gt;
        showLoadingPopup();&lt;br /&gt;
        &lt;br /&gt;
        // First, check for full data in hidden elements&lt;br /&gt;
        var dataSelector = &#039;.&#039; + type.replace(&#039;craftedWith&#039;, &#039;crafted-with&#039;).replace(&#039;craftedFrom&#039;, &#039;crafted-from&#039;) + &#039;-full-data&#039;;&lt;br /&gt;
        var $fullDataElement = $(dataSelector);&lt;br /&gt;
        &lt;br /&gt;
        console.log(&#039;[ResourcePage] Looking for data in:&#039;, dataSelector);&lt;br /&gt;
        &lt;br /&gt;
        if ($fullDataElement.length &amp;amp;&amp;amp; $fullDataElement.text().trim()) {&lt;br /&gt;
            try {&lt;br /&gt;
                // Parse JSON data from hidden element&lt;br /&gt;
                var jsonText = $fullDataElement.text().trim();&lt;br /&gt;
                console.log(&#039;[ResourcePage] Found JSON data, parsing...&#039;);&lt;br /&gt;
                &lt;br /&gt;
                var jsonData = JSON.parse(jsonText);&lt;br /&gt;
                var rows = jsonData.results || jsonData || [];&lt;br /&gt;
                &lt;br /&gt;
                console.log(&#039;[ResourcePage] Parsed&#039;, rows.length, &#039;rows&#039;);&lt;br /&gt;
                &lt;br /&gt;
                // Transform to expected format&lt;br /&gt;
                var formattedRows = rows.map(function(row) {&lt;br /&gt;
                    return {&lt;br /&gt;
                        item: formatItemName(row.OutputItem || row.output_item || &#039;&#039;),&lt;br /&gt;
                        resources: formatResourceList(row.Resources || row.resources || &#039;&#039;),&lt;br /&gt;
                        stations: formatStations(row.Stations || row.station || row.stations || &#039;&#039;),&lt;br /&gt;
                        water: formatWater(row.WaterML || row.water_ml),&lt;br /&gt;
                        craftTime: formatCraftTime(row.CraftTime || row.craft_time),&lt;br /&gt;
                        schematic: formatSchematic(row.Schematic || row.schematic)&lt;br /&gt;
                    };&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                displayPopup(title, formattedRows, false);&lt;br /&gt;
                return;&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                console.error(&#039;[ResourcePage] Failed to parse full recipe data:&#039;, e);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Fallback to API call&lt;br /&gt;
        console.log(&#039;[ResourcePage] No cached data found, making API call...&#039;);&lt;br /&gt;
        fetchRecipeDataViaAPI(type, resourceName, title);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format item name (handle wiki links)&lt;br /&gt;
    function formatItemName(name) {&lt;br /&gt;
        if (!name) return &#039;Unknown&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // Handle wiki links if present&lt;br /&gt;
        if (name.indexOf(&#039;[[&#039;) &amp;gt; -1) {&lt;br /&gt;
            return name.replace(/\[\[([^\|]+)\|?([^\]]*)\]\]/g, function(match, link, display) {&lt;br /&gt;
                return &#039;&amp;lt;a href=&amp;quot;/wiki/&#039; + link.replace(/ /g, &#039;_&#039;) + &#039;&amp;quot;&amp;gt;&#039; + (display || link) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
        return name;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format resource list for display&lt;br /&gt;
    function formatResourceList(resources) {&lt;br /&gt;
        if (!resources) return &#039;None&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // If it&#039;s already HTML formatted, return as is&lt;br /&gt;
        if (resources.indexOf(&#039;&amp;lt;br&#039;) &amp;gt; -1) {&lt;br /&gt;
            return resources;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Otherwise, split by semicolons or newlines and format&lt;br /&gt;
        return resources.split(/[;\n]/).map(function(r) {&lt;br /&gt;
            return r.trim();&lt;br /&gt;
        }).filter(Boolean).join(&#039;&amp;lt;br&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format stations&lt;br /&gt;
    function formatStations(stations) {&lt;br /&gt;
        if (!stations) return &#039;Unknown&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // Handle multiple stations&lt;br /&gt;
        return stations.split(/[;,]/).map(function(s) {&lt;br /&gt;
            return s.trim();&lt;br /&gt;
        }).filter(Boolean).join(&#039;&amp;lt;br&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format water amount&lt;br /&gt;
    function formatWater(water) {&lt;br /&gt;
        if (!water || water === &#039;0&#039; || water === &#039;N/A&#039;) return &#039;N/A&#039;;&lt;br /&gt;
        return parseInt(water).toLocaleString() + &#039; mL&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format craft time&lt;br /&gt;
    function formatCraftTime(time) {&lt;br /&gt;
        if (!time || time === &#039;0&#039; || time === &#039;N/A&#039;) return &#039;Instant&#039;;&lt;br /&gt;
        &lt;br /&gt;
        var seconds = parseInt(time);&lt;br /&gt;
        if (isNaN(seconds)) return time;&lt;br /&gt;
        &lt;br /&gt;
        if (seconds &amp;lt; 60) return seconds + &#039;s&#039;;&lt;br /&gt;
        if (seconds &amp;lt; 3600) {&lt;br /&gt;
            var mins = Math.floor(seconds / 60);&lt;br /&gt;
            var secs = seconds % 60;&lt;br /&gt;
            return mins + &#039;m &#039; + (secs &amp;gt; 0 ? secs + &#039;s&#039; : &#039;&#039;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        var hours = Math.floor(seconds / 3600);&lt;br /&gt;
        var mins = Math.floor((seconds % 3600) / 60);&lt;br /&gt;
        return hours + &#039;h &#039; + (mins &amp;gt; 0 ? mins + &#039;m&#039; : &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format schematic&lt;br /&gt;
    function formatSchematic(schematic) {&lt;br /&gt;
        if (!schematic || schematic === &#039;N/A&#039; || schematic === &#039;None&#039;) return &#039;None&#039;;&lt;br /&gt;
        return formatItemName(schematic);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Fetch recipe data via API&lt;br /&gt;
    function fetchRecipeDataViaAPI(type, resourceName, title) {&lt;br /&gt;
        $.ajax({&lt;br /&gt;
            url: mw.util.wikiScript(&#039;api&#039;),&lt;br /&gt;
            data: {&lt;br /&gt;
                action: &#039;parse&#039;,&lt;br /&gt;
                format: &#039;json&#039;,&lt;br /&gt;
                page: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
                prop: &#039;text&#039;,&lt;br /&gt;
                disablelimitreport: true,&lt;br /&gt;
                disableeditsection: true,&lt;br /&gt;
                disabletoc: true&lt;br /&gt;
            },&lt;br /&gt;
            success: function(response) {&lt;br /&gt;
                if (response.parse &amp;amp;&amp;amp; response.parse.text) {&lt;br /&gt;
                    var html = response.parse.text[&#039;*&#039;];&lt;br /&gt;
                    var $html = $(&#039;&amp;lt;div&amp;gt;&#039;).html(html);&lt;br /&gt;
                    &lt;br /&gt;
                    // Try to find full data first&lt;br /&gt;
                    var dataSelector = &#039;.&#039; + type.replace(&#039;craftedWith&#039;, &#039;crafted-with&#039;).replace(&#039;craftedFrom&#039;, &#039;crafted-from&#039;) + &#039;-full-data&#039;;&lt;br /&gt;
                    var $dataElement = $html.find(dataSelector);&lt;br /&gt;
                    &lt;br /&gt;
                    if ($dataElement.length &amp;amp;&amp;amp; $dataElement.text().trim()) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            var jsonData = JSON.parse($dataElement.text().trim());&lt;br /&gt;
                            var rows = (jsonData.results || jsonData || []).map(function(row) {&lt;br /&gt;
                                return {&lt;br /&gt;
                                    item: formatItemName(row.OutputItem || row.output_item || &#039;&#039;),&lt;br /&gt;
                                    resources: formatResourceList(row.Resources || row.resources || &#039;&#039;),&lt;br /&gt;
                                    stations: formatStations(row.Stations || row.station || row.stations || &#039;&#039;),&lt;br /&gt;
                                    water: formatWater(row.WaterML || row.water_ml),&lt;br /&gt;
                                    craftTime: formatCraftTime(row.CraftTime || row.craft_time),&lt;br /&gt;
                                    schematic: formatSchematic(row.Schematic || row.schematic)&lt;br /&gt;
                                };&lt;br /&gt;
                            });&lt;br /&gt;
                            &lt;br /&gt;
                            console.log(&#039;[ResourcePage] Found full data via API:&#039;, rows.length, &#039;rows&#039;);&lt;br /&gt;
                            displayPopup(title, rows, false);&lt;br /&gt;
                            return;&lt;br /&gt;
                        } catch (e) {&lt;br /&gt;
                            console.error(&#039;[ResourcePage] Failed to parse API JSON data:&#039;, e);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    // Fallback to parsing table&lt;br /&gt;
                    var tableId = type === &#039;craftedWith&#039; ? &#039;#craftedWithTable&#039; : &#039;#craftedFromTable&#039;;&lt;br /&gt;
                    var $table = $html.find(tableId);&lt;br /&gt;
                    &lt;br /&gt;
                    var rows = [];&lt;br /&gt;
                    $table.find(&#039;tbody tr&#039;).each(function() {&lt;br /&gt;
                        var $cells = $(this).find(&#039;td&#039;);&lt;br /&gt;
                        if ($cells.length &amp;gt;= 3) {&lt;br /&gt;
                            rows.push({&lt;br /&gt;
                                item: $cells.eq(0).html(),&lt;br /&gt;
                                resources: $cells.eq(1).html(),&lt;br /&gt;
                                stations: $cells.eq(2).html(),&lt;br /&gt;
                                water: &#039;N/A&#039;,&lt;br /&gt;
                                craftTime: &#039;N/A&#039;,&lt;br /&gt;
                                schematic: &#039;N/A&#039;&lt;br /&gt;
                            });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                    &lt;br /&gt;
                    console.log(&#039;[ResourcePage] Found&#039;, rows.length, &#039;rows via API table parsing&#039;);&lt;br /&gt;
                    displayPopup(title, rows, rows.length &amp;lt; 10); // Mark as limited if less than 10&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            error: function(xhr, status, error) {&lt;br /&gt;
                console.error(&#039;[ResourcePage] API call failed:&#039;, error);&lt;br /&gt;
                var rows = getVisibleRows(type);&lt;br /&gt;
                displayPopup(title, rows, true);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Get visible rows as fallback&lt;br /&gt;
    function getVisibleRows(type) {&lt;br /&gt;
        var $table = $(type === &#039;craftedWith&#039; ? &#039;#craftedWithTable&#039; : &#039;#craftedFromTable&#039;);&lt;br /&gt;
        var rows = [];&lt;br /&gt;
        &lt;br /&gt;
        $table.find(&#039;tbody tr&#039;).each(function() {&lt;br /&gt;
            var $row = $(this);&lt;br /&gt;
            var $cells = $row.find(&#039;td&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if ($cells.length &amp;gt;= 3) {&lt;br /&gt;
                rows.push({&lt;br /&gt;
                    item: $cells.eq(0).html(),&lt;br /&gt;
                    resources: $cells.eq(1).html(),&lt;br /&gt;
                    stations: $cells.eq(2).html(),&lt;br /&gt;
                    water: &#039;N/A&#039;,&lt;br /&gt;
                    craftTime: &#039;N/A&#039;,&lt;br /&gt;
                    schematic: &#039;N/A&#039;&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        console.log(&#039;[ResourcePage] Using visible rows:&#039;, rows.length);&lt;br /&gt;
        return rows;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Show loading popup&lt;br /&gt;
    function showLoadingPopup() {&lt;br /&gt;
        var loadingHtml = &#039;&amp;lt;div class=&amp;quot;recipe-popup-overlay active&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;recipe-popup&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;popup-content&amp;quot; style=&amp;quot;text-align: center; padding: 60px;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;div style=&amp;quot;font-size: 24px; color: #fce7c8; margin-bottom: 20px;&amp;quot;&amp;gt;Loading recipes...&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;div class=&amp;quot;loading-spinner&amp;quot;&amp;gt;⟳&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        $(&#039;body&#039;).append(loadingHtml);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Display popup with data&lt;br /&gt;
    function displayPopup(title, rows, isLimited) {&lt;br /&gt;
        // Remove any existing popup&lt;br /&gt;
        $(&#039;.recipe-popup-overlay&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Build table rows HTML&lt;br /&gt;
        var tableRowsHtml = &#039;&#039;;&lt;br /&gt;
        rows.forEach(function(row, index) {&lt;br /&gt;
            tableRowsHtml += &#039;&amp;lt;tr data-index=&amp;quot;&#039; + index + &#039;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.item + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.resources + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.stations + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.water + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.craftTime + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.schematic + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Note if data is limited&lt;br /&gt;
        var limitedNote = isLimited ? &lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;popup-note&amp;quot;&amp;gt;Note: This may not show all recipes. Reload the page to see full data.&amp;lt;/div&amp;gt;&#039; : &lt;br /&gt;
            &#039;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // Build popup HTML&lt;br /&gt;
        var popupHtml = &#039;&amp;lt;div class=&amp;quot;recipe-popup-overlay&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;recipe-popup&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;popup-header&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;h3 class=&amp;quot;popup-title&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/h3&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;span class=&amp;quot;recipe-count&amp;quot;&amp;gt;&#039; + rows.length + &#039; recipe&#039; + (rows.length !== 1 ? &#039;s&#039; : &#039;&#039;) + &#039;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;popup-close&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;popup-content&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    limitedNote +&lt;br /&gt;
                    &#039;&amp;lt;div class=&amp;quot;popup-controls&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;div class=&amp;quot;popup-search-container&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;popup-search-input&amp;quot; placeholder=&amp;quot;Search recipes...&amp;quot; id=&amp;quot;popupSearchInput&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;div class=&amp;quot;popup-stats&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;span class=&amp;quot;visible-count&amp;quot;&amp;gt;&#039; + rows.length + &#039;&amp;lt;/span&amp;gt; of &amp;lt;span class=&amp;quot;total-count&amp;quot;&amp;gt;&#039; + rows.length + &#039;&amp;lt;/span&amp;gt; shown&#039; +&lt;br /&gt;
                        &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;div class=&amp;quot;popup-table-wrapper&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;table class=&amp;quot;infobox-dune-standard-table recipe-popup-table&amp;quot; id=&amp;quot;popupRecipeTable&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;thead&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;tr class=&amp;quot;tr-dark&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;item&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;Item Created&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;resources&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;Resources Needed&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;stations&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;Stations&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;water&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;Water (mL)&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;time&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;Craft Time&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;schematic&amp;quot; class=&amp;quot;sortable&amp;quot;&amp;gt;Schematic&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;/thead&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;tbody&amp;gt;&#039; + tableRowsHtml + &#039;&amp;lt;/tbody&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;/table&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // Add to page&lt;br /&gt;
        $(&#039;body&#039;).append(popupHtml);&lt;br /&gt;
        &lt;br /&gt;
        // Activate popup&lt;br /&gt;
        setTimeout(function() {&lt;br /&gt;
            $(&#039;.recipe-popup-overlay&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        }, 10);&lt;br /&gt;
        &lt;br /&gt;
        // Initialize popup functionality&lt;br /&gt;
        initPopupFunctionality();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Initialize popup functionality (search and sort)&lt;br /&gt;
    function initPopupFunctionality() {&lt;br /&gt;
        var $searchInput = $(&#039;#popupSearchInput&#039;);&lt;br /&gt;
        var $visibleCount = $(&#039;.visible-count&#039;);&lt;br /&gt;
        var $totalCount = $(&#039;.total-count&#039;);&lt;br /&gt;
        var totalRows = $(&#039;#popupRecipeTable tbody tr&#039;).length;&lt;br /&gt;
        &lt;br /&gt;
        // Search functionality with counting&lt;br /&gt;
        $searchInput.on(&#039;input&#039;, function() {&lt;br /&gt;
            var searchTerm = $(this).val().toLowerCase();&lt;br /&gt;
            var visibleRows = 0;&lt;br /&gt;
            &lt;br /&gt;
            $(&#039;#popupRecipeTable tbody tr&#039;).each(function() {&lt;br /&gt;
                var $row = $(this);&lt;br /&gt;
                var text = $row.text().toLowerCase();&lt;br /&gt;
                &lt;br /&gt;
                if (searchTerm === &#039;&#039; || text.indexOf(searchTerm) &amp;gt; -1) {&lt;br /&gt;
                    $row.show();&lt;br /&gt;
                    visibleRows++;&lt;br /&gt;
                } else {&lt;br /&gt;
                    $row.hide();&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            $visibleCount.text(visibleRows);&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Sort functionality&lt;br /&gt;
        $(&#039;#popupRecipeTable thead th.sortable&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
            var $th = $(this);&lt;br /&gt;
            var sortKey = $th.data(&#039;sort&#039;);&lt;br /&gt;
            var $tbody = $(&#039;#popupRecipeTable tbody&#039;);&lt;br /&gt;
            var rows = $tbody.find(&#039;tr&#039;).toArray();&lt;br /&gt;
            &lt;br /&gt;
            // Determine sort direction&lt;br /&gt;
            var ascending = !$th.hasClass(&#039;sort-desc&#039;);&lt;br /&gt;
            &lt;br /&gt;
            // Remove sort classes from all headers&lt;br /&gt;
            $(&#039;#popupRecipeTable thead th&#039;).removeClass(&#039;sort-asc sort-desc&#039;);&lt;br /&gt;
            &lt;br /&gt;
            // Add appropriate class to clicked header&lt;br /&gt;
            $th.addClass(ascending ? &#039;sort-asc&#039; : &#039;sort-desc&#039;);&lt;br /&gt;
            &lt;br /&gt;
            // Sort rows&lt;br /&gt;
            rows.sort(function(a, b) {&lt;br /&gt;
                var aText = $(a).find(&#039;td&#039;).eq($th.index()).text().trim();&lt;br /&gt;
                var bText = $(b).find(&#039;td&#039;).eq($th.index()).text().trim();&lt;br /&gt;
                &lt;br /&gt;
                // Special handling for numeric columns&lt;br /&gt;
                if (sortKey === &#039;water&#039;) {&lt;br /&gt;
                    var aNum = parseInt(aText.replace(/[^\d]/g, &#039;&#039;)) || 0;&lt;br /&gt;
                    var bNum = parseInt(bText.replace(/[^\d]/g, &#039;&#039;)) || 0;&lt;br /&gt;
                    return ascending ? aNum - bNum : bNum - aNum;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                if (sortKey === &#039;time&#039;) {&lt;br /&gt;
                    var aSeconds = parseTimeToSeconds(aText);&lt;br /&gt;
                    var bSeconds = parseTimeToSeconds(bText);&lt;br /&gt;
                    return ascending ? aSeconds - bSeconds : bSeconds - aSeconds;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                // Sort as text&lt;br /&gt;
                return ascending &lt;br /&gt;
                    ? aText.localeCompare(bText)&lt;br /&gt;
                    : bText.localeCompare(aText);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            // Re-append sorted rows&lt;br /&gt;
            $tbody.empty();&lt;br /&gt;
            rows.forEach(function(row) {&lt;br /&gt;
                $tbody.append(row);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Focus search input&lt;br /&gt;
        $searchInput.focus();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Parse time string to seconds for sorting&lt;br /&gt;
    function parseTimeToSeconds(timeStr) {&lt;br /&gt;
        if (!timeStr || timeStr === &#039;Instant&#039; || timeStr === &#039;N/A&#039;) return 0;&lt;br /&gt;
        &lt;br /&gt;
        var seconds = 0;&lt;br /&gt;
        var hourMatch = timeStr.match(/(\d+)h/);&lt;br /&gt;
        var minMatch = timeStr.match(/(\d+)m/);&lt;br /&gt;
        var secMatch = timeStr.match(/(\d+)s/);&lt;br /&gt;
        &lt;br /&gt;
        if (hourMatch) seconds += parseInt(hourMatch[1]) * 3600;&lt;br /&gt;
        if (minMatch) seconds += parseInt(minMatch[1]) * 60;&lt;br /&gt;
        if (secMatch) seconds += parseInt(secMatch[1]);&lt;br /&gt;
        &lt;br /&gt;
        return seconds;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Close recipe popup&lt;br /&gt;
    function closeRecipePopup() {&lt;br /&gt;
        $(&#039;.recipe-popup-overlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        &lt;br /&gt;
        setTimeout(function() {&lt;br /&gt;
            $(&#039;.recipe-popup-overlay&#039;).remove();&lt;br /&gt;
        }, 300);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Add required CSS for animations&lt;br /&gt;
    function addAnimationStyles() {&lt;br /&gt;
        if ($(&#039;#resourcePageAnimations&#039;).length === 0) {&lt;br /&gt;
            var styles = `&lt;br /&gt;
                &amp;lt;style id=&amp;quot;resourcePageAnimations&amp;quot;&amp;gt;&lt;br /&gt;
                    @keyframes spin {&lt;br /&gt;
                        from { transform: rotate(0deg); }&lt;br /&gt;
                        to { transform: rotate(360deg); }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    .recipe-popup-table th.sort-asc::after {&lt;br /&gt;
                        content: &#039; ↑&#039;;&lt;br /&gt;
                        color: #fce7c8;&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    .recipe-popup-table th.sort-desc::after {&lt;br /&gt;
                        content: &#039; ↓&#039;;&lt;br /&gt;
                        color: #fce7c8;&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    .recipe-popup-table th.sortable:hover {&lt;br /&gt;
                        background: rgba(252,231,200,.1) !important;&lt;br /&gt;
                        cursor: pointer;&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    /* Gallery styles */&lt;br /&gt;
                    .gallery-container {&lt;br /&gt;
                        display: flex;&lt;br /&gt;
                        flex-wrap: wrap;&lt;br /&gt;
                        gap: 10px;&lt;br /&gt;
                        margin-top: 10px;&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    .gallery-item {&lt;br /&gt;
                        flex: 0 0 120px;&lt;br /&gt;
                        text-align: center;&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    .gallery-item img {&lt;br /&gt;
                        max-width: 100%;&lt;br /&gt;
                        height: auto;&lt;br /&gt;
                        border: 2px solid rgba(252,231,200,.3);&lt;br /&gt;
                        transition: all 0.3s ease;&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    .gallery-item:hover img {&lt;br /&gt;
                        border-color: #fce7c8;&lt;br /&gt;
                        transform: scale(1.05);&lt;br /&gt;
                        box-shadow: 0 0 15px rgba(252,231,200,.5);&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    .gallery-item .caption {&lt;br /&gt;
                        font-size: 12px;&lt;br /&gt;
                        color: #E3BB7A;&lt;br /&gt;
                        margin-top: 4px;&lt;br /&gt;
                    }&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
            `;&lt;br /&gt;
            $(&#039;head&#039;).append(styles);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Initialize when DOM is ready&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        init();&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
})(jQuery, mediaWiki);&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=Template:ResourcePage/styles.css&amp;diff=1172</id>
		<title>Template:ResourcePage/styles.css</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=Template:ResourcePage/styles.css&amp;diff=1172"/>
		<updated>2025-06-04T05:50:22Z</updated>

		<summary type="html">&lt;p&gt;Operator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**********************************************************&lt;br /&gt;
 *  Template:ResourcePage/styles.css  (TemplateStyles version)&lt;br /&gt;
 *  Dune Awakening — Resource Page&lt;br /&gt;
 *  v1.2 · 2025-05-27 &lt;br /&gt;
 *  &lt;br /&gt;
 *  This version is compliant with MediaWiki TemplateStyles restrictions&lt;br /&gt;
 **********************************************************/&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   RESPONSIVE LAYOUT (from BuildingPage)&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
.responsive-container {&lt;br /&gt;
    display: flex !important;&lt;br /&gt;
    flex-wrap: wrap !important;&lt;br /&gt;
    gap: 24px !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    max-width: none !important;&lt;br /&gt;
    margin: 0 auto 20px auto !important;&lt;br /&gt;
    padding: 0 20px !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.responsive-col {&lt;br /&gt;
    display: flex !important;&lt;br /&gt;
    flex-direction: column !important;&lt;br /&gt;
    flex: 1 1 0 !important;&lt;br /&gt;
    min-width: 0 !important;&lt;br /&gt;
    max-width: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Desktop: 3 columns */&lt;br /&gt;
@media (min-width: 1200px) {&lt;br /&gt;
    .responsive-col {&lt;br /&gt;
        flex: 1 1 calc(33.333% - 16px) !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tablet: 2 columns */&lt;br /&gt;
@media (min-width: 768px) and (max-width: 1199px) {&lt;br /&gt;
    .responsive-col {&lt;br /&gt;
        flex: 1 1 calc(50% - 12px) !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile: 1 column */&lt;br /&gt;
@media (max-width: 767px) {&lt;br /&gt;
    .responsive-col {&lt;br /&gt;
        flex: 1 1 100% !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   DUNE CARD COMPONENTS&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
.dune-card {&lt;br /&gt;
    background: linear-gradient(135deg, rgba(0,0,2,.85) 0%, rgba(12,10,20,.85) 100%);&lt;br /&gt;
    color: #E0E0E0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    margin-bottom: 20px !important;&lt;br /&gt;
    border: 2px solid rgba(252, 231, 200, 0.2);&lt;br /&gt;
    position: relative;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    clip-path: polygon(&lt;br /&gt;
        0 20px,&lt;br /&gt;
        20px 0,&lt;br /&gt;
        calc(100% - 20px) 0,&lt;br /&gt;
        100% 20px,&lt;br /&gt;
        100% calc(100% - 20px),&lt;br /&gt;
        calc(100% - 20px) 100%,&lt;br /&gt;
        20px 100%,&lt;br /&gt;
        0 calc(100% - 20px)&lt;br /&gt;
    );&lt;br /&gt;
    box-shadow: &lt;br /&gt;
        0 0 30px rgba(0,0,0,.8),&lt;br /&gt;
        inset 0 0 30px rgba(252, 231, 200, 0.05);&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    flex: 1 0 auto;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-inner {&lt;br /&gt;
    padding: 24px !important;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-decoration {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    width: 60px;&lt;br /&gt;
    height: 60px;&lt;br /&gt;
    background: linear-gradient(135deg, transparent 50%, rgba(252, 231, 200, 0.1) 50%);&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-decoration::before {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 10px;&lt;br /&gt;
    right: 10px;&lt;br /&gt;
    width: 6px;&lt;br /&gt;
    height: 6px;&lt;br /&gt;
    background: #fce7c8;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    box-shadow: 0 0 10px #fce7c8;&lt;br /&gt;
    opacity: 0.7;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Card Label */&lt;br /&gt;
.dune-card-label {&lt;br /&gt;
    color: #E3BB7A;&lt;br /&gt;
    font-size: 11px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    margin-bottom: 8px;&lt;br /&gt;
    letter-spacing: 2px;&lt;br /&gt;
    font-weight: 700;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 4px 12px;&lt;br /&gt;
    background: linear-gradient(90deg, rgba(227,187,122,.1) 0%, transparent 100%);&lt;br /&gt;
    border-left: 3px solid #E3BB7A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Card Title */&lt;br /&gt;
.dune-card-title {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    font-size: 24px !important;&lt;br /&gt;
    color: #fce7c8;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    padding-bottom: 12px;&lt;br /&gt;
    margin-bottom: 16px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    font-weight: 700;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
    text-shadow: 0 0 20px rgba(252, 231, 200, 0.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-title::after {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    height: 2px;&lt;br /&gt;
    background: linear-gradient(90deg, &lt;br /&gt;
        transparent 0%, &lt;br /&gt;
        #fce7c8 20%, &lt;br /&gt;
        #E3BB7A 50%, &lt;br /&gt;
        #fce7c8 80%, &lt;br /&gt;
        transparent 100%&lt;br /&gt;
    );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-title .icon {&lt;br /&gt;
    margin-right: 12px;&lt;br /&gt;
    font-size: 28px;&lt;br /&gt;
    color: #E3BB7A;&lt;br /&gt;
    filter: drop-shadow(0 0 5px rgba(227,187,122,.7));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Card Description */&lt;br /&gt;
.dune-card-description {&lt;br /&gt;
    font-size: 18px !important;&lt;br /&gt;
    line-height: 1.5 !important;&lt;br /&gt;
    background: rgba(0,0,2,.8);&lt;br /&gt;
    border: 1px solid rgba(252, 231, 200, 0.2);&lt;br /&gt;
    padding: 16px;&lt;br /&gt;
    margin-bottom: 16px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-description::before,&lt;br /&gt;
.dune-card-description::after {&lt;br /&gt;
    content: &#039;&#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 20px;&lt;br /&gt;
    height: 20px;&lt;br /&gt;
    border: 2px solid rgba(252, 231, 200, 0.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-description::before {&lt;br /&gt;
    top: -1px;&lt;br /&gt;
    left: -1px;&lt;br /&gt;
    border-right: none;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-description::after {&lt;br /&gt;
    bottom: -1px;&lt;br /&gt;
    right: -1px;&lt;br /&gt;
    border-left: none;&lt;br /&gt;
    border-top: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-description:empty {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Card Image */&lt;br /&gt;
.dune-card-image {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    margin: 16px 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-image img {&lt;br /&gt;
    max-width: 260px !important;&lt;br /&gt;
    max-height: 260px !important;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: auto;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    filter: drop-shadow(0 0 20px rgba(252, 231, 200, 0.3));&lt;br /&gt;
    transition: transform 0.3s ease, filter 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-image:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
    filter: drop-shadow(0 0 30px rgba(252, 231, 200, 0.5));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Border Styling */&lt;br /&gt;
.has-border {&lt;br /&gt;
    border: 3px solid transparent;&lt;br /&gt;
    background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%) padding-box,&lt;br /&gt;
                linear-gradient(135deg, #fce7c8 0%, #E3BB7A 100%) border-box;&lt;br /&gt;
    padding: 8px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Card Video */&lt;br /&gt;
.dune-card-video {&lt;br /&gt;
    max-height: 250px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-card-video iframe,&lt;br /&gt;
.dune-card-video video {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: auto;&lt;br /&gt;
    max-height: 240px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   TABLE STYLES&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
.dune-table-wrapper {&lt;br /&gt;
    border: 2px solid rgba(252, 231, 200, 0.3);&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    background: rgba(0,0,2,.6);&lt;br /&gt;
    box-shadow: inset 0 0 20px rgba(0,0,0,0.5);&lt;br /&gt;
    margin: 12px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.infobox-dune-two-column,&lt;br /&gt;
table.infobox-dune-standard-table {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    table-layout: fixed;&lt;br /&gt;
    border-collapse: separate;&lt;br /&gt;
    border-spacing: 0;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Table cells */&lt;br /&gt;
table.infobox-dune-two-column th,&lt;br /&gt;
table.infobox-dune-two-column td,&lt;br /&gt;
table.infobox-dune-standard-table th,&lt;br /&gt;
table.infobox-dune-standard-table td {&lt;br /&gt;
    padding: 12px 10px !important;&lt;br /&gt;
    font-size: 17px !important;&lt;br /&gt;
    color: #E0E0E0;&lt;br /&gt;
    background: rgba(12,10,20,.6);&lt;br /&gt;
    border-bottom: 1px solid rgba(252, 231, 200, 0.2);&lt;br /&gt;
    transition: background 0.2s ease, color 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Table hover effects */&lt;br /&gt;
table.infobox-dune-two-column tr:hover td,&lt;br /&gt;
table.infobox-dune-standard-table tr:hover td {&lt;br /&gt;
    background: rgba(252, 231, 200, 0.05);&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Table headers */&lt;br /&gt;
table.infobox-dune-two-column thead th,&lt;br /&gt;
table.infobox-dune-standard-table thead th,&lt;br /&gt;
.tr-dark,&lt;br /&gt;
tr.tr-dark td {&lt;br /&gt;
    background: rgba(0,0,2,.9) !important;&lt;br /&gt;
    color: #fce7c8 !important;&lt;br /&gt;
    font-weight: 700;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
    border-bottom: 2px solid rgba(252, 231, 200, 0.4);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove last row border */&lt;br /&gt;
table.infobox-dune-two-column tr:last-child td,&lt;br /&gt;
table.infobox-dune-standard-table tr:last-child td {&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   CRAFTING SECTION&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
.crafting-section {&lt;br /&gt;
    margin-bottom: 24px;&lt;br /&gt;
    padding: 16px;&lt;br /&gt;
    background: rgba(0,0,2,.6);&lt;br /&gt;
    border: 1px solid rgba(252,231,200,.2);&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-section-header {&lt;br /&gt;
    color: #fce7c8;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    font-weight: 700;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    margin: 0 0 8px 0;&lt;br /&gt;
    padding-bottom: 8px;&lt;br /&gt;
    border-bottom: 2px solid rgba(252,231,200,.3);&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Recipe Table Preview - Limited Height with Scroll */&lt;br /&gt;
.recipe-table-preview {&lt;br /&gt;
    max-height: 320px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin: 12px 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Recipe Table Styling */&lt;br /&gt;
.recipe-table {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    border-collapse: separate;&lt;br /&gt;
    border-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-table thead th {&lt;br /&gt;
    background: rgba(0,0,2,.9) !important;&lt;br /&gt;
    color: #fce7c8 !important;&lt;br /&gt;
    font-weight: 700;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
    padding: 12px 10px !important;&lt;br /&gt;
    font-size: 14px !important;&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 10;&lt;br /&gt;
    border-bottom: 2px solid rgba(252,231,200,.4);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-table tbody tr {&lt;br /&gt;
    transition: background 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-table tbody tr:hover {&lt;br /&gt;
    background: rgba(252,231,200,.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-table tbody td {&lt;br /&gt;
    padding: 10px !important;&lt;br /&gt;
    font-size: 14px !important;&lt;br /&gt;
    color: #E0E0E0;&lt;br /&gt;
    background: rgba(12,10,20,.6);&lt;br /&gt;
    border-bottom: 1px solid rgba(252,231,200,.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Recipe Search Container */&lt;br /&gt;
.recipe-search-container {&lt;br /&gt;
    margin: 8px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-search-input {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    background: rgba(0,0,2,.8);&lt;br /&gt;
    border: 2px solid rgba(252,231,200,.3);&lt;br /&gt;
    color: #fce7c8;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-family: &#039;Rajdhani&#039;, sans-serif;&lt;br /&gt;
    transition: border-color 0.3s ease, box-shadow 0.3s ease;&lt;br /&gt;
    outline: none;&lt;br /&gt;
    box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-search-input:focus {&lt;br /&gt;
    border-color: #fce7c8;&lt;br /&gt;
    box-shadow: 0 0 10px rgba(252,231,200,.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-search-input::placeholder {&lt;br /&gt;
    color: rgba(252,231,200,.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Recipe Actions */&lt;br /&gt;
.recipe-actions {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    margin-top: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-action-button {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 10px 20px;&lt;br /&gt;
    background: linear-gradient(135deg, rgba(252,231,200,.1) 0%, rgba(227,187,122,.1) 100%);&lt;br /&gt;
    border: 2px solid rgba(252,231,200,.3);&lt;br /&gt;
    color: #fce7c8;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: background 0.3s ease, border-color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-action-button:hover {&lt;br /&gt;
    background: linear-gradient(135deg, rgba(252,231,200,.2) 0%, rgba(227,187,122,.2) 100%);&lt;br /&gt;
    border-color: #fce7c8;&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(252,231,200,.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.dune-action-button .icon {&lt;br /&gt;
    margin-right: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   GALLERY&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
.gallery-container {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 12px;&lt;br /&gt;
    margin-top: 12px;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gallery-item {&lt;br /&gt;
    flex: 0 0 120px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gallery-item img {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: auto;&lt;br /&gt;
    max-height: 120px;&lt;br /&gt;
    object-fit: cover;&lt;br /&gt;
    border: 2px solid rgba(252,231,200,.3);&lt;br /&gt;
    transition: border-color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gallery-item:hover img {&lt;br /&gt;
    border-color: #fce7c8;&lt;br /&gt;
    transform: scale(1.1);&lt;br /&gt;
    box-shadow: 0 0 20px rgba(252,231,200,.6);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gallery-item .caption {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    color: #E3BB7A;&lt;br /&gt;
    margin-top: 6px;&lt;br /&gt;
    padding: 0 4px;&lt;br /&gt;
    line-height: 1.2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   MOBILE RESPONSIVE&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    /* Container adjustments */&lt;br /&gt;
    .responsive-container {&lt;br /&gt;
        padding: 0 10px !important;&lt;br /&gt;
        gap: 16px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Card adjustments */&lt;br /&gt;
    .dune-card {&lt;br /&gt;
        clip-path: polygon(0 10px, 10px 0, calc(100% - 10px) 0, 100% 10px, 100% calc(100% - 10px), calc(100% - 10px) 100%, 10px 100%, 0 calc(100% - 10px));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .dune-card-inner {&lt;br /&gt;
        padding: 16px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .dune-card-title {&lt;br /&gt;
        font-size: 20px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .dune-card-description {&lt;br /&gt;
        font-size: 14px !important;&lt;br /&gt;
        padding: 12px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .dune-card-image img {&lt;br /&gt;
        max-width: 180px !important;&lt;br /&gt;
        max-height: 180px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Table adjustments */&lt;br /&gt;
    table.infobox-dune-two-column th,&lt;br /&gt;
    table.infobox-dune-two-column td,&lt;br /&gt;
    table.infobox-dune-standard-table th,&lt;br /&gt;
    table.infobox-dune-standard-table td {&lt;br /&gt;
        padding: 10px 6px !important;&lt;br /&gt;
        font-size: 14px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Recipe table mobile */&lt;br /&gt;
    .recipe-table-preview {&lt;br /&gt;
        max-height: 240px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Gallery mobile */&lt;br /&gt;
    .gallery-container {&lt;br /&gt;
        gap: 8px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .gallery-item {&lt;br /&gt;
        flex: 0 0 80px;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .gallery-item img {&lt;br /&gt;
        max-height: 80px;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ResourcePage Template Fixes - Add to ResourcePage_TemplateStyles.css */&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   FIX 1: REDUCE TABLE ROW SIZE TO FIT VIEWPORT&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
   &lt;br /&gt;
/* Reduce recipe table preview height for better viewport fit */&lt;br /&gt;
.recipe-table-preview {&lt;br /&gt;
    max-height: 240px !important; /* Reduced from 320px */&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin: 8px 0 !important;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Smaller table cells and text */&lt;br /&gt;
.recipe-table tbody td {&lt;br /&gt;
    padding: 6px 8px !important; /* Reduced from 10px */&lt;br /&gt;
    font-size: 13px !important; /* Reduced from 14px */&lt;br /&gt;
    line-height: 1.3 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-table thead th {&lt;br /&gt;
    padding: 8px 6px !important; /* Reduced from 12px 10px */&lt;br /&gt;
    font-size: 13px !important; /* Reduced from 14px */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tighter recipe rows */&lt;br /&gt;
.recipe-row {&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Reduce crafting section padding */&lt;br /&gt;
.crafting-section {&lt;br /&gt;
    margin-bottom: 16px !important; /* Reduced from 24px */&lt;br /&gt;
    padding: 12px !important; /* Reduced from 16px */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   FIX 2: VIDEO CONTAINER SIZING&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
   &lt;br /&gt;
/* Make video container responsive */&lt;br /&gt;
.dune-card-video {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    padding-bottom: 56.25%; /* 16:9 Aspect Ratio */&lt;br /&gt;
    height: 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    background-color: #262626;&lt;br /&gt;
    border: 2px solid #e2d3ae;&lt;br /&gt;
    border-radius: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Position iframe absolutely within container */&lt;br /&gt;
.dune-card-video iframe,&lt;br /&gt;
.dune-card-video .embedvideo-wrapper {&lt;br /&gt;
    position: absolute !important;&lt;br /&gt;
    top: 0 !important;&lt;br /&gt;
    left: 0 !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fix YouTube embed wrapper */&lt;br /&gt;
.embedvideo {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.embedvideo-wrapper {&lt;br /&gt;
    position: relative !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   FIX 3: GOLD COLOR FOR ICONS&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
   &lt;br /&gt;
/* Apply gold color to all icons in resource info card */&lt;br /&gt;
.dune-card-inner .icon,&lt;br /&gt;
table.infobox-dune-two-column th .icon {&lt;br /&gt;
    color: #E3BB7A !important;&lt;br /&gt;
    filter: drop-shadow(0 0 3px rgba(227,187,122,.5));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Specific icon styling */&lt;br /&gt;
.dune-card-inner .icon::before {&lt;br /&gt;
    color: #E3BB7A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Icon hover effect */&lt;br /&gt;
.dune-card-inner tr:hover .icon {&lt;br /&gt;
    color: #fce7c8 !important;&lt;br /&gt;
    filter: drop-shadow(0 0 5px rgba(252,231,200,.7));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   FIX 4: CLICKABLE SPAN BUTTONS&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
   &lt;br /&gt;
/* Style spans to look and act like buttons */&lt;br /&gt;
.dune-action-button {&lt;br /&gt;
    display: inline-block !important;&lt;br /&gt;
    padding: 8px 16px !important;&lt;br /&gt;
    background: linear-gradient(135deg, rgba(252,231,200,.1) 0%, rgba(227,187,122,.1) 100%) !important;&lt;br /&gt;
    border: 2px solid rgba(252,231,200,.3) !important;&lt;br /&gt;
    color: #fce7c8 !important;&lt;br /&gt;
    font-size: 13px !important;&lt;br /&gt;
    font-weight: 600 !important;&lt;br /&gt;
    text-transform: uppercase !important;&lt;br /&gt;
    letter-spacing: 1px !important;&lt;br /&gt;
    cursor: pointer !important;&lt;br /&gt;
    transition: all 0.3s ease !important;&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
    position: relative !important;&lt;br /&gt;
    overflow: hidden !important;&lt;br /&gt;
    user-select: none !important;&lt;br /&gt;
    -webkit-user-select: none !important;&lt;br /&gt;
    -moz-user-select: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state for span buttons */&lt;br /&gt;
.dune-action-button:hover {&lt;br /&gt;
    background: linear-gradient(135deg, rgba(252,231,200,.2) 0%, rgba(227,187,122,.2) 100%) !important;&lt;br /&gt;
    border-color: #fce7c8 !important;&lt;br /&gt;
    transform: translateY(-2px) !important;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(252,231,200,.3) !important;&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active/click state */&lt;br /&gt;
.dune-action-button:active {&lt;br /&gt;
    transform: translateY(0) !important;&lt;br /&gt;
    box-shadow: 0 2px 6px rgba(252,231,200,.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   ADDITIONAL VIEWPORT OPTIMIZATIONS&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
   &lt;br /&gt;
/* Reduce card padding on smaller screens */&lt;br /&gt;
@media (max-width: 1400px) {&lt;br /&gt;
    .dune-card-inner {&lt;br /&gt;
        padding: 16px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .dune-card-title {&lt;br /&gt;
        font-size: 20px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .dune-card-description {&lt;br /&gt;
        font-size: 14px !important;&lt;br /&gt;
        padding: 12px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optimize column layout for better viewport usage */&lt;br /&gt;
@media (min-width: 1200px) and (max-width: 1600px) {&lt;br /&gt;
    .responsive-container {&lt;br /&gt;
        gap: 16px !important;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .recipe-table-preview {&lt;br /&gt;
        max-height: 200px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ========================================================&lt;br /&gt;
   POPUP STYLES&lt;br /&gt;
   ======================================================== */&lt;br /&gt;
   &lt;br /&gt;
/* Ensure popup overlay works */&lt;br /&gt;
.recipe-popup-overlay {&lt;br /&gt;
    position: fixed !important;&lt;br /&gt;
    top: 0 !important;&lt;br /&gt;
    left: 0 !important;&lt;br /&gt;
    right: 0 !important;&lt;br /&gt;
    bottom: 0 !important;&lt;br /&gt;
    background: rgba(0,0,0,.85) !important;&lt;br /&gt;
    z-index: 100000 !important;&lt;br /&gt;
    display: flex !important;&lt;br /&gt;
    align-items: center !important;&lt;br /&gt;
    justify-content: center !important;&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
    transition: opacity .3s ease, visibility .3s ease !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.recipe-popup-overlay.active {&lt;br /&gt;
    opacity: 1 !important;&lt;br /&gt;
    visibility: visible !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Popup close button styling */&lt;br /&gt;
.popup-close {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
    border: none !important;&lt;br /&gt;
    color: #fce7c8 !important;&lt;br /&gt;
    font-size: 28px !important;&lt;br /&gt;
    cursor: pointer !important;&lt;br /&gt;
    transition: transform 0.3s ease, color 0.3s ease !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
    width: 40px !important;&lt;br /&gt;
    height: 40px !important;&lt;br /&gt;
    display: flex !important;&lt;br /&gt;
    align-items: center !important;&lt;br /&gt;
    justify-content: center !important;&lt;br /&gt;
    line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.popup-close:hover {&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    transform: rotate(90deg) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=Template:ResourcePage&amp;diff=1171</id>
		<title>Template:ResourcePage</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=Template:ResourcePage&amp;diff=1171"/>
		<updated>2025-06-04T05:49:29Z</updated>

		<summary type="html">&lt;p&gt;Operator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Template:ResourcePage/styles.css&amp;quot; /&amp;gt;{{#get_external_data:source=externaldb|from=data_items|data=ItemID=item_id,InternalName=internal_name,ItemClass=item_class,ItemSubclass=item_subclass,Tier=tier,Rarity=rarity,Faction=faction,Name=name,Description=description,HowToObtain=how_to_obtain,Notes=notes,AdditionalNotes=additional_notes,Weight=weight,MaxStacks=max_stacks,XPPerHarvest=xp_per_harvest,BaseVendorPrice=base_vendor_price,GuideLink=guide_link,IconLink=icon_link,ImageLink=image_link,Category1=category_1,Category2=category_2,Category3=category_3|cache=yes|where=name=&#039;{{PAGENAME}}&#039;|limit=1&lt;br /&gt;
}}&lt;br /&gt;
{{#for_external_table:|{{#vardefine:ItemID|{{{ItemID}}}}}{{#vardefine:InternalName|{{{InternalName}}}}}{{#vardefine:ItemClass|{{{ItemClass}}}}}{{#vardefine:ItemSubclass|{{{ItemSubclass}}}}}{{#vardefine:Tier|{{{Tier}}}}}{{#vardefine:Rarity|{{{Rarity}}}}}{{#vardefine:Faction|{{{Faction}}}}}{{#vardefine:Name|{{{Name}}}}}{{#vardefine:Description|{{{Description}}}}}{{#vardefine:HowToObtain|{{{HowToObtain}}}}}{{#vardefine:Notes|{{{Notes}}}}}{{#vardefine:AdditionalNotes|{{{AdditionalNotes}}}}}{{#vardefine:Weight|{{{Weight}}}}}{{#vardefine:MaxStacks|{{{MaxStacks}}}}}{{#vardefine:XPPerHarvest|{{{XPPerHarvest}}}}}{{#vardefine:BaseVendorPrice|{{{BaseVendorPrice}}}}}{{#vardefine:GuideLink|{{{GuideLink}}}}}{{#vardefine:IconLink|{{{IconLink}}}}}{{#vardefine:ImageLink|{{{ImageLink}}}}}{{#vardefine:Category1|{{{Category1}}}}}{{#vardefine:Category2|{{{Category2}}}}}{{#vardefine:Category3|{{{Category3}}}}}&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;div class=&amp;quot;responsive-container&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;responsive-col col1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;skin-pivot&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-decoration&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-inner&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-label&amp;quot;&amp;gt;{{#var:ItemClass}} - {{#var:ItemSubclass}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-title&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;◆&amp;lt;/span&amp;gt; Resource Information&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:3px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-image&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;has-border&amp;quot;&amp;gt;{{#if:{{#var:ImageLink}}|[[File:{{#var:ImageLink}}|200px|alt={{#var:Name}}]]|[[File:Placeholder.png|200px|alt=No image available]]}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:3px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-description&amp;quot;&amp;gt;{{#invoke:DataTableParserV2|iconize|{{#var:Description}}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-table-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;infobox-dune-two-column&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;{{#if:{{#var:IconLink}}|[[File:{{#var:IconLink}}|16px]]|}}&amp;lt;/span&amp;gt; Tier&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;{{#var:Tier}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;✦&amp;lt;/span&amp;gt; Rarity&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;{{#var:Rarity}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;🏛&amp;lt;/span&amp;gt; Faction&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;{{#var:Faction}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;⚖&amp;lt;/span&amp;gt; Weight&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;{{#var:Weight}} kg&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;📦&amp;lt;/span&amp;gt; Max Stacks&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;{{#var:MaxStacks}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;💰&amp;lt;/span&amp;gt; Base Vendor Price&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;{{#var:BaseVendorPrice}} Solaris&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;⭐&amp;lt;/span&amp;gt; XP per Harvest&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;{{#var:XPPerHarvest}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#get_external_data:&lt;br /&gt;
source=externaldb&lt;br /&gt;
|from=data_item_locations&lt;br /&gt;
|data=LocationName=location_name,Note=note&lt;br /&gt;
|cache=yes&lt;br /&gt;
|where=internal_name=&#039;{{PAGENAME}}&#039;&lt;br /&gt;
}}&lt;br /&gt;
{{#if:{{{LocationName|}}}|&amp;lt;div style=&amp;quot;clear:both; padding:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;dune-card-title&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;🗺&amp;lt;/span&amp;gt; Harvest Locations&amp;lt;/div&amp;gt;&amp;lt;div style=&amp;quot;padding:3px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;dune-card-description&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;location-list&amp;quot;&amp;gt;{{#for_external_table:|&amp;lt;li&amp;gt;&#039;&#039;&#039;{{{LocationName}}}&#039;&#039;&#039;{{#if:{{{Note|}}}|: {{{Note}}}}}&amp;lt;/li&amp;gt;}}&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;responsive-col col2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;skin-pivot&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-decoration&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-inner&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-label&amp;quot;&amp;gt;CRAFTING&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-title&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;⚒&amp;lt;/span&amp;gt; Crafting Recipes&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:3px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;crafting-section&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3 class=&amp;quot;dune-section-header&amp;quot;&amp;gt;Crafted With&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-description&amp;quot;&amp;gt;Items that require {{#var:Name}} as an ingredient&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;craftedWithPreview&amp;quot; class=&amp;quot;recipe-table-preview&amp;quot;&amp;gt;&lt;br /&gt;
{{#get_external_data:&lt;br /&gt;
source=externaldb&lt;br /&gt;
|from=vw_recipe_by_ingredient&lt;br /&gt;
|data=OutputItem=output_item,Resources=resources,Stations=stations&lt;br /&gt;
|cache=yes&lt;br /&gt;
|where=ingredient=&#039;{{PAGENAME}}&#039;&lt;br /&gt;
|order by=Stations&lt;br /&gt;
|limit=5&lt;br /&gt;
|table=crafted_with_preview&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- For Crafted With section, after the table --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;crafted-with-full-data&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&lt;br /&gt;
{{#get_external_data:&lt;br /&gt;
source=externaldb&lt;br /&gt;
|from=vw_recipe_by_ingredient&lt;br /&gt;
|data=OutputItem=output_item,Resources=resources,Stations=stations,WaterML=water_ml,CraftTime=craft_time,Schematic=schematic&lt;br /&gt;
|format=json&lt;br /&gt;
|cache=yes&lt;br /&gt;
|where=ingredient=&#039;{{PAGENAME}}&#039;&lt;br /&gt;
|order by=Stations&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-table-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;infobox-dune-standard-table recipe-table&amp;quot; id=&amp;quot;craftedWithTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr class=&amp;quot;tr-dark&amp;quot;&amp;gt;&amp;lt;th style=&amp;quot;width:35%;&amp;quot;&amp;gt;Item Created&amp;lt;/th&amp;gt;&amp;lt;th style=&amp;quot;width:40%;&amp;quot;&amp;gt;Resources Needed&amp;lt;/th&amp;gt;&amp;lt;th style=&amp;quot;width:25%;&amp;quot;&amp;gt;Stations&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
{{#for_external_table:|&amp;lt;tr class=&amp;quot;recipe-row&amp;quot;&amp;gt;&amp;lt;td&amp;gt;{{#invoke:DataTableParserV2|iconize|{{{OutputItem}}}}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{#invoke:DataTableParserV2|formatRecipeList|{{{Resources}}}}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{{Stations}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;}}&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;recipe-actions&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;dune-action-button view-all-crafted-with&amp;quot; data-resource=&amp;quot;{{PAGENAME}}&amp;quot;&amp;gt;View All Recipes&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both; padding:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;crafting-section&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3 class=&amp;quot;dune-section-header&amp;quot;&amp;gt;Crafted From&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-card-description&amp;quot;&amp;gt;Recipes that produce {{#var:Name}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;craftedFromPreview&amp;quot; class=&amp;quot;recipe-table-preview&amp;quot;&amp;gt;&lt;br /&gt;
{{#get_external_data:&lt;br /&gt;
source=externaldb&lt;br /&gt;
|from=vw_recipe_summary&lt;br /&gt;
|data=OutputItem=output_item,Resources=resources,Stations=station,WaterML=water_ml,CraftTime=craft_time,Schematic=schematic&lt;br /&gt;
|cache=yes&lt;br /&gt;
|where=output_item=&#039;{{PAGENAME}}&#039;&lt;br /&gt;
|order by=station&lt;br /&gt;
|limit=5&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- For Crafted From section, after the table --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;crafted-from-full-data&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&lt;br /&gt;
{{#get_external_data:&lt;br /&gt;
source=externaldb&lt;br /&gt;
|from=vw_recipe_summary&lt;br /&gt;
|data=OutputItem=output_item,Resources=resources,Stations=station,WaterML=water_ml,CraftTime=craft_time,Schematic=schematic&lt;br /&gt;
|format=json&lt;br /&gt;
|cache=yes&lt;br /&gt;
|where=output_item=&#039;{{PAGENAME}}&#039;&lt;br /&gt;
|order by=station&lt;br /&gt;
|table=crafted_from_preview&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;dune-table-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;infobox-dune-standard-table recipe-table&amp;quot; id=&amp;quot;craftedFromTable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr class=&amp;quot;tr-dark&amp;quot;&amp;gt;&amp;lt;th style=&amp;quot;width:35%;&amp;quot;&amp;gt;Item Created&amp;lt;/th&amp;gt;&amp;lt;th style=&amp;quot;width:40%;&amp;quot;&amp;gt;Resources Needed&amp;lt;/th&amp;gt;&amp;lt;th style=&amp;quot;width:25%;&amp;quot;&amp;gt;Stations&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
{{#for_external_table:|&amp;lt;tr class=&amp;quot;recipe-row&amp;quot;&amp;gt;&amp;lt;td&amp;gt;{{#invoke:DataTableParserV2|iconize|{{{OutputItem}}}}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{#invoke:DataTableParserV2|formatRecipeList|{{{Resources}}}}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{{Stations}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;}}&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;recipe-actions&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;dune-action-button view-all-crafted-from&amp;quot; data-resource=&amp;quot;{{PAGENAME}}&amp;quot;&amp;gt;View All Recipes&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;responsive-col col3&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Building Guide Video Card with Notes integrated --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;skin-pivot&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;dune-card&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-card-decoration&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-card-inner&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-card-label&amp;quot;&amp;gt;VIDEO TUTORIALS&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-card-title&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt; Building Guide&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style=&amp;quot;padding:3px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-card-video&amp;quot;&amp;gt;&lt;br /&gt;
            {{#if:{{{YoutubeEmbed|}}}| &lt;br /&gt;
              {{{YoutubeEmbed}}}&lt;br /&gt;
            | &lt;br /&gt;
              &amp;lt;youtube id=&amp;quot;r8lxVDqoHLQ&amp;quot; /&amp;gt;&lt;br /&gt;
            }}&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style=&amp;quot;clear:both; padding:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-card-title&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;icon&amp;quot;&amp;gt;☰&amp;lt;/span&amp;gt; Notes&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style=&amp;quot;padding:3px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-card-description&amp;quot;&amp;gt;{{#invoke:DataTableParserV2|iconize|{{#var:AdditionalNotes}}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#tag:script|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;recipe-popup-overlay&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;recipe-popup&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;popup-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h3 class=&amp;quot;popup-title&amp;quot;&amp;gt;{{title}}&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;button class=&amp;quot;popup-close&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;popup-content&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;popup-search-container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;popup-search-input&amp;quot; placeholder=&amp;quot;Search recipes…&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;popup-table-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;infobox-dune-standard-table recipe-popup-table&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;thead&amp;gt;&lt;br /&gt;
            &amp;lt;tr class=&amp;quot;tr-dark&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;th&amp;gt;Item Created&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Resources Needed&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Stations&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;th&amp;gt;Water&amp;amp;nbsp;(mL)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Craft&amp;amp;nbsp;Time&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Schematic&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;/thead&amp;gt;&lt;br /&gt;
          &amp;lt;tbody&amp;gt;{{tableRows}}&amp;lt;/tbody&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|type=&amp;quot;text/template&amp;quot; id=&amp;quot;recipePopupTemplate&amp;quot;}}&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=MediaWiki:Gadget-ResourcePage.js&amp;diff=1170</id>
		<title>MediaWiki:Gadget-ResourcePage.js</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=MediaWiki:Gadget-ResourcePage.js&amp;diff=1170"/>
		<updated>2025-06-04T05:45:49Z</updated>

		<summary type="html">&lt;p&gt;Operator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * ResourcePage Gadget - Complete Fixed Version&lt;br /&gt;
 * Handles recipe popups and search functionality for resource pages&lt;br /&gt;
 * &lt;br /&gt;
 * @requires jquery&lt;br /&gt;
 * @requires mediawiki.api&lt;br /&gt;
 * @requires mediawiki.util&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
(function($, mw) {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Only run on pages with resource page elements&lt;br /&gt;
    if (!$(&#039;.crafting-section, .recipe-table&#039;).length) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    console.log(&#039;[ResourcePage] Gadget loading...&#039;);&lt;br /&gt;
    &lt;br /&gt;
    // Cache for storing recipe data&lt;br /&gt;
    var recipeCache = {&lt;br /&gt;
        craftedWith: null,&lt;br /&gt;
        craftedFrom: null&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    // Initialize module&lt;br /&gt;
    function init() {&lt;br /&gt;
        console.log(&#039;[ResourcePage] Initializing...&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Add required styles&lt;br /&gt;
        injectRequiredStyles();&lt;br /&gt;
        &lt;br /&gt;
        // Add table search functionality&lt;br /&gt;
        initTableSearch();&lt;br /&gt;
        &lt;br /&gt;
        // Add popup handlers - FIXED VERSION&lt;br /&gt;
        initPopupHandlers();&lt;br /&gt;
        &lt;br /&gt;
        // Format tables&lt;br /&gt;
        formatTables();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Inject required CSS&lt;br /&gt;
    function injectRequiredStyles() {&lt;br /&gt;
        if ($(&#039;#resourcePageGadgetStyles&#039;).length === 0) {&lt;br /&gt;
            var styles = `&amp;lt;style id=&amp;quot;resourcePageGadgetStyles&amp;quot;&amp;gt;&lt;br /&gt;
                /* Span button styles */&lt;br /&gt;
                .dune-action-button {&lt;br /&gt;
                    display: inline-block !important;&lt;br /&gt;
                    cursor: pointer !important;&lt;br /&gt;
                    user-select: none !important;&lt;br /&gt;
                    -webkit-user-select: none !important;&lt;br /&gt;
                    -moz-user-select: none !important;&lt;br /&gt;
                    -ms-user-select: none !important;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Loading spinner */&lt;br /&gt;
                .loading-spinner {&lt;br /&gt;
                    font-size: 48px;&lt;br /&gt;
                    animation: spin 1s linear infinite;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                @keyframes spin {&lt;br /&gt;
                    from { transform: rotate(0deg); }&lt;br /&gt;
                    to { transform: rotate(360deg); }&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Sort indicators */&lt;br /&gt;
                .recipe-popup-table th {&lt;br /&gt;
                    cursor: pointer;&lt;br /&gt;
                    user-select: none;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                .recipe-popup-table th.sort-asc::after {&lt;br /&gt;
                    content: &amp;quot; ↑&amp;quot;;&lt;br /&gt;
                    color: #fce7c8;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                .recipe-popup-table th.sort-desc::after {&lt;br /&gt;
                    content: &amp;quot; ↓&amp;quot;;&lt;br /&gt;
                    color: #fce7c8;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Popup note */&lt;br /&gt;
                .popup-note {&lt;br /&gt;
                    background: rgba(252,231,200,.1);&lt;br /&gt;
                    border: 1px solid rgba(252,231,200,.3);&lt;br /&gt;
                    padding: 10px;&lt;br /&gt;
                    margin-bottom: 15px;&lt;br /&gt;
                    color: #E3BB7A;&lt;br /&gt;
                    text-align: center;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                /* Recipe count */&lt;br /&gt;
                .recipe-count {&lt;br /&gt;
                    position: absolute;&lt;br /&gt;
                    right: 60px;&lt;br /&gt;
                    top: 50%;&lt;br /&gt;
                    transform: translateY(-50%);&lt;br /&gt;
                    color: #E3BB7A;&lt;br /&gt;
                    font-size: 14px;&lt;br /&gt;
                }&lt;br /&gt;
            &amp;lt;/style&amp;gt;`;&lt;br /&gt;
            &lt;br /&gt;
            $(&#039;head&#039;).append(styles);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format tables to ensure proper styling&lt;br /&gt;
    function formatTables() {&lt;br /&gt;
        $(&#039;.recipe-table&#039;).each(function() {&lt;br /&gt;
            var $table = $(this);&lt;br /&gt;
            &lt;br /&gt;
            // Ensure proper header styling&lt;br /&gt;
            $table.find(&#039;thead tr&#039;).addClass(&#039;tr-dark&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Initialize table search functionality&lt;br /&gt;
    function initTableSearch() {&lt;br /&gt;
        // Crafted With search&lt;br /&gt;
        $(&#039;#craftedWithSearch&#039;).on(&#039;input&#039;, function() {&lt;br /&gt;
            filterTable(&#039;#craftedWithTable&#039;, $(this).val());&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Crafted From search&lt;br /&gt;
        $(&#039;#craftedFromSearch&#039;).on(&#039;input&#039;, function() {&lt;br /&gt;
            filterTable(&#039;#craftedFromTable&#039;, $(this).val());&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Filter table rows based on search input&lt;br /&gt;
    function filterTable(tableId, searchTerm) {&lt;br /&gt;
        var $table = $(tableId);&lt;br /&gt;
        var term = searchTerm.toLowerCase();&lt;br /&gt;
        &lt;br /&gt;
        $table.find(&#039;tbody tr&#039;).each(function() {&lt;br /&gt;
            var $row = $(this);&lt;br /&gt;
            var text = $row.text().toLowerCase();&lt;br /&gt;
            &lt;br /&gt;
            if (text.indexOf(term) &amp;gt; -1) {&lt;br /&gt;
                $row.show();&lt;br /&gt;
            } else {&lt;br /&gt;
                $row.hide();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // FIXED: Initialize popup handlers with event delegation&lt;br /&gt;
    function initPopupHandlers() {&lt;br /&gt;
        console.log(&#039;[ResourcePage] Setting up popup handlers...&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // View All Crafted With - using event delegation&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.view-all-crafted-with&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            console.log(&#039;[ResourcePage] View All Crafted With clicked&#039;);&lt;br /&gt;
            &lt;br /&gt;
            var $element = $(this);&lt;br /&gt;
            var resourceName = $element.data(&#039;resource&#039;) || $element.attr(&#039;data-resource&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (!resourceName) {&lt;br /&gt;
                console.error(&#039;[ResourcePage] No resource name found!&#039;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            showRecipePopup(&#039;craftedWith&#039;, resourceName);&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // View All Crafted From - using event delegation&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.view-all-crafted-from&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            console.log(&#039;[ResourcePage] View All Crafted From clicked&#039;);&lt;br /&gt;
            &lt;br /&gt;
            var $element = $(this);&lt;br /&gt;
            var resourceName = $element.data(&#039;resource&#039;) || $element.attr(&#039;data-resource&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (!resourceName) {&lt;br /&gt;
                console.error(&#039;[ResourcePage] No resource name found!&#039;);&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            showRecipePopup(&#039;craftedFrom&#039;, resourceName);&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Close popup - overlay click&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.recipe-popup-overlay&#039;, function(e) {&lt;br /&gt;
            if (e.target === this) {&lt;br /&gt;
                console.log(&#039;[ResourcePage] Overlay clicked - closing popup&#039;);&lt;br /&gt;
                closeRecipePopup();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Close popup - close button&lt;br /&gt;
        $(document).on(&#039;click&#039;, &#039;.popup-close&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            console.log(&#039;[ResourcePage] Close button clicked&#039;);&lt;br /&gt;
            closeRecipePopup();&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Escape key to close popup&lt;br /&gt;
        $(document).on(&#039;keydown&#039;, function(e) {&lt;br /&gt;
            if (e.key === &#039;Escape&#039; &amp;amp;&amp;amp; $(&#039;.recipe-popup-overlay&#039;).length &amp;gt; 0) {&lt;br /&gt;
                console.log(&#039;[ResourcePage] Escape key pressed - closing popup&#039;);&lt;br /&gt;
                closeRecipePopup();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Prevent text selection on span buttons&lt;br /&gt;
        $(document).on(&#039;selectstart&#039;, &#039;.dune-action-button&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            return false;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Show recipe popup&lt;br /&gt;
    function showRecipePopup(type, resourceName) {&lt;br /&gt;
        console.log(&#039;[ResourcePage] Showing popup for:&#039;, type, resourceName);&lt;br /&gt;
        &lt;br /&gt;
        var title = type === &#039;craftedWith&#039; &lt;br /&gt;
            ? &#039;All Recipes Using &#039; + resourceName&lt;br /&gt;
            : &#039;All Recipes Creating &#039; + resourceName;&lt;br /&gt;
        &lt;br /&gt;
        // Show loading state&lt;br /&gt;
        showLoadingPopup();&lt;br /&gt;
        &lt;br /&gt;
        // First, check for full data in hidden elements&lt;br /&gt;
        var dataSelector = &#039;.&#039; + type.replace(&#039;craftedWith&#039;, &#039;crafted-with&#039;).replace(&#039;craftedFrom&#039;, &#039;crafted-from&#039;) + &#039;-full-data&#039;;&lt;br /&gt;
        var $fullDataElement = $(dataSelector);&lt;br /&gt;
        &lt;br /&gt;
        console.log(&#039;[ResourcePage] Looking for data in:&#039;, dataSelector);&lt;br /&gt;
        &lt;br /&gt;
        if ($fullDataElement.length &amp;amp;&amp;amp; $fullDataElement.text().trim()) {&lt;br /&gt;
            try {&lt;br /&gt;
                // Parse JSON data from hidden element&lt;br /&gt;
                var jsonText = $fullDataElement.text().trim();&lt;br /&gt;
                console.log(&#039;[ResourcePage] Found JSON data, parsing...&#039;);&lt;br /&gt;
                &lt;br /&gt;
                var jsonData = JSON.parse(jsonText);&lt;br /&gt;
                var rows = jsonData.results || jsonData || [];&lt;br /&gt;
                &lt;br /&gt;
                console.log(&#039;[ResourcePage] Parsed&#039;, rows.length, &#039;rows&#039;);&lt;br /&gt;
                &lt;br /&gt;
                // Transform to expected format&lt;br /&gt;
                var formattedRows = rows.map(function(row) {&lt;br /&gt;
                    return {&lt;br /&gt;
                        item: row.OutputItem || row.output_item || &#039;&#039;,&lt;br /&gt;
                        resources: formatResourceList(row.Resources || row.resources || &#039;&#039;),&lt;br /&gt;
                        stations: row.Stations || row.station || row.stations || &#039;&#039;,&lt;br /&gt;
                        water: row.WaterML || row.water_ml || &#039;N/A&#039;,&lt;br /&gt;
                        craftTime: row.CraftTime || row.craft_time || &#039;N/A&#039;,&lt;br /&gt;
                        schematic: row.Schematic || row.schematic || &#039;N/A&#039;&lt;br /&gt;
                    };&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                displayPopup(title, formattedRows, false);&lt;br /&gt;
                return;&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                console.error(&#039;[ResourcePage] Failed to parse full recipe data:&#039;, e);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Fallback to API call&lt;br /&gt;
        console.log(&#039;[ResourcePage] No cached data found, making API call...&#039;);&lt;br /&gt;
        fetchRecipeDataViaAPI(type, resourceName, title);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Format resource list for display&lt;br /&gt;
    function formatResourceList(resources) {&lt;br /&gt;
        if (!resources) return &#039;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // If it&#039;s already HTML formatted, return as is&lt;br /&gt;
        if (resources.indexOf(&#039;&amp;lt;br&#039;) &amp;gt; -1) {&lt;br /&gt;
            return resources;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Otherwise, split by semicolons and format&lt;br /&gt;
        return resources.split(&#039;;&#039;).map(function(r) {&lt;br /&gt;
            return r.trim();&lt;br /&gt;
        }).filter(Boolean).join(&#039;&amp;lt;br&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Fetch recipe data via API&lt;br /&gt;
    function fetchRecipeDataViaAPI(type, resourceName, title) {&lt;br /&gt;
        $.ajax({&lt;br /&gt;
            url: mw.util.wikiScript(&#039;api&#039;),&lt;br /&gt;
            data: {&lt;br /&gt;
                action: &#039;parse&#039;,&lt;br /&gt;
                format: &#039;json&#039;,&lt;br /&gt;
                page: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
                prop: &#039;text&#039;&lt;br /&gt;
            },&lt;br /&gt;
            success: function(response) {&lt;br /&gt;
                if (response.parse &amp;amp;&amp;amp; response.parse.text) {&lt;br /&gt;
                    var html = response.parse.text[&#039;*&#039;];&lt;br /&gt;
                    var $html = $(&#039;&amp;lt;div&amp;gt;&#039;).html(html);&lt;br /&gt;
                    &lt;br /&gt;
                    // Find the appropriate table&lt;br /&gt;
                    var tableId = type === &#039;craftedWith&#039; ? &#039;#craftedWithTable&#039; : &#039;#craftedFromTable&#039;;&lt;br /&gt;
                    var $table = $html.find(tableId);&lt;br /&gt;
                    &lt;br /&gt;
                    var rows = [];&lt;br /&gt;
                    $table.find(&#039;tbody tr&#039;).each(function() {&lt;br /&gt;
                        var $cells = $(this).find(&#039;td&#039;);&lt;br /&gt;
                        if ($cells.length &amp;gt;= 3) {&lt;br /&gt;
                            rows.push({&lt;br /&gt;
                                item: $cells.eq(0).html(),&lt;br /&gt;
                                resources: $cells.eq(1).html(),&lt;br /&gt;
                                stations: $cells.eq(2).html(),&lt;br /&gt;
                                water: &#039;N/A&#039;,&lt;br /&gt;
                                craftTime: &#039;N/A&#039;,&lt;br /&gt;
                                schematic: &#039;N/A&#039;&lt;br /&gt;
                            });&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                    &lt;br /&gt;
                    console.log(&#039;[ResourcePage] Found&#039;, rows.length, &#039;rows via API&#039;);&lt;br /&gt;
                    displayPopup(title, rows, false);&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            error: function() {&lt;br /&gt;
                console.error(&#039;[ResourcePage] API call failed, using visible rows&#039;);&lt;br /&gt;
                var rows = getVisibleRows(type);&lt;br /&gt;
                displayPopup(title, rows, true);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Get visible rows as fallback&lt;br /&gt;
    function getVisibleRows(type) {&lt;br /&gt;
        var $table = $(type === &#039;craftedWith&#039; ? &#039;#craftedWithTable&#039; : &#039;#craftedFromTable&#039;);&lt;br /&gt;
        var rows = [];&lt;br /&gt;
        &lt;br /&gt;
        $table.find(&#039;tbody tr:visible&#039;).each(function() {&lt;br /&gt;
            var $row = $(this);&lt;br /&gt;
            var $cells = $row.find(&#039;td&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if ($cells.length &amp;gt;= 3) {&lt;br /&gt;
                rows.push({&lt;br /&gt;
                    item: $cells.eq(0).html(),&lt;br /&gt;
                    resources: $cells.eq(1).html(),&lt;br /&gt;
                    stations: $cells.eq(2).html(),&lt;br /&gt;
                    water: &#039;N/A&#039;,&lt;br /&gt;
                    craftTime: &#039;N/A&#039;,&lt;br /&gt;
                    schematic: &#039;N/A&#039;&lt;br /&gt;
                });&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        return rows;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Show loading popup&lt;br /&gt;
    function showLoadingPopup() {&lt;br /&gt;
        var loadingHtml = &#039;&amp;lt;div class=&amp;quot;recipe-popup-overlay active&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;recipe-popup&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;popup-content&amp;quot; style=&amp;quot;text-align: center; padding: 60px;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;div style=&amp;quot;font-size: 24px; color: #fce7c8; margin-bottom: 20px;&amp;quot;&amp;gt;Loading recipes...&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;div class=&amp;quot;loading-spinner&amp;quot;&amp;gt;⟳&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        $(&#039;body&#039;).append(loadingHtml);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Display popup with data&lt;br /&gt;
    function displayPopup(title, rows, isLimited) {&lt;br /&gt;
        // Remove any existing popup&lt;br /&gt;
        $(&#039;.recipe-popup-overlay&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Build table rows HTML&lt;br /&gt;
        var tableRowsHtml = &#039;&#039;;&lt;br /&gt;
        rows.forEach(function(row) {&lt;br /&gt;
            tableRowsHtml += &#039;&amp;lt;tr&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.item + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.resources + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.stations + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.water + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.craftTime + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;td&amp;gt;&#039; + row.schematic + &#039;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Note if data is limited&lt;br /&gt;
        var limitedNote = isLimited ? &lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;popup-note&amp;quot;&amp;gt;Showing only visible recipes. Full data may require page reload.&amp;lt;/div&amp;gt;&#039; : &lt;br /&gt;
            &#039;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // Build popup HTML&lt;br /&gt;
        var popupHtml = &#039;&amp;lt;div class=&amp;quot;recipe-popup-overlay&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;recipe-popup&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;popup-header&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;h3 class=&amp;quot;popup-title&amp;quot;&amp;gt;&#039; + title + &#039;&amp;lt;/h3&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;span class=&amp;quot;recipe-count&amp;quot;&amp;gt;&#039; + rows.length + &#039; recipes&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;popup-close&amp;quot;&amp;gt;×&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;popup-content&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    limitedNote +&lt;br /&gt;
                    &#039;&amp;lt;div class=&amp;quot;popup-search-container&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;popup-search-input&amp;quot; placeholder=&amp;quot;Search recipes...&amp;quot; id=&amp;quot;popupSearchInput&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;div class=&amp;quot;popup-table-wrapper&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;table class=&amp;quot;infobox-dune-standard-table recipe-popup-table&amp;quot; id=&amp;quot;popupRecipeTable&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;thead&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;tr class=&amp;quot;tr-dark&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;item&amp;quot;&amp;gt;Item Created&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;resources&amp;quot;&amp;gt;Resources Needed&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;stations&amp;quot;&amp;gt;Stations&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;water&amp;quot;&amp;gt;Water (mL)&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;time&amp;quot;&amp;gt;Craft Time&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                    &#039;&amp;lt;th data-sort=&amp;quot;schematic&amp;quot;&amp;gt;Schematic&amp;lt;/th&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;/tr&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;/thead&amp;gt;&#039; +&lt;br /&gt;
                            &#039;&amp;lt;tbody&amp;gt;&#039; + tableRowsHtml + &#039;&amp;lt;/tbody&amp;gt;&#039; +&lt;br /&gt;
                        &#039;&amp;lt;/table&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        // Add to page&lt;br /&gt;
        $(&#039;body&#039;).append(popupHtml);&lt;br /&gt;
        &lt;br /&gt;
        // Activate popup&lt;br /&gt;
        setTimeout(function() {&lt;br /&gt;
            $(&#039;.recipe-popup-overlay&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        }, 10);&lt;br /&gt;
        &lt;br /&gt;
        // Initialize popup functionality&lt;br /&gt;
        initPopupFunctionality();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Initialize popup functionality (search and sort)&lt;br /&gt;
    function initPopupFunctionality() {&lt;br /&gt;
        // Search functionality&lt;br /&gt;
        $(&#039;#popupSearchInput&#039;).on(&#039;input&#039;, function() {&lt;br /&gt;
            var searchTerm = $(this).val().toLowerCase();&lt;br /&gt;
            &lt;br /&gt;
            $(&#039;#popupRecipeTable tbody tr&#039;).each(function() {&lt;br /&gt;
                var $row = $(this);&lt;br /&gt;
                var text = $row.text().toLowerCase();&lt;br /&gt;
                &lt;br /&gt;
                if (text.indexOf(searchTerm) &amp;gt; -1) {&lt;br /&gt;
                    $row.show();&lt;br /&gt;
                } else {&lt;br /&gt;
                    $row.hide();&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Sort functionality&lt;br /&gt;
        $(&#039;#popupRecipeTable thead th&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
            var $th = $(this);&lt;br /&gt;
            var sortKey = $th.data(&#039;sort&#039;);&lt;br /&gt;
            var $tbody = $(&#039;#popupRecipeTable tbody&#039;);&lt;br /&gt;
            var rows = $tbody.find(&#039;tr&#039;).toArray();&lt;br /&gt;
            &lt;br /&gt;
            // Determine sort direction&lt;br /&gt;
            var ascending = !$th.hasClass(&#039;sort-desc&#039;);&lt;br /&gt;
            &lt;br /&gt;
            // Remove sort classes from all headers&lt;br /&gt;
            $(&#039;#popupRecipeTable thead th&#039;).removeClass(&#039;sort-asc sort-desc&#039;);&lt;br /&gt;
            &lt;br /&gt;
            // Add appropriate class to clicked header&lt;br /&gt;
            $th.addClass(ascending ? &#039;sort-asc&#039; : &#039;sort-desc&#039;);&lt;br /&gt;
            &lt;br /&gt;
            // Sort rows&lt;br /&gt;
            rows.sort(function(a, b) {&lt;br /&gt;
                var aText = $(a).find(&#039;td&#039;).eq($th.index()).text().trim();&lt;br /&gt;
                var bText = $(b).find(&#039;td&#039;).eq($th.index()).text().trim();&lt;br /&gt;
                &lt;br /&gt;
                // Try to parse as number&lt;br /&gt;
                var aNum = parseFloat(aText);&lt;br /&gt;
                var bNum = parseFloat(bText);&lt;br /&gt;
                &lt;br /&gt;
                if (!isNaN(aNum) &amp;amp;&amp;amp; !isNaN(bNum)) {&lt;br /&gt;
                    return ascending ? aNum - bNum : bNum - aNum;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                // Sort as text&lt;br /&gt;
                return ascending &lt;br /&gt;
                    ? aText.localeCompare(bText)&lt;br /&gt;
                    : bText.localeCompare(aText);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            // Re-append sorted rows&lt;br /&gt;
            $tbody.empty();&lt;br /&gt;
            rows.forEach(function(row) {&lt;br /&gt;
                $tbody.append(row);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Focus search input&lt;br /&gt;
        $(&#039;#popupSearchInput&#039;).focus();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Close recipe popup&lt;br /&gt;
    function closeRecipePopup() {&lt;br /&gt;
        $(&#039;.recipe-popup-overlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        &lt;br /&gt;
        setTimeout(function() {&lt;br /&gt;
            $(&#039;.recipe-popup-overlay&#039;).remove();&lt;br /&gt;
        }, 300);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Initialize when DOM is ready&lt;br /&gt;
    $(function() {&lt;br /&gt;
        init();&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
})(jQuery, mediaWiki);&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=MediaWiki:Common.js&amp;diff=1169</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=MediaWiki:Common.js&amp;diff=1169"/>
		<updated>2025-06-04T05:45:32Z</updated>

		<summary type="html">&lt;p&gt;Operator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ========================================&lt;br /&gt;
   MediaWiki:Common.js - Fixed Header Spacing&lt;br /&gt;
   FIXED VERSION - Addresses all positioning issues&lt;br /&gt;
   ======================================== */&lt;br /&gt;
&lt;br /&gt;
/* ░ MOBILE DISCLAIMER BANNER ░ */&lt;br /&gt;
$( function () {&lt;br /&gt;
    if ( window.innerWidth &amp;gt; 768 ) return;     // desktop? abort.&lt;br /&gt;
&lt;br /&gt;
    // already injected? abort.&lt;br /&gt;
    if ( $(&#039;#mobile-disclaimer&#039;).length ) return;&lt;br /&gt;
&lt;br /&gt;
    // Build &amp;amp; inject&lt;br /&gt;
    const $banner = $( &#039;&amp;lt;div&amp;gt;&#039;, {&lt;br /&gt;
        id:   &#039;mobile-disclaimer&#039;,&lt;br /&gt;
        html: &#039;Heads-up: this section is optimised for desktop. Smaller layouts are experimental 👀&#039;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // insert right after the site header / before main content.&lt;br /&gt;
    // Adjust selector to your skin; Vector uses #content, Timeless uses #mw-site.&lt;br /&gt;
    $( &#039;#mw-content-text&#039; ).prepend( $banner ); &lt;br /&gt;
    // If you prefer it at absolute top, use $(&#039;body&#039;).prepend( $banner );&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* util: &amp;quot;Fabricator Basics&amp;quot; → &amp;quot;fabricator-basics&amp;quot; */&lt;br /&gt;
function makeSlug(str){&lt;br /&gt;
  return str.toLowerCase().trim()&lt;br /&gt;
            .replace(/[^\\w\\s-]/g,&#039;&#039;)   // drop punctuation&lt;br /&gt;
            .replace(/\\s+/g,&#039;-&#039;);        // spaces → dashes&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // FIXED: Check if page has breadcrumb navigation&lt;br /&gt;
    var hasBreadcrumb = $(&#039;.dune-breadcrumb-nav&#039;).length &amp;gt; 0;&lt;br /&gt;
    if (hasBreadcrumb) {&lt;br /&gt;
        $(&#039;body&#039;).addClass(&#039;has-breadcrumb&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // HEADER FIX - Wait for page to load then force header&lt;br /&gt;
    setTimeout(function() {&lt;br /&gt;
        // Remove ALL existing headers and nav attempts&lt;br /&gt;
        $(&#039;.mw-header, #mw-header-container, nav.tab-bar, .tab-bar&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Hide the page title and extra elements completely&lt;br /&gt;
        $(&#039;.firstHeading, h1.title, .mw-page-title-main, #firstHeading, #tagline, h3#tagline, #contentSub, .mw-content-subtitle&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Remove any MediaWiki notices that might appear&lt;br /&gt;
        $(&#039;#siteNotice, .mw-indicators, .printfooter, .catlinks&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Create the navigation bar HTML with inline styles&lt;br /&gt;
        var headerHTML = `&lt;br /&gt;
            &amp;lt;div id=&amp;quot;dune-header&amp;quot; style=&amp;quot;position: fixed; top: 0; left: 0; right: 0; height: 60px; background: linear-gradient(180deg, rgba(20, 18, 28, 0.95) 0%, rgba(10, 8, 16, 0.98) 100%); border-bottom: 3px solid rgba(252, 231, 200, 0.4); box-shadow: 0 2px 20px rgba(0,0,0,0.8); z-index: 99999; display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div style=&amp;quot;width: 100%; max-width: 1600px; margin: 0 auto; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;/wiki/Main_Page&amp;quot; style=&amp;quot;font-family: &#039;Orbitron&#039;, sans-serif; font-size: 22px; color: #fce7c8; text-transform: uppercase; letter-spacing: 3px; font-weight: 700; text-shadow: 0 0 15px rgba(252, 231, 200, 0.4); text-decoration: none; white-space: nowrap;&amp;quot;&amp;gt;DUNE DB&amp;lt;/a&amp;gt;&lt;br /&gt;
                    &lt;br /&gt;
                    &amp;lt;nav style=&amp;quot;display: flex; gap: 0; margin: 0 20px; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Items&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-left: 1px solid rgba(252, 231, 200, 0.1); border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;◇ Items&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Crafting&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⚒ Crafting&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Building&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⌂ Building&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Tech_Tree&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⬢ Tech Tree&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Journeys&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;➤ Journeys&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Skills&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;★ Skills&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Map&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;🗺 Map&amp;lt;/a&amp;gt;&lt;br /&gt;
                    &amp;lt;/nav&amp;gt;&lt;br /&gt;
                    &lt;br /&gt;
                    &amp;lt;div style=&amp;quot;display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;form action=&amp;quot;/index.php&amp;quot; method=&amp;quot;get&amp;quot; style=&amp;quot;display: flex; align-items: center; gap: 0; height: 38px;&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;input type=&amp;quot;search&amp;quot; name=&amp;quot;search&amp;quot; placeholder=&amp;quot;Search wiki...&amp;quot; style=&amp;quot;background: rgba(0, 0, 2, 0.8); border: 2px solid rgba(252, 231, 200, 0.3); border-radius: 0; color: #fce7c8; padding: 0 12px; width: 200px; font-size: 13px; font-family: &#039;Rajdhani&#039;, sans-serif; transition: all 0.3s ease; outline: none; height: 38px; box-sizing: border-box; margin: 0; vertical-align: middle;&amp;quot; onfocus=&amp;quot;this.style.borderColor=&#039;#fce7c8&#039;; this.style.boxShadow=&#039;0 0 10px rgba(252, 231, 200, 0.3)&#039;; this.style.width=&#039;250px&#039;;&amp;quot; onblur=&amp;quot;this.style.borderColor=&#039;rgba(252, 231, 200, 0.3)&#039;; this.style.boxShadow=&#039;none&#039;; this.style.width=&#039;200px&#039;;&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;button type=&amp;quot;submit&amp;quot; style=&amp;quot;background: rgba(252, 231, 200, 0.1); border: 2px solid rgba(252, 231, 200, 0.3); border-left: none; color: #fce7c8; padding: 0 12px; cursor: pointer; font-size: 14px; transition: all 0.3s ease; height: 38px; box-sizing: border-box; margin: 0; vertical-align: middle; display: flex; align-items: center; justify-content: center;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.2)&#039;; this.style.borderColor=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.borderColor=&#039;rgba(252, 231, 200, 0.3)&#039;;&amp;quot;&amp;gt;&amp;lt;span&amp;gt;🔍&amp;lt;/span&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
                        &amp;lt;/form&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        `;&lt;br /&gt;
        &lt;br /&gt;
        // Check if header already exists to avoid duplicates&lt;br /&gt;
        if ($(&#039;#dune-header&#039;).length === 0) {&lt;br /&gt;
            $(&#039;body&#039;).prepend(headerHTML);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // CRITICAL: Force proper spacing&lt;br /&gt;
        $(&#039;body&#039;).css({&lt;br /&gt;
            &#039;padding-top&#039;: &#039;60px&#039;,&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;overflow-y&#039;: &#039;auto&#039;,&lt;br /&gt;
            &#039;height&#039;: &#039;auto&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // FIXED: Different spacing for pages with/without breadcrumb&lt;br /&gt;
        if (hasBreadcrumb) {&lt;br /&gt;
            // Pages with breadcrumb - content starts immediately after header&lt;br /&gt;
            $(&#039;#content, .mw-body, #mw-content-text, .mw-body-content, .mw-parser-output, #main-section, .main-section, #page-content&#039;).css({&lt;br /&gt;
                &#039;padding-top&#039;: &#039;0&#039;,&lt;br /&gt;
                &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            // Breadcrumb should have proper spacing from header&lt;br /&gt;
            $(&#039;.dune-breadcrumb-nav&#039;).css({&lt;br /&gt;
                &#039;margin-top&#039;: &#039;20px&#039;,&lt;br /&gt;
                &#039;margin-bottom&#039;: &#039;20px&#039;&lt;br /&gt;
            });&lt;br /&gt;
        } else {&lt;br /&gt;
            // Pages without breadcrumb - add padding to content&lt;br /&gt;
            $(&#039;#content, .mw-body, #mw-content-text, .mw-body-content, .mw-parser-output, #main-section, .main-section, #page-content&#039;).css({&lt;br /&gt;
                &#039;padding-top&#039;: &#039;20px&#039;,&lt;br /&gt;
                &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Force first element to start at top (unless it&#039;s breadcrumb)&lt;br /&gt;
        $(&#039;.mw-parser-output &amp;gt; *:first-child:not(.dune-breadcrumb-nav), .mw-body-content &amp;gt; *:first-child:not(.dune-breadcrumb-nav)&#039;).css({&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding-top&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove sidebar space&lt;br /&gt;
        $(&#039;#sidebar, .columns.large-2.medium-3&#039;).css(&#039;display&#039;, &#039;none&#039;);&lt;br /&gt;
        $(&#039;#page-content, .columns.large-10.medium-9&#039;).css({&lt;br /&gt;
            &#039;width&#039;: &#039;100%&#039;,&lt;br /&gt;
            &#039;max-width&#039;: &#039;100%&#039;,&lt;br /&gt;
            &#039;margin&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Handle Actions button positioning&lt;br /&gt;
        $(&#039;#p-cactions&#039;).css({&lt;br /&gt;
            &#039;position&#039;: &#039;fixed&#039;,&lt;br /&gt;
            &#039;top&#039;: &#039;11px&#039;,&lt;br /&gt;
            &#039;right&#039;: &#039;20px&#039;,&lt;br /&gt;
            &#039;z-index&#039;: &#039;100001&#039;,&lt;br /&gt;
            &#039;margin&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;height&#039;: &#039;38px&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove spacing from all column wrappers&lt;br /&gt;
        $(&#039;.row &amp;gt; .columns&#039;).css({&lt;br /&gt;
            &#039;padding-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // FIXED: Ensure page content can scroll&lt;br /&gt;
        $(&#039;#content&#039;).css({&lt;br /&gt;
            &#039;min-height&#039;: &#039;calc(100vh - 60px)&#039;,&lt;br /&gt;
            &#039;position&#039;: &#039;relative&#039;,&lt;br /&gt;
            &#039;z-index&#039;: &#039;1&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove any floating MediaWiki elements&lt;br /&gt;
        $(&#039;.mw-jump-link, .mw-redirectedfrom, #siteNotice&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
    }, 100);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* ===== RADIAL MENU CODE ===== */&lt;br /&gt;
function waitForRadialData(callback, attempts = 0) {&lt;br /&gt;
  const dataTag = document.getElementById(&#039;radialMenuData&#039;);&lt;br /&gt;
  if (dataTag) {&lt;br /&gt;
    try {&lt;br /&gt;
      const menuItems = JSON.parse(dataTag.innerText || dataTag.textContent);&lt;br /&gt;
      console.log(&amp;quot;✅ Loaded radialMenuData:&amp;quot;, menuItems);&lt;br /&gt;
      callback(menuItems);&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      console.error(&amp;quot;❌ Failed to parse radialMenuData&amp;quot;, e);&lt;br /&gt;
    }&lt;br /&gt;
  } else if (attempts &amp;lt; 20) {&lt;br /&gt;
    setTimeout(() =&amp;gt; waitForRadialData(callback, attempts + 1), 100);&lt;br /&gt;
  } else {&lt;br /&gt;
    console.warn(&amp;quot;⚠️ radialMenuData tag not found after timeout.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function () {&lt;br /&gt;
  waitForRadialData(function (menuItems) {&lt;br /&gt;
    const isMobile = () =&amp;gt; window.innerWidth &amp;lt;= 768;&lt;br /&gt;
&lt;br /&gt;
    let radialItemsHTML = &#039;&#039;;&lt;br /&gt;
    menuItems.forEach((item, index) =&amp;gt; {&lt;br /&gt;
      const id = item.category.toLowerCase().replace(/\s+/g, &#039;-&#039;);&lt;br /&gt;
      item.id = id;&lt;br /&gt;
&lt;br /&gt;
      radialItemsHTML += `&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-radial-item-container ${item.position}&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;a data-id=&amp;quot;${id}&amp;quot; class=&amp;quot;dune-radial-item&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;img src=&amp;quot;${item.icon}&amp;quot; alt=&amp;quot;${item.name}&amp;quot; class=&amp;quot;dune-radial-icon&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;span class=&amp;quot;dune-radial-tooltip&amp;quot;&amp;gt;${item.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    const centerButtonHTML = `&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://dunedb.com/Main_Page&amp;quot; class=&amp;quot;dune-radial-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img src=&amp;quot;https://dunedb.com/images/9/99/HomeNavIcon.png&amp;quot; alt=&amp;quot;Home&amp;quot; class=&amp;quot;dune-radial-icon&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;dune-radial-tooltip&amp;quot;&amp;gt;Main Page&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    const radialMenuHTML = `&lt;br /&gt;
      &amp;lt;div id=&amp;quot;duneRadialMenu&amp;quot; class=&amp;quot;dune-radial-menu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-radial-background&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle outer&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle middle&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle inner&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        ${centerButtonHTML}&lt;br /&gt;
        ${radialItemsHTML}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;duneRadialOverlay&amp;quot; class=&amp;quot;dune-radial-overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    const subcategoryContainerHTML = `&amp;lt;div id=&amp;quot;duneSubcategoryContainer&amp;quot; class=&amp;quot;dune-subcategory-container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;`;&lt;br /&gt;
    $(&#039;body&#039;).append(radialMenuHTML);&lt;br /&gt;
    $(&#039;body&#039;).append(subcategoryContainerHTML);&lt;br /&gt;
&lt;br /&gt;
    if (isMobile()) {&lt;br /&gt;
      $(&#039;#duneRadialMenu&#039;).addClass(&#039;mobile-grid&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const showSubcategories = (itemId, event) =&amp;gt; {&lt;br /&gt;
      const item = menuItems.find(i =&amp;gt; i.id === itemId);&lt;br /&gt;
      if (!item || !item.subcategories) return;&lt;br /&gt;
&lt;br /&gt;
      $(&#039;.dune-radial-item&#039;).removeClass(&#039;selected&#039;);&lt;br /&gt;
      $(`.dune-radial-item[data-id=&amp;quot;${itemId}&amp;quot;]`).addClass(&#039;selected&#039;);&lt;br /&gt;
&lt;br /&gt;
      let subcategoryHTML = `&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-header&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;img src=&amp;quot;${item.icon}&amp;quot; alt=&amp;quot;${item.name}&amp;quot; class=&amp;quot;dune-subcategory-icon&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span&amp;gt;${item.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-items&amp;quot;&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      item.subcategories.forEach((sub, index) =&amp;gt; {&lt;br /&gt;
        subcategoryHTML += `&lt;br /&gt;
          &amp;lt;a href=&amp;quot;${sub.url}&amp;quot; class=&amp;quot;dune-subcategory-item&amp;quot; style=&amp;quot;--item-index: ${index}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;span class=&amp;quot;dune-subcategory-name&amp;quot;&amp;gt;${sub.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        `;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      subcategoryHTML += `&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-footer&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;a href=&amp;quot;${item.url}&amp;quot; class=&amp;quot;dune-subcategory-all&amp;quot;&amp;gt;View All ${item.name}&amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const $subcategoryContainer = $(&#039;#duneSubcategoryContainer&#039;);&lt;br /&gt;
      $subcategoryContainer.html(subcategoryHTML);&lt;br /&gt;
&lt;br /&gt;
      $subcategoryContainer.removeClass((index, className) =&amp;gt; {&lt;br /&gt;
        return (className.match(/from-\S+/g) || []).join(&#039; &#039;);&lt;br /&gt;
      });&lt;br /&gt;
      $subcategoryContainer.addClass(`from-${item.position}`);&lt;br /&gt;
      $subcategoryContainer.addClass(&#039;active&#039;);&lt;br /&gt;
&lt;br /&gt;
      event.stopPropagation();&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const hideSubcategories = () =&amp;gt; {&lt;br /&gt;
      $(&#039;#duneSubcategoryContainer&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $(&#039;.dune-radial-item&#039;).removeClass(&#039;selected&#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const toggleRadialMenu = () =&amp;gt; {&lt;br /&gt;
      if ($(&#039;#duneRadialMenu&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
        hideSubcategories();&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;#duneRadialOverlay&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;.dune-radial-item-container&#039;).each(function (index) {&lt;br /&gt;
          const $item = $(this);&lt;br /&gt;
          setTimeout(() =&amp;gt; {&lt;br /&gt;
            $item.addClass(&#039;animated&#039;);&lt;br /&gt;
          }, index * 50);&lt;br /&gt;
        });&lt;br /&gt;
        setTimeout(() =&amp;gt; {&lt;br /&gt;
          $(&#039;.dune-radial-center&#039;).addClass(&#039;animated&#039;);&lt;br /&gt;
        }, menuItems.length * 50);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;#duneLogoBtn, #menuRadialTrigger img&#039;, function (e) {&lt;br /&gt;
      console.log(&amp;quot;✅ Radial trigger clicked&amp;quot;);&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      e.stopPropagation();&lt;br /&gt;
      toggleRadialMenu();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;.dune-radial-item&#039;, function (e) {&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      e.stopPropagation();&lt;br /&gt;
      const itemId = $(this).data(&#039;id&#039;);&lt;br /&gt;
      if ($(this).hasClass(&#039;selected&#039;)) {&lt;br /&gt;
        hideSubcategories();&lt;br /&gt;
      } else {&lt;br /&gt;
        showSubcategories(itemId, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;#duneRadialOverlay&#039;, function () {&lt;br /&gt;
      hideSubcategories();&lt;br /&gt;
      $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;li.name.logo a[href=&amp;quot;/Main_Page&amp;quot;]&#039;, function (e) {&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      toggleRadialMenu();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Escape&#039;) {&lt;br /&gt;
        if ($(&#039;#duneSubcategoryContainer&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
          hideSubcategories();&lt;br /&gt;
        } else if ($(&#039;#duneRadialMenu&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
          $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
          $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(window).on(&#039;resize&#039;, function () {&lt;br /&gt;
      if (isMobile()) {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).addClass(&#039;mobile-grid&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).removeClass(&#039;mobile-grid&#039;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* Used-In dynamic filters &amp;amp; search */&lt;br /&gt;
mw.hook( &#039;wikipage.content&#039; ).add( function ( $content ) {&lt;br /&gt;
&lt;br /&gt;
  const $holder = $content.find( &#039;#usedInFilterHolder&#039; );&lt;br /&gt;
  const $table  = $content.find( &#039;#usedInTable&#039; );&lt;br /&gt;
&lt;br /&gt;
  if ( !$holder.length || !$table.length ) return;&lt;br /&gt;
&lt;br /&gt;
  const rowsData = [];&lt;br /&gt;
  const stations = new Set();&lt;br /&gt;
  const types    = new Set();&lt;br /&gt;
&lt;br /&gt;
  $table.find( &#039;tbody tr&#039; ).each( function () {&lt;br /&gt;
    const $tds     = $( this ).children( &#039;td&#039; );&lt;br /&gt;
    const output   = $tds.eq( 0 ).text().trim();&lt;br /&gt;
    const type     = $tds.eq( 1 ).text().trim();&lt;br /&gt;
    const station  = $tds.last().text().trim();&lt;br /&gt;
&lt;br /&gt;
    rowsData.push( { tr: this, output, type, station } );&lt;br /&gt;
    stations.add( station );&lt;br /&gt;
    types.add( type );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
  const makeSel = ( id, label, opts ) =&amp;gt; {&lt;br /&gt;
    const $sel = $( &#039;&amp;lt;select&amp;gt;&#039;, { id, class: &#039;game-button&#039;, css:{margin:&#039;6px 4px 6px 0&#039;} } )&lt;br /&gt;
                  .append( $( &#039;&amp;lt;option&amp;gt;&#039;, { value:&#039;&#039;, text:label } ) );&lt;br /&gt;
    opts.forEach( o =&amp;gt; $sel.append( $( &#039;&amp;lt;option&amp;gt;&#039;, { value:o, text:o } ) ) );&lt;br /&gt;
    return $sel;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const $stationSel = makeSel( &#039;filterStation&#039;, &#039;All Stations&#039;, [ ...stations ].sort() );&lt;br /&gt;
  const $typeSel    = makeSel( &#039;filterType&#039;,    &#039;All Types&#039;,    [ ...types ].sort() );&lt;br /&gt;
  const $search     = $( &#039;&amp;lt;input&amp;gt;&#039;, {&lt;br /&gt;
                          type:&#039;text&#039;,&lt;br /&gt;
                          placeholder:&#039;Search…&#039;,&lt;br /&gt;
                          css:{ margin:&#039;6px 0&#039;, padding:&#039;4px&#039;, width:&#039;140px&#039;,&lt;br /&gt;
                               &#039;background&#039;:&#039;#111&#039;, color:&#039;#fff&#039;, border:&#039;1px solid #555&#039; }&lt;br /&gt;
                        } );&lt;br /&gt;
&lt;br /&gt;
  $holder.append( $stationSel, $typeSel, $search );&lt;br /&gt;
&lt;br /&gt;
  function applyFilters() {&lt;br /&gt;
    const sVal = $stationSel.val();&lt;br /&gt;
    const tVal = $typeSel.val();&lt;br /&gt;
    const q    = $search.val().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    rowsData.forEach( ({ tr, output, type, station }) =&amp;gt; {&lt;br /&gt;
      const show =&lt;br /&gt;
        (!sVal || station === sVal) &amp;amp;&amp;amp;&lt;br /&gt;
        (!tVal || type    === tVal) &amp;amp;&amp;amp;&lt;br /&gt;
        (!q    || output.toLowerCase().includes( q ));&lt;br /&gt;
      tr.style.display = show ? &#039;&#039; : &#039;none&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $stationSel.on( &#039;change&#039;, applyFilters );&lt;br /&gt;
  $typeSel   .on( &#039;change&#039;, applyFilters );&lt;br /&gt;
  $search    .on( &#039;input&#039;,  applyFilters );&lt;br /&gt;
} );&lt;br /&gt;
&lt;br /&gt;
/* Lazy-load background image Blur */&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, () =&amp;gt; {&lt;br /&gt;
  const hero = document.querySelector(&#039;.dune-hero&#039;);&lt;br /&gt;
  if (hero &amp;amp;&amp;amp; !hero.style.backgroundImage) {&lt;br /&gt;
    hero.style.backgroundImage =&lt;br /&gt;
      &#039;url(/images/7/70/Arrakis_dunes.jpg?2025)&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const radial = document.querySelector(&#039;.radial-menu-wrapper&#039;);&lt;br /&gt;
  if (!radial) return;&lt;br /&gt;
  const y = radial.offsetTop;&lt;br /&gt;
  window.addEventListener(&#039;scroll&#039;, () =&amp;gt; {&lt;br /&gt;
    radial.classList.toggle(&#039;is-fixed&#039;, window.scrollY &amp;gt; y);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Resource Page Module Loader&lt;br /&gt;
 */&lt;br /&gt;
$(function() {&lt;br /&gt;
    // Only on resource pages&lt;br /&gt;
    if ($(&#039;.crafting-section, .recipe-table, [class*=&amp;quot;crafted-&amp;quot;]&#039;).length &amp;gt; 0) {&lt;br /&gt;
        // Load dependencies first&lt;br /&gt;
        mw.loader.using([&#039;jquery&#039;, &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039;], function() {&lt;br /&gt;
            // Load resource page module&lt;br /&gt;
            $.getScript(&#039;/index.php?title=MediaWiki:ResourcePage.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;)&lt;br /&gt;
                .done(function() {&lt;br /&gt;
                    console.log(&#039;Resource page module loaded&#039;);&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function() {&lt;br /&gt;
                    console.error(&#039;Failed to load resource page module&#039;);&lt;br /&gt;
                });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
  const $drop = $(&#039;#drop&#039;);&lt;br /&gt;
  const $menu = $(&#039;#drop1&#039;);&lt;br /&gt;
&lt;br /&gt;
  if ($drop.length &amp;amp;&amp;amp; $menu.length) {&lt;br /&gt;
    // Move Actions button into the footer visually&lt;br /&gt;
    $(&#039;#footer&#039;).append($drop);&lt;br /&gt;
    $(&#039;#footer&#039;).append($menu);&lt;br /&gt;
&lt;br /&gt;
    // Style the button like a footer element&lt;br /&gt;
    $drop.css({&lt;br /&gt;
      position: &#039;relative&#039;,&lt;br /&gt;
      display: &#039;inline-block&#039;,&lt;br /&gt;
      marginTop: &#039;12px&#039;,&lt;br /&gt;
      background: &#039;rgba(252,231,200,0.08)&#039;,&lt;br /&gt;
      border: &#039;1px solid rgba(252,231,200,0.2)&#039;,&lt;br /&gt;
      color: &#039;#fce7c8&#039;,&lt;br /&gt;
      fontFamily: &#039;Rajdhani, sans-serif&#039;,&lt;br /&gt;
      padding: &#039;6px 12px&#039;,&lt;br /&gt;
      boxShadow: &#039;0 0 6px rgba(0,0,0,0.3)&#039;,&lt;br /&gt;
      cursor: &#039;pointer&#039;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $drop.hover(&lt;br /&gt;
      () =&amp;gt; $drop.css({ background: &#039;rgba(252,231,200,0.15)&#039;, color: &#039;#fff&#039; }),&lt;br /&gt;
      () =&amp;gt; $drop.css({ background: &#039;rgba(252,231,200,0.08)&#039;, color: &#039;#fce7c8&#039; })&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Ensure dropdown menu opens below and is styled cleanly&lt;br /&gt;
    $menu.css({&lt;br /&gt;
      position: &#039;absolute&#039;,&lt;br /&gt;
      top: &#039;100%&#039;,&lt;br /&gt;
      right: &#039;0&#039;,&lt;br /&gt;
      zIndex: &#039;9999&#039;,&lt;br /&gt;
      background: &#039;#1a1a1a&#039;,&lt;br /&gt;
      boxShadow: &#039;0 2px 6px rgba(0,0,0,0.5)&#039;,&lt;br /&gt;
      marginTop: &#039;4px&#039;&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Footer message logic&lt;br /&gt;
  if (!$(&#039;#custom-footer-note&#039;).length) {&lt;br /&gt;
    const $customLine = $(&#039;&amp;lt;div&amp;gt;&#039;, {&lt;br /&gt;
      id: &#039;custom-footer-note&#039;,&lt;br /&gt;
      html: `This is an experimental solo project exploring what’s possible in gaming UI and data experiences. Things may break—thank you for being part of the push forward.&amp;lt;br&amp;gt;&lt;br /&gt;
           &amp;lt;a href=&amp;quot;${mw.util.getUrl(&#039;Disclaimer&#039;)}&amp;quot; class=&amp;quot;footer-link&amp;quot;&amp;gt;Legal &amp;amp; Disclaimer&amp;lt;/a&amp;gt;`&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;#footer&#039;).prepend($customLine);&lt;br /&gt;
    $(&#039;#footer-left&#039;).hide();&lt;br /&gt;
  }&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=MediaWiki:Common.js&amp;diff=1168</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=MediaWiki:Common.js&amp;diff=1168"/>
		<updated>2025-06-04T05:30:12Z</updated>

		<summary type="html">&lt;p&gt;Operator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ========================================&lt;br /&gt;
   MediaWiki:Common.js - Fixed Header Spacing&lt;br /&gt;
   FIXED VERSION - Addresses all positioning issues&lt;br /&gt;
   ======================================== */&lt;br /&gt;
&lt;br /&gt;
/* ░ MOBILE DISCLAIMER BANNER ░ */&lt;br /&gt;
$( function () {&lt;br /&gt;
    if ( window.innerWidth &amp;gt; 768 ) return;     // desktop? abort.&lt;br /&gt;
&lt;br /&gt;
    // already injected? abort.&lt;br /&gt;
    if ( $(&#039;#mobile-disclaimer&#039;).length ) return;&lt;br /&gt;
&lt;br /&gt;
    // Build &amp;amp; inject&lt;br /&gt;
    const $banner = $( &#039;&amp;lt;div&amp;gt;&#039;, {&lt;br /&gt;
        id:   &#039;mobile-disclaimer&#039;,&lt;br /&gt;
        html: &#039;Heads-up: this section is optimised for desktop. Smaller layouts are experimental 👀&#039;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // insert right after the site header / before main content.&lt;br /&gt;
    // Adjust selector to your skin; Vector uses #content, Timeless uses #mw-site.&lt;br /&gt;
    $( &#039;#mw-content-text&#039; ).prepend( $banner ); &lt;br /&gt;
    // If you prefer it at absolute top, use $(&#039;body&#039;).prepend( $banner );&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* util: &amp;quot;Fabricator Basics&amp;quot; → &amp;quot;fabricator-basics&amp;quot; */&lt;br /&gt;
function makeSlug(str){&lt;br /&gt;
  return str.toLowerCase().trim()&lt;br /&gt;
            .replace(/[^\\w\\s-]/g,&#039;&#039;)   // drop punctuation&lt;br /&gt;
            .replace(/\\s+/g,&#039;-&#039;);        // spaces → dashes&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // FIXED: Check if page has breadcrumb navigation&lt;br /&gt;
    var hasBreadcrumb = $(&#039;.dune-breadcrumb-nav&#039;).length &amp;gt; 0;&lt;br /&gt;
    if (hasBreadcrumb) {&lt;br /&gt;
        $(&#039;body&#039;).addClass(&#039;has-breadcrumb&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // HEADER FIX - Wait for page to load then force header&lt;br /&gt;
    setTimeout(function() {&lt;br /&gt;
        // Remove ALL existing headers and nav attempts&lt;br /&gt;
        $(&#039;.mw-header, #mw-header-container, nav.tab-bar, .tab-bar&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Hide the page title and extra elements completely&lt;br /&gt;
        $(&#039;.firstHeading, h1.title, .mw-page-title-main, #firstHeading, #tagline, h3#tagline, #contentSub, .mw-content-subtitle&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Remove any MediaWiki notices that might appear&lt;br /&gt;
        $(&#039;#siteNotice, .mw-indicators, .printfooter, .catlinks&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Create the navigation bar HTML with inline styles&lt;br /&gt;
        var headerHTML = `&lt;br /&gt;
            &amp;lt;div id=&amp;quot;dune-header&amp;quot; style=&amp;quot;position: fixed; top: 0; left: 0; right: 0; height: 60px; background: linear-gradient(180deg, rgba(20, 18, 28, 0.95) 0%, rgba(10, 8, 16, 0.98) 100%); border-bottom: 3px solid rgba(252, 231, 200, 0.4); box-shadow: 0 2px 20px rgba(0,0,0,0.8); z-index: 99999; display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div style=&amp;quot;width: 100%; max-width: 1600px; margin: 0 auto; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;/wiki/Main_Page&amp;quot; style=&amp;quot;font-family: &#039;Orbitron&#039;, sans-serif; font-size: 22px; color: #fce7c8; text-transform: uppercase; letter-spacing: 3px; font-weight: 700; text-shadow: 0 0 15px rgba(252, 231, 200, 0.4); text-decoration: none; white-space: nowrap;&amp;quot;&amp;gt;DUNE DB&amp;lt;/a&amp;gt;&lt;br /&gt;
                    &lt;br /&gt;
                    &amp;lt;nav style=&amp;quot;display: flex; gap: 0; margin: 0 20px; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Items&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-left: 1px solid rgba(252, 231, 200, 0.1); border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;◇ Items&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Crafting&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⚒ Crafting&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Building&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⌂ Building&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Tech_Tree&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⬢ Tech Tree&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Journeys&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;➤ Journeys&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Skills&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;★ Skills&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Map&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;🗺 Map&amp;lt;/a&amp;gt;&lt;br /&gt;
                    &amp;lt;/nav&amp;gt;&lt;br /&gt;
                    &lt;br /&gt;
                    &amp;lt;div style=&amp;quot;display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;form action=&amp;quot;/index.php&amp;quot; method=&amp;quot;get&amp;quot; style=&amp;quot;display: flex; align-items: center; gap: 0; height: 38px;&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;input type=&amp;quot;search&amp;quot; name=&amp;quot;search&amp;quot; placeholder=&amp;quot;Search wiki...&amp;quot; style=&amp;quot;background: rgba(0, 0, 2, 0.8); border: 2px solid rgba(252, 231, 200, 0.3); border-radius: 0; color: #fce7c8; padding: 0 12px; width: 200px; font-size: 13px; font-family: &#039;Rajdhani&#039;, sans-serif; transition: all 0.3s ease; outline: none; height: 38px; box-sizing: border-box; margin: 0; vertical-align: middle;&amp;quot; onfocus=&amp;quot;this.style.borderColor=&#039;#fce7c8&#039;; this.style.boxShadow=&#039;0 0 10px rgba(252, 231, 200, 0.3)&#039;; this.style.width=&#039;250px&#039;;&amp;quot; onblur=&amp;quot;this.style.borderColor=&#039;rgba(252, 231, 200, 0.3)&#039;; this.style.boxShadow=&#039;none&#039;; this.style.width=&#039;200px&#039;;&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;button type=&amp;quot;submit&amp;quot; style=&amp;quot;background: rgba(252, 231, 200, 0.1); border: 2px solid rgba(252, 231, 200, 0.3); border-left: none; color: #fce7c8; padding: 0 12px; cursor: pointer; font-size: 14px; transition: all 0.3s ease; height: 38px; box-sizing: border-box; margin: 0; vertical-align: middle; display: flex; align-items: center; justify-content: center;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.2)&#039;; this.style.borderColor=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.borderColor=&#039;rgba(252, 231, 200, 0.3)&#039;;&amp;quot;&amp;gt;&amp;lt;span&amp;gt;🔍&amp;lt;/span&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
                        &amp;lt;/form&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        `;&lt;br /&gt;
        &lt;br /&gt;
        // Check if header already exists to avoid duplicates&lt;br /&gt;
        if ($(&#039;#dune-header&#039;).length === 0) {&lt;br /&gt;
            $(&#039;body&#039;).prepend(headerHTML);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // CRITICAL: Force proper spacing&lt;br /&gt;
        $(&#039;body&#039;).css({&lt;br /&gt;
            &#039;padding-top&#039;: &#039;60px&#039;,&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;overflow-y&#039;: &#039;auto&#039;,&lt;br /&gt;
            &#039;height&#039;: &#039;auto&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // FIXED: Different spacing for pages with/without breadcrumb&lt;br /&gt;
        if (hasBreadcrumb) {&lt;br /&gt;
            // Pages with breadcrumb - content starts immediately after header&lt;br /&gt;
            $(&#039;#content, .mw-body, #mw-content-text, .mw-body-content, .mw-parser-output, #main-section, .main-section, #page-content&#039;).css({&lt;br /&gt;
                &#039;padding-top&#039;: &#039;0&#039;,&lt;br /&gt;
                &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            // Breadcrumb should have proper spacing from header&lt;br /&gt;
            $(&#039;.dune-breadcrumb-nav&#039;).css({&lt;br /&gt;
                &#039;margin-top&#039;: &#039;20px&#039;,&lt;br /&gt;
                &#039;margin-bottom&#039;: &#039;20px&#039;&lt;br /&gt;
            });&lt;br /&gt;
        } else {&lt;br /&gt;
            // Pages without breadcrumb - add padding to content&lt;br /&gt;
            $(&#039;#content, .mw-body, #mw-content-text, .mw-body-content, .mw-parser-output, #main-section, .main-section, #page-content&#039;).css({&lt;br /&gt;
                &#039;padding-top&#039;: &#039;20px&#039;,&lt;br /&gt;
                &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Force first element to start at top (unless it&#039;s breadcrumb)&lt;br /&gt;
        $(&#039;.mw-parser-output &amp;gt; *:first-child:not(.dune-breadcrumb-nav), .mw-body-content &amp;gt; *:first-child:not(.dune-breadcrumb-nav)&#039;).css({&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding-top&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove sidebar space&lt;br /&gt;
        $(&#039;#sidebar, .columns.large-2.medium-3&#039;).css(&#039;display&#039;, &#039;none&#039;);&lt;br /&gt;
        $(&#039;#page-content, .columns.large-10.medium-9&#039;).css({&lt;br /&gt;
            &#039;width&#039;: &#039;100%&#039;,&lt;br /&gt;
            &#039;max-width&#039;: &#039;100%&#039;,&lt;br /&gt;
            &#039;margin&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Handle Actions button positioning&lt;br /&gt;
        $(&#039;#p-cactions&#039;).css({&lt;br /&gt;
            &#039;position&#039;: &#039;fixed&#039;,&lt;br /&gt;
            &#039;top&#039;: &#039;11px&#039;,&lt;br /&gt;
            &#039;right&#039;: &#039;20px&#039;,&lt;br /&gt;
            &#039;z-index&#039;: &#039;100001&#039;,&lt;br /&gt;
            &#039;margin&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;height&#039;: &#039;38px&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove spacing from all column wrappers&lt;br /&gt;
        $(&#039;.row &amp;gt; .columns&#039;).css({&lt;br /&gt;
            &#039;padding-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // FIXED: Ensure page content can scroll&lt;br /&gt;
        $(&#039;#content&#039;).css({&lt;br /&gt;
            &#039;min-height&#039;: &#039;calc(100vh - 60px)&#039;,&lt;br /&gt;
            &#039;position&#039;: &#039;relative&#039;,&lt;br /&gt;
            &#039;z-index&#039;: &#039;1&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove any floating MediaWiki elements&lt;br /&gt;
        $(&#039;.mw-jump-link, .mw-redirectedfrom, #siteNotice&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
    }, 100);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* ===== RADIAL MENU CODE ===== */&lt;br /&gt;
function waitForRadialData(callback, attempts = 0) {&lt;br /&gt;
  const dataTag = document.getElementById(&#039;radialMenuData&#039;);&lt;br /&gt;
  if (dataTag) {&lt;br /&gt;
    try {&lt;br /&gt;
      const menuItems = JSON.parse(dataTag.innerText || dataTag.textContent);&lt;br /&gt;
      console.log(&amp;quot;✅ Loaded radialMenuData:&amp;quot;, menuItems);&lt;br /&gt;
      callback(menuItems);&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      console.error(&amp;quot;❌ Failed to parse radialMenuData&amp;quot;, e);&lt;br /&gt;
    }&lt;br /&gt;
  } else if (attempts &amp;lt; 20) {&lt;br /&gt;
    setTimeout(() =&amp;gt; waitForRadialData(callback, attempts + 1), 100);&lt;br /&gt;
  } else {&lt;br /&gt;
    console.warn(&amp;quot;⚠️ radialMenuData tag not found after timeout.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function () {&lt;br /&gt;
  waitForRadialData(function (menuItems) {&lt;br /&gt;
    const isMobile = () =&amp;gt; window.innerWidth &amp;lt;= 768;&lt;br /&gt;
&lt;br /&gt;
    let radialItemsHTML = &#039;&#039;;&lt;br /&gt;
    menuItems.forEach((item, index) =&amp;gt; {&lt;br /&gt;
      const id = item.category.toLowerCase().replace(/\s+/g, &#039;-&#039;);&lt;br /&gt;
      item.id = id;&lt;br /&gt;
&lt;br /&gt;
      radialItemsHTML += `&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-radial-item-container ${item.position}&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;a data-id=&amp;quot;${id}&amp;quot; class=&amp;quot;dune-radial-item&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;img src=&amp;quot;${item.icon}&amp;quot; alt=&amp;quot;${item.name}&amp;quot; class=&amp;quot;dune-radial-icon&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;span class=&amp;quot;dune-radial-tooltip&amp;quot;&amp;gt;${item.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    const centerButtonHTML = `&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://dunedb.com/Main_Page&amp;quot; class=&amp;quot;dune-radial-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img src=&amp;quot;https://dunedb.com/images/9/99/HomeNavIcon.png&amp;quot; alt=&amp;quot;Home&amp;quot; class=&amp;quot;dune-radial-icon&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;dune-radial-tooltip&amp;quot;&amp;gt;Main Page&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    const radialMenuHTML = `&lt;br /&gt;
      &amp;lt;div id=&amp;quot;duneRadialMenu&amp;quot; class=&amp;quot;dune-radial-menu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-radial-background&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle outer&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle middle&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle inner&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        ${centerButtonHTML}&lt;br /&gt;
        ${radialItemsHTML}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;duneRadialOverlay&amp;quot; class=&amp;quot;dune-radial-overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    const subcategoryContainerHTML = `&amp;lt;div id=&amp;quot;duneSubcategoryContainer&amp;quot; class=&amp;quot;dune-subcategory-container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;`;&lt;br /&gt;
    $(&#039;body&#039;).append(radialMenuHTML);&lt;br /&gt;
    $(&#039;body&#039;).append(subcategoryContainerHTML);&lt;br /&gt;
&lt;br /&gt;
    if (isMobile()) {&lt;br /&gt;
      $(&#039;#duneRadialMenu&#039;).addClass(&#039;mobile-grid&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const showSubcategories = (itemId, event) =&amp;gt; {&lt;br /&gt;
      const item = menuItems.find(i =&amp;gt; i.id === itemId);&lt;br /&gt;
      if (!item || !item.subcategories) return;&lt;br /&gt;
&lt;br /&gt;
      $(&#039;.dune-radial-item&#039;).removeClass(&#039;selected&#039;);&lt;br /&gt;
      $(`.dune-radial-item[data-id=&amp;quot;${itemId}&amp;quot;]`).addClass(&#039;selected&#039;);&lt;br /&gt;
&lt;br /&gt;
      let subcategoryHTML = `&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-header&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;img src=&amp;quot;${item.icon}&amp;quot; alt=&amp;quot;${item.name}&amp;quot; class=&amp;quot;dune-subcategory-icon&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span&amp;gt;${item.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-items&amp;quot;&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      item.subcategories.forEach((sub, index) =&amp;gt; {&lt;br /&gt;
        subcategoryHTML += `&lt;br /&gt;
          &amp;lt;a href=&amp;quot;${sub.url}&amp;quot; class=&amp;quot;dune-subcategory-item&amp;quot; style=&amp;quot;--item-index: ${index}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;span class=&amp;quot;dune-subcategory-name&amp;quot;&amp;gt;${sub.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        `;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      subcategoryHTML += `&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-footer&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;a href=&amp;quot;${item.url}&amp;quot; class=&amp;quot;dune-subcategory-all&amp;quot;&amp;gt;View All ${item.name}&amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const $subcategoryContainer = $(&#039;#duneSubcategoryContainer&#039;);&lt;br /&gt;
      $subcategoryContainer.html(subcategoryHTML);&lt;br /&gt;
&lt;br /&gt;
      $subcategoryContainer.removeClass((index, className) =&amp;gt; {&lt;br /&gt;
        return (className.match(/from-\S+/g) || []).join(&#039; &#039;);&lt;br /&gt;
      });&lt;br /&gt;
      $subcategoryContainer.addClass(`from-${item.position}`);&lt;br /&gt;
      $subcategoryContainer.addClass(&#039;active&#039;);&lt;br /&gt;
&lt;br /&gt;
      event.stopPropagation();&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const hideSubcategories = () =&amp;gt; {&lt;br /&gt;
      $(&#039;#duneSubcategoryContainer&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $(&#039;.dune-radial-item&#039;).removeClass(&#039;selected&#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const toggleRadialMenu = () =&amp;gt; {&lt;br /&gt;
      if ($(&#039;#duneRadialMenu&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
        hideSubcategories();&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;#duneRadialOverlay&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;.dune-radial-item-container&#039;).each(function (index) {&lt;br /&gt;
          const $item = $(this);&lt;br /&gt;
          setTimeout(() =&amp;gt; {&lt;br /&gt;
            $item.addClass(&#039;animated&#039;);&lt;br /&gt;
          }, index * 50);&lt;br /&gt;
        });&lt;br /&gt;
        setTimeout(() =&amp;gt; {&lt;br /&gt;
          $(&#039;.dune-radial-center&#039;).addClass(&#039;animated&#039;);&lt;br /&gt;
        }, menuItems.length * 50);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;#duneLogoBtn, #menuRadialTrigger img&#039;, function (e) {&lt;br /&gt;
      console.log(&amp;quot;✅ Radial trigger clicked&amp;quot;);&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      e.stopPropagation();&lt;br /&gt;
      toggleRadialMenu();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;.dune-radial-item&#039;, function (e) {&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      e.stopPropagation();&lt;br /&gt;
      const itemId = $(this).data(&#039;id&#039;);&lt;br /&gt;
      if ($(this).hasClass(&#039;selected&#039;)) {&lt;br /&gt;
        hideSubcategories();&lt;br /&gt;
      } else {&lt;br /&gt;
        showSubcategories(itemId, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;#duneRadialOverlay&#039;, function () {&lt;br /&gt;
      hideSubcategories();&lt;br /&gt;
      $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;li.name.logo a[href=&amp;quot;/Main_Page&amp;quot;]&#039;, function (e) {&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      toggleRadialMenu();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Escape&#039;) {&lt;br /&gt;
        if ($(&#039;#duneSubcategoryContainer&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
          hideSubcategories();&lt;br /&gt;
        } else if ($(&#039;#duneRadialMenu&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
          $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
          $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(window).on(&#039;resize&#039;, function () {&lt;br /&gt;
      if (isMobile()) {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).addClass(&#039;mobile-grid&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).removeClass(&#039;mobile-grid&#039;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* Used-In dynamic filters &amp;amp; search */&lt;br /&gt;
mw.hook( &#039;wikipage.content&#039; ).add( function ( $content ) {&lt;br /&gt;
&lt;br /&gt;
  const $holder = $content.find( &#039;#usedInFilterHolder&#039; );&lt;br /&gt;
  const $table  = $content.find( &#039;#usedInTable&#039; );&lt;br /&gt;
&lt;br /&gt;
  if ( !$holder.length || !$table.length ) return;&lt;br /&gt;
&lt;br /&gt;
  const rowsData = [];&lt;br /&gt;
  const stations = new Set();&lt;br /&gt;
  const types    = new Set();&lt;br /&gt;
&lt;br /&gt;
  $table.find( &#039;tbody tr&#039; ).each( function () {&lt;br /&gt;
    const $tds     = $( this ).children( &#039;td&#039; );&lt;br /&gt;
    const output   = $tds.eq( 0 ).text().trim();&lt;br /&gt;
    const type     = $tds.eq( 1 ).text().trim();&lt;br /&gt;
    const station  = $tds.last().text().trim();&lt;br /&gt;
&lt;br /&gt;
    rowsData.push( { tr: this, output, type, station } );&lt;br /&gt;
    stations.add( station );&lt;br /&gt;
    types.add( type );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
  const makeSel = ( id, label, opts ) =&amp;gt; {&lt;br /&gt;
    const $sel = $( &#039;&amp;lt;select&amp;gt;&#039;, { id, class: &#039;game-button&#039;, css:{margin:&#039;6px 4px 6px 0&#039;} } )&lt;br /&gt;
                  .append( $( &#039;&amp;lt;option&amp;gt;&#039;, { value:&#039;&#039;, text:label } ) );&lt;br /&gt;
    opts.forEach( o =&amp;gt; $sel.append( $( &#039;&amp;lt;option&amp;gt;&#039;, { value:o, text:o } ) ) );&lt;br /&gt;
    return $sel;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const $stationSel = makeSel( &#039;filterStation&#039;, &#039;All Stations&#039;, [ ...stations ].sort() );&lt;br /&gt;
  const $typeSel    = makeSel( &#039;filterType&#039;,    &#039;All Types&#039;,    [ ...types ].sort() );&lt;br /&gt;
  const $search     = $( &#039;&amp;lt;input&amp;gt;&#039;, {&lt;br /&gt;
                          type:&#039;text&#039;,&lt;br /&gt;
                          placeholder:&#039;Search…&#039;,&lt;br /&gt;
                          css:{ margin:&#039;6px 0&#039;, padding:&#039;4px&#039;, width:&#039;140px&#039;,&lt;br /&gt;
                               &#039;background&#039;:&#039;#111&#039;, color:&#039;#fff&#039;, border:&#039;1px solid #555&#039; }&lt;br /&gt;
                        } );&lt;br /&gt;
&lt;br /&gt;
  $holder.append( $stationSel, $typeSel, $search );&lt;br /&gt;
&lt;br /&gt;
  function applyFilters() {&lt;br /&gt;
    const sVal = $stationSel.val();&lt;br /&gt;
    const tVal = $typeSel.val();&lt;br /&gt;
    const q    = $search.val().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    rowsData.forEach( ({ tr, output, type, station }) =&amp;gt; {&lt;br /&gt;
      const show =&lt;br /&gt;
        (!sVal || station === sVal) &amp;amp;&amp;amp;&lt;br /&gt;
        (!tVal || type    === tVal) &amp;amp;&amp;amp;&lt;br /&gt;
        (!q    || output.toLowerCase().includes( q ));&lt;br /&gt;
      tr.style.display = show ? &#039;&#039; : &#039;none&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $stationSel.on( &#039;change&#039;, applyFilters );&lt;br /&gt;
  $typeSel   .on( &#039;change&#039;, applyFilters );&lt;br /&gt;
  $search    .on( &#039;input&#039;,  applyFilters );&lt;br /&gt;
} );&lt;br /&gt;
&lt;br /&gt;
/* Lazy-load background image Blur */&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, () =&amp;gt; {&lt;br /&gt;
  const hero = document.querySelector(&#039;.dune-hero&#039;);&lt;br /&gt;
  if (hero &amp;amp;&amp;amp; !hero.style.backgroundImage) {&lt;br /&gt;
    hero.style.backgroundImage =&lt;br /&gt;
      &#039;url(/images/7/70/Arrakis_dunes.jpg?2025)&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const radial = document.querySelector(&#039;.radial-menu-wrapper&#039;);&lt;br /&gt;
  if (!radial) return;&lt;br /&gt;
  const y = radial.offsetTop;&lt;br /&gt;
  window.addEventListener(&#039;scroll&#039;, () =&amp;gt; {&lt;br /&gt;
    radial.classList.toggle(&#039;is-fixed&#039;, window.scrollY &amp;gt; y);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Resource Page Module Loader&lt;br /&gt;
 */&lt;br /&gt;
$(function() {&lt;br /&gt;
    // Only on resource pages&lt;br /&gt;
    if ($(&#039;.crafting-section, .recipe-table, [class*=&amp;quot;crafted-&amp;quot;]&#039;).length &amp;gt; 0) {&lt;br /&gt;
        // Load dependencies first&lt;br /&gt;
        mw.loader.using([&#039;jquery&#039;, &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039;], function() {&lt;br /&gt;
            // Load resource page module&lt;br /&gt;
            $.getScript(&#039;/index.php?title=MediaWiki:ResourcePage.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;)&lt;br /&gt;
                .done(function() {&lt;br /&gt;
                    console.log(&#039;Resource page module loaded&#039;);&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function() {&lt;br /&gt;
                    console.error(&#039;Failed to load resource page module&#039;);&lt;br /&gt;
                });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
  const $drop = $(&#039;#drop&#039;);&lt;br /&gt;
  const $menu = $(&#039;#drop1&#039;);&lt;br /&gt;
&lt;br /&gt;
  if ($drop.length &amp;amp;&amp;amp; $menu.length) {&lt;br /&gt;
    // Move Actions button into the footer visually&lt;br /&gt;
    $(&#039;#footer&#039;).append($drop);&lt;br /&gt;
    $(&#039;#footer&#039;).append($menu);&lt;br /&gt;
&lt;br /&gt;
    // Style the button like a footer element&lt;br /&gt;
    $drop.css({&lt;br /&gt;
      position: &#039;relative&#039;,&lt;br /&gt;
      display: &#039;inline-block&#039;,&lt;br /&gt;
      marginTop: &#039;12px&#039;,&lt;br /&gt;
      background: &#039;rgba(252,231,200,0.08)&#039;,&lt;br /&gt;
      border: &#039;1px solid rgba(252,231,200,0.2)&#039;,&lt;br /&gt;
      color: &#039;#fce7c8&#039;,&lt;br /&gt;
      fontFamily: &#039;Rajdhani, sans-serif&#039;,&lt;br /&gt;
      padding: &#039;6px 12px&#039;,&lt;br /&gt;
      boxShadow: &#039;0 0 6px rgba(0,0,0,0.3)&#039;,&lt;br /&gt;
      cursor: &#039;pointer&#039;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $drop.hover(&lt;br /&gt;
      () =&amp;gt; $drop.css({ background: &#039;rgba(252,231,200,0.15)&#039;, color: &#039;#fff&#039; }),&lt;br /&gt;
      () =&amp;gt; $drop.css({ background: &#039;rgba(252,231,200,0.08)&#039;, color: &#039;#fce7c8&#039; })&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Ensure dropdown menu opens below and is styled cleanly&lt;br /&gt;
    $menu.css({&lt;br /&gt;
      position: &#039;absolute&#039;,&lt;br /&gt;
      top: &#039;100%&#039;,&lt;br /&gt;
      right: &#039;0&#039;,&lt;br /&gt;
      zIndex: &#039;9999&#039;,&lt;br /&gt;
      background: &#039;#1a1a1a&#039;,&lt;br /&gt;
      boxShadow: &#039;0 2px 6px rgba(0,0,0,0.5)&#039;,&lt;br /&gt;
      marginTop: &#039;4px&#039;&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Footer message logic&lt;br /&gt;
  if (!$(&#039;#custom-footer-note&#039;).length) {&lt;br /&gt;
    const $customLine = $(&#039;&amp;lt;div&amp;gt;&#039;, {&lt;br /&gt;
      id: &#039;custom-footer-note&#039;,&lt;br /&gt;
      text: `This is an experimental solo project exploring what’s possible in gaming UI and data experiences. Things may break—thank you for being part of the push forward. &amp;lt;br&amp;gt;Legal &amp;amp; [[Disclaimer]]`&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;#footer&#039;).prepend($customLine);&lt;br /&gt;
    $(&#039;#footer-left&#039;).hide();&lt;br /&gt;
  }&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=MediaWiki:Common.js&amp;diff=1167</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=MediaWiki:Common.js&amp;diff=1167"/>
		<updated>2025-06-04T05:27:20Z</updated>

		<summary type="html">&lt;p&gt;Operator: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ========================================&lt;br /&gt;
   MediaWiki:Common.js - Fixed Header Spacing&lt;br /&gt;
   FIXED VERSION - Addresses all positioning issues&lt;br /&gt;
   ======================================== */&lt;br /&gt;
&lt;br /&gt;
/* ░ MOBILE DISCLAIMER BANNER ░ */&lt;br /&gt;
$( function () {&lt;br /&gt;
    if ( window.innerWidth &amp;gt; 768 ) return;     // desktop? abort.&lt;br /&gt;
&lt;br /&gt;
    // already injected? abort.&lt;br /&gt;
    if ( $(&#039;#mobile-disclaimer&#039;).length ) return;&lt;br /&gt;
&lt;br /&gt;
    // Build &amp;amp; inject&lt;br /&gt;
    const $banner = $( &#039;&amp;lt;div&amp;gt;&#039;, {&lt;br /&gt;
        id:   &#039;mobile-disclaimer&#039;,&lt;br /&gt;
        html: &#039;Heads-up: this section is optimised for desktop. Smaller layouts are experimental 👀&#039;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // insert right after the site header / before main content.&lt;br /&gt;
    // Adjust selector to your skin; Vector uses #content, Timeless uses #mw-site.&lt;br /&gt;
    $( &#039;#mw-content-text&#039; ).prepend( $banner ); &lt;br /&gt;
    // If you prefer it at absolute top, use $(&#039;body&#039;).prepend( $banner );&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* util: &amp;quot;Fabricator Basics&amp;quot; → &amp;quot;fabricator-basics&amp;quot; */&lt;br /&gt;
function makeSlug(str){&lt;br /&gt;
  return str.toLowerCase().trim()&lt;br /&gt;
            .replace(/[^\\w\\s-]/g,&#039;&#039;)   // drop punctuation&lt;br /&gt;
            .replace(/\\s+/g,&#039;-&#039;);        // spaces → dashes&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // FIXED: Check if page has breadcrumb navigation&lt;br /&gt;
    var hasBreadcrumb = $(&#039;.dune-breadcrumb-nav&#039;).length &amp;gt; 0;&lt;br /&gt;
    if (hasBreadcrumb) {&lt;br /&gt;
        $(&#039;body&#039;).addClass(&#039;has-breadcrumb&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // HEADER FIX - Wait for page to load then force header&lt;br /&gt;
    setTimeout(function() {&lt;br /&gt;
        // Remove ALL existing headers and nav attempts&lt;br /&gt;
        $(&#039;.mw-header, #mw-header-container, nav.tab-bar, .tab-bar&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Hide the page title and extra elements completely&lt;br /&gt;
        $(&#039;.firstHeading, h1.title, .mw-page-title-main, #firstHeading, #tagline, h3#tagline, #contentSub, .mw-content-subtitle&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Remove any MediaWiki notices that might appear&lt;br /&gt;
        $(&#039;#siteNotice, .mw-indicators, .printfooter, .catlinks&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
        // Create the navigation bar HTML with inline styles&lt;br /&gt;
        var headerHTML = `&lt;br /&gt;
            &amp;lt;div id=&amp;quot;dune-header&amp;quot; style=&amp;quot;position: fixed; top: 0; left: 0; right: 0; height: 60px; background: linear-gradient(180deg, rgba(20, 18, 28, 0.95) 0%, rgba(10, 8, 16, 0.98) 100%); border-bottom: 3px solid rgba(252, 231, 200, 0.4); box-shadow: 0 2px 20px rgba(0,0,0,0.8); z-index: 99999; display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div style=&amp;quot;width: 100%; max-width: 1600px; margin: 0 auto; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;/wiki/Main_Page&amp;quot; style=&amp;quot;font-family: &#039;Orbitron&#039;, sans-serif; font-size: 22px; color: #fce7c8; text-transform: uppercase; letter-spacing: 3px; font-weight: 700; text-shadow: 0 0 15px rgba(252, 231, 200, 0.4); text-decoration: none; white-space: nowrap;&amp;quot;&amp;gt;DUNE DB&amp;lt;/a&amp;gt;&lt;br /&gt;
                    &lt;br /&gt;
                    &amp;lt;nav style=&amp;quot;display: flex; gap: 0; margin: 0 20px; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Items&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-left: 1px solid rgba(252, 231, 200, 0.1); border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;◇ Items&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Crafting&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⚒ Crafting&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Building&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⌂ Building&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Tech_Tree&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;⬢ Tech Tree&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Journeys&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;➤ Journeys&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Skills&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;★ Skills&amp;lt;/a&amp;gt;&lt;br /&gt;
                        &amp;lt;a href=&amp;quot;/Map&amp;quot; style=&amp;quot;display: flex; align-items: center; padding: 0 18px; height: 100%; color: rgba(252, 231, 200, 0.8); font-family: &#039;Rajdhani&#039;, sans-serif; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1.2px; text-decoration: none; border-right: 1px solid rgba(252, 231, 200, 0.1); transition: all 0.3s ease; background: transparent;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.color=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;transparent&#039;; this.style.color=&#039;rgba(252, 231, 200, 0.8)&#039;;&amp;quot;&amp;gt;🗺 Map&amp;lt;/a&amp;gt;&lt;br /&gt;
                    &amp;lt;/nav&amp;gt;&lt;br /&gt;
                    &lt;br /&gt;
                    &amp;lt;div style=&amp;quot;display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;form action=&amp;quot;/index.php&amp;quot; method=&amp;quot;get&amp;quot; style=&amp;quot;display: flex; align-items: center; gap: 0; height: 38px;&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;input type=&amp;quot;search&amp;quot; name=&amp;quot;search&amp;quot; placeholder=&amp;quot;Search wiki...&amp;quot; style=&amp;quot;background: rgba(0, 0, 2, 0.8); border: 2px solid rgba(252, 231, 200, 0.3); border-radius: 0; color: #fce7c8; padding: 0 12px; width: 200px; font-size: 13px; font-family: &#039;Rajdhani&#039;, sans-serif; transition: all 0.3s ease; outline: none; height: 38px; box-sizing: border-box; margin: 0; vertical-align: middle;&amp;quot; onfocus=&amp;quot;this.style.borderColor=&#039;#fce7c8&#039;; this.style.boxShadow=&#039;0 0 10px rgba(252, 231, 200, 0.3)&#039;; this.style.width=&#039;250px&#039;;&amp;quot; onblur=&amp;quot;this.style.borderColor=&#039;rgba(252, 231, 200, 0.3)&#039;; this.style.boxShadow=&#039;none&#039;; this.style.width=&#039;200px&#039;;&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;button type=&amp;quot;submit&amp;quot; style=&amp;quot;background: rgba(252, 231, 200, 0.1); border: 2px solid rgba(252, 231, 200, 0.3); border-left: none; color: #fce7c8; padding: 0 12px; cursor: pointer; font-size: 14px; transition: all 0.3s ease; height: 38px; box-sizing: border-box; margin: 0; vertical-align: middle; display: flex; align-items: center; justify-content: center;&amp;quot; onmouseover=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.2)&#039;; this.style.borderColor=&#039;#fce7c8&#039;;&amp;quot; onmouseout=&amp;quot;this.style.background=&#039;rgba(252, 231, 200, 0.1)&#039;; this.style.borderColor=&#039;rgba(252, 231, 200, 0.3)&#039;;&amp;quot;&amp;gt;&amp;lt;span&amp;gt;🔍&amp;lt;/span&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
                        &amp;lt;/form&amp;gt;&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        `;&lt;br /&gt;
        &lt;br /&gt;
        // Check if header already exists to avoid duplicates&lt;br /&gt;
        if ($(&#039;#dune-header&#039;).length === 0) {&lt;br /&gt;
            $(&#039;body&#039;).prepend(headerHTML);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // CRITICAL: Force proper spacing&lt;br /&gt;
        $(&#039;body&#039;).css({&lt;br /&gt;
            &#039;padding-top&#039;: &#039;60px&#039;,&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;overflow-y&#039;: &#039;auto&#039;,&lt;br /&gt;
            &#039;height&#039;: &#039;auto&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // FIXED: Different spacing for pages with/without breadcrumb&lt;br /&gt;
        if (hasBreadcrumb) {&lt;br /&gt;
            // Pages with breadcrumb - content starts immediately after header&lt;br /&gt;
            $(&#039;#content, .mw-body, #mw-content-text, .mw-body-content, .mw-parser-output, #main-section, .main-section, #page-content&#039;).css({&lt;br /&gt;
                &#039;padding-top&#039;: &#039;0&#039;,&lt;br /&gt;
                &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            // Breadcrumb should have proper spacing from header&lt;br /&gt;
            $(&#039;.dune-breadcrumb-nav&#039;).css({&lt;br /&gt;
                &#039;margin-top&#039;: &#039;20px&#039;,&lt;br /&gt;
                &#039;margin-bottom&#039;: &#039;20px&#039;&lt;br /&gt;
            });&lt;br /&gt;
        } else {&lt;br /&gt;
            // Pages without breadcrumb - add padding to content&lt;br /&gt;
            $(&#039;#content, .mw-body, #mw-content-text, .mw-body-content, .mw-parser-output, #main-section, .main-section, #page-content&#039;).css({&lt;br /&gt;
                &#039;padding-top&#039;: &#039;20px&#039;,&lt;br /&gt;
                &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Force first element to start at top (unless it&#039;s breadcrumb)&lt;br /&gt;
        $(&#039;.mw-parser-output &amp;gt; *:first-child:not(.dune-breadcrumb-nav), .mw-body-content &amp;gt; *:first-child:not(.dune-breadcrumb-nav)&#039;).css({&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding-top&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove sidebar space&lt;br /&gt;
        $(&#039;#sidebar, .columns.large-2.medium-3&#039;).css(&#039;display&#039;, &#039;none&#039;);&lt;br /&gt;
        $(&#039;#page-content, .columns.large-10.medium-9&#039;).css({&lt;br /&gt;
            &#039;width&#039;: &#039;100%&#039;,&lt;br /&gt;
            &#039;max-width&#039;: &#039;100%&#039;,&lt;br /&gt;
            &#039;margin&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Handle Actions button positioning&lt;br /&gt;
        $(&#039;#p-cactions&#039;).css({&lt;br /&gt;
            &#039;position&#039;: &#039;fixed&#039;,&lt;br /&gt;
            &#039;top&#039;: &#039;11px&#039;,&lt;br /&gt;
            &#039;right&#039;: &#039;20px&#039;,&lt;br /&gt;
            &#039;z-index&#039;: &#039;100001&#039;,&lt;br /&gt;
            &#039;margin&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;padding&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;height&#039;: &#039;38px&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove spacing from all column wrappers&lt;br /&gt;
        $(&#039;.row &amp;gt; .columns&#039;).css({&lt;br /&gt;
            &#039;padding-top&#039;: &#039;0&#039;,&lt;br /&gt;
            &#039;margin-top&#039;: &#039;0&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // FIXED: Ensure page content can scroll&lt;br /&gt;
        $(&#039;#content&#039;).css({&lt;br /&gt;
            &#039;min-height&#039;: &#039;calc(100vh - 60px)&#039;,&lt;br /&gt;
            &#039;position&#039;: &#039;relative&#039;,&lt;br /&gt;
            &#039;z-index&#039;: &#039;1&#039;&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        // Remove any floating MediaWiki elements&lt;br /&gt;
        $(&#039;.mw-jump-link, .mw-redirectedfrom, #siteNotice&#039;).remove();&lt;br /&gt;
        &lt;br /&gt;
    }, 100);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* ===== RADIAL MENU CODE ===== */&lt;br /&gt;
function waitForRadialData(callback, attempts = 0) {&lt;br /&gt;
  const dataTag = document.getElementById(&#039;radialMenuData&#039;);&lt;br /&gt;
  if (dataTag) {&lt;br /&gt;
    try {&lt;br /&gt;
      const menuItems = JSON.parse(dataTag.innerText || dataTag.textContent);&lt;br /&gt;
      console.log(&amp;quot;✅ Loaded radialMenuData:&amp;quot;, menuItems);&lt;br /&gt;
      callback(menuItems);&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      console.error(&amp;quot;❌ Failed to parse radialMenuData&amp;quot;, e);&lt;br /&gt;
    }&lt;br /&gt;
  } else if (attempts &amp;lt; 20) {&lt;br /&gt;
    setTimeout(() =&amp;gt; waitForRadialData(callback, attempts + 1), 100);&lt;br /&gt;
  } else {&lt;br /&gt;
    console.warn(&amp;quot;⚠️ radialMenuData tag not found after timeout.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function () {&lt;br /&gt;
  waitForRadialData(function (menuItems) {&lt;br /&gt;
    const isMobile = () =&amp;gt; window.innerWidth &amp;lt;= 768;&lt;br /&gt;
&lt;br /&gt;
    let radialItemsHTML = &#039;&#039;;&lt;br /&gt;
    menuItems.forEach((item, index) =&amp;gt; {&lt;br /&gt;
      const id = item.category.toLowerCase().replace(/\s+/g, &#039;-&#039;);&lt;br /&gt;
      item.id = id;&lt;br /&gt;
&lt;br /&gt;
      radialItemsHTML += `&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-radial-item-container ${item.position}&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;a data-id=&amp;quot;${id}&amp;quot; class=&amp;quot;dune-radial-item&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;img src=&amp;quot;${item.icon}&amp;quot; alt=&amp;quot;${item.name}&amp;quot; class=&amp;quot;dune-radial-icon&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;span class=&amp;quot;dune-radial-tooltip&amp;quot;&amp;gt;${item.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    const centerButtonHTML = `&lt;br /&gt;
      &amp;lt;a href=&amp;quot;https://dunedb.com/Main_Page&amp;quot; class=&amp;quot;dune-radial-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img src=&amp;quot;https://dunedb.com/images/9/99/HomeNavIcon.png&amp;quot; alt=&amp;quot;Home&amp;quot; class=&amp;quot;dune-radial-icon&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;dune-radial-tooltip&amp;quot;&amp;gt;Main Page&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    const radialMenuHTML = `&lt;br /&gt;
      &amp;lt;div id=&amp;quot;duneRadialMenu&amp;quot; class=&amp;quot;dune-radial-menu&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-radial-background&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle outer&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle middle&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;dune-radial-circle inner&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        ${centerButtonHTML}&lt;br /&gt;
        ${radialItemsHTML}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;duneRadialOverlay&amp;quot; class=&amp;quot;dune-radial-overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    const subcategoryContainerHTML = `&amp;lt;div id=&amp;quot;duneSubcategoryContainer&amp;quot; class=&amp;quot;dune-subcategory-container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;`;&lt;br /&gt;
    $(&#039;body&#039;).append(radialMenuHTML);&lt;br /&gt;
    $(&#039;body&#039;).append(subcategoryContainerHTML);&lt;br /&gt;
&lt;br /&gt;
    if (isMobile()) {&lt;br /&gt;
      $(&#039;#duneRadialMenu&#039;).addClass(&#039;mobile-grid&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const showSubcategories = (itemId, event) =&amp;gt; {&lt;br /&gt;
      const item = menuItems.find(i =&amp;gt; i.id === itemId);&lt;br /&gt;
      if (!item || !item.subcategories) return;&lt;br /&gt;
&lt;br /&gt;
      $(&#039;.dune-radial-item&#039;).removeClass(&#039;selected&#039;);&lt;br /&gt;
      $(`.dune-radial-item[data-id=&amp;quot;${itemId}&amp;quot;]`).addClass(&#039;selected&#039;);&lt;br /&gt;
&lt;br /&gt;
      let subcategoryHTML = `&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-header&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;img src=&amp;quot;${item.icon}&amp;quot; alt=&amp;quot;${item.name}&amp;quot; class=&amp;quot;dune-subcategory-icon&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span&amp;gt;${item.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-items&amp;quot;&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      item.subcategories.forEach((sub, index) =&amp;gt; {&lt;br /&gt;
        subcategoryHTML += `&lt;br /&gt;
          &amp;lt;a href=&amp;quot;${sub.url}&amp;quot; class=&amp;quot;dune-subcategory-item&amp;quot; style=&amp;quot;--item-index: ${index}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;span class=&amp;quot;dune-subcategory-name&amp;quot;&amp;gt;${sub.name}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        `;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      subcategoryHTML += `&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dune-subcategory-footer&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;a href=&amp;quot;${item.url}&amp;quot; class=&amp;quot;dune-subcategory-all&amp;quot;&amp;gt;View All ${item.name}&amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const $subcategoryContainer = $(&#039;#duneSubcategoryContainer&#039;);&lt;br /&gt;
      $subcategoryContainer.html(subcategoryHTML);&lt;br /&gt;
&lt;br /&gt;
      $subcategoryContainer.removeClass((index, className) =&amp;gt; {&lt;br /&gt;
        return (className.match(/from-\S+/g) || []).join(&#039; &#039;);&lt;br /&gt;
      });&lt;br /&gt;
      $subcategoryContainer.addClass(`from-${item.position}`);&lt;br /&gt;
      $subcategoryContainer.addClass(&#039;active&#039;);&lt;br /&gt;
&lt;br /&gt;
      event.stopPropagation();&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const hideSubcategories = () =&amp;gt; {&lt;br /&gt;
      $(&#039;#duneSubcategoryContainer&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $(&#039;.dune-radial-item&#039;).removeClass(&#039;selected&#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const toggleRadialMenu = () =&amp;gt; {&lt;br /&gt;
      if ($(&#039;#duneRadialMenu&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
        hideSubcategories();&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;#duneRadialOverlay&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
        $(&#039;.dune-radial-item-container&#039;).each(function (index) {&lt;br /&gt;
          const $item = $(this);&lt;br /&gt;
          setTimeout(() =&amp;gt; {&lt;br /&gt;
            $item.addClass(&#039;animated&#039;);&lt;br /&gt;
          }, index * 50);&lt;br /&gt;
        });&lt;br /&gt;
        setTimeout(() =&amp;gt; {&lt;br /&gt;
          $(&#039;.dune-radial-center&#039;).addClass(&#039;animated&#039;);&lt;br /&gt;
        }, menuItems.length * 50);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;#duneLogoBtn, #menuRadialTrigger img&#039;, function (e) {&lt;br /&gt;
      console.log(&amp;quot;✅ Radial trigger clicked&amp;quot;);&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      e.stopPropagation();&lt;br /&gt;
      toggleRadialMenu();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;.dune-radial-item&#039;, function (e) {&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      e.stopPropagation();&lt;br /&gt;
      const itemId = $(this).data(&#039;id&#039;);&lt;br /&gt;
      if ($(this).hasClass(&#039;selected&#039;)) {&lt;br /&gt;
        hideSubcategories();&lt;br /&gt;
      } else {&lt;br /&gt;
        showSubcategories(itemId, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;#duneRadialOverlay&#039;, function () {&lt;br /&gt;
      hideSubcategories();&lt;br /&gt;
      $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;click&#039;, &#039;li.name.logo a[href=&amp;quot;/Main_Page&amp;quot;]&#039;, function (e) {&lt;br /&gt;
      e.preventDefault();&lt;br /&gt;
      toggleRadialMenu();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(document).on(&#039;keydown&#039;, function (e) {&lt;br /&gt;
      if (e.key === &#039;Escape&#039;) {&lt;br /&gt;
        if ($(&#039;#duneSubcategoryContainer&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
          hideSubcategories();&lt;br /&gt;
        } else if ($(&#039;#duneRadialMenu&#039;).hasClass(&#039;active&#039;)) {&lt;br /&gt;
          $(&#039;#duneRadialMenu&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
          $(&#039;#duneRadialOverlay&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(window).on(&#039;resize&#039;, function () {&lt;br /&gt;
      if (isMobile()) {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).addClass(&#039;mobile-grid&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        $(&#039;#duneRadialMenu&#039;).removeClass(&#039;mobile-grid&#039;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* Used-In dynamic filters &amp;amp; search */&lt;br /&gt;
mw.hook( &#039;wikipage.content&#039; ).add( function ( $content ) {&lt;br /&gt;
&lt;br /&gt;
  const $holder = $content.find( &#039;#usedInFilterHolder&#039; );&lt;br /&gt;
  const $table  = $content.find( &#039;#usedInTable&#039; );&lt;br /&gt;
&lt;br /&gt;
  if ( !$holder.length || !$table.length ) return;&lt;br /&gt;
&lt;br /&gt;
  const rowsData = [];&lt;br /&gt;
  const stations = new Set();&lt;br /&gt;
  const types    = new Set();&lt;br /&gt;
&lt;br /&gt;
  $table.find( &#039;tbody tr&#039; ).each( function () {&lt;br /&gt;
    const $tds     = $( this ).children( &#039;td&#039; );&lt;br /&gt;
    const output   = $tds.eq( 0 ).text().trim();&lt;br /&gt;
    const type     = $tds.eq( 1 ).text().trim();&lt;br /&gt;
    const station  = $tds.last().text().trim();&lt;br /&gt;
&lt;br /&gt;
    rowsData.push( { tr: this, output, type, station } );&lt;br /&gt;
    stations.add( station );&lt;br /&gt;
    types.add( type );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
  const makeSel = ( id, label, opts ) =&amp;gt; {&lt;br /&gt;
    const $sel = $( &#039;&amp;lt;select&amp;gt;&#039;, { id, class: &#039;game-button&#039;, css:{margin:&#039;6px 4px 6px 0&#039;} } )&lt;br /&gt;
                  .append( $( &#039;&amp;lt;option&amp;gt;&#039;, { value:&#039;&#039;, text:label } ) );&lt;br /&gt;
    opts.forEach( o =&amp;gt; $sel.append( $( &#039;&amp;lt;option&amp;gt;&#039;, { value:o, text:o } ) ) );&lt;br /&gt;
    return $sel;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const $stationSel = makeSel( &#039;filterStation&#039;, &#039;All Stations&#039;, [ ...stations ].sort() );&lt;br /&gt;
  const $typeSel    = makeSel( &#039;filterType&#039;,    &#039;All Types&#039;,    [ ...types ].sort() );&lt;br /&gt;
  const $search     = $( &#039;&amp;lt;input&amp;gt;&#039;, {&lt;br /&gt;
                          type:&#039;text&#039;,&lt;br /&gt;
                          placeholder:&#039;Search…&#039;,&lt;br /&gt;
                          css:{ margin:&#039;6px 0&#039;, padding:&#039;4px&#039;, width:&#039;140px&#039;,&lt;br /&gt;
                               &#039;background&#039;:&#039;#111&#039;, color:&#039;#fff&#039;, border:&#039;1px solid #555&#039; }&lt;br /&gt;
                        } );&lt;br /&gt;
&lt;br /&gt;
  $holder.append( $stationSel, $typeSel, $search );&lt;br /&gt;
&lt;br /&gt;
  function applyFilters() {&lt;br /&gt;
    const sVal = $stationSel.val();&lt;br /&gt;
    const tVal = $typeSel.val();&lt;br /&gt;
    const q    = $search.val().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    rowsData.forEach( ({ tr, output, type, station }) =&amp;gt; {&lt;br /&gt;
      const show =&lt;br /&gt;
        (!sVal || station === sVal) &amp;amp;&amp;amp;&lt;br /&gt;
        (!tVal || type    === tVal) &amp;amp;&amp;amp;&lt;br /&gt;
        (!q    || output.toLowerCase().includes( q ));&lt;br /&gt;
      tr.style.display = show ? &#039;&#039; : &#039;none&#039;;&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $stationSel.on( &#039;change&#039;, applyFilters );&lt;br /&gt;
  $typeSel   .on( &#039;change&#039;, applyFilters );&lt;br /&gt;
  $search    .on( &#039;input&#039;,  applyFilters );&lt;br /&gt;
} );&lt;br /&gt;
&lt;br /&gt;
/* Lazy-load background image Blur */&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, () =&amp;gt; {&lt;br /&gt;
  const hero = document.querySelector(&#039;.dune-hero&#039;);&lt;br /&gt;
  if (hero &amp;amp;&amp;amp; !hero.style.backgroundImage) {&lt;br /&gt;
    hero.style.backgroundImage =&lt;br /&gt;
      &#039;url(/images/7/70/Arrakis_dunes.jpg?2025)&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const radial = document.querySelector(&#039;.radial-menu-wrapper&#039;);&lt;br /&gt;
  if (!radial) return;&lt;br /&gt;
  const y = radial.offsetTop;&lt;br /&gt;
  window.addEventListener(&#039;scroll&#039;, () =&amp;gt; {&lt;br /&gt;
    radial.classList.toggle(&#039;is-fixed&#039;, window.scrollY &amp;gt; y);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Resource Page Module Loader&lt;br /&gt;
 */&lt;br /&gt;
$(function() {&lt;br /&gt;
    // Only on resource pages&lt;br /&gt;
    if ($(&#039;.crafting-section, .recipe-table, [class*=&amp;quot;crafted-&amp;quot;]&#039;).length &amp;gt; 0) {&lt;br /&gt;
        // Load dependencies first&lt;br /&gt;
        mw.loader.using([&#039;jquery&#039;, &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039;], function() {&lt;br /&gt;
            // Load resource page module&lt;br /&gt;
            $.getScript(&#039;/index.php?title=MediaWiki:ResourcePage.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;)&lt;br /&gt;
                .done(function() {&lt;br /&gt;
                    console.log(&#039;Resource page module loaded&#039;);&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function() {&lt;br /&gt;
                    console.error(&#039;Failed to load resource page module&#039;);&lt;br /&gt;
                });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
  const $drop = $(&#039;#drop&#039;);&lt;br /&gt;
  const $menu = $(&#039;#drop1&#039;);&lt;br /&gt;
&lt;br /&gt;
  if ($drop.length &amp;amp;&amp;amp; $menu.length) {&lt;br /&gt;
    // Move Actions button into the footer visually&lt;br /&gt;
    $(&#039;#footer&#039;).append($drop);&lt;br /&gt;
    $(&#039;#footer&#039;).append($menu);&lt;br /&gt;
&lt;br /&gt;
    // Style the button like a footer element&lt;br /&gt;
    $drop.css({&lt;br /&gt;
      position: &#039;relative&#039;,&lt;br /&gt;
      display: &#039;inline-block&#039;,&lt;br /&gt;
      marginTop: &#039;12px&#039;,&lt;br /&gt;
      background: &#039;rgba(252,231,200,0.08)&#039;,&lt;br /&gt;
      border: &#039;1px solid rgba(252,231,200,0.2)&#039;,&lt;br /&gt;
      color: &#039;#fce7c8&#039;,&lt;br /&gt;
      fontFamily: &#039;Rajdhani, sans-serif&#039;,&lt;br /&gt;
      padding: &#039;6px 12px&#039;,&lt;br /&gt;
      boxShadow: &#039;0 0 6px rgba(0,0,0,0.3)&#039;,&lt;br /&gt;
      cursor: &#039;pointer&#039;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $drop.hover(&lt;br /&gt;
      () =&amp;gt; $drop.css({ background: &#039;rgba(252,231,200,0.15)&#039;, color: &#039;#fff&#039; }),&lt;br /&gt;
      () =&amp;gt; $drop.css({ background: &#039;rgba(252,231,200,0.08)&#039;, color: &#039;#fce7c8&#039; })&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Ensure dropdown menu opens below and is styled cleanly&lt;br /&gt;
    $menu.css({&lt;br /&gt;
      position: &#039;absolute&#039;,&lt;br /&gt;
      top: &#039;100%&#039;,&lt;br /&gt;
      right: &#039;0&#039;,&lt;br /&gt;
      zIndex: &#039;9999&#039;,&lt;br /&gt;
      background: &#039;#1a1a1a&#039;,&lt;br /&gt;
      boxShadow: &#039;0 2px 6px rgba(0,0,0,0.5)&#039;,&lt;br /&gt;
      marginTop: &#039;4px&#039;&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Footer message logic&lt;br /&gt;
  if (!$(&#039;#custom-footer-note&#039;).length) {&lt;br /&gt;
    const $customLine = $(&#039;&amp;lt;div&amp;gt;&#039;, {&lt;br /&gt;
      id: &#039;custom-footer-note&#039;,&lt;br /&gt;
      text: `This is an experimental solo project exploring what’s possible in gaming UI and data experiences. Things may break—thank you for being part of the push forward. &amp;lt;a href=&amp;quot;/Disclaimer&amp;quot; class=&amp;quot;footer-link&amp;quot;&amp;gt;Legal &amp;amp;amp; Disclaimer&amp;lt;/a&amp;gt;`&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;#footer&#039;).prepend($customLine);&lt;br /&gt;
    $(&#039;#footer-left&#039;).hide();&lt;br /&gt;
  }&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=Disclaimer&amp;diff=1166</id>
		<title>Disclaimer</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=Disclaimer&amp;diff=1166"/>
		<updated>2025-06-04T05:19:43Z</updated>

		<summary type="html">&lt;p&gt;Operator: Created page with &amp;quot;&amp;lt;!-- =============================      Unofficial Dune Awakening Fan Wiki – Legal Notice &amp;amp; Disclaimer      Last updated: 4 June 2025      ============================= --&amp;gt;  = Legal Notice &amp;amp;amp; Disclaimer = &amp;lt;small&amp;gt;Last updated: 4&amp;amp;nbsp;June&amp;amp;nbsp;2025&amp;lt;/small&amp;gt;  == 1&amp;amp;nbsp;-&amp;amp;nbsp;Interpretation &amp;amp;amp; Definitions == ; Wiki / We / Us / Our : the Dune DB Project ; Service : the website at &amp;#039;&amp;#039;&amp;#039;www.dunedb.com&amp;#039;&amp;#039;&amp;#039; and any sub-pages ; You / User : any individual or entity accessing...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =============================&lt;br /&gt;
     Unofficial Dune Awakening Fan Wiki – Legal Notice &amp;amp; Disclaimer&lt;br /&gt;
     Last updated: 4 June 2025&lt;br /&gt;
     ============================= --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Legal Notice &amp;amp;amp; Disclaimer =&lt;br /&gt;
&amp;lt;small&amp;gt;Last updated: 4&amp;amp;nbsp;June&amp;amp;nbsp;2025&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1&amp;amp;nbsp;-&amp;amp;nbsp;Interpretation &amp;amp;amp; Definitions ==&lt;br /&gt;
; Wiki / We / Us / Our&lt;br /&gt;
: the Dune DB Project&lt;br /&gt;
; Service&lt;br /&gt;
: the website at &#039;&#039;&#039;www.dunedb.com&#039;&#039;&#039; and any sub-pages&lt;br /&gt;
; You / User&lt;br /&gt;
: any individual or entity accessing the Service&lt;br /&gt;
; Funcom Assets&lt;br /&gt;
: game art, logos, screenshots, audio, icons, models and other IP owned by Funcom Oslo AS or its licensors&lt;br /&gt;
&lt;br /&gt;
== 2&amp;amp;nbsp;-&amp;amp;nbsp;Non-Affiliation ==&lt;br /&gt;
This is an &#039;&#039;&#039;unofficial, fan-operated resource&#039;&#039;&#039;.  &lt;br /&gt;
It is &amp;lt;strong&amp;gt;not endorsed by, affiliated with, or sponsored by Funcom Oslo AS, Legendary Entertainment, or any related parties.&amp;lt;/strong&amp;gt;  &lt;br /&gt;
All Funcom trademarks and copyrights remain the property of their respective owners.&lt;br /&gt;
&lt;br /&gt;
== 3&amp;amp;nbsp;-&amp;amp;nbsp;Copyright &amp;amp;amp; Trademark Notice ==&lt;br /&gt;
© Funcom Oslo AS. “Dune: Awakening” and related logos are trademarks of Funcom Oslo AS or its licensors.  &lt;br /&gt;
Original text written by our contributors is released under &amp;lt;small&amp;gt;CC&amp;amp;nbsp;BY-NC-SA 4.0&amp;lt;/small&amp;gt; unless otherwise noted.&lt;br /&gt;
&lt;br /&gt;
== 4&amp;amp;nbsp;-&amp;amp;nbsp;Fair-Use Statement ==&lt;br /&gt;
Images, video frames, audio snippets and text excerpts are reproduced solely for criticism, commentary, news reporting, teaching and research in accordance with 17 U.S.C. §107.  &lt;br /&gt;
If you wish to use Funcom Assets beyond fair use, obtain permission from Funcom first.&lt;br /&gt;
&lt;br /&gt;
== 5&amp;amp;nbsp;-&amp;amp;nbsp;Datamined Material ==&lt;br /&gt;
Some icons and data are &amp;lt;em&amp;gt;extracted from public game builds&amp;lt;/em&amp;gt; for analysis and are marked with a &amp;lt;code&amp;gt;Datamined&amp;lt;/code&amp;gt; label.  &lt;br /&gt;
* They may change before release.  &lt;br /&gt;
* No raw, high-resolution files are hosted here.  &lt;br /&gt;
If you are the rights-holder and object to any such material, contact us at &#039;&#039;&#039;[[email protected]]&#039;&#039;&#039; and we will remove or alter it promptly.&lt;br /&gt;
&lt;br /&gt;
== 6&amp;amp;nbsp;-&amp;amp;nbsp;External Links ==&lt;br /&gt;
The Service may link to external sites not operated by Us. We make &amp;lt;em&amp;gt;no warranties&amp;lt;/em&amp;gt; regarding the accuracy or safety of external content and accept no liability for any loss arising from its use.&lt;br /&gt;
&lt;br /&gt;
== 7&amp;amp;nbsp;-&amp;amp;nbsp;Errors &amp;amp;amp; Omissions ==&lt;br /&gt;
While we aim for accuracy, the information provided is for general guidance only. Content may be out of date, incomplete or erroneous. The Wiki assumes &amp;lt;em&amp;gt;no responsibility&amp;lt;/em&amp;gt; for errors or omissions, or for results obtained from the use of this information.&lt;br /&gt;
&lt;br /&gt;
== 8&amp;amp;nbsp;-&amp;amp;nbsp;Views &amp;amp;amp; User-Generated Content ==&lt;br /&gt;
Opinions expressed in articles or comments are solely those of their authors and do not necessarily reflect Our views or Funcom’s. Users are responsible for their own contributions; We reserve the right to remove any content at Our discretion.&lt;br /&gt;
&lt;br /&gt;
== 9&amp;amp;nbsp;-&amp;amp;nbsp;No Professional Advice ==&lt;br /&gt;
Nothing on the Service constitutes legal, financial, medical or any other professional advice. Always consult qualified professionals before acting on information obtained here.&lt;br /&gt;
&lt;br /&gt;
== 10&amp;amp;nbsp;-&amp;amp;nbsp;Limitation of Liability ==&lt;br /&gt;
The Service and all content are provided &amp;lt;em&amp;gt;“as is” and “as available,” without warranty of any kind&amp;lt;/em&amp;gt;, express or implied.  &lt;br /&gt;
In no event shall the Wiki or its contributors be liable for any direct, indirect, incidental, special or consequential damages arising out of—or in connection with—Your use of the Service.&lt;br /&gt;
&lt;br /&gt;
== 11&amp;amp;nbsp;-&amp;amp;nbsp;Viruses &amp;amp;amp; Security ==&lt;br /&gt;
We do not warrant that the Service will be uninterrupted or free of viruses or other harmful components. You are responsible for implementing sufficient safeguards to prevent damage or loss.&lt;br /&gt;
&lt;br /&gt;
== 12&amp;amp;nbsp;-&amp;amp;nbsp;Changes ==&lt;br /&gt;
We may modify this Disclaimer at any time without prior notice. Changes take effect once posted on this page.&lt;br /&gt;
&lt;br /&gt;
== 13&amp;amp;nbsp;-&amp;amp;nbsp;Contact &amp;amp;amp; Takedown Requests ==&lt;br /&gt;
For copyright concerns, takedown requests or legal inquiries, e-mail &#039;&#039;&#039;legal@dunedb.com&#039;&#039;&#039; with the subject line “DMCA / Legal Request”.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;Use the Service at your own risk. By continuing to browse or contribute, You acknowledge that You have read, understood and agreed to this Disclaimer.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T5R_D.png&amp;diff=1165</id>
		<title>File:T UI IconWpn2HChoamMaula01 T5R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T5R_D.png&amp;diff=1165"/>
		<updated>2025-06-04T04:43:15Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T5_D.png&amp;diff=1164</id>
		<title>File:T UI IconWpn2HChoamMaula01 T5 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T5_D.png&amp;diff=1164"/>
		<updated>2025-06-04T04:43:14Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4S_D.png&amp;diff=1163</id>
		<title>File:T UI IconWpn2HChoamMaula01 T4S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4S_D.png&amp;diff=1163"/>
		<updated>2025-06-04T04:43:14Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4R_D.png&amp;diff=1162</id>
		<title>File:T UI IconWpn2HChoamMaula01 T4R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4R_D.png&amp;diff=1162"/>
		<updated>2025-06-04T04:43:13Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4R.png&amp;diff=1161</id>
		<title>File:T UI IconWpn2HChoamMaula01 T4R.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4R.png&amp;diff=1161"/>
		<updated>2025-06-04T04:43:13Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4_D.png&amp;diff=1160</id>
		<title>File:T UI IconWpn2HChoamMaula01 T4 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4_D.png&amp;diff=1160"/>
		<updated>2025-06-04T04:43:12Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4.png&amp;diff=1159</id>
		<title>File:T UI IconWpn2HChoamMaula01 T4.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T4.png&amp;diff=1159"/>
		<updated>2025-06-04T04:43:12Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T3R_D.png&amp;diff=1158</id>
		<title>File:T UI IconWpn2HChoamMaula01 T3R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T3R_D.png&amp;diff=1158"/>
		<updated>2025-06-04T04:43:11Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T3_D.png&amp;diff=1157</id>
		<title>File:T UI IconWpn2HChoamMaula01 T3 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T3_D.png&amp;diff=1157"/>
		<updated>2025-06-04T04:43:11Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T2R_D.png&amp;diff=1156</id>
		<title>File:T UI IconWpn2HChoamMaula01 T2R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T2R_D.png&amp;diff=1156"/>
		<updated>2025-06-04T04:43:10Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T2_D.png&amp;diff=1155</id>
		<title>File:T UI IconWpn2HChoamMaula01 T2 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T2_D.png&amp;diff=1155"/>
		<updated>2025-06-04T04:43:10Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T1S_D.png&amp;diff=1154</id>
		<title>File:T UI IconWpn2HChoamMaula01 T1S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T1S_D.png&amp;diff=1154"/>
		<updated>2025-06-04T04:43:10Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T1R_D.png&amp;diff=1153</id>
		<title>File:T UI IconWpn2HChoamMaula01 T1R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T1R_D.png&amp;diff=1153"/>
		<updated>2025-06-04T04:43:09Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T1_D.png&amp;diff=1152</id>
		<title>File:T UI IconWpn2HChoamMaula01 T1 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T1_D.png&amp;diff=1152"/>
		<updated>2025-06-04T04:43:09Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T0R_D.png&amp;diff=1151</id>
		<title>File:T UI IconWpn2HChoamMaula01 T0R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T0R_D.png&amp;diff=1151"/>
		<updated>2025-06-04T04:43:08Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T0_D.png&amp;diff=1150</id>
		<title>File:T UI IconWpn2HChoamMaula01 T0 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T0_D.png&amp;diff=1150"/>
		<updated>2025-06-04T04:43:08Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T6S_D.png&amp;diff=1149</id>
		<title>File:T UI IconWpn2HChoamMaula01 T6S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T6S_D.png&amp;diff=1149"/>
		<updated>2025-06-04T04:43:07Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T6R_D.png&amp;diff=1148</id>
		<title>File:T UI IconWpn2HChoamMaula01 T6R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T6R_D.png&amp;diff=1148"/>
		<updated>2025-06-04T04:43:07Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T6_D.png&amp;diff=1147</id>
		<title>File:T UI IconWpn2HChoamMaula01 T6 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T6_D.png&amp;diff=1147"/>
		<updated>2025-06-04T04:43:06Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T5S_D.png&amp;diff=1146</id>
		<title>File:T UI IconWpn2HChoamMaula01 T5S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamMaula01_T5S_D.png&amp;diff=1146"/>
		<updated>2025-06-04T04:43:06Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T6R_D.png&amp;diff=1145</id>
		<title>File:T UI IconWpn2HAtreSMG01 T6R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T6R_D.png&amp;diff=1145"/>
		<updated>2025-06-04T04:40:39Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T6_D.png&amp;diff=1144</id>
		<title>File:T UI IconWpn2HAtreSMG01 T6 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T6_D.png&amp;diff=1144"/>
		<updated>2025-06-04T04:40:38Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T5S_D.png&amp;diff=1143</id>
		<title>File:T UI IconWpn2HAtreSMG01 T5S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T5S_D.png&amp;diff=1143"/>
		<updated>2025-06-04T04:40:38Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T5R_D.png&amp;diff=1142</id>
		<title>File:T UI IconWpn2HAtreSMG01 T5R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T5R_D.png&amp;diff=1142"/>
		<updated>2025-06-04T04:40:38Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T5_D.png&amp;diff=1141</id>
		<title>File:T UI IconWpn2HAtreSMG01 T5 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T5_D.png&amp;diff=1141"/>
		<updated>2025-06-04T04:40:37Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T4S_D.png&amp;diff=1140</id>
		<title>File:T UI IconWpn2HAtreSMG01 T4S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T4S_D.png&amp;diff=1140"/>
		<updated>2025-06-04T04:40:36Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T4R_D.png&amp;diff=1139</id>
		<title>File:T UI IconWpn2HAtreSMG01 T4R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T4R_D.png&amp;diff=1139"/>
		<updated>2025-06-04T04:40:36Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T4_D.png&amp;diff=1138</id>
		<title>File:T UI IconWpn2HAtreSMG01 T4 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T4_D.png&amp;diff=1138"/>
		<updated>2025-06-04T04:40:36Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T3R_D.png&amp;diff=1137</id>
		<title>File:T UI IconWpn2HAtreSMG01 T3R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T3R_D.png&amp;diff=1137"/>
		<updated>2025-06-04T04:40:35Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T3_D.png&amp;diff=1136</id>
		<title>File:T UI IconWpn2HAtreSMG01 T3 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T3_D.png&amp;diff=1136"/>
		<updated>2025-06-04T04:40:34Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T2R_D.png&amp;diff=1135</id>
		<title>File:T UI IconWpn2HAtreSMG01 T2R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T2R_D.png&amp;diff=1135"/>
		<updated>2025-06-04T04:40:34Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T2_D.png&amp;diff=1134</id>
		<title>File:T UI IconWpn2HAtreSMG01 T2 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T2_D.png&amp;diff=1134"/>
		<updated>2025-06-04T04:40:33Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T1S_D.png&amp;diff=1133</id>
		<title>File:T UI IconWpn2HAtreSMG01 T1S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T1S_D.png&amp;diff=1133"/>
		<updated>2025-06-04T04:40:33Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T1R_D.png&amp;diff=1132</id>
		<title>File:T UI IconWpn2HAtreSMG01 T1R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T1R_D.png&amp;diff=1132"/>
		<updated>2025-06-04T04:40:32Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T1_D.png&amp;diff=1131</id>
		<title>File:T UI IconWpn2HAtreSMG01 T1 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T1_D.png&amp;diff=1131"/>
		<updated>2025-06-04T04:40:32Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamFlame01S_D.png&amp;diff=1130</id>
		<title>File:T UI IconWpn2HChoamFlame01S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamFlame01S_D.png&amp;diff=1130"/>
		<updated>2025-06-04T04:40:31Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamFlame01R_D.png&amp;diff=1129</id>
		<title>File:T UI IconWpn2HChoamFlame01R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamFlame01R_D.png&amp;diff=1129"/>
		<updated>2025-06-04T04:40:31Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamFlame01_D.png&amp;diff=1128</id>
		<title>File:T UI IconWpn2HChoamFlame01 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HChoamFlame01_D.png&amp;diff=1128"/>
		<updated>2025-06-04T04:40:30Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T6S_D.png&amp;diff=1127</id>
		<title>File:T UI IconWpn2HAtreSMG01 T6S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreSMG01_T6S_D.png&amp;diff=1127"/>
		<updated>2025-06-04T04:40:30Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreLMG01_T1S_D.png&amp;diff=1126</id>
		<title>File:T UI IconWpn2HAtreLMG01 T1S D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreLMG01_T1S_D.png&amp;diff=1126"/>
		<updated>2025-06-04T04:40:15Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreLMG01_T1R_D.png&amp;diff=1125</id>
		<title>File:T UI IconWpn2HAtreLMG01 T1R D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreLMG01_T1R_D.png&amp;diff=1125"/>
		<updated>2025-06-04T04:40:15Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
	<entry>
		<id>https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreLMG01_T1_D.png&amp;diff=1124</id>
		<title>File:T UI IconWpn2HAtreLMG01 T1 D.png</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=File:T_UI_IconWpn2HAtreLMG01_T1_D.png&amp;diff=1124"/>
		<updated>2025-06-04T04:40:14Z</updated>

		<summary type="html">&lt;p&gt;Operator: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
</feed>