Spaces:
Running
Running
File size: 9,859 Bytes
52e816d bad53f2 05e69ff fd7890a 846057f fd7890a 52e816d 846057f bad53f2 351ea5d bad53f2 52e816d 351ea5d fd7890a 846057f bad53f2 846057f 806182b fd7890a 806182b 52e816d a44fed6 b2e1ab5 05e69ff 52e816d 2cdd5ec 52e816d 2cdd5ec 52e816d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | // Toggle sidebar collapse
function toggleSidebar() {
const sidebar = document.querySelector('.sidebar');
sidebar.classList.toggle('collapsed');
// Save state to localStorage
const isCollapsed = sidebar.classList.contains('collapsed');
localStorage.setItem('sidebarCollapsed', isCollapsed);
}
// Initialize sidebar state from localStorage
function initSidebar() {
const sidebar = document.querySelector('.sidebar');
const isCollapsed = localStorage.getItem('sidebarCollapsed') === 'true';
if (isCollapsed) {
sidebar.classList.add('collapsed');
}
}
// Initialize tooltips
function initTooltips() {
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
}
// Enhanced filter function with debounce
function debounce(func, timeout = 300) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => { func.apply(this, args); }, timeout);
};
}
const filterResources = debounce(function() {
const searchTerm = document.getElementById('search').value.toLowerCase();
const categoryFilter = document.getElementById('category').value;
const sortOption = document.getElementById('sort').value;
const slides = document.querySelectorAll('#slides-container .card');
const slidesArray = Array.from(slides);
// Filter
slides.forEach(slide => {
const title = slide.querySelector('h3').textContent.toLowerCase();
const category = slide.querySelector('span').textContent;
const matchesSearch = title.includes(searchTerm);
const matchesCategory = !categoryFilter || category === categoryFilter;
if (matchesSearch && matchesCategory) {
slide.style.display = 'block';
} else {
slide.style.display = 'none';
}
});
// Sort
slidesArray.sort((a, b) => {
const titleA = a.querySelector('h3').textContent.toLowerCase();
const titleB = b.querySelector('h3').textContent.toLowerCase();
const dateA = a.querySelector('.text-sm.text-gray-500').textContent;
const dateB = b.querySelector('.text-sm.text-gray-500').textContent;
switch(sortOption) {
case 'name':
return titleA.localeCompare(titleB);
case 'oldest':
return new Date(dateA) - new Date(dateB);
case 'recent':
default:
return new Date(dateB) - new Date(dateA);
}
});
// Re-append sorted slides
const container = document.getElementById('slides-container');
container.innerHTML = '';
slidesArray.forEach(slide => container.appendChild(slide));
}
// Reset filters function
function resetFilters() {
document.getElementById('search').value = '';
document.getElementById('category').value = '';
document.getElementById('sort').value = 'recent';
filterSlides();
}
// Add hover effects to all cards
function initCardEffects() {
const cards = document.querySelectorAll('.card-hover');
cards.forEach(card => {
card.addEventListener('mousemove', (e) => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
card.style.setProperty('--mouse-x', `${x}px`);
card.style.setProperty('--mouse-y', `${y}px`);
// Parallax effect for child elements
const tiltX = (rect.width / 2 - x) / 20;
const tiltY = (rect.height / 2 - y) / 20;
card.style.transform = `perspective(1000px) rotateX(${tiltY}deg) rotateY(${-tiltX}deg)`;
});
card.addEventListener('mouseleave', () => {
card.style.transform = 'perspective(1000px) rotateX(0) rotateY(0)';
});
});
}
// Initialize glow effects
function initGlowEffects() {
// Auto add glow effect to all buttons with class 'glow'
document.querySelectorAll('.btn-primary').forEach(btn => {
const glow = document.createElement('glow-effect');
glow.setAttribute('r', '139');
glow.setAttribute('g', '92');
glow.setAttribute('b', '246');
btn.appendChild(glow);
});
}
// Dark mode toggle
function initDarkMode() {
const darkModeToggle = document.getElementById('dark-mode-toggle');
if (darkModeToggle) {
darkModeToggle.addEventListener('click', () => {
document.documentElement.classList.toggle('dark');
localStorage.setItem('darkMode', document.documentElement.classList.contains('dark'));
});
// Initialize from localStorage
if (localStorage.getItem('darkMode') === 'true') {
document.documentElement.classList.add('dark');
}
}
}
// Smooth scroll animation
function smoothScroll(target, duration) {
const targetElement = document.querySelector(target);
const targetPosition = targetElement.getBoundingClientRect().top;
const startPosition = window.pageYOffset;
const distance = targetPosition;
let startTime = null;
function animation(currentTime) {
if (startTime === null) startTime = currentTime;
const timeElapsed = currentTime - startTime;
const run = ease(timeElapsed, startPosition, distance, duration);
window.scrollTo(0, run);
if (timeElapsed < duration) requestAnimationFrame(animation);
}
function ease(t, b, c, d) {
t /= d / 2;
if (t < 1) return c / 2 * t * t + b;
t--;
return -c / 2 * (t * (t - 2) - 1) + b;
}
requestAnimationFrame(animation);
}
// Initialize the app when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
initSidebar();
initCardEffects();
initGlowEffects();
initDarkMode();
// Add event listeners
const sidebarToggle = document.querySelector('custom-sidebar')?.shadowRoot?.querySelector('.sidebar-toggle');
if (sidebarToggle) {
sidebarToggle.addEventListener('click', toggleSidebar);
}
// Initialize tooltips if Bootstrap is loaded
if (typeof bootstrap !== 'undefined') {
initTooltips();
}
// Add filter event listeners if on slides, blocks, assessments or marketplace page
if (document.getElementById('search') && !document.querySelector('.marketplace-search')) {
const searchInput = document.getElementById('search');
const categorySelect = document.getElementById('category');
const sortSelect = document.getElementById('sort');
const resetBtn = document.getElementById('reset-filters');
if (searchInput) searchInput.addEventListener('input', filterSlides);
if (categorySelect) categorySelect.addEventListener('change', filterSlides);
if (sortSelect) sortSelect.addEventListener('change', filterSlides);
if (resetBtn) resetBtn.addEventListener('click', resetFilters);
}
});
// AI Assistant functionality
function initAIAssistant() {
const chatInput = document.querySelector('.ai-assistant input[type="text"]');
const sendBtn = document.querySelector('.ai-assistant button');
if (chatInput && sendBtn) {
sendBtn.addEventListener('click', function() {
const message = chatInput.value.trim();
if (message) {
addUserMessage(message);
chatInput.value = '';
// Simulate AI response after a short delay
setTimeout(() => {
addAIMessage("I'm your AI assistant. In a real implementation, this would be a response from the AI service.");
}, 1000);
}
});
chatInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
sendBtn.click();
}
});
}
}
function addUserMessage(message) {
const chatContainer = document.getElementById('chat-messages');
if (chatContainer) {
const messageDiv = document.createElement('div');
messageDiv.className = 'flex items-start justify-end';
messageDiv.innerHTML = `
<div class="bg-indigo-600 text-white rounded-lg p-4 max-w-3xl">
<p>${message}</p>
</div>
<div class="h-8 w-8 rounded-full bg-indigo-600 flex items-center justify-center text-white ml-3 flex-shrink-0">
<i class="fas fa-user"></i>
</div>
`;
chatContainer.appendChild(messageDiv);
chatContainer.scrollTop = chatContainer.scrollHeight;
}
}
function addAIMessage(message) {
const chatContainer = document.getElementById('chat-messages');
if (chatContainer) {
const messageDiv = document.createElement('div');
messageDiv.className = 'flex items-start';
messageDiv.innerHTML = `
<div class="h-8 w-8 rounded-full bg-indigo-100 flex items-center justify-center text-indigo-600 mr-3 flex-shrink-0">
<i class="fas fa-robot"></i>
</div>
<div class="bg-indigo-50 rounded-lg p-4 max-w-3xl">
<p class="text-gray-800">${message}</p>
</div>
`;
chatContainer.appendChild(messageDiv);
chatContainer.scrollTop = chatContainer.scrollHeight;
}
}
// Initialize the app when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
initSidebar();
initAIAssistant();
// Responsive adjustments
window.addEventListener('resize', function() {
// Add any responsive adjustments here
if (window.innerWidth < 768) {
document.querySelector('.sidebar').classList.add('collapsed');
}
}); |