# RELEVANT REFLEX SHOP_26 AUG 2025 - REPOSITORY
================================================================================
Project Name: Relevant Reflex Shop_26 Aug 2025
Created: 2025-08-26 03:47:07
Last Updated: 2025-08-26 03:47:16
Source ZIP: public_html(2).zip
Total Files: 9
Total Folders: 5
================================================================================
## FILE STRUCTURE
================================================================================
Relevant Reflex Shop_26 Aug 2025/
├── assets/
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── app.js
├── content/
│ └── dashboard.php
├── includes/
│ ├── footer.php
│ └── header.php
├── index.php
├── manifest.json
├── offline.html
└── sw.js
================================================================================
## FILE CONTENTS
================================================================================
### FILE 1: index.php
- Type: PHP
- Size: 623 B
- Path: .
- Name: index.php
------------------------------------------------------------
'relevantreflex.shop',
'site_description' => 'Panel Management System'
];
// Check if user is logged in (this will be expanded later)
$isLoggedIn = isset($_SESSION['user_id']);
// For demo purposes, we'll show the dashboard without authentication
// In production, uncomment the lines below:
/*
if (!$isLoggedIn) {
header('Location: login.php');
exit;
}
*/
// Include header
include_once 'includes/header.php';
// Include dashboard content
include_once 'content/dashboard.php';
// Include footer
include_once 'includes/footer.php';
?>
-------------------- END OF FILE --------------------
### FILE 2: manifest.json
- Type: JSON
- Size: 5.03 KB
- Path: .
- Name: manifest.json
------------------------------------------------------------
{
"name": "RelevantReflex Panel Management",
"short_name": "RelevantReflex",
"description": "Professional survey panel management platform optimized for mobile devices. Manage your research panel, track analytics, and handle operations on the go.",
"version": "2.1.0",
"start_url": "/",
"scope": "/",
"display": "standalone",
"display_override": ["window-controls-overlay", "standalone", "minimal-ui"],
"orientation": "portrait-primary",
"theme_color": "#1e293b",
"background_color": "#f8fafc",
"categories": ["business", "productivity", "utilities"],
"lang": "en-IN",
"dir": "ltr",
"icons": [
{
"src": "/icons/icon-72x72.png",
"sizes": "72x72",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-96x96.png",
"sizes": "96x96",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-128x128.png",
"sizes": "128x128",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-144x144.png",
"sizes": "144x144",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-152x152.png",
"sizes": "152x152",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-384x384.png",
"sizes": "384x384",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any maskable"
}
],
"shortcuts": [
{
"name": "Dashboard",
"short_name": "Home",
"description": "View dashboard overview",
"url": "/",
"icons": [
{
"src": "/icons/shortcut-home.png",
"sizes": "96x96",
"type": "image/png"
}
]
},
{
"name": "Panel Management",
"short_name": "Panel",
"description": "Manage survey panels",
"url": "/panel.php",
"icons": [
{
"src": "/icons/shortcut-panel.png",
"sizes": "96x96",
"type": "image/png"
}
]
},
{
"name": "Analytics",
"short_name": "Stats",
"description": "View analytics and reports",
"url": "/analytics.php",
"icons": [
{
"src": "/icons/shortcut-analytics.png",
"sizes": "96x96",
"type": "image/png"
}
]
},
{
"name": "Support",
"short_name": "Help",
"description": "Get support and help",
"url": "/tickets.php",
"icons": [
{
"src": "/icons/shortcut-support.png",
"sizes": "96x96",
"type": "image/png"
}
]
}
],
"screenshots": [
{
"src": "/screenshots/desktop-home.png",
"sizes": "1280x720",
"type": "image/png",
"form_factor": "wide",
"label": "Dashboard overview on desktop"
},
{
"src": "/screenshots/mobile-home.png",
"sizes": "375x812",
"type": "image/png",
"form_factor": "narrow",
"label": "Dashboard overview on mobile"
},
{
"src": "/screenshots/mobile-panel.png",
"sizes": "375x812",
"type": "image/png",
"form_factor": "narrow",
"label": "Panel management on mobile"
},
{
"src": "/screenshots/mobile-analytics.png",
"sizes": "375x812",
"type": "image/png",
"form_factor": "narrow",
"label": "Analytics dashboard on mobile"
}
],
"related_applications": [
{
"platform": "play",
"url": "https://play.google.com/store/apps/details?id=com.relevantreflex.panel",
"id": "com.relevantreflex.panel"
},
{
"platform": "itunes",
"url": "https://apps.apple.com/app/relevantreflex-panel/id123456789",
"id": "123456789"
}
],
"prefer_related_applications": false,
"protocol_handlers": [
{
"protocol": "web+relevantreflex",
"url": "/handle-protocol?url=%s"
}
],
"share_target": {
"action": "/share-handler",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"url": "url",
"files": [
{
"name": "file",
"accept": [
"image/*",
"text/csv",
".xlsx",
".pdf"
]
}
]
}
},
"file_handlers": [
{
"action": "/handle-csv",
"accept": {
"text/csv": [".csv"],
"application/vnd.ms-excel": [".xls"],
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [".xlsx"]
}
}
],
"launch_handler": {
"client_mode": "navigate-existing"
},
"handle_links": "preferred",
"edge_side_panel": {
"preferred_width": 400
},
"id": "relevantreflex-panel-management",
"iarc_rating_id": "e84b072d-71b3-4d3e-86ae-31a8ce4e53b7"
}
-------------------- END OF FILE --------------------
### FILE 3: offline.html
- Type: HTML
- Size: 16.62 KB
- Path: .
- Name: offline.html
------------------------------------------------------------
Offline - RelevantReflex
📡
You're Offline
It looks like you're not connected to the internet. Don't worry - you can still access some features using cached data.
Offline
While You're Offline
-
1
View previously loaded dashboard data and analytics
-
2
Check your network connection or try moving to a different location
-
3
Your changes will sync automatically when you're back online
-------------------- END OF FILE --------------------
### FILE 4: sw.js
- Type: JS
- Size: 12.26 KB
- Path: .
- Name: sw.js
------------------------------------------------------------
// Service Worker for RelevantReflex Panel Management
// Version: 2.1.0
// Optimized for mobile devices and offline functionality
const CACHE_NAME = 'relevantreflex-v2.1.0';
const OFFLINE_CACHE = 'relevantreflex-offline-v2.1.0';
const DYNAMIC_CACHE = 'relevantreflex-dynamic-v2.1.0';
// Resources to cache for offline functionality
const STATIC_ASSETS = [
'/',
'/index.php',
'/assets/css/style.css',
'/assets/js/app.js',
'/manifest.json',
'/offline.html', // Fallback page
// Critical fonts (subset for mobile)
'https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap',
// Essential icons
'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css',
// App icons
'/icons/icon-192x192.png',
'/icons/icon-512x512.png',
// Offline assets
'/images/offline-illustration.svg'
];
// Pages that should work offline
const OFFLINE_PAGES = [
'/',
'/index.php',
'/analytics.php',
'/users.php',
'/panel.php',
'/finance.php',
'/tickets.php',
'/settings.php'
];
// Network-first resources (always try network)
const NETWORK_FIRST = [
'/api/',
'/ajax/',
'/login.php',
'/logout.php'
];
// Cache-first resources (images, fonts, etc.)
const CACHE_FIRST = [
'.png',
'.jpg',
'.jpeg',
'.svg',
'.webp',
'.woff',
'.woff2',
'.ttf',
'.css',
'.js'
];
// Install Service Worker
self.addEventListener('install', (event) => {
console.log('🔧 Service Worker installing...');
event.waitUntil(
Promise.all([
// Cache static assets
caches.open(CACHE_NAME).then((cache) => {
console.log('📦 Caching static assets');
return cache.addAll(STATIC_ASSETS);
}),
// Cache offline pages
caches.open(OFFLINE_CACHE).then((cache) => {
console.log('📱 Caching offline pages');
return cache.addAll(OFFLINE_PAGES);
})
]).then(() => {
console.log('✅ Service Worker installed successfully');
// Force activation of new service worker
return self.skipWaiting();
}).catch((error) => {
console.error('❌ Service Worker installation failed:', error);
})
);
});
// Activate Service Worker
self.addEventListener('activate', (event) => {
console.log('🚀 Service Worker activating...');
event.waitUntil(
Promise.all([
// Clean up old caches
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME &&
cacheName !== OFFLINE_CACHE &&
cacheName !== DYNAMIC_CACHE) {
console.log('🗑️ Deleting old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
}),
// Take control of all clients
self.clients.claim()
]).then(() => {
console.log('✅ Service Worker activated successfully');
})
);
});
// Fetch event handler
self.addEventListener('fetch', (event) => {
const request = event.request;
const url = new URL(request.url);
// Skip non-GET requests and chrome-extension requests
if (request.method !== 'GET' || url.protocol === 'chrome-extension:') {
return;
}
// Handle different request types with appropriate strategies
if (isNetworkFirst(url.pathname)) {
event.respondWith(handleNetworkFirst(request));
} else if (isCacheFirst(url.pathname)) {
event.respondWith(handleCacheFirst(request));
} else if (isOfflinePage(url.pathname)) {
event.respondWith(handleStaleWhileRevalidate(request));
} else {
event.respondWith(handleDefault(request));
}
});
// Network-first strategy (for dynamic content)
async function handleNetworkFirst(request) {
try {
console.log('🌐 Network-first:', request.url);
// Add timeout for mobile networks
const networkResponse = await Promise.race([
fetch(request),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Network timeout')), 3000)
)
]);
// Cache successful responses
if (networkResponse.ok) {
const cache = await caches.open(DYNAMIC_CACHE);
cache.put(request, networkResponse.clone());
}
return networkResponse;
} catch (error) {
console.log('📱 Network failed, trying cache:', request.url);
// Fallback to cache
const cachedResponse = await caches.match(request);
if (cachedResponse) {
return cachedResponse;
}
// Return offline page for navigation requests
if (request.mode === 'navigate') {
return caches.match('/offline.html');
}
// Return generic offline response
return new Response('Offline - Content not available', {
status: 503,
statusText: 'Service Unavailable',
headers: { 'Content-Type': 'text/plain' }
});
}
}
// Cache-first strategy (for static assets)
async function handleCacheFirst(request) {
console.log('📦 Cache-first:', request.url);
const cachedResponse = await caches.match(request);
if (cachedResponse) {
return cachedResponse;
}
try {
const networkResponse = await fetch(request);
if (networkResponse.ok) {
const cache = await caches.open(CACHE_NAME);
cache.put(request, networkResponse.clone());
}
return networkResponse;
} catch (error) {
console.log('❌ Cache-first failed:', request.url);
// Return placeholder for images
if (request.destination === 'image') {
return new Response(
'',
{ headers: { 'Content-Type': 'image/svg+xml' } }
);
}
throw error;
}
}
// Stale-while-revalidate strategy (for app pages)
async function handleStaleWhileRevalidate(request) {
console.log('🔄 Stale-while-revalidate:', request.url);
const cache = await caches.open(OFFLINE_CACHE);
const cachedResponse = await cache.match(request);
// Fetch in background and update cache
const networkResponsePromise = fetch(request).then(async (networkResponse) => {
if (networkResponse.ok) {
cache.put(request, networkResponse.clone());
}
return networkResponse;
}).catch(() => null);
// Return cached version immediately if available
if (cachedResponse) {
return cachedResponse;
}
// Wait for network if no cached version
const networkResponse = await networkResponsePromise;
if (networkResponse) {
return networkResponse;
}
// Fallback to offline page
return caches.match('/offline.html');
}
// Default strategy
async function handleDefault(request) {
console.log('🔧 Default strategy:', request.url);
try {
const networkResponse = await fetch(request);
return networkResponse;
} catch (error) {
const cachedResponse = await caches.match(request);
if (cachedResponse) {
return cachedResponse;
}
if (request.mode === 'navigate') {
return caches.match('/offline.html');
}
throw error;
}
}
// Helper functions
function isNetworkFirst(pathname) {
return NETWORK_FIRST.some(pattern => pathname.includes(pattern));
}
function isCacheFirst(pathname) {
return CACHE_FIRST.some(ext => pathname.includes(ext));
}
function isOfflinePage(pathname) {
return OFFLINE_PAGES.some(page =>
pathname === page || pathname === page.replace('.php', '')
);
}
// Background sync for mobile
self.addEventListener('sync', (event) => {
console.log('🔄 Background sync triggered:', event.tag);
if (event.tag === 'background-sync') {
event.waitUntil(doBackgroundSync());
}
});
async function doBackgroundSync() {
try {
// Sync pending data when back online
console.log('📡 Performing background sync...');
// Get any stored offline actions
const offlineActions = await getStoredOfflineActions();
for (const action of offlineActions) {
try {
await fetch(action.url, {
method: action.method,
headers: action.headers,
body: action.body
});
// Remove successfully synced action
await removeStoredOfflineAction(action.id);
console.log('✅ Synced action:', action.id);
} catch (error) {
console.log('❌ Failed to sync action:', action.id, error);
}
}
} catch (error) {
console.error('❌ Background sync failed:', error);
}
}
// Push notifications for mobile
self.addEventListener('push', (event) => {
console.log('📱 Push notification received');
const options = {
body: event.data ? event.data.text() : 'New update available',
icon: '/icons/icon-192x192.png',
badge: '/icons/badge-72x72.png',
vibrate: [100, 50, 100],
data: {
dateOfArrival: Date.now(),
primaryKey: 1
},
actions: [
{
action: 'explore',
title: 'View',
icon: '/icons/checkmark.png'
},
{
action: 'close',
title: 'Close',
icon: '/icons/xmark.png'
}
],
tag: 'relevantreflex-notification'
};
event.waitUntil(
self.registration.showNotification('RelevantReflex', options)
);
});
// Handle notification clicks
self.addEventListener('notificationclick', (event) => {
console.log('🔔 Notification clicked:', event.action);
event.notification.close();
if (event.action === 'explore') {
event.waitUntil(
clients.openWindow('/')
);
}
});
// Periodic background sync (for mobile PWAs)
self.addEventListener('periodicsync', (event) => {
console.log('⏰ Periodic sync triggered:', event.tag);
if (event.tag === 'content-sync') {
event.waitUntil(
updateCriticalData()
);
}
});
async function updateCriticalData() {
try {
console.log('📊 Updating critical data...');
// Update dashboard data
const dashboardResponse = await fetch('/api/dashboard-summary');
if (dashboardResponse.ok) {
const cache = await caches.open(DYNAMIC_CACHE);
cache.put('/api/dashboard-summary', dashboardResponse.clone());
}
// Update notifications count
const notificationsResponse = await fetch('/api/notifications/count');
if (notificationsResponse.ok) {
const cache = await caches.open(DYNAMIC_CACHE);
cache.put('/api/notifications/count', notificationsResponse.clone());
}
console.log('✅ Critical data updated');
} catch (error) {
console.error('❌ Failed to update critical data:', error);
}
}
// Cache management for mobile (prevent cache overflow)
async function manageCacheSize() {
const cache = await caches.open(DYNAMIC_CACHE);
const requests = await cache.keys();
// Remove oldest entries if cache is too large (mobile memory management)
if (requests.length > 50) {
const oldestRequests = requests.slice(0, requests.length - 40);
await Promise.all(
oldestRequests.map(request => cache.delete(request))
);
console.log(`🗑️ Cleaned up ${oldestRequests.length} old cache entries`);
}
}
// Run cache management periodically
setInterval(manageCacheSize, 300000); // Every 5 minutes
// Utility functions for offline actions
async function getStoredOfflineActions() {
try {
const cache = await caches.open('offline-actions');
const response = await cache.match('/offline-actions.json');
if (response) {
return await response.json();
}
} catch (error) {
console.error('Failed to get stored offline actions:', error);
}
return [];
}
async function removeStoredOfflineAction(actionId) {
try {
const actions = await getStoredOfflineActions();
const updatedActions = actions.filter(action => action.id !== actionId);
const cache = await caches.open('offline-actions');
await cache.put('/offline-actions.json', new Response(JSON.stringify(updatedActions)));
} catch (error) {
console.error('Failed to remove offline action:', error);
}
}
// Error handling
self.addEventListener('error', (event) => {
console.error('💥 Service Worker error:', event.error);
});
self.addEventListener('unhandledrejection', (event) => {
console.error('💥 Service Worker unhandled rejection:', event.reason);
});
console.log('📱 RelevantReflex Service Worker loaded - optimized for mobile');
-------------------- END OF FILE --------------------
### FILE 5: assets/css/style.css
- Type: CSS
- Size: 43.17 KB
- Path: assets/css
- Name: style.css
------------------------------------------------------------
/* Force Firefox to use new styles - v2.1.1 */
:root {
/* International Corporate Color Palette - Inspired by global brands */
--primary: #0052CC; /* Professional Blue (Atlassian-inspired) */
--primary-light: #0065FF; /* Vibrant Blue */
--primary-dark: #003884; /* Deep Corporate Blue */
--secondary: #00A86B; /* Emerald Green (International) */
--secondary-light: #00D084; /* Bright Emerald */
--secondary-dark: #008B57; /* Forest Green */
--accent: #FF6B35; /* Warm Orange (Global Appeal) */
--accent-light: #FF8A5B; /* Light Orange */
--accent-dark: #E5502A; /* Deep Orange */
--tertiary: #8B5CF6; /* Royal Purple */
--tertiary-light: #A78BFA; /* Light Purple */
--quaternary: #F59E0B; /* Golden Yellow */
--quaternary-light: #FCD34D; /* Light Gold */
/* Professional Status Colors */
--success: #10B981; /* International Green */
--warning: #F59E0B; /* Amber Warning */
--danger: #EF4444; /* Alert Red */
--info: #3B82F6; /* Info Blue */
/* Sophisticated Neutral Palette */
--white: #FFFFFF;
--black: #000000;
--gray-25: #FCFCFD; /* Ultra Light */
--gray-50: #F8FAFC; /* Very Light */
--gray-100: #F1F5F9; /* Light */
--gray-200: #E2E8F0; /* Light Gray */
--gray-300: #CBD5E1; /* Medium Light */
--gray-400: #94A3B8; /* Medium */
--gray-500: #64748B; /* Medium Dark */
--gray-600: #475569; /* Dark */
--gray-700: #334155; /* Very Dark */
--gray-800: #1E293B; /* Ultra Dark */
--gray-900: #0F172A; /* Nearly Black */
/* Corporate Background Variations */
--bg-primary: #FFFFFF;
--bg-secondary: #F8FAFC;
--bg-tertiary: #F1F5F9;
--bg-accent: linear-gradient(135deg, #0052CC 0%, #0065FF 100%);
/* International Typography Scale */
--text-xs: clamp(0.75rem, 1.5vw + 0.5rem, 0.875rem);
--text-sm: clamp(0.875rem, 1.8vw + 0.6rem, 1rem);
--text-base: clamp(1rem, 2.2vw + 0.7rem, 1.125rem);
--text-lg: clamp(1.125rem, 2.5vw + 0.8rem, 1.25rem);
--text-xl: clamp(1.25rem, 3vw + 0.9rem, 1.5rem);
--text-2xl: clamp(1.5rem, 4vw + 1rem, 2rem);
--text-3xl: clamp(2rem, 5vw + 1.2rem, 2.5rem);
--text-4xl: clamp(2.5rem, 6vw + 1.5rem, 3.5rem);
--text-5xl: clamp(3rem, 8vw + 2rem, 4.5rem);
/* Professional Spacing System */
--space-xs: 0.25rem; /* 4px */
--space-sm: 0.5rem; /* 8px */
--space-md: 0.75rem; /* 12px */
--space-lg: 1rem; /* 16px */
--space-xl: 1.5rem; /* 24px */
--space-2xl: 2rem; /* 32px */
--space-3xl: 3rem; /* 48px */
--space-4xl: 4rem; /* 64px */
--space-5xl: 6rem; /* 96px */
/* Corporate Layout Dimensions */
--header-height-mobile: 64px;
--header-height-tablet: 72px;
--header-height-desktop: 80px;
--sidebar-width: 280px;
--container-max-width: 1400px;
/* International Border Radius */
--radius-none: 0;
--radius-xs: 2px;
--radius-sm: 4px;
--radius: 6px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--radius-2xl: 24px;
--radius-full: 9999px;
/* Corporate Shadow System */
--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
--shadow-colored: 0 10px 15px -3px rgb(0 82 204 / 0.1), 0 4px 6px -4px rgb(0 82 204 / 0.1);
/* Professional Gradients */
--gradient-primary: linear-gradient(135deg, #0052CC 0%, #0065FF 100%);
--gradient-secondary: linear-gradient(135deg, #00A86B 0%, #00D084 100%);
--gradient-accent: linear-gradient(135deg, #FF6B35 0%, #FF8A5B 100%);
--gradient-hero: linear-gradient(135deg, #0052CC 0%, #8B5CF6 50%, #FF6B35 100%);
--gradient-surface: linear-gradient(135deg, #FFFFFF 0%, #F8FAFC 100%);
/* International Transitions */
--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1);
/* Corporate Borders */
--border-light: 1px solid var(--gray-200);
--border-medium: 2px solid var(--gray-300);
--border-primary: 2px solid var(--primary);
--border-accent: 2px solid var(--accent);
}
/* Advanced CSS Reset */
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* International Typography Foundation */
html {
font-size: 16px;
scroll-behavior: smooth;
text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: transparent;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
font-family: 'Inter', 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', Arial, sans-serif;
font-size: var(--text-base);
font-weight: 400;
line-height: 1.6;
color: var(--gray-800);
background: var(--bg-secondary);
overflow-x: hidden;
min-height: 100vh;
min-height: 100dvh;
letter-spacing: -0.005em;
text-rendering: optimizeLegibility;
}
/* Professional Typography Hierarchy */
h1, h2, h3, h4, h5, h6 {
font-family: 'Manrope', 'Inter', system-ui, sans-serif;
font-weight: 700;
line-height: 1.2;
color: var(--gray-900);
margin-bottom: var(--space-md);
letter-spacing: -0.025em;
text-wrap: balance;
}
h1 {
font-size: var(--text-5xl);
font-weight: 800;
background: var(--gradient-hero);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
h2 {
font-size: var(--text-4xl);
font-weight: 700;
color: var(--gray-900);
}
h3 {
font-size: var(--text-3xl);
font-weight: 600;
}
h4 {
font-size: var(--text-2xl);
font-weight: 600;
}
h5 {
font-size: var(--text-xl);
font-weight: 500;
}
h6 {
font-size: var(--text-lg);
font-weight: 500;
}
/* International Header Design */
.header {
position: sticky;
top: 0;
z-index: 1000;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-bottom: var(--border-light);
box-shadow: var(--shadow-sm);
height: var(--header-height-mobile);
transition: all var(--transition-normal);
}
.header-content {
display: flex;
align-items: center;
justify-content: space-between;
height: 100%;
padding: 0 var(--space-lg);
max-width: var(--container-max-width);
margin: 0 auto;
position: relative;
}
/* Corporate Logo Design */
.logo {
display: flex;
align-items: center;
gap: var(--space-md);
text-decoration: none;
color: inherit;
transition: all var(--transition-fast);
touch-action: manipulation;
}
.logo:hover {
transform: translateY(-1px);
}
.logo-icon {
width: 48px;
height: 48px;
background: var(--gradient-primary);
border-radius: var(--radius-lg);
display: flex;
align-items: center;
justify-content: center;
color: var(--white);
font-size: 1.25rem;
font-weight: 800;
font-family: 'Manrope', sans-serif;
box-shadow: var(--shadow-colored);
position: relative;
overflow: hidden;
flex-shrink: 0;
}
.logo-icon::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, transparent 30%, rgba(255,255,255,0.2) 50%, transparent 70%);
transform: translateX(-100%);
transition: transform 0.6s ease;
}
.logo:hover .logo-icon::before {
transform: translateX(100%);
}
.logo-main {
font-size: var(--text-xl);
font-weight: 800;
font-family: 'Manrope', sans-serif;
background: var(--gradient-primary);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: -0.02em;
}
/* International Navigation System */
.main-nav {
display: none;
align-items: center;
gap: var(--space-xs);
flex: 1;
justify-content: center;
max-width: 800px;
margin: 0 var(--space-2xl);
background: var(--white);
border: var(--border-light);
border-radius: var(--radius-2xl);
padding: var(--space-sm);
box-shadow: var(--shadow-md);
}
.nav-section {
display: flex;
align-items: center;
gap: var(--space-xs);
}
.nav-divider {
width: 1px;
height: 36px;
background: var(--gray-200);
margin: 0 var(--space-md);
}
.nav-item {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-xs);
padding: var(--space-md) var(--space-lg);
color: var(--gray-600);
text-decoration: none;
border-radius: var(--radius-lg);
font-weight: 500;
font-size: var(--text-xs);
white-space: nowrap;
min-width: 70px;
position: relative;
transition: all var(--transition-fast);
touch-action: manipulation;
}
.nav-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--gradient-primary);
border-radius: var(--radius-lg);
opacity: 0;
transform: scale(0.8);
transition: all var(--transition-normal);
}
.nav-item:hover::before {
opacity: 0.1;
transform: scale(1);
}
.nav-item:hover {
color: var(--primary);
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
.nav-item.active {
background: var(--gradient-primary);
color: var(--white);
box-shadow: var(--shadow-colored);
transform: translateY(-1px);
}
.nav-item.active::before {
display: none;
}
.nav-icon {
width: 20px;
height: 20px;
flex-shrink: 0;
font-size: 18px;
transition: transform var(--transition-fast);
}
.nav-item:hover .nav-icon {
transform: scale(1.1);
}
.nav-text {
font-size: var(--text-xs);
font-weight: 600;
font-family: 'Manrope', sans-serif;
text-align: center;
line-height: 1.2;
letter-spacing: 0.025em;
}
.nav-badge {
position: absolute;
top: var(--space-sm);
right: var(--space-sm);
background: var(--gradient-accent);
color: var(--white);
font-size: 0.625rem;
font-weight: 800;
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-full);
min-width: 20px;
text-align: center;
line-height: 1;
box-shadow: var(--shadow-md);
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.05);
opacity: 0.9;
}
}
/* Professional Action Buttons */
.header-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--space-md);
flex-shrink: 0;
height: 100%;
}
.action-buttons {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-md);
height: 100%;
}
.action-btn,
.profile-btn,
.mobile-menu-toggle {
width: 48px;
height: 48px;
border: var(--border-light);
background: var(--white);
border-radius: var(--radius-xl);
display: flex;
align-items: center;
justify-content: center;
color: var(--gray-600);
cursor: pointer;
font-size: 1rem;
font-weight: 600;
transition: all var(--transition-fast);
box-shadow: var(--shadow-xs);
touch-action: manipulation;
position: relative;
overflow: hidden;
flex-shrink: 0;
}
.action-btn::before,
.profile-btn::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--gradient-primary);
opacity: 0;
transition: opacity var(--transition-fast);
}
.action-btn:hover::before,
.profile-btn:hover::before {
opacity: 1;
}
.action-btn:hover,
.profile-btn:hover {
color: var(--white);
border-color: var(--primary);
transform: translateY(-2px);
box-shadow: var(--shadow-colored);
}
.profile-btn {
background: var(--gradient-primary);
color: var(--white);
border-color: var(--primary);
box-shadow: var(--shadow-colored);
}
.profile-btn:hover {
background: var(--gradient-accent);
border-color: var(--accent);
transform: translateY(-2px) scale(1.05);
}
.action-btn:hover,
.mobile-menu-toggle:hover {
background: var(--gradient-primary);
color: var(--white);
border-color: var(--primary);
transform: translateY(-2px);
box-shadow: var(--shadow-colored);
}
/* Enhanced Mobile Navigation */
.mobile-nav {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-top: var(--border-light);
padding: var(--space-lg);
z-index: 999;
box-shadow: var(--shadow-2xl);
display: flex;
justify-content: space-around;
height: 80px;
transform: translateY(100%);
transition: transform var(--transition-slow);
}
.mobile-nav.show {
transform: translateY(0);
}
.mobile-nav-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--space-xs);
padding: var(--space-sm);
text-decoration: none;
color: var(--gray-600);
font-size: var(--text-xs);
font-weight: 600;
font-family: 'Manrope', sans-serif;
border-radius: var(--radius-lg);
transition: all var(--transition-fast);
touch-action: manipulation;
position: relative;
}
.mobile-nav-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--gradient-primary);
border-radius: var(--radius-lg);
opacity: 0;
transform: scale(0.8);
transition: all var(--transition-normal);
}
.mobile-nav-item.active::before {
opacity: 1;
transform: scale(1);
}
.mobile-nav-item.active {
color: var(--white);
box-shadow: var(--shadow-colored);
}
.mobile-nav-item i {
font-size: 1.25rem;
z-index: 1;
}
.mobile-nav-item span {
z-index: 1;
}
/* International Main Content */
.main-content {
min-height: calc(100vh - var(--header-height-mobile));
min-height: calc(100dvh - var(--header-height-mobile));
padding-bottom: 100px; /* Mobile nav space */
background: var(--bg-secondary);
}
.content-area {
padding: var(--space-2xl) var(--space-lg);
max-width: var(--container-max-width);
margin: 0 auto;
width: 100%;
}
/* Corporate Page Header */
.page-header {
text-align: center;
margin-bottom: var(--space-4xl);
padding: var(--space-3xl) 0;
background: var(--gradient-surface);
border-radius: var(--radius-2xl);
box-shadow: var(--shadow-sm);
border: var(--border-light);
}
.page-title {
font-size: var(--text-4xl);
font-weight: 800;
font-family: 'Manrope', sans-serif;
background: var(--gradient-hero);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: var(--space-xl);
line-height: 1.1;
letter-spacing: -0.02em;
}
.page-subtitle {
color: var(--gray-600);
font-size: var(--text-lg);
font-weight: 400;
line-height: 1.6;
max-width: 600px;
margin: 0 auto;
letter-spacing: -0.01em;
}
/* International Grid System */
.stats-grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-xl);
margin-bottom: var(--space-4xl);
}
.content-grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-xl);
}
/* Premium Card System */
.content-card,
.stat-card {
background: var(--white);
border-radius: var(--radius-2xl);
border: var(--border-light);
box-shadow: var(--shadow-md);
overflow: hidden;
transition: all var(--transition-normal);
touch-action: manipulation;
position: relative;
}
.content-card::before,
.stat-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: var(--gradient-primary);
opacity: 0;
transition: opacity var(--transition-normal);
}
.content-card:hover::before,
.stat-card:hover::before {
opacity: 1;
}
.content-card:hover,
.stat-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-2xl);
border-color: var(--primary);
}
.stat-card {
padding: var(--space-2xl);
position: relative;
}
.stat-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: var(--gradient-primary);
}
.stat-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-xl);
margin-bottom: var(--space-xl);
}
.stat-icon {
width: 64px;
height: 64px;
border-radius: var(--radius-xl);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.75rem;
color: var(--white);
flex-shrink: 0;
position: relative;
overflow: hidden;
order: 2;
box-shadow: var(--shadow-lg);
}
.stat-icon::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, transparent 30%, rgba(255,255,255,0.2) 50%, transparent 70%);
transform: translateX(-100%);
transition: transform 0.8s ease;
}
.stat-card:hover .stat-icon::before {
transform: translateX(100%);
}
.stat-icon.primary {
background: var(--gradient-primary);
}
.stat-icon.success {
background: var(--gradient-secondary);
}
.stat-icon.warning {
background: linear-gradient(135deg, var(--quaternary) 0%, var(--quaternary-light) 100%);
}
.stat-icon.danger {
background: var(--gradient-accent);
}
.stat-icon.info {
background: linear-gradient(135deg, var(--tertiary) 0%, var(--tertiary-light) 100%);
}
.stat-content {
text-align: left;
flex: 1;
order: 1;
}
.stat-label {
font-size: var(--text-sm);
color: var(--gray-500);
font-weight: 600;
font-family: 'Manrope', sans-serif;
margin-bottom: var(--space-md);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.stat-value {
font-size: var(--text-3xl);
font-weight: 800;
font-family: 'Manrope', sans-serif;
color: var(--gray-900);
line-height: 1;
margin-bottom: var(--space-lg);
letter-spacing: -0.02em;
}
.stat-change {
display: inline-flex;
align-items: center;
gap: var(--space-sm);
font-size: var(--text-sm);
font-weight: 600;
font-family: 'Manrope', sans-serif;
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-full);
background: var(--gray-100);
color: var(--gray-700);
box-shadow: var(--shadow-xs);
}
.stat-change.positive {
color: var(--secondary);
background: rgba(0, 168, 107, 0.1);
border: 1px solid rgba(0, 168, 107, 0.2);
}
.stat-change.negative {
color: var(--danger);
background: rgba(239, 68, 68, 0.1);
border: 1px solid rgba(239, 68, 68, 0.2);
}
/* International Card Components */
.card-header {
padding: var(--space-2xl) var(--space-2xl) var(--space-xl);
border-bottom: var(--border-light);
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-lg);
background: var(--gradient-surface);
}
.card-title {
font-size: var(--text-xl);
font-weight: 700;
font-family: 'Manrope', sans-serif;
color: var(--gray-900);
flex: 1;
letter-spacing: -0.01em;
}
.card-action {
color: var(--primary);
text-decoration: none;
font-size: var(--text-sm);
font-weight: 600;
font-family: 'Manrope', sans-serif;
padding: var(--space-md) var(--space-lg);
border-radius: var(--radius-lg);
border: var(--border-light);
background: var(--white);
transition: all var(--transition-fast);
touch-action: manipulation;
flex-shrink: 0;
position: relative;
overflow: hidden;
}
.card-action::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--gradient-primary);
opacity: 0;
transition: opacity var(--transition-fast);
}
.card-action:hover::before {
opacity: 1;
}
.card-action:hover {
color: var(--white);
border-color: var(--primary);
transform: translateY(-1px);
box-shadow: var(--shadow-colored);
}
.card-content {
padding: var(--space-2xl);
}
/* Enhanced Activity Items */
.activity-item {
display: flex;
gap: var(--space-xl);
padding: var(--space-xl) 0;
border-bottom: var(--border-light);
transition: all var(--transition-fast);
position: relative;
}
.activity-item::before {
content: '';
position: absolute;
left: -var(--space-xl);
right: -var(--space-xl);
top: 0;
bottom: 0;
background: var(--gradient-surface);
border-radius: var(--radius-lg);
opacity: 0;
transition: opacity var(--transition-fast);
}
.activity-item:hover::before {
opacity: 1;
}
.activity-item:last-child {
border-bottom: none;
}
.activity-icon {
width: 52px;
height: 52px;
border-radius: var(--radius-xl);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.25rem;
flex-shrink: 0;
color: var(--white);
box-shadow: var(--shadow-md);
position: relative;
z-index: 1;
}
.activity-icon.primary { background: var(--gradient-primary); }
.activity-icon.success { background: var(--gradient-secondary); }
.activity-icon.warning { background: linear-gradient(135deg, var(--quaternary) 0%, var(--quaternary-light) 100%); }
.activity-icon.danger { background: var(--gradient-accent); }
.activity-content {
flex: 1;
min-width: 0;
position: relative;
z-index: 1;
}
.activity-title {
font-weight: 600;
font-family: 'Manrope', sans-serif;
color: var(--gray-900);
font-size: var(--text-base);
margin-bottom: var(--space-sm);
line-height: 1.4;
word-wrap: break-word;
}
.activity-time {
font-size: var(--text-sm);
color: var(--gray-500);
font-weight: 500;
}
/* Premium Member Items */
.member-item {
display: flex;
align-items: center;
gap: var(--space-xl);
padding: var(--space-xl) 0;
border-bottom: var(--border-light);
transition: all var(--transition-fast);
position: relative;
}
.member-item::before {
content: '';
position: absolute;
left: -var(--space-xl);
right: -var(--space-xl);
top: 0;
bottom: 0;
background: var(--gradient-surface);
border-radius: var(--radius-lg);
opacity: 0;
transition: opacity var(--transition-fast);
}
.member-item:hover::before {
opacity: 1;
}
.member-item:last-child {
border-bottom: none;
}
.member-avatar {
width: 52px;
height: 52px;
border-radius: var(--radius-full);
background: var(--gradient-primary);
display: flex;
align-items: center;
justify-content: center;
color: var(--white);
font-weight: 800;
font-size: var(--text-lg);
font-family: 'Manrope', sans-serif;
flex-shrink: 0;
box-shadow: var(--shadow-colored);
position: relative;
z-index: 1;
}
.member-info {
flex: 1;
min-width: 0;
position: relative;
z-index: 1;
}
.member-name {
font-weight: 600;
font-family: 'Manrope', sans-serif;
color: var(--gray-900);
font-size: var(--text-base);
margin-bottom: var(--space-xs);
word-wrap: break-word;
}
.member-location {
font-size: var(--text-sm);
color: var(--gray-500);
word-wrap: break-word;
}
/* International Status Badges */
.status-badge {
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-full);
font-size: var(--text-xs);
font-weight: 700;
font-family: 'Manrope', sans-serif;
text-transform: uppercase;
letter-spacing: 0.05em;
background: var(--gray-100);
color: var(--gray-700);
border: var(--border-light);
flex-shrink: 0;
white-space: nowrap;
position: relative;
z-index: 1;
box-shadow: var(--shadow-xs);
}
.status-badge.active {
background: rgba(0, 168, 107, 0.1);
color: var(--secondary);
border: 1px solid rgba(0, 168, 107, 0.3);
box-shadow: 0 0 0 0px rgba(0, 168, 107, 0.1);
}
.status-badge.pending {
background: var(--gradient-primary);
color: var(--white);
border-color: var(--primary);
box-shadow: var(--shadow-colored);
}
.status-badge.inactive {
background: rgba(239, 68, 68, 0.1);
color: var(--danger);
border: 1px solid rgba(239, 68, 68, 0.3);
}
/* Enhanced Survey Items */
.survey-item {
padding: var(--space-2xl);
border: var(--border-light);
border-radius: var(--radius-2xl);
margin-bottom: var(--space-xl);
background: var(--white);
transition: all var(--transition-normal);
touch-action: manipulation;
position: relative;
box-shadow: var(--shadow-sm);
}
.survey-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--gradient-surface);
border-radius: var(--radius-2xl);
opacity: 0;
transition: opacity var(--transition-normal);
}
.survey-item:hover::before {
opacity: 1;
}
.survey-item:hover {
transform: translateY(-2px);
border-color: var(--primary);
box-shadow: var(--shadow-2xl);
}
.survey-item:last-child {
margin-bottom: 0;
}
.survey-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-lg);
margin-bottom: var(--space-lg);
position: relative;
z-index: 1;
}
.survey-title {
font-weight: 700;
font-family: 'Manrope', sans-serif;
color: var(--gray-900);
font-size: var(--text-lg);
flex: 1;
line-height: 1.3;
word-wrap: break-word;
}
.survey-meta {
display: flex;
flex-direction: column;
gap: var(--space-sm);
font-size: var(--text-sm);
position: relative;
z-index: 1;
}
.survey-details {
color: var(--gray-600);
font-weight: 500;
}
.survey-progress {
font-weight: 700;
font-family: 'Manrope', sans-serif;
color: var(--primary);
}
/* Corporate Quick Actions */
.quick-actions {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-lg);
}
.quick-action-btn {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--space-lg);
padding: var(--space-2xl);
border-radius: var(--radius-2xl);
text-decoration: none;
font-weight: 600;
font-size: var(--text-base);
font-family: 'Manrope', sans-serif;
border: var(--border-light);
background: var(--white);
color: var(--gray-900);
transition: all var(--transition-normal);
touch-action: manipulation;
position: relative;
overflow: hidden;
box-shadow: var(--shadow-sm);
min-height: 120px;
}
.quick-action-btn::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
transition: opacity var(--transition-normal);
}
.quick-action-btn:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-2xl);
}
.quick-action-btn i {
font-size: 2rem;
z-index: 1;
}
.quick-action-btn span {
z-index: 1;
}
.quick-action-btn.primary {
background: var(--gradient-primary);
color: var(--white);
border-color: var(--primary);
box-shadow: var(--shadow-colored);
}
.quick-action-btn.success {
background: rgba(0, 168, 107, 0.1);
color: var(--secondary);
border: 1px solid rgba(0, 168, 107, 0.3);
}
.quick-action-btn.success::before {
background: var(--gradient-secondary);
}
.quick-action-btn.warning {
background: rgba(245, 158, 11, 0.1);
color: var(--quaternary);
border: 1px solid rgba(245, 158, 11, 0.3);
}
.quick-action-btn.warning::before {
background: linear-gradient(135deg, var(--quaternary) 0%, var(--quaternary-light) 100%);
}
.quick-action-btn.danger {
background: rgba(255, 107, 53, 0.1);
color: var(--accent);
border: 1px solid rgba(255, 107, 53, 0.3);
}
.quick-action-btn.danger::before {
background: var(--gradient-accent);
}
.quick-action-btn.success:hover::before,
.quick-action-btn.warning:hover::before,
.quick-action-btn.danger:hover::before {
opacity: 1;
}
.quick-action-btn.success:hover,
.quick-action-btn.warning:hover,
.quick-action-btn.danger:hover {
color: var(--white);
border-color: transparent;
}
/* Premium System Status */
.system-status {
display: flex;
flex-direction: column;
gap: var(--space-lg);
}
.status-item {
display: flex;
align-items: center;
gap: var(--space-lg);
padding: var(--space-lg) var(--space-xl);
background: var(--gradient-surface);
border-radius: var(--radius-xl);
border: var(--border-light);
transition: all var(--transition-fast);
box-shadow: var(--shadow-xs);
}
.status-item:hover {
background: var(--white);
box-shadow: var(--shadow-md);
transform: translateY(-1px);
}
.status-indicator {
width: 14px;
height: 14px;
border-radius: var(--radius-full);
flex-shrink: 0;
background: var(--gray-400);
position: relative;
}
.status-indicator::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 6px;
height: 6px;
border-radius: var(--radius-full);
background: currentColor;
}
.status-indicator.active {
background: rgba(0, 168, 107, 0.2);
color: var(--secondary);
box-shadow: 0 0 0 3px rgba(0, 168, 107, 0.1);
}
.status-indicator.warning {
background: rgba(245, 158, 11, 0.2);
color: var(--quaternary);
box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);
}
.status-indicator.danger {
background: rgba(239, 68, 68, 0.2);
color: var(--danger);
box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
}
.status-info {
flex: 1;
min-width: 0;
}
.status-name {
font-weight: 600;
font-family: 'Manrope', sans-serif;
color: var(--gray-900);
font-size: var(--text-base);
margin-bottom: var(--space-xs);
}
.status-value {
font-size: var(--text-sm);
color: var(--gray-500);
word-wrap: break-word;
}
/* International Chart Placeholder */
.chart-placeholder {
height: 280px;
background: var(--gradient-surface);
border-radius: var(--radius-2xl);
display: flex;
align-items: center;
justify-content: center;
border: 2px dashed var(--gray-300);
text-align: center;
padding: var(--space-2xl);
position: relative;
overflow: hidden;
}
.chart-placeholder::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--gradient-primary);
opacity: 0.02;
}
.chart-content {
color: var(--gray-500);
z-index: 1;
}
.chart-icon {
font-size: 4rem;
margin-bottom: var(--space-xl);
opacity: 0.6;
color: var(--primary);
background: var(--gradient-primary);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.chart-title {
font-size: var(--text-xl);
margin-bottom: var(--space-md);
font-weight: 700;
font-family: 'Manrope', sans-serif;
color: var(--gray-900);
}
.chart-subtitle {
font-size: var(--text-base);
color: var(--gray-500);
line-height: 1.6;
}
/* Corporate Footer */
.footer {
background: var(--gray-900);
color: var(--white);
margin-top: var(--space-5xl);
position: relative;
overflow: hidden;
}
.footer::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg, var(--gray-900) 0%, var(--gray-800) 50%, var(--primary-dark) 100%);
}
.footer-content {
padding: var(--space-4xl) var(--space-lg) var(--space-3xl);
display: grid;
grid-template-columns: 1fr;
gap: var(--space-3xl);
position: relative;
z-index: 1;
}
.footer-section h4.footer-title {
font-size: var(--text-xl);
font-weight: 700;
font-family: 'Manrope', sans-serif;
margin-bottom: var(--space-xl);
color: var(--white);
}
.footer-description {
font-size: var(--text-base);
color: var(--gray-300);
line-height: 1.7;
margin-top: var(--space-xl);
}
.footer-links {
list-style: none;
}
.footer-links li {
margin-bottom: var(--space-md);
}
.footer-links a {
color: var(--gray-300);
text-decoration: none;
font-size: var(--text-base);
transition: all var(--transition-fast);
touch-action: manipulation;
display: block;
padding: var(--space-sm) 0;
position: relative;
}
.footer-links a::before {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 0;
height: 2px;
background: var(--gradient-secondary);
transition: width var(--transition-normal);
}
.footer-links a:hover::before {
width: 20px;
}
.footer-links a:hover {
color: var(--secondary);
transform: translateX(4px);
}
.social-links {
display: flex;
gap: var(--space-lg);
margin: var(--space-xl) 0;
flex-wrap: wrap;
}
.social-link {
width: 52px;
height: 52px;
background: var(--gray-800);
border-radius: var(--radius-xl);
display: flex;
align-items: center;
justify-content: center;
color: var(--gray-300);
text-decoration: none;
border: var(--border-light);
transition: all var(--transition-normal);
touch-action: manipulation;
position: relative;
overflow: hidden;
}
.social-link::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--gradient-secondary);
opacity: 0;
transition: opacity var(--transition-fast);
}
.social-link:hover::before {
opacity: 1;
}
.social-link:hover {
color: var(--white);
transform: translateY(-4px) scale(1.1);
box-shadow: var(--shadow-2xl);
}
.social-link i {
z-index: 1;
font-size: 1.25rem;
}
.contact-info p {
font-size: var(--text-base);
color: var(--gray-300);
margin-bottom: var(--space-lg);
display: flex;
align-items: flex-start;
gap: var(--space-lg);
line-height: 1.6;
}
.footer-bottom {
background: var(--black);
border-top: 1px solid var(--gray-700);
position: relative;
z-index: 1;
}
.footer-bottom-content {
padding: var(--space-2xl) var(--space-lg);
text-align: center;
}
.copyright p {
font-size: var(--text-sm);
color: var(--gray-400);
margin-bottom: var(--space-md);
line-height: 1.5;
}
.legal-text {
font-size: var(--text-xs);
color: var(--gray-500);
line-height: 1.5;
}
.footer-meta {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-lg);
margin-top: var(--space-xl);
font-size: var(--text-xs);
color: var(--gray-500);
}
.version-info {
display: flex;
gap: var(--space-lg);
}
.server-status {
display: flex;
align-items: center;
gap: var(--space-sm);
}
/* International Animations */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(40px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideInRight {
from {
opacity: 0;
transform: translateX(30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
.fade-in-up {
animation: fadeInUp 0.8s cubic-bezier(0.4, 0, 0.2, 1) both;
}
.slide-in-right {
animation: slideInRight 0.6s cubic-bezier(0.4, 0, 0.2, 1) both;
}
.scale-in {
animation: scaleIn 0.5s cubic-bezier(0.4, 0, 0.2, 1) both;
}
.stagger-1 { animation-delay: 0.1s; }
.stagger-2 { animation-delay: 0.2s; }
.stagger-3 { animation-delay: 0.3s; }
.stagger-4 { animation-delay: 0.4s; }
@media (max-width: 767px) {
.header-content {
padding: 0 var(--space-lg);
gap: var(--space-md);
}
.header-actions {
gap: var(--space-sm);
}
.action-buttons {
gap: var(--space-sm);
}
.action-btn,
.profile-btn,
.mobile-menu-toggle {
width: 44px;
height: 44px;
font-size: 0.9375rem;
}
}
/* Tablet Responsive Design */
@media (min-width: 640px) {
.stats-grid {
grid-template-columns: repeat(2, 1fr);
}
.quick-actions {
grid-template-columns: repeat(2, 1fr);
}
.survey-meta {
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.footer-content {
grid-template-columns: repeat(2, 1fr);
}
.footer-meta {
flex-direction: row;
justify-content: space-between;
}
}
@media (min-width: 768px) {
.header {
height: var(--header-height-tablet);
}
.header-content {
padding: 0 var(--space-2xl);
gap: var(--space-xl);
}
.content-area {
padding: var(--space-3xl) var(--space-2xl);
}
.main-content {
min-height: calc(100vh - var(--header-height-tablet));
min-height: calc(100dvh - var(--header-height-tablet));
padding-bottom: 0;
}
.mobile-nav {
display: none;
}
.mobile-menu-toggle {
display: none;
}
.main-nav {
display: flex;
}
.action-buttons {
gap: var(--space-lg);
}
.action-btn,
.profile-btn,
.mobile-menu-toggle {
width: 50px;
height: 50px;
font-size: 1.0625rem;
}
.content-grid {
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
}
.footer-content {
grid-template-columns: repeat(3, 1fr);
padding: var(--space-5xl) var(--space-2xl) var(--space-4xl);
}
}
/* Desktop Responsive Design */
@media (min-width: 1024px) {
.header {
height: var(--header-height-desktop);
}
.header-content {
padding: 0 var(--space-3xl);
gap: var(--space-2xl);
}
.content-area {
padding: var(--space-4xl) var(--space-3xl);
}
.main-content {
min-height: calc(100vh - var(--header-height-desktop));
min-height: calc(100dvh - var(--header-height-desktop));
}
.stats-grid {
grid-template-columns: repeat(4, 1fr);
}
.content-grid {
grid-template-columns: repeat(auto-fit, minmax(420px, 1fr));
}
.quick-actions {
grid-template-columns: repeat(2, 1fr);
}
.footer-content {
grid-template-columns: repeat(5, 1fr);
padding: var(--space-5xl) var(--space-3xl) var(--space-4xl);
}
.footer-bottom-content {
padding: var(--space-2xl) var(--space-3xl);
display: flex;
align-items: center;
justify-content: space-between;
text-align: left;
}
.logo-icon {
width: 56px;
height: 56px;
font-size: 1.5rem;
}
.logo-main {
font-size: var(--text-2xl);
}
.action-btn,
.profile-btn,
.mobile-menu-toggle {
width: 52px;
height: 52px;
font-size: 1.125rem;
}
.action-buttons {
gap: var(--space-xl);
}
}
@media (min-width: 1280px) {
.header-content {
padding: 0 var(--space-4xl);
}
.content-area {
padding: var(--space-5xl) var(--space-4xl);
}
.footer-content {
padding: var(--space-5xl) var(--space-4xl) var(--space-4xl);
}
.footer-bottom-content {
padding: var(--space-2xl) var(--space-4xl);
}
}
/* High DPI and Retina Support */
@media (min-resolution: 2dppx) {
.logo-icon,
.stat-icon,
.activity-icon {
background-size: contain;
}
}
/* Accessibility and Motion Preferences */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
.fade-in-up,
.slide-in-right,
.scale-in {
animation: none !important;
}
}
/* High Contrast Mode Support */
@media (prefers-contrast: high) {
:root {
--gray-100: #f0f0f0;
--gray-200: #d0d0d0;
--gray-300: #b0b0b0;
--border-light: 2px solid var(--gray-400);
--border-medium: 3px solid var(--gray-600);
}
.content-card,
.stat-card,
.survey-item {
border-width: 2px;
}
}
/* Print Styles */
@media print {
.header,
.footer,
.mobile-nav,
.action-buttons,
.mobile-menu-toggle {
display: none;
}
.main-content {
margin: 0;
padding: 0;
min-height: auto;
}
.content-area {
padding: 1rem;
}
.content-card,
.stat-card {
break-inside: avoid;
border: 1px solid var(--gray-400);
box-shadow: none;
page-break-inside: avoid;
}
* {
background: transparent !important;
color: black !important;
box-shadow: none !important;
}
.gradient-text {
color: black !important;
background: none !important;
-webkit-text-fill-color: black !important;
}
}
/* Utility Classes */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.touch-target {
min-height: 44px;
min-width: 44px;
touch-action: manipulation;
}
.no-tap-highlight {
-webkit-tap-highlight-color: transparent;
}
.gradient-text {
background: var(--gradient-primary);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.safe-area-inset {
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
padding-bottom: env(safe-area-inset-bottom);
}
/* International Focus States */
.focus-ring:focus-visible,
*:focus-visible {
outline: 3px solid var(--primary);
outline-offset: 2px;
border-radius: var(--radius-sm);
}
/* Enhanced Loading States */
.loading {
pointer-events: none;
opacity: 0.7;
position: relative;
}
.loading::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 24px;
height: 24px;
margin: -12px 0 0 -12px;
border: 3px solid var(--gray-200);
border-top-color: var(--primary);
border-radius: var(--radius-full);
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* International Scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--gray-100);
border-radius: var(--radius);
}
::-webkit-scrollbar-thumb {
background: var(--gray-400);
border-radius: var(--radius);
transition: background var(--transition-fast);
}
::-webkit-scrollbar-thumb:hover {
background: var(--primary);
}
/* Selection Colors */
::selection {
background: rgba(0, 82, 204, 0.2);
color: var(--primary-dark);
}
::-moz-selection {
background: rgba(0, 82, 204, 0.2);
color: var(--primary-dark);
}
-------------------- END OF FILE --------------------
### FILE 6: assets/js/app.js
- Type: JS
- Size: 34.49 KB
- Path: assets/js
- Name: app.js
------------------------------------------------------------
// Enhanced Mobile-First Application Initialization
document.addEventListener('DOMContentLoaded', function() {
initializeMobileApp();
});
// Check if running on mobile device
const isMobileDevice = () => {
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||
(window.innerWidth <= 768 && 'ontouchstart' in window);
};
// Check if device supports touch
const isTouchDevice = () => {
return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
};
function initializeMobileApp() {
console.log('🚀 Initializing Mobile-First RelevantReflex System...');
console.log(`📱 Device: ${isMobileDevice() ? 'Mobile' : 'Desktop'}`);
console.log(`👆 Touch: ${isTouchDevice() ? 'Supported' : 'Not Supported'}`);
initializeMobileDetection();
initializeTouchInteractions();
initializeMobileNavigation();
initializeSwipeGestures();
initializeMobileAnimations();
initializePerformanceOptimizations();
initializeMobileAccessibility();
initializeOrientationHandling();
initializePWAFeatures();
initializeOfflineSupport();
console.log('✅ Mobile application initialization complete');
}
// Mobile Device Detection and Setup
function initializeMobileDetection() {
// Add device classes to body
const body = document.body;
if (isMobileDevice()) {
body.classList.add('is-mobile');
}
if (isTouchDevice()) {
body.classList.add('is-touch');
// Remove hover styles on touch devices
const style = document.createElement('style');
style.textContent = `
@media (hover: none) and (pointer: coarse) {
.nav-item:hover,
.action-btn:hover,
.card:hover {
transform: none !important;
background: inherit !important;
box-shadow: inherit !important;
}
}
`;
document.head.appendChild(style);
}
// Detect safe area support
if (CSS.supports('padding: env(safe-area-inset-top)')) {
body.classList.add('has-safe-area');
}
// Set viewport height CSS custom property for mobile browsers
const setVH = () => {
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
};
setVH();
window.addEventListener('resize', setVH);
window.addEventListener('orientationchange', () => {
setTimeout(setVH, 100); // Delay for orientation change
});
}
// Enhanced Touch Interactions
function initializeTouchInteractions() {
console.log('👆 Initializing touch interactions...');
// Prevent 300ms click delay on mobile
let touchStartTime = 0;
let touchStartTarget = null;
document.addEventListener('touchstart', function(e) {
touchStartTime = Date.now();
touchStartTarget = e.target;
}, { passive: true });
document.addEventListener('touchend', function(e) {
const touchEndTime = Date.now();
const touchDuration = touchEndTime - touchStartTime;
// Fast tap detection (under 200ms)
if (touchDuration < 200 && e.target === touchStartTarget) {
e.target.classList.add('fast-tap');
setTimeout(() => {
e.target.classList.remove('fast-tap');
}, 150);
}
}, { passive: true });
// Enhanced touch feedback for interactive elements
const interactiveElements = document.querySelectorAll(
'.nav-item, .mobile-nav-item, .action-btn, .profile-btn, ' +
'.card-action, .quick-action-btn, .survey-item, .activity-item, ' +
'.member-item, .status-item'
);
interactiveElements.forEach(element => {
// Touch start feedback
element.addEventListener('touchstart', function(e) {
this.classList.add('touch-active');
// Create touch ripple effect
if (!this.querySelector('.touch-ripple')) {
createTouchRipple(this, e.touches[0]);
}
}, { passive: true });
// Touch end cleanup
element.addEventListener('touchend', function() {
setTimeout(() => {
this.classList.remove('touch-active');
}, 150);
}, { passive: true });
// Touch cancel cleanup
element.addEventListener('touchcancel', function() {
this.classList.remove('touch-active');
}, { passive: true });
});
// Add CSS for touch states
const touchStyles = document.createElement('style');
touchStyles.textContent = `
.touch-active {
transform: scale(0.98) !important;
opacity: 0.8 !important;
transition: all 0.1s ease !important;
}
.fast-tap {
animation: fastTapFeedback 0.15s ease-out;
}
@keyframes fastTapFeedback {
0% { transform: scale(1); }
50% { transform: scale(0.95); }
100% { transform: scale(1); }
}
.touch-ripple {
position: absolute;
border-radius: 50%;
background: rgba(255, 255, 255, 0.6);
transform: scale(0);
animation: touchRipple 0.6s ease-out;
pointer-events: none;
z-index: 1;
}
@keyframes touchRipple {
to {
transform: scale(4);
opacity: 0;
}
}
`;
document.head.appendChild(touchStyles);
}
// Create touch ripple effect
function createTouchRipple(element, touch) {
const ripple = document.createElement('div');
const rect = element.getBoundingClientRect();
const size = Math.max(rect.width, rect.height);
const x = touch.clientX - rect.left - size / 2;
const y = touch.clientY - rect.top - size / 2;
ripple.className = 'touch-ripple';
ripple.style.cssText = `
width: ${size}px;
height: ${size}px;
left: ${x}px;
top: ${y}px;
`;
element.style.position = 'relative';
element.style.overflow = 'hidden';
element.appendChild(ripple);
setTimeout(() => {
ripple.remove();
}, 600);
}
// Enhanced Mobile Navigation
function initializeMobileNavigation() {
console.log('📱 Initializing mobile navigation...');
const mobileMenuToggle = document.querySelector('.mobile-menu-toggle');
const mobileNav = document.querySelector('.mobile-nav');
const body = document.body;
let isMenuOpen = false;
if (mobileMenuToggle && mobileNav) {
// Prevent body scroll when menu is open
const toggleBodyScroll = (disable) => {
if (disable) {
body.style.position = 'fixed';
body.style.top = `-${window.scrollY}px`;
body.style.width = '100%';
} else {
const scrollY = body.style.top;
body.style.position = '';
body.style.top = '';
body.style.width = '';
window.scrollTo(0, parseInt(scrollY || '0') * -1);
}
};
// Enhanced menu toggle with proper animations
const toggleMenu = () => {
isMenuOpen = !isMenuOpen;
// Update toggle button
const icon = mobileMenuToggle.querySelector('i');
icon.style.transform = isMenuOpen ? 'rotate(90deg)' : 'rotate(0deg)';
mobileMenuToggle.setAttribute('aria-expanded', isMenuOpen);
// Update menu visibility
if (isMenuOpen) {
mobileNav.classList.add('show');
mobileNav.setAttribute('aria-hidden', 'false');
toggleBodyScroll(true);
// Focus first nav item for accessibility
setTimeout(() => {
const firstNavItem = mobileNav.querySelector('.mobile-nav-item');
if (firstNavItem) firstNavItem.focus();
}, 100);
// Stagger animation for nav items
const navItems = mobileNav.querySelectorAll('.mobile-nav-item');
navItems.forEach((item, index) => {
item.style.opacity = '0';
item.style.transform = 'translateY(20px)';
setTimeout(() => {
item.style.transition = 'all 0.3s ease';
item.style.opacity = '1';
item.style.transform = 'translateY(0)';
}, index * 50);
});
} else {
mobileNav.classList.remove('show');
mobileNav.setAttribute('aria-hidden', 'true');
toggleBodyScroll(false);
// Return focus to toggle button
mobileMenuToggle.focus();
}
};
// Touch-optimized menu toggle
let touchStartY = 0;
let isSwiping = false;
mobileMenuToggle.addEventListener('touchstart', (e) => {
touchStartY = e.touches[0].clientY;
isSwiping = false;
}, { passive: true });
mobileMenuToggle.addEventListener('touchmove', (e) => {
const touchY = e.touches[0].clientY;
const deltaY = Math.abs(touchY - touchStartY);
if (deltaY > 10) isSwiping = true;
}, { passive: true });
mobileMenuToggle.addEventListener('touchend', (e) => {
if (!isSwiping) {
e.preventDefault();
toggleMenu();
}
});
mobileMenuToggle.addEventListener('click', (e) => {
e.preventDefault();
toggleMenu();
});
// Close menu when clicking outside (for larger screens)
document.addEventListener('click', (e) => {
if (isMenuOpen &&
!mobileNav.contains(e.target) &&
!mobileMenuToggle.contains(e.target)) {
toggleMenu();
}
});
// Keyboard navigation
mobileNav.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && isMenuOpen) {
toggleMenu();
}
});
// Enhanced mobile nav item interactions
const mobileNavItems = document.querySelectorAll('.mobile-nav-item');
mobileNavItems.forEach(item => {
item.addEventListener('click', function(e) {
if (!this.classList.contains('active')) {
e.preventDefault();
// Visual feedback
this.style.transform = 'scale(0.95)';
setTimeout(() => {
this.style.transform = 'scale(1)';
}, 150);
// Remove active from all items
mobileNavItems.forEach(i => i.classList.remove('active'));
// Add active to clicked item
this.classList.add('active');
// Close menu after navigation
setTimeout(() => {
if (isMenuOpen) toggleMenu();
simulatePageNavigation(this.getAttribute('href'));
}, 300);
}
});
});
}
}
// Swipe Gesture Support
function initializeSwipeGestures() {
console.log('👋 Initializing swipe gestures...');
let touchStartX = 0;
let touchStartY = 0;
let touchEndX = 0;
let touchEndY = 0;
// Swipe detection on cards
const swipeableElements = document.querySelectorAll(
'.survey-item, .activity-item, .member-item'
);
swipeableElements.forEach(element => {
element.addEventListener('touchstart', (e) => {
touchStartX = e.touches[0].clientX;
touchStartY = e.touches[0].clientY;
}, { passive: true });
element.addEventListener('touchend', (e) => {
touchEndX = e.changedTouches[0].clientX;
touchEndY = e.changedTouches[0].clientY;
handleSwipe(element);
}, { passive: true });
});
function handleSwipe(element) {
const deltaX = touchEndX - touchStartX;
const deltaY = touchEndY - touchStartY;
const minSwipeDistance = 50;
// Horizontal swipe detection
if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > minSwipeDistance) {
if (deltaX > 0) {
handleSwipeRight(element);
} else {
handleSwipeLeft(element);
}
}
}
function handleSwipeRight(element) {
// Swipe right action (e.g., mark as read, like)
element.style.transform = 'translateX(20px)';
element.style.background = 'rgba(5, 150, 105, 0.1)';
setTimeout(() => {
element.style.transform = 'translateX(0)';
element.style.background = '';
}, 300);
console.log('👉 Swipe right on:', element);
}
function handleSwipeLeft(element) {
// Swipe left action (e.g., archive, delete)
element.style.transform = 'translateX(-20px)';
element.style.background = 'rgba(220, 38, 38, 0.1)';
setTimeout(() => {
element.style.transform = 'translateX(0)';
element.style.background = '';
}, 300);
console.log('👈 Swipe left on:', element);
}
}
// Mobile-Optimized Animations
function initializeMobileAnimations() {
console.log('🎬 Initializing mobile animations...');
// Respect user's motion preferences
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (prefersReducedMotion) {
console.log('⚡ Reduced motion preferred - using minimal animations');
document.body.classList.add('reduced-motion');
return;
}
// Intersection Observer for mobile-optimized scroll animations
const observerOptions = {
threshold: [0.1, 0.25],
rootMargin: '0px 0px -50px 0px'
};
const animationObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const element = entry.target;
element.style.opacity = '1';
element.style.transform = 'translateY(0)';
element.classList.add('animate-in');
// Reduced animation duration for mobile
if (isMobileDevice()) {
element.style.animationDuration = '0.4s';
}
}
});
}, observerOptions);
// Observe elements with animation classes
document.querySelectorAll('.fade-in-up, .slide-in-right').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(30px)';
el.style.transition = 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)';
animationObserver.observe(el);
});
// Staggered animations with mobile optimization
document.querySelectorAll('[class*="stagger-"]').forEach((el, index) => {
const delay = isMobileDevice() ? (index * 0.05) : (index * 0.1);
el.style.animationDelay = `${delay}s`;
});
}
// Performance Optimizations for Mobile
function initializePerformanceOptimizations() {
console.log('⚡ Initializing performance optimizations...');
// Lazy loading for images
const lazyImages = document.querySelectorAll('img[data-src]');
if ('IntersectionObserver' in window) {
const imageObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
imageObserver.unobserve(img);
}
});
});
lazyImages.forEach(img => {
img.classList.add('lazy');
imageObserver.observe(img);
});
}
// Debounced scroll handler
let scrollTimer = null;
const scrollHandler = () => {
document.body.classList.add('is-scrolling');
if (scrollTimer !== null) {
clearTimeout(scrollTimer);
}
scrollTimer = setTimeout(() => {
document.body.classList.remove('is-scrolling');
}, 150);
};
window.addEventListener('scroll', scrollHandler, { passive: true });
// Resource hints for critical resources
const preloadCriticalResources = () => {
const criticalCSS = document.createElement('link');
criticalCSS.rel = 'preload';
criticalCSS.as = 'style';
criticalCSS.href = 'assets/css/critical.css';
document.head.appendChild(criticalCSS);
};
// Preload on user interaction
let userInteracted = false;
const preloadOnInteraction = () => {
if (!userInteracted) {
userInteracted = true;
preloadCriticalResources();
}
};
document.addEventListener('touchstart', preloadOnInteraction, {
once: true,
passive: true
});
document.addEventListener('click', preloadOnInteraction, { once: true });
// Memory usage monitoring
if (performance.memory) {
const checkMemoryUsage = () => {
const memoryInfo = performance.memory;
const usedMB = memoryInfo.usedJSHeapSize / 1048576;
const totalMB = memoryInfo.totalJSHeapSize / 1048576;
console.log(`📊 Memory usage: ${usedMB.toFixed(1)}MB / ${totalMB.toFixed(1)}MB`);
// Warn if memory usage is high
if (usedMB > 50) {
console.warn('⚠️ High memory usage detected');
}
};
setInterval(checkMemoryUsage, 30000); // Check every 30 seconds
}
}
// Mobile Accessibility Enhancements
function initializeMobileAccessibility() {
console.log('♿ Initializing mobile accessibility...');
// Enhanced focus management for mobile
let focusedBeforeModal = null;
// Skip links for mobile navigation
const createSkipLinks = () => {
const skipNav = document.createElement('a');
skipNav.href = '#main-content';
skipNav.textContent = 'Skip to main content';
skipNav.className = 'skip-link';
skipNav.style.cssText = `
position: absolute;
top: -40px;
left: 10px;
background: var(--primary);
color: white;
padding: 8px 16px;
text-decoration: none;
border-radius: 4px;
z-index: 100000;
font-size: 14px;
transition: top 0.3s ease;
`;
skipNav.addEventListener('focus', () => {
skipNav.style.top = '10px';
});
skipNav.addEventListener('blur', () => {
skipNav.style.top = '-40px';
});
document.body.insertBefore(skipNav, document.body.firstChild);
};
createSkipLinks();
// Touch target size enforcement
const enforceMinTouchTargets = () => {
const interactiveElements = document.querySelectorAll(
'button, a, input, select, textarea, [role="button"], [tabindex="0"]'
);
interactiveElements.forEach(element => {
const rect = element.getBoundingClientRect();
const minSize = 44; // WCAG minimum
if (rect.width < minSize || rect.height < minSize) {
element.style.minWidth = `${minSize}px`;
element.style.minHeight = `${minSize}px`;
element.style.display = 'inline-flex';
element.style.alignItems = 'center';
element.style.justifyContent = 'center';
}
});
};
// Run after DOM is fully loaded
setTimeout(enforceMinTouchTargets, 1000);
// Announce page changes for screen readers
const announcePageChange = (message) => {
const announcement = document.createElement('div');
announcement.setAttribute('aria-live', 'polite');
announcement.setAttribute('aria-atomic', 'true');
announcement.style.cssText = `
position: absolute;
left: -10000px;
width: 1px;
height: 1px;
overflow: hidden;
`;
announcement.textContent = message;
document.body.appendChild(announcement);
setTimeout(() => {
document.body.removeChild(announcement);
}, 1000);
};
// Export for use in navigation
window.announcePageChange = announcePageChange;
}
// Orientation Change Handling
function initializeOrientationHandling() {
console.log('🔄 Initializing orientation handling...');
let currentOrientation = screen.orientation?.angle || window.orientation;
const handleOrientationChange = () => {
const newOrientation = screen.orientation?.angle || window.orientation;
if (newOrientation !== currentOrientation) {
currentOrientation = newOrientation;
// Add orientation class to body
document.body.classList.remove('portrait', 'landscape');
if (Math.abs(newOrientation) === 90) {
document.body.classList.add('landscape');
console.log('📱 Switched to landscape mode');
} else {
document.body.classList.add('portrait');
console.log('📱 Switched to portrait mode');
}
// Trigger resize event for components that need to reflow
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
}, 100);
// Re-calculate viewport height
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
}
};
// Listen for orientation changes
if (screen.orientation) {
screen.orientation.addEventListener('change', handleOrientationChange);
} else {
window.addEventListener('orientationchange', handleOrientationChange);
}
// Initial orientation setup
handleOrientationChange();
}
// Progressive Web App Features
function initializePWAFeatures() {
console.log('📱 Initializing PWA features...');
// Add to homescreen prompt
let deferredPrompt = null;
window.addEventListener('beforeinstallprompt', (e) => {
console.log('💾 PWA install prompt available');
e.preventDefault();
deferredPrompt = e;
// Show custom install button
showInstallPrompt();
});
const showInstallPrompt = () => {
const installBanner = document.createElement('div');
installBanner.className = 'install-banner';
installBanner.innerHTML = `
📱
Install RelevantReflex
Access your panel management system offline
`;
installBanner.style.cssText = `
position: fixed;
bottom: 20px;
left: 20px;
right: 20px;
background: var(--white);
border: 1px solid var(--gray-200);
border-radius: 12px;
box-shadow: var(--shadow-xl);
z-index: 1000;
animation: slideInUp 0.3s ease-out;
`;
// Add styles for install banner content
const style = document.createElement('style');
style.textContent = `
.install-content {
display: flex;
align-items: center;
gap: 12px;
padding: 16px;
}
.install-icon {
font-size: 24px;
flex-shrink: 0;
}
.install-text {
flex: 1;
min-width: 0;
}
.install-title {
font-weight: 600;
font-size: 14px;
color: var(--gray-900);
margin-bottom: 2px;
}
.install-subtitle {
font-size: 12px;
color: var(--gray-600);
}
.install-btn {
background: var(--primary);
color: white;
border: none;
padding: 8px 16px;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
}
.install-close {
background: none;
border: none;
font-size: 20px;
color: var(--gray-500);
cursor: pointer;
margin-left: 8px;
}
@keyframes slideInUp {
from { transform: translateY(100px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
`;
document.head.appendChild(style);
document.body.appendChild(installBanner);
// Handle install button click
installBanner.querySelector('.install-btn').addEventListener('click', async () => {
if (deferredPrompt) {
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
console.log(`👤 PWA install prompt outcome: ${outcome}`);
deferredPrompt = null;
installBanner.remove();
}
});
// Handle close button
installBanner.querySelector('.install-close').addEventListener('click', () => {
installBanner.remove();
});
// Auto-hide after 10 seconds
setTimeout(() => {
if (document.body.contains(installBanner)) {
installBanner.remove();
}
}, 10000);
};
// Handle successful installation
window.addEventListener('appinstalled', () => {
console.log('✅ PWA successfully installed');
deferredPrompt = null;
// Show success message
showNotification('App installed successfully! 🎉', 'success');
});
}
// Offline Support
function initializeOfflineSupport() {
console.log('📡 Initializing offline support...');
// Check online/offline status
const updateOnlineStatus = () => {
const isOnline = navigator.onLine;
document.body.classList.toggle('is-offline', !isOnline);
if (isOnline) {
console.log('🌐 Back online');
showNotification('Back online! 🌐', 'success');
} else {
console.log('📴 Gone offline');
showNotification('You are offline. Some features may be limited. 📴', 'warning');
}
};
window.addEventListener('online', updateOnlineStatus);
window.addEventListener('offline', updateOnlineStatus);
// Initial status
updateOnlineStatus();
// Cache critical resources
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('✅ Service Worker registered:', registration.scope);
})
.catch(error => {
console.log('❌ Service Worker registration failed:', error);
});
}
}
// Enhanced Page Navigation
function simulatePageNavigation(href) {
console.log(`🔄 Navigating to: ${href}`);
// Show loading state
showMobileLoadingState();
// Simulate navigation delay
setTimeout(() => {
hideMobileLoadingState();
if (window.announcePageChange) {
window.announcePageChange(`Navigated to ${href}`);
}
}, 800);
}
function showMobileLoadingState() {
const loader = document.createElement('div');
loader.id = 'mobile-loader';
loader.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.95);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
backdrop-filter: blur(5px);
`;
loader.innerHTML = `
`;
document.body.appendChild(loader);
}
function hideMobileLoadingState() {
const loader = document.getElementById('mobile-loader');
if (loader) {
loader.style.opacity = '0';
setTimeout(() => loader.remove(), 300);
}
}
// Enhanced notification system for mobile
function showNotification(message, type = 'info', duration = 4000) {
const notification = document.createElement('div');
notification.className = `mobile-notification ${type}`;
const getNotificationStyles = (type) => {
const baseStyles = `
position: fixed;
top: 20px;
left: 20px;
right: 20px;
padding: 16px 20px;
border-radius: 12px;
font-size: 14px;
font-weight: 500;
z-index: 10000;
animation: slideInDown 0.3s ease-out;
backdrop-filter: blur(10px);
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
display: flex;
align-items: center;
gap: 12px;
`;
switch (type) {
case 'success':
return baseStyles + `
background: rgba(5, 150, 105, 0.95);
color: white;
border: 1px solid rgba(5, 150, 105, 0.3);
`;
case 'warning':
return baseStyles + `
background: rgba(245, 158, 11, 0.95);
color: white;
border: 1px solid rgba(245, 158, 11, 0.3);
`;
case 'error':
return baseStyles + `
background: rgba(220, 38, 38, 0.95);
color: white;
border: 1px solid rgba(220, 38, 38, 0.3);
`;
default:
return baseStyles + `
background: rgba(30, 41, 59, 0.95);
color: white;
border: 1px solid rgba(30, 41, 59, 0.3);
`;
}
};
const getIcon = (type) => {
switch (type) {
case 'success': return '✅';
case 'warning': return '⚠️';
case 'error': return '❌';
default: return 'ℹ️';
}
};
notification.style.cssText = getNotificationStyles(type);
notification.innerHTML = `
${getIcon(type)}
${message}
`;
// Add slide in animation
const style = document.createElement('style');
style.textContent = `
@keyframes slideInDown {
from { transform: translateY(-100px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
@keyframes slideOutUp {
from { transform: translateY(0); opacity: 1; }
to { transform: translateY(-100px); opacity: 0; }
}
`;
document.head.appendChild(style);
document.body.appendChild(notification);
// Auto-remove notification
setTimeout(() => {
notification.style.animation = 'slideOutUp 0.3s ease-out';
setTimeout(() => {
if (notification.parentNode) {
notification.remove();
}
}, 300);
}, duration);
// Touch to dismiss
notification.addEventListener('touchstart', () => {
notification.style.animation = 'slideOutUp 0.3s ease-out';
setTimeout(() => {
if (notification.parentNode) {
notification.remove();
}
}, 300);
});
}
// Performance monitoring specific to mobile
function monitorMobilePerformance() {
if ('performance' in window) {
window.addEventListener('load', () => {
const navigation = performance.getEntriesByType('navigation')[0];
const loadTime = navigation.loadEventEnd - navigation.loadEventStart;
console.log(`📊 Mobile load time: ${loadTime}ms`);
// Show warning if load time is poor for mobile
if (loadTime > 3000) {
console.warn('🐌 Slow loading detected on mobile');
}
// Monitor First Contentful Paint
const fcpEntry = performance.getEntriesByName('first-contentful-paint')[0];
if (fcpEntry) {
console.log(`🎨 First Contentful Paint: ${fcpEntry.startTime}ms`);
}
// Monitor Largest Contentful Paint
if ('PerformanceObserver' in window) {
const lcpObserver = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lastEntry = entries[entries.length - 1];
console.log(`📏 Largest Contentful Paint: ${lastEntry.startTime}ms`);
});
lcpObserver.observe({ entryTypes: ['largest-contentful-paint'] });
}
});
}
}
// Initialize mobile performance monitoring
monitorMobilePerformance();
// Export mobile utilities
window.MobileRelevantReflex = {
isMobileDevice,
isTouchDevice,
showNotification,
simulatePageNavigation,
createTouchRipple,
showMobileLoadingState,
hideMobileLoadingState
};
console.log('🎉 Mobile-optimized RelevantReflex system loaded successfully!');
-------------------- END OF FILE --------------------
### FILE 7: content/dashboard.php
- Type: PHP
- Size: 17.37 KB
- Path: content
- Name: dashboard.php
------------------------------------------------------------
New panel member registered from Mumbai
3 minutes ago
Survey "Consumer Tech Trends 2025" published successfully
18 minutes ago
Payment of ₹67,800 processed and distributed to panelists
1 hour ago
New support ticket: Account verification issues
2 hours ago
Weekly analytics report generated for client portal
4 hours ago
AS
Amit Sharma
Mumbai, Maharashtra • Joined today
Active
PK
Priya Kapoor
Delhi, NCR • Joined yesterday
Active
RN
Rahul Nair
Bangalore, Karnataka • 2 days ago
Active
SP
Sneha Patel
Pune, Maharashtra • 3 days ago
Verification
MG
Manoj Gupta
Hyderabad, Telangana • 1 week ago
Active
Interactive Analytics Dashboard
Real-time charts and performance metrics coming soon
API Services
All systems operational
Database Performance
Excellent response time: 12ms
Email Service
Slight delay in queue processing
Payment Gateway
CashFree integration active
CDN & Assets
Global delivery optimized
Last updated: 2 minutes ago •
Uptime: 99.9%
-------------------- END OF FILE --------------------
### FILE 8: includes/footer.php
- Type: PHP
- Size: 19.62 KB
- Path: includes
- Name: footer.php
------------------------------------------------------------