/** * AlgorithmPress Dock System * Provides a unified interface for accessing various modules and systems */ const AlgorithmPressDock = (function() { 'use strict'; // Module state let state = { initialized: false, activeModules: new Set(), visiblePanels: new Set() }; // Module registry for keeping track of module status const moduleRegistry = { 'voice-control': { id: 'voice-control', name: 'Voice Control', initialized: false, panelVisible: false, initialize: initializeVoiceControl, togglePanel: toggleVoiceControlPanel }, 'nexus-grid': { id: 'nexus-grid', name: 'NexusGrid', initialized: false, panelVisible: false, initialize: initializeNexusGrid, togglePanel: toggleNexusGridPanel }, 'demo-system': { id: 'demo-system', name: 'Demonstration System', initialized: false, panelVisible: false, initialize: initializeDemoSystem, togglePanel: toggleDemoSystemPanel }, 'implementation': { id: 'implementation', name: 'Implementation Example', initialized: false, panelVisible: false, initialize: initializeImplementation, togglePanel: toggleImplementationPanel }, 'rainbow-indicator': { id: 'rainbow-indicator', name: 'Rainbow Indicator', initialized: false, panelVisible: false, initialize: initializeRainbowIndicator, togglePanel: toggleRainbowIndicatorPanel }, 'cubbit-storage': { id: 'cubbit-storage', name: 'Cubbit Storage', initialized: false, panelVisible: false, initialize: initializeCubbitStorage, togglePanel: toggleCubbitStoragePanel }, 'settings': { id: 'settings', name: 'Settings', initialized: false, panelVisible: false, initialize: initializeSettings, togglePanel: toggleSettingsPanel } }; /** * Initialize the dock system */ function initialize() { if (state.initialized) return; console.log('Initializing AlgorithmPress Dock...'); // Create and inject the dock HTML createDockUI(); // Bind event handlers to dock buttons bindDockEvents(); // Set initialization flag state.initialized = true; console.log('AlgorithmPress Dock initialized'); // Check if modules are already loaded and update status checkExistingModules(); } /** * Create and inject the dock UI if not already present */ function createDockUI() { // Check if dock already exists if (document.getElementById('algorithm-press-dock')) return; // Inject the dock element const dockHtml = document.querySelector('#algorithm-press-dock-template'); if (dockHtml) { // Use template if available const clone = document.importNode(dockHtml.content, true); document.body.appendChild(clone); } else { // Create dock from scratch if template not available const dockElement = document.createElement('div'); dockElement.id = 'algorithm-press-dock'; dockElement.className = 'algorithm-press-dock'; dockElement.innerHTML = `
`; document.body.appendChild(dockElement); } // Inject styles if not already present if (!document.getElementById('algorithm-press-dock-styles')) { const styleElement = document.createElement('style'); styleElement.id = 'algorithm-press-dock-styles'; styleElement.textContent = ` /* AlgorithmPress Dock Styles will be inserted here */ `; document.head.appendChild(styleElement); } } /** * Bind event handlers to dock buttons */ function bindDockEvents() { // Voice Control button const voiceControlBtn = document.getElementById('voice-control-dock-btn'); if (voiceControlBtn) { voiceControlBtn.addEventListener('click', function() { toggleModule('voice-control'); }); } // NexusGrid button const nexusGridBtn = document.getElementById('nexus-grid-dock-btn'); if (nexusGridBtn) { nexusGridBtn.addEventListener('click', function() { toggleModule('nexus-grid'); }); } // Demonstration System button const demoSystemBtn = document.getElementById('demo-system-dock-btn'); if (demoSystemBtn) { demoSystemBtn.addEventListener('click', function() { toggleModule('demo-system'); }); } // Implementation Example button const implementationBtn = document.getElementById('implementation-dock-btn'); if (implementationBtn) { implementationBtn.addEventListener('click', function() { toggleModule('implementation'); }); } // Rainbow Indicator button const rainbowIndicatorBtn = document.getElementById('rainbow-indicator-dock-btn'); if (rainbowIndicatorBtn) { rainbowIndicatorBtn.addEventListener('click', function() { toggleModule('rainbow-indicator'); }); } // Cubbit Storage button const cubbitStorageBtn = document.getElementById('cubbit-storage-dock-btn'); if (cubbitStorageBtn) { cubbitStorageBtn.addEventListener('click', function() { toggleModule('cubbit-storage'); }); } // Settings button const settingsBtn = document.getElementById('settings-dock-btn'); if (settingsBtn) { settingsBtn.addEventListener('click', function() { toggleModule('settings'); }); } } /** * Toggle a module's panel visibility * @param {string} moduleId - Module identifier */ function toggleModule(moduleId) { const module = moduleRegistry[moduleId]; if (!module) { console.error(`Module ${moduleId} not found in registry`); return; } // Initialize module if not already initialized if (!module.initialized) { module.initialize() .then(() => { module.initialized = true; state.activeModules.add(moduleId); updateDockButtonState(moduleId, true); module.togglePanel(); }) .catch(error => { console.error(`Failed to initialize ${module.name}:`, error); showToast('error', `Failed to initialize ${module.name}: ${error.message}`); }); } else { // Toggle panel visibility module.togglePanel(); updateDockButtonState(moduleId, module.panelVisible); } } /** * Update the visual state of a dock button * @param {string} moduleId - Module identifier * @param {boolean} active - Whether the module is active */ function updateDockButtonState(moduleId, active) { const button = document.getElementById(`${moduleId}-dock-btn`); if (!button) return; if (active) { button.classList.add('active'); } else { button.classList.remove('active'); } } /** * Check for existing module instances and update dock status */ function checkExistingModules() { // Check for Voice Control if (window.VoiceControlSystem && typeof window.VoiceControlSystem.isInitialized === 'function') { if (window.VoiceControlSystem.isInitialized()) { moduleRegistry['voice-control'].initialized = true; state.activeModules.add('voice-control'); updateDockButtonState('voice-control', true); } } // Check for NexusGrid if (window.NexusGrid) { moduleRegistry['nexus-grid'].initialized = true; state.activeModules.add('nexus-grid'); } // Check for Demonstration System if (window.NexusGridDemoSystem) { moduleRegistry['demo-system'].initialized = true; state.activeModules.add('demo-system'); } // Check for Rainbow Indicator if (window.RainbowIndicator) { moduleRegistry['rainbow-indicator'].initialized = true; state.activeModules.add('rainbow-indicator'); } // Check for Cubbit Storage if (window.CubbitStorage && typeof window.CubbitStorage.isInitialized === 'function') { if (window.CubbitStorage.isInitialized()) { moduleRegistry['cubbit-storage'].initialized = true; state.activeModules.add('cubbit-storage'); } } } /** * Initialize Voice Control System * @returns {Promise} - Promise that resolves when initialization is complete */ function initializeVoiceControl() { return new Promise((resolve, reject) => { try { if (!window.VoiceControlSystem) { reject(new Error('Voice Control System not available')); return; } if (window.VoiceControlSystem.isInitialized && window.VoiceControlSystem.isInitialized()) { // Already initialized resolve(); return; } window.VoiceControlSystem.initialize({ autoStart: false, voiceFeedback: true, visualFeedbackElement: 'voice-feedback' }).then(() => { console.log('Voice Control System initialized'); resolve(); }).catch(error => { reject(error); }); } catch (error) { reject(error); } }); } /** * Toggle Voice Control panel */ function toggleVoiceControlPanel() { try { if (!window.VoiceControlSystem) return; if (window.VoiceControlSystem.isListening && window.VoiceControlSystem.isListening()) { window.VoiceControlSystem.stopListening(); moduleRegistry['voice-control'].panelVisible = false; } else { window.VoiceControlSystem.startListening(); moduleRegistry['voice-control'].panelVisible = true; } } catch (error) { console.error('Error toggling Voice Control panel:', error); } } /** * Initialize NexusGrid * @returns {Promise} - Promise that resolves when initialization is complete */ function initializeNexusGrid() { return new Promise((resolve, reject) => { try { if (!window.NexusGrid) { reject(new Error('NexusGrid not available')); return; } // Create NexusGrid panel if not exists createNexusGridPanel(); window.NexusGrid.initialize() .then(() => { console.log('NexusGrid initialized'); resolve(); }) .catch(error => { reject(error); }); } catch (error) { reject(error); } }); } /** * Create NexusGrid panel */ function createNexusGridPanel() { if (document.getElementById('nexus-grid-panel')) return; const panel = document.createElement('div'); panel.id = 'nexus-grid-panel'; panel.className = 'system-panel nexus-grid-panel hidden'; panel.innerHTML = `

NexusGrid

Loading NexusGrid...
`; document.body.appendChild(panel); // Add close button event listener document.getElementById('nexus-grid-close-btn').addEventListener('click', function() { toggleNexusGridPanel(); }); } /** * Toggle NexusGrid panel */ function toggleNexusGridPanel() { const panel = document.getElementById('nexus-grid-panel'); if (!panel) return; if (panel.classList.contains('hidden')) { panel.classList.remove('hidden'); moduleRegistry['nexus-grid'].panelVisible = true; } else { panel.classList.add('hidden'); moduleRegistry['nexus-grid'].panelVisible = false; } updateDockButtonState('nexus-grid', moduleRegistry['nexus-grid'].panelVisible); } /** * Initialize Demonstration System * @returns {Promise} - Promise that resolves when initialization is complete */ function initializeDemoSystem() { return new Promise((resolve, reject) => { try { if (!window.NexusGridDemoSystem) { reject(new Error('Demonstration System not available')); return; } // Create Demo System panel if not exists createDemoSystemPanel(); if (typeof window.NexusGridDemoSystem.initialize === 'function') { window.NexusGridDemoSystem.initialize() .then(() => { console.log('Demonstration System initialized'); resolve(); }) .catch(error => { reject(error); }); } else { console.log('Demonstration System initialized (no init function)'); resolve(); } } catch (error) { reject(error); } }); } /** * Create Demonstration System panel */ function createDemoSystemPanel() { if (document.getElementById('demo-system-panel')) return; const panel = document.createElement('div'); panel.id = 'demo-system-panel'; panel.className = 'system-panel demo-system-panel hidden'; panel.innerHTML = `

Demonstration System

Demo Categories

Available Demos

Loading demos...
`; document.body.appendChild(panel); // Add close button event listener document.getElementById('demo-system-close-btn').addEventListener('click', function() { toggleDemoSystemPanel(); }); } /** * Toggle Demonstration System panel */ function toggleDemoSystemPanel() { const panel = document.getElementById('demo-system-panel'); if (!panel) return; if (panel.classList.contains('hidden')) { panel.classList.remove('hidden'); moduleRegistry['demo-system'].panelVisible = true; } else { panel.classList.add('hidden'); moduleRegistry['demo-system'].panelVisible = false; } updateDockButtonState('demo-system', moduleRegistry['demo-system'].panelVisible); } /** * Initialize Implementation Example * @returns {Promise} - Promise that resolves when initialization is complete */ function initializeImplementation() { return new Promise((resolve, reject) => { try { // Create Implementation panel if not exists createImplementationPanel(); console.log('Implementation Example initialized'); resolve(); } catch (error) { reject(error); } }); } /** * Create Implementation Example panel */ function createImplementationPanel() { if (document.getElementById('implementation-panel')) return; const panel = document.createElement('div'); panel.id = 'implementation-panel'; panel.className = 'system-panel implementation-panel hidden'; panel.innerHTML = `

Implementation Example

Rainbow Border Event Indicator

Preview Area

This area will show the rainbow border effect when active.

`; document.body.appendChild(panel); // Add close button event listener document.getElementById('implementation-close-btn').addEventListener('click', function() { toggleImplementationPanel(); }); // Add demo buttons event listeners document.getElementById('start-indicator-btn')?.addEventListener('click', function() { if (window.RainbowIndicator) { const previewEl = document.getElementById('indicator-preview'); if (previewEl && !window.previewIndicator) { window.previewIndicator = RainbowIndicator.init(previewEl, { borderSize: 4, glowSize: 20, animationSpeed: 4 }); } if (window.previewIndicator) { window.previewIndicator.start(); } } }); document.getElementById('stop-indicator-btn')?.addEventListener('click', function() { if (window.previewIndicator) { window.previewIndicator.stop(); } }); document.getElementById('toggle-indicator-btn')?.addEventListener('click', function() { if (window.previewIndicator) { window.previewIndicator.toggle(); } }); } /** * Toggle Implementation Example panel */ function toggleImplementationPanel() { const panel = document.getElementById('implementation-panel'); if (!panel) return; if (panel.classList.contains('hidden')) { panel.classList.remove('hidden'); moduleRegistry['implementation'].panelVisible = true; } else { panel.classList.add('hidden'); moduleRegistry['implementation'].panelVisible = false; } updateDockButtonState('implementation', moduleRegistry['implementation'].panelVisible); } /** * Initialize Rainbow Indicator * @returns {Promise} - Promise that resolves when initialization is complete */ function initializeRainbowIndicator() { return new Promise((resolve, reject) => { try { if (!window.RainbowIndicator) { reject(new Error('Rainbow Indicator not available')); return; } // Create Rainbow Indicator panel if not exists createRainbowIndicatorPanel(); console.log('Rainbow Indicator initialized'); resolve(); } catch (error) { reject(error); } }); } /** * Create Rainbow Indicator panel */ function createRainbowIndicatorPanel() { if (document.getElementById('rainbow-indicator-panel')) return; const panel = document.createElement('div'); panel.id = 'rainbow-indicator-panel'; panel.className = 'system-panel rainbow-indicator-panel hidden'; panel.innerHTML = `

Rainbow Indicator Settings

Configure Effects

4px
20px
4s

Color Presets

`; document.body.appendChild(panel); // Add close button event listener document.getElementById('rainbow-indicator-close-btn').addEventListener('click', function() { toggleRainbowIndicatorPanel(); }); // Add range input event listeners document.querySelectorAll('.form-range').forEach(range => { range.addEventListener('input', function() { this.nextElementSibling.textContent = this.value + ( this.id === 'animation-speed' ? 's' : 'px' ); }); }); // Apply button event listener document.getElementById('apply-effects-btn')?.addEventListener('click', function() { if (window.RainbowIndicator && window.appEventIndicator) { const borderSize = parseInt(document.getElementById('border-size').value); const glowSize = parseInt(document.getElementById('glow-size').value); const animationSpeed = parseInt(document.getElementById('animation-speed').value); const autoHooks = document.getElementById('auto-hooks').checked; // Update indicator settings window.appEventIndicator.updateSettings({ borderSize, glowSize, animationSpeed, useAutoHooks: autoHooks }); showToast('success', 'Rainbow indicator settings applied'); } }); // Preview button event listener document.getElementById('preview-effects-btn')?.addEventListener('click', function() { if (window.appEventIndicator) { window.appEventIndicator.start(); setTimeout(() => { window.appEventIndicator.stop(); }, 2000); } }); } /** * Toggle Rainbow Indicator panel */ function toggleRainbowIndicatorPanel() { const panel = document.getElementById('rainbow-indicator-panel'); if (!panel) return; if (panel.classList.contains('hidden')) { panel.classList.remove('hidden'); moduleRegistry['rainbow-indicator'].panelVisible = true; } else { panel.classList.add('hidden'); moduleRegistry['rainbow-indicator'].panelVisible = false; } updateDockButtonState('rainbow-indicator', moduleRegistry['rainbow-indicator'].panelVisible); } /** * Initialize Cubbit Storage * @returns {Promise} - Promise that resolves when initialization is complete */ function initializeCubbitStorage() { return new Promise((resolve, reject) => { try { if (!window.CubbitStorage) { reject(new Error('Cubbit Storage not available')); return; } // Create Cubbit Storage panel if not exists createCubbitStoragePanel(); console.log('Cubbit Storage initialized'); resolve(); } catch (error) { reject(error); } }); } /** * Create Cubbit Storage panel */ function createCubbitStoragePanel() { if (document.getElementById('cubbit-storage-panel')) return; const panel = document.createElement('div'); panel.id = 'cubbit-storage-panel'; panel.className = 'system-panel cubbit-storage-panel hidden'; panel.innerHTML = `

Cubbit Storage

Decentralized Storage

Connection Status

Not connected
`; document.body.appendChild(panel); // Add close button event listener document.getElementById('cubbit-storage-close-btn').addEventListener('click', function() { toggleCubbitStoragePanel(); }); // Connect button event listener document.getElementById('cubbit-connect-btn')?.addEventListener('click', function() { const apiKey = document.getElementById('cubbit-api-key-panel').value; const bucketName = document.getElementById('cubbit-bucket-panel').value || 'php-wasm-projects'; if (!apiKey) { showToast('error', 'API key is required'); return; } if (window.CubbitStorage) { window.CubbitStorage.initialize({ apiKey: apiKey, bucketName: bucketName }).then(() => { showToast('success', 'Connected to Cubbit DS3'); updateCubbitStorageStatus(true); }).catch(error => { showToast('error', 'Connection failed: ' + error.message); }); } }); } /** * Update Cubbit Storage status * @param {boolean} connected - Whether Cubbit storage is connected */ function updateCubbitStorageStatus(connected) { const statusDot = document.querySelector('.cubbit-status .status-dot'); const statusText = document.querySelector('.cubbit-status .status-text'); const projectsList = document.querySelector('.cubbit-projects'); if (statusDot && statusText) { if (connected) { statusDot.classList.add('connected'); statusText.textContent = 'Connected'; if (projectsList) { projectsList.classList.remove('hidden'); } } else { statusDot.classList.remove('connected'); statusText.textContent = 'Not connected'; if (projectsList) { projectsList.classList.add('hidden'); } } } } /** * Toggle Cubbit Storage panel */ function toggleCubbitStoragePanel() { const panel = document.getElementById('cubbit-storage-panel'); if (!panel) return; if (panel.classList.contains('hidden')) { panel.classList.remove('hidden'); moduleRegistry['cubbit-storage'].panelVisible = true; // Update connection status if (window.CubbitStorage && typeof window.CubbitStorage.isInitialized === 'function') { updateCubbitStorageStatus(window.CubbitStorage.isInitialized()); } } else { panel.classList.add('hidden'); moduleRegistry['cubbit-storage'].panelVisible = false; } updateDockButtonState('cubbit-storage', moduleRegistry['cubbit-storage'].panelVisible); } /** * Initialize Settings * @returns {Promise} - Promise that resolves when initialization is complete */ function initializeSettings() { return new Promise((resolve, reject) => { try { // Create Settings panel if not exists createSettingsPanel(); console.log('Settings initialized'); resolve(); } catch (error) { reject(error); } }); } /** * Create Settings panel */ function createSettingsPanel() { if (document.getElementById('settings-panel')) return; const panel = document.createElement('div'); panel.id = 'settings-panel'; panel.className = 'system-panel settings-panel hidden'; panel.innerHTML = `

AlgorithmPress Settings

General Settings

Builder Preferences

Appearance Settings

UI Preferences

Module Settings

Module Management

Voice Control

Enable voice commands for the builder

NexusGrid

Decentralized application platform

Demonstration System

Demo application generator

Rainbow Indicator

Visual feedback for operations

Cubbit Storage

Decentralized storage integration

Notification Settings

Notification Preferences

`; document.body.appendChild(panel); // Add close button event listener document.getElementById('settings-close-btn').addEventListener('click', function() { toggleSettingsPanel(); }); // Add settings tabs functionality const settingsTabs = document.querySelectorAll('.settings-tab'); settingsTabs.forEach(tab => { tab.addEventListener('click', function() { // Remove active class from all tabs settingsTabs.forEach(t => t.classList.remove('active')); // Add active class to clicked tab tab.classList.add('active'); // Show corresponding panel const tabId = tab.getAttribute('data-tab'); document.querySelectorAll('.settings-tab-panel').forEach(panel => { panel.classList.remove('active'); }); document.getElementById(`${tabId}-panel`).classList.add('active'); }); }); // Save settings button event listener document.getElementById('save-settings-btn')?.addEventListener('click', function() { saveSettings(); showToast('success', 'Settings saved successfully'); }); } /** * Save settings */ function saveSettings() { // Get settings from form const settings = { general: { autoSave: document.getElementById('auto-save')?.checked || false, saveInterval: parseInt(document.getElementById('save-interval')?.value || '60'), defaultTheme: document.getElementById('default-theme')?.value || 'bootstrap' }, appearance: { colorScheme: document.getElementById('ui-color-scheme')?.value || 'default', fontSize: document.getElementById('font-size')?.value || 'medium', animationSpeed: document.getElementById('animation-speed')?.value || 'normal' }, modules: { enabledModules: Array.from(document.querySelectorAll('.module-toggle input[type="checkbox"]')) .filter(input => input.checked) .map(input => input.getAttribute('data-module')) }, notifications: { enabled: document.getElementById('enable-notifications')?.checked || false, sound: document.getElementById('notification-sound')?.checked || false, position: document.getElementById('notification-position')?.value || 'bottom-right' } }; // Save settings to local storage localStorage.setItem('algorithm_press_settings', JSON.stringify(settings)); // Apply settings applySettings(settings); } /** * Apply settings * @param {Object} settings - Settings to apply */ function applySettings(settings) { // Apply appearance settings if (settings.appearance) { document.documentElement.setAttribute('data-color-scheme', settings.appearance.colorScheme); document.documentElement.setAttribute('data-font-size', settings.appearance.fontSize); document.documentElement.setAttribute('data-animation-speed', settings.appearance.animationSpeed); } // Apply module settings if (settings.modules && settings.modules.enabledModules) { // Show/hide dock buttons based on enabled modules Object.keys(moduleRegistry).forEach(moduleId => { const enabled = settings.modules.enabledModules.includes(moduleId); const button = document.getElementById(`${moduleId}-dock-btn`); if (button) { button.style.display = enabled ? '' : 'none'; } }); } // Apply notification settings if (settings.notifications) { // Update toast container position if it exists const toastContainer = document.getElementById('toast-container'); if (toastContainer) { toastContainer.className = `toast-container position-fixed p-3 ${settings.notifications.position}`; } } } /** * Toggle Settings panel */ function toggleSettingsPanel() { const panel = document.getElementById('settings-panel'); if (!panel) return; if (panel.classList.contains('hidden')) { panel.classList.remove('hidden'); moduleRegistry['settings'].panelVisible = true; } else { panel.classList.add('hidden'); moduleRegistry['settings'].panelVisible = false; } updateDockButtonState('settings', moduleRegistry['settings'].panelVisible); } /** * Show a toast notification * @param {string} type - Notification type (success, info, warning, error) * @param {string} message - Notification message */ function showToast(type, message) { // Check if function exists in the global scope if (typeof window.showToast === 'function') { window.showToast(type, message); return; } // Fallback implementation const toastEl = document.createElement('div'); toastEl.className = `toast align-items-center text-white bg-${type === 'error' ? 'danger' : type} border-0`; toastEl.setAttribute('role', 'alert'); toastEl.setAttribute('aria-live', 'assertive'); toastEl.setAttribute('aria-atomic', 'true'); toastEl.innerHTML = `
${message}
`; // Get settings for notification position const settings = JSON.parse(localStorage.getItem('algorithm_press_settings') || '{}'); const position = settings.notifications?.position || 'bottom-right'; // Add to document let toastContainer = document.getElementById('toast-container'); if (!toastContainer) { // Create toast container toastContainer = document.createElement('div'); toastContainer.id = 'toast-container'; toastContainer.className = `toast-container position-fixed p-3 ${position}`; document.body.appendChild(toastContainer); } toastContainer.appendChild(toastEl); // Initialize and show toast if (window.bootstrap && window.bootstrap.Toast) { const toast = new window.bootstrap.Toast(toastEl, { delay: 5000 }); toast.show(); } else { // Fallback if Bootstrap is not available toastEl.style.opacity = '1'; setTimeout(() => { toastEl.style.opacity = '0'; setTimeout(() => { toastEl.remove(); }, 300); }, 5000); } // Remove after hiding toastEl.addEventListener('hidden.bs.toast', () => { toastEl.remove(); }); } /** * Inject system panel styles */ function injectSystemPanelStyles() { if (document.getElementById('system-panel-styles')) return; const styleElement = document.createElement('style'); styleElement.id = 'system-panel-styles'; styleElement.textContent = ` /* System Panel Styles */ .system-panel { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80%; max-width: 1000px; height: 80%; max-height: 700px; background-color: rgba(255, 255, 255, 0.15); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid rgba(255, 255, 255, 0.3); border-radius: 20px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); z-index: 9500; display: flex; flex-direction: column; overflow: hidden; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } .system-panel.hidden { opacity: 0; transform: translate(-50%, -60%); pointer-events: none; } .panel-header { display: flex; justify-content: space-between; align-items: center; padding: 15px 20px; border-bottom: 1px solid rgba(255, 255, 255, 0.2); } .panel-header h2 { margin: 0; font-family: 'Alegreya Sans SC', sans-serif; font-size: 1.5rem; background-image: linear-gradient(to right, #ff9966, #ff5e62); color: transparent; -webkit-background-clip: text; background-clip: text; } .panel-controls { display: flex; gap: 10px; } .panel-close-btn { width: 30px; height: 30px; border-radius: 50%; background-color: rgba(255, 255, 255, 0.2); border: none; display: flex; align-items: center; justify-content: center; color: rgba(255, 255, 255, 0.8); cursor: pointer; transition: all 0.2s ease; } .panel-close-btn:hover { background-color: rgba(255, 87, 34, 0.3); transform: rotate(90deg); } .panel-body { flex: 1; overflow-y: auto; padding: 20px; } /* Loading spinner */ .loading-spinner { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 30px; color: rgba(255, 255, 255, 0.7); } .loading-spinner i { font-size: 2rem; margin-bottom: 15px; } /* Settings panel styles */ .settings-content { display: flex; flex-direction: column; height: 100%; } .settings-tabs { display: flex; border-bottom: 1px solid rgba(255, 255, 255, 0.2); margin-bottom: 20px; } .settings-tab { padding: 10px 20px; background: transparent; border: none; color: rgba(255, 255, 255, 0.7); font-size: 1rem; cursor: pointer; position: relative; transition: all 0.2s ease; } .settings-tab:hover { color: rgba(255, 255, 255, 0.9); } .settings-tab.active { color: rgba(255, 255, 255, 0.9); } .settings-tab.active::after { content: ''; position: absolute; bottom: -1px; left: 0; width: 100%; height: 2px; background: rgba(255, 255, 255, 0.9); } .settings-panels { flex: 1; overflow-y: auto; } .settings-tab-panel { display: none; } .settings-tab-panel.active { display: block; } .settings-group { background: rgba(255, 255, 255, 0.1); border-radius: 10px; padding: 20px; margin-bottom: 20px; } .settings-group h4 { margin: 0 0 15px 0; font-family: 'Alegreya Sans SC', sans-serif; font-size: 1.1rem; color: rgba(255, 255, 255, 0.9); } .settings-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; } /* Module list styles */ .module-list { display: flex; flex-direction: column; gap: 15px; } .module-item { display: flex; justify-content: space-between; align-items: center; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 8px; transition: all 0.2s ease; } .module-item:hover { background: rgba(255, 255, 255, 0.1); } .module-info h5 { margin: 0 0 5px 0; font-size: 1rem; color: rgba(255, 255, 255, 0.9); } .module-info p { margin: 0; font-size: 0.9rem; color: rgba(255, 255, 255, 0.7); } /* Switch styles */ .switch { position: relative; display: inline-block; width: 50px; height: 24px; } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.2); transition: .4s; } .slider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; transition: .4s; } input:checked + .slider { background-color: rgba(13, 110, 253, 0.5); } input:focus + .slider { box-shadow: 0 0 1px rgba(13, 110, 253, 0.5); } input:checked + .slider:before { transform: translateX(26px); } .slider.round { border-radius: 24px; } .slider.round:before { border-radius: 50%; } /* Demo system styles */ .demo-system-content { display: grid; grid-template-columns: 250px 1fr; gap: 20px; height: 100%; } .demo-categories { background: rgba(255, 255, 255, 0.05); border-radius: 10px; padding: 15px; } .demo-category-list { display: flex; flex-direction: column; gap: 8px; } .demo-category-btn { background: rgba(255, 255, 255, 0.1); border: none; border-radius: 6px; padding: 10px 15px; text-align: left; color: rgba(255, 255, 255, 0.8); cursor: pointer; transition: all 0.2s ease; } .demo-category-btn:hover { background: rgba(255, 255, 255, 0.15); color: rgba(255, 255, 255, 0.9); } .demo-category-btn.active { background: rgba(13, 110, 253, 0.2); color: rgba(255, 255, 255, 0.9); } /* Implementation demo styles */ .implementation-demo { display: flex; flex-direction: column; gap: 20px; } .implementation-controls { display: flex; gap: 10px; } .indicator-preview { flex: 1; min-height: 300px; background: rgba(255, 255, 255, 0.05); border-radius: 10px; display: flex; align-items: center; justify-content: center; overflow: hidden; position: relative; } .preview-content { text-align: center; padding: 20px; } .preview-content h4 { margin-bottom: 10px; } /* Rainbow indicator settings */ .rainbow-indicator-content { display: flex; flex-direction: column; gap: 20px; } .color-presets { margin-top: 20px; } .preset-buttons { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-top: 10px; } .preset-btn { background: rgba(255, 255, 255, 0.1); border: none; border-radius: 6px; padding: 8px 12px; color: rgba(255, 255, 255, 0.8); cursor: pointer; transition: all 0.2s ease; } .preset-btn:hover { background: rgba(255, 255, 255, 0.2); color: rgba(255, 255, 255, 0.9); } /* Cubbit storage panel styles */ .cubbit-storage-content { display: flex; flex-direction: column; gap: 20px; } .cubbit-settings { background: rgba(255, 255, 255, 0.05); border-radius: 10px; padding: 20px; } .cubbit-status { background: rgba(255, 255, 255, 0.05); border-radius: 10px; padding: 15px; } .status-indicator { display: flex; align-items: center; gap: 10px; margin-top: 10px; } .status-dot { width: 12px; height: 12px; border-radius: 50%; background-color: rgba(255, 0, 0, 0.5); } .status-dot.connected { background-color: rgba(46, 204, 113, 0.8); } /* Responsive styles */ @media (max-width: 768px) { .system-panel { width: 95%; height: 90%; } .demo-system-content { grid-template-columns: 1fr; } .preset-buttons { grid-template-columns: repeat(2, 1fr); } } `; document.head.appendChild(styleElement); } // Initialize when DOM is ready document.addEventListener('DOMContentLoaded', function() { // Inject styles injectSystemPanelStyles(); // Initialize dock initialize(); }); // Public API return { initialize, toggleModule, showToast }; })();