Torn Radial UI Components Library

UI component generators for Torn Radial Menu

Questo script non dovrebbe essere installato direttamente. È una libreria per altri script da includere con la chiave // @require https://update.greasyfork.org/scripts/554529/1688219/Torn%20Radial%20UI%20Components%20Library.js

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         Torn Radial UI Components Library
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  UI component generators for Torn Radial Menu
// @author       Sensimillia (2168012)
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // ==================== UI COMPONENT GENERATOR ====================
    class UIComponents {
        
        // Search Overlay
        static createSearchOverlay() {
            const overlay = document.createElement('div');
            overlay.id = 'torn-radial-search-overlay';
            overlay.className = 'torn-radial-overlay';
            overlay.innerHTML = `
                <div class="torn-radial-container-base">
                    <div class="torn-radial-header-base">
                        <h2>🔍 Quick Search</h2>
                        <button class="modal-close" id="search-close">✕</button>
                    </div>
                    <div class="torn-radial-body-base">
                        <div style="margin-bottom: 16px;">
                            <input type="text" class="torn-radial-input" id="torn-search-input" placeholder="Search players, items, pages...">
                        </div>
                        <div id="torn-search-results"></div>
                        <div class="torn-radial-section" id="torn-search-history" style="display: none; margin-top: 16px;">
                            <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
                                <span style="font-size: 12px; opacity: 0.7;">Recent Searches</span>
                                <button class="torn-radial-btn-base btn-danger" id="clear-search-history" style="padding: 4px 8px; font-size: 11px;">Clear</button>
                            </div>
                            <div id="search-history-items"></div>
                        </div>
                    </div>
                </div>
            `;
            return overlay;
        }

        // Calculator Overlay
        static createCalculatorOverlay() {
            const overlay = document.createElement('div');
            overlay.id = 'torn-radial-calculator';
            overlay.className = 'torn-radial-overlay';
            overlay.innerHTML = `
                <div class="torn-radial-container-base" style="max-width: 400px;">
                    <div class="torn-radial-header-base">
                        <h2>🔢 Calculator</h2>
                        <button class="modal-close" id="calculator-close">✕</button>
                    </div>
                    <div style="padding: 30px 20px; background: rgba(50, 50, 50, 0.5); text-align: right; font-size: 36px; font-weight: 300; min-height: 80px; word-break: break-all; font-family: 'Courier New', monospace;" id="calc-display">0</div>
                    <div style="padding: 20px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;">
                        <button class="torn-radial-btn-base btn-danger" data-value="C">C</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="/">/</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="*">×</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="-">-</button>
                        
                        <button class="torn-radial-btn-base btn-secondary" data-value="7">7</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="8">8</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="9">9</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="+">+</button>
                        
                        <button class="torn-radial-btn-base btn-secondary" data-value="4">4</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="5">5</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="6">6</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="%">%</button>
                        
                        <button class="torn-radial-btn-base btn-secondary" data-value="1">1</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="2">2</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value="3">3</button>
                        <button class="torn-radial-btn-base btn-success" data-value="=" style="grid-row: span 2;">=</button>
                        
                        <button class="torn-radial-btn-base btn-secondary" data-value="0" style="grid-column: span 2;">0</button>
                        <button class="torn-radial-btn-base btn-secondary" data-value=".">.</button>
                    </div>
                </div>
            `;
            return overlay;
        }

        // Mini Apps Overlay
        static createMiniAppsOverlay() {
            const overlay = document.createElement('div');
            overlay.id = 'torn-radial-mini-apps';
            overlay.className = 'torn-radial-overlay';
            overlay.innerHTML = `
                <div class="torn-radial-container-base" style="max-width: 800px;">
                    <div class="torn-radial-header-base">
                        <h2>🛠️ Mini Apps</h2>
                        <button class="modal-close" id="mini-apps-close">✕</button>
                    </div>
                    <div class="torn-radial-body-base">
                        <div class="torn-radial-section">
                            <h3>⏱️ Timer Manager</h3>
                            <div id="timers-list"></div>
                            <div style="display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap;">
                                <input type="text" class="torn-radial-input" id="timer-name" placeholder="Timer name" style="flex: 1; min-width: 150px;">
                                <input type="number" class="torn-radial-input" id="timer-minutes" placeholder="Minutes" style="width: 100px;">
                                <button class="torn-radial-btn-base btn-success" id="add-timer-btn">Add</button>
                            </div>
                        </div>
                        
                        <div class="torn-radial-section" id="api-monitor-section">
                            <h3>📊 API Monitor</h3>
                            <div id="api-status">
                                <p style="font-size: 12px; margin: 0; opacity: 0.7;">Configure your API key in settings to enable real-time monitoring</p>
                            </div>
                            <div id="api-bars" style="display: none; margin-top: 12px;">
                                <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px;">
                                    <div class="torn-radial-section" style="margin: 0; padding: 12px;">
                                        <div style="font-size: 12px; opacity: 0.7; margin-bottom: 4px;">Energy</div>
                                        <div style="font-size: 18px; font-weight: 600;" id="energy-value">-/-</div>
                                        <div style="height: 4px; background: rgba(255,255,255,0.1); border-radius: 2px; margin-top: 8px; overflow: hidden;">
                                            <div id="energy-progress" style="height: 100%; width: 0%; background: #4aa3df; transition: width 0.3s ease;"></div>
                                        </div>
                                    </div>
                                    <div class="torn-radial-section" style="margin: 0; padding: 12px;">
                                        <div style="font-size: 12px; opacity: 0.7; margin-bottom: 4px;">Nerve</div>
                                        <div style="font-size: 18px; font-weight: 600;" id="nerve-value">-/-</div>
                                        <div style="height: 4px; background: rgba(255,255,255,0.1); border-radius: 2px; margin-top: 8px; overflow: hidden;">
                                            <div id="nerve-progress" style="height: 100%; width: 0%; background: #a33a3a; transition: width 0.3s ease;"></div>
                                        </div>
                                    </div>
                                    <div class="torn-radial-section" style="margin: 0; padding: 12px;">
                                        <div style="font-size: 12px; opacity: 0.7; margin-bottom: 4px;">Happy</div>
                                        <div style="font-size: 18px; font-weight: 600;" id="happy-value">-/-</div>
                                        <div style="height: 4px; background: rgba(255,255,255,0.1); border-radius: 2px; margin-top: 8px; overflow: hidden;">
                                            <div id="happy-progress" style="height: 100%; width: 0%; background: #3ea34a; transition: width 0.3s ease;"></div>
                                        </div>
                                    </div>
                                    <div class="torn-radial-section" style="margin: 0; padding: 12px;">
                                        <div style="font-size: 12px; opacity: 0.7; margin-bottom: 4px;">Life</div>
                                        <div style="font-size: 18px; font-weight: 600;" id="life-value">-/-</div>
                                        <div style="height: 4px; background: rgba(255,255,255,0.1); border-radius: 2px; margin-top: 8px; overflow: hidden;">
                                            <div id="life-progress" style="height: 100%; width: 0%; background: #FF3B30; transition: width 0.3s ease;"></div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <button class="torn-radial-btn-base btn-primary" id="refresh-api-btn" style="width: 100%; margin-top: 12px; display: none;">Refresh Data</button>
                        </div>
                        
                        <div class="torn-radial-section">
                            <h3>📝 Quick Notes</h3>
                            <textarea class="torn-radial-input" id="quick-notes" placeholder="Jot down quick notes..." style="min-height: 120px; resize: vertical; font-family: monospace;"></textarea>
                            <button class="torn-radial-btn-base btn-success" id="save-notes-btn" style="margin-top: 8px; width: 100%;">Save Notes</button>
                        </div>
                        
                        <div class="torn-radial-section">
                            <h3>⚔️ Faction Shortcuts</h3>
                            <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px;">
                                <a href="/factions.php?step=your" class="torn-radial-btn-base btn-secondary" style="text-decoration: none; text-align: center; display: block;">Faction Home</a>
                                <a href="/factions.php?step=your#/tab=crimes" class="torn-radial-btn-base btn-secondary" style="text-decoration: none; text-align: center; display: block;">OC</a>
                                <a href="/factions.php?step=your#/tab=armoury" class="torn-radial-btn-base btn-secondary" style="text-decoration: none; text-align: center; display: block;">Armory</a>
                                <a href="/factions.php?step=your#/tab=controls" class="torn-radial-btn-base btn-secondary" style="text-decoration: none; text-align: center; display: block;">Controls</a>
                            </div>
                        </div>
                    </div>
                </div>
            `;
            return overlay;
        }

        // Calibration Overlay
        static createCalibrationOverlay() {
            const overlay = document.createElement('div');
            overlay.id = 'torn-radial-calibration';
            overlay.innerHTML = `
                <div class="calibration-instruction">Click the TOP-LEFT corner of your safe area</div>
                <button class="calibration-cancel" id="calibration-cancel-btn">Cancel (ESC)</button>
            `;
            return overlay;
        }

        // Settings Modal
        static createSettingsModal(isPDA) {
            const modal = document.createElement('div');
            modal.id = 'torn-radial-modal';
            modal.style.cssText = `
                display: none;
                position: fixed;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                background: rgba(0, 0, 0, 0.6);
                backdrop-filter: blur(40px);
                -webkit-backdrop-filter: blur(40px);
                z-index: 1000000;
                justify-content: center;
                align-items: center;
                animation: fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);
                padding: ${isPDA ? '8px' : '20px'};
                overflow-y: auto;
            `;
            modal.innerHTML = `
                <div class="torn-radial-container-base">
                    <div class="torn-radial-header-base">
                        <div style="display: flex; align-items: center; gap: 8px; flex: 1;">
                            <h2>⚙️ Quick Travel Settings</h2>
                        </div>
                        <button class="error-log-btn" id="show-error-log" title="View Error Log">🐞</button>
                        <button class="modal-close" id="modal-close-btn">✕</button>
                    </div>
                    <div class="torn-radial-body-base">
                        <div class="torn-radial-section">
                            <h3>📋 Loadouts</h3>
                            <div class="loadout-tabs" id="loadout-tabs"></div>
                            <div style="display: grid; grid-template-columns: repeat(${isPDA ? '2' : '3'}, 1fr); gap: 8px; margin-top: 12px;">
                                <button class="torn-radial-btn-base btn-success" id="new-loadout-btn" style="font-size: ${isPDA ? '11px' : '13px'};">➕ New</button>
                                <button class="torn-radial-btn-base btn-secondary" id="rename-loadout-btn" style="font-size: ${isPDA ? '11px' : '13px'};">✏️ Rename</button>
                                <button class="torn-radial-btn-base btn-danger" id="delete-loadout-btn" style="font-size: ${isPDA ? '11px' : '13px'}; ${isPDA ? 'grid-column: span 2;' : ''}">🗑️ Delete</button>
                            </div>
                        </div>
                        
                        <button class="torn-radial-btn-base btn-success" id="add-current-page-btn" style="width: 100%; margin-bottom: 12px;">📄 Add Current Page to Loadout</button>
                        
                        <div class="torn-radial-section">
                            <h3>🎨 Appearance</h3>
                            <div class="setting-item">
                                <label>Theme</label>
                                <select class="torn-radial-select" id="theme-select">
                                    <option value="torn">Torn</option>
                                    <option value="light">Light</option>
                                    <option value="dark">Dark</option>
                                    <option value="cyberpunk">Cyberpunk</option>
                                    <option value="ocean">Ocean</option>
                                    <option value="sunset">Sunset</option>
                                    <option value="neonNoir">NeonNoir</option>
                                    <option value="bloodline">Bloodline</option>
                                    <option value="stealth">Stealth</option>
                                    <option value="terminal">Terminal</option>
                                </select>
                            </div>
                            <div class="setting-item">
                                <label>Layout</label>
                                <select class="torn-radial-select" id="layout-select">
                                    <option value="circular">Circular</option>
                                    <option value="vertical">Vertical</option>
                                    <option value="horizontal">Horizontal</option>
                                </select>
                            </div>
                            <div class="setting-item">
                                <label>Size</label>
                                <select class="torn-radial-select" id="size-select">
                                    <option value="pda">PDA</option>
                                    <option value="small">Small</option>
                                    <option value="medium">Medium</option>
                                    <option value="large">Large</option>
                                </select>
                            </div>
                        </div>
                        
                        <div class="torn-radial-section">
                            <h3>🔔 Notifications</h3>
                            <div class="setting-item">
                                <label>Enable Notifications</label>
                                <input type="checkbox" id="notif-enabled">
                            </div>
                        </div>
                        
                        <div class="torn-radial-section">
                            <h3>🔑 API Configuration</h3>
                            <div class="setting-item" style="flex-direction: column; align-items: stretch;">
                                <label>Torn API Key</label>
                                <input type="password" class="torn-radial-input" id="api-key-input" placeholder="Enter your Torn API key" style="margin-top: 8px;">
                                <p style="font-size: 11px; opacity: 0.7; margin: 8px 0 0 0;">Used for API Monitor in Mini Apps. Get your key at torn.com/preferences.php#tab=api</p>
                            </div>
                        </div>
                        
                        <div id="links-container"></div>
                        
                        <div class="torn-radial-section" style="margin-top: 20px; font-size: 12px; opacity: 0.8;">
                            <h3>💡 v2.2.0 Features</h3>
                            <p style="margin: 6px 0;">• <strong>📦 Modular Architecture:</strong> Separate libraries for easier updates</p>
                            <p style="margin: 6px 0;">• <strong>📱 PDA Optimized:</strong> All UI scales perfectly for mobile</p>
                            <p style="margin: 6px 0;">• <strong>🎨 6 Themes:</strong> Torn, Light, Dark, Cyberpunk, Ocean, Sunset</p>
                            <p style="margin: 6px 0;">• <strong>⚡ Performance:</strong> Faster loading with cached libraries</p>
                        </div>
                    </div>
                    <div class="torn-radial-footer-base" style="${isPDA ? 'flex-direction: column;' : ''}">
                        <button class="torn-radial-btn-base btn-success" id="add-link-btn">➕ Add Link</button>
                        <button class="torn-radial-btn-base btn-secondary" id="restore-btn">🔄 Restore</button>
                        <button class="torn-radial-btn-base btn-secondary" id="export-btn">📤 Export</button>
                        <button class="torn-radial-btn-base btn-secondary" id="import-btn">📥 Import</button>
                        <button class="torn-radial-btn-base btn-secondary" id="calibrate-btn" style="background: linear-gradient(135deg, #FF9500 0%, #FF6B00 100%); color: white;">📐 Calibrate</button>
                        <button class="torn-radial-btn-base btn-primary" id="save-btn" style="${isPDA ? 'grid-column: span 2;' : ''}">Save Changes</button>
                    </div>
                </div>
            `;
            return modal;
        }

        // Error Log Modal
        static createErrorLogModal() {
            const modal = document.createElement('div');
            modal.id = 'error-log-modal';
            modal.style.cssText = 'display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); z-index: 1000001; justify-content: center; align-items: center; padding: 20px;';
            modal.innerHTML = `
                <div class="torn-radial-container-base" style="max-width: 800px;">
                    <div class="torn-radial-header-base">
                        <h2>🐞 Error Log</h2>
                        <button class="modal-close" id="error-log-close">✕</button>
                    </div>
                    <div class="torn-radial-body-base" id="error-log-body" style="font-family: 'Courier New', monospace; font-size: 12px;"></div>
                    <div class="torn-radial-footer-base">
                        <button class="torn-radial-btn-base btn-secondary" id="export-log-btn">💾 Export</button>
                        <button class="torn-radial-btn-base btn-secondary" id="clear-log-btn">🗑️ Clear</button>
                        <button class="torn-radial-btn-base btn-primary" id="close-log-btn">Close</button>
                    </div>
                </div>
            `;
            return modal;
        }

        // Timer Item HTML
        static createTimerItem(timer, index, timeRemaining) {
            return `
                <div class="torn-radial-section" style="margin: 8px 0; padding: 12px; display: flex; justify-content: space-between; align-items: center;">
                    <div>
                        <div style="font-weight: 600;">${timer.name}</div>
                        <div style="font-size: 12px; opacity: 0.7;">${timeRemaining.minutes}m ${timeRemaining.seconds}s remaining</div>
                    </div>
                    <button class="torn-radial-btn-base btn-danger" onclick="window.tornRadialRemoveTimer(${index})" style="padding: 6px 12px; font-size: 12px;">Remove</button>
                </div>
            `;
        }

        // Search Result Item HTML
        static createSearchResultItem(result, isSelected = false) {
            return `
                <div class="torn-radial-section ${isSelected ? 'selected' : ''}" style="margin: 8px 0; padding: 12px; cursor: pointer; display: flex; align-items: center; gap: 12px;" data-url="${result.url}" data-type="${result.type}">
                    <span style="font-size: 20px;">${result.icon}</span>
                    <span>${result.name}</span>
                </div>
            `;
        }

        // Link Item HTML
        static createLinkItem(link, index, totalLinks, isPDA) {
            return `
                <div class="link-item">
                    <input type="text" value="${link.icon}" placeholder="Icon" maxlength="2" data-index="${index}" data-field="icon">
                    <input type="text" value="${link.name}" placeholder="Name" data-index="${index}" data-field="name">
                    <input type="text" value="${link.url}" placeholder="URL" data-index="${index}" data-field="url">
                    <div class="color-picker-wrapper">
                        <input type="color" class="color-picker" value="${link.color}" data-index="${index}" data-field="color">
                    </div>
                    <button class="delete-btn" data-index="${index}" title="Delete">🗑️</button>
                    <div class="reorder-controls">
                        <button class="reorder-btn" data-index="${index}" data-direction="up" ${index === 0 ? 'disabled' : ''} title="Move Up">▲</button>
                        <button class="reorder-btn" data-index="${index}" data-direction="down" ${index === totalLinks - 1 ? 'disabled' : ''} title="Move Down">▼</button>
                    </div>
                </div>
            `;
        }
    }

    // ==================== EXPORT ====================
    window.TornRadialUI = {
        UIComponents: UIComponents
    };

})();