|
174 | 174 | card.classList.add('filter-hidden'); |
175 | 175 | } |
176 | 176 | }); |
| 177 | + |
| 178 | + // Update view toggle button state |
| 179 | + if (window.updateViewToggleState) { |
| 180 | + window.updateViewToggleState(); |
| 181 | + } |
177 | 182 | }); |
178 | 183 | }); |
| 184 | + |
| 185 | + // Auto-click "All" button on page load to show all cards |
| 186 | + const allButton = document.querySelector('.filter-pill[data-filter="all"]'); |
| 187 | + if (allButton) { |
| 188 | + allButton.click(); |
| 189 | + } |
179 | 190 | }; |
180 | 191 |
|
181 | 192 | /* ========================================================== |
|
211 | 222 | // Only handle touches on the card-code area |
212 | 223 | if (!e.target.closest('.card-code')) return; |
213 | 224 |
|
| 225 | + // Don't handle touch events when in expanded mode |
| 226 | + const tipsGrid = document.getElementById('tipsGrid'); |
| 227 | + if (tipsGrid && tipsGrid.classList.contains('expanded')) { |
| 228 | + return; |
| 229 | + } |
| 230 | + |
214 | 231 | touchEndX = e.changedTouches[0].clientX; |
215 | 232 | touchEndY = e.changedTouches[0].clientY; |
216 | 233 |
|
|
245 | 262 | // This is a safety net in case touch events trigger click as fallback |
246 | 263 | card.addEventListener('click', (e) => { |
247 | 264 | if (e.target.closest('.card-code')) { |
| 265 | + // Don't prevent navigation when in expanded mode |
| 266 | + const tipsGrid = document.getElementById('tipsGrid'); |
| 267 | + if (tipsGrid && tipsGrid.classList.contains('expanded')) { |
| 268 | + return; |
| 269 | + } |
248 | 270 | e.preventDefault(); |
249 | 271 | e.stopPropagation(); |
250 | 272 | } |
|
470 | 492 | }); |
471 | 493 | }; |
472 | 494 |
|
| 495 | + /* ========================================================== |
| 496 | + 6. View Toggle (Expand/Collapse All Cards) |
| 497 | + ========================================================== */ |
| 498 | + const initViewToggle = () => { |
| 499 | + const toggleBtn = document.getElementById('viewToggle'); |
| 500 | + const tipsGrid = document.getElementById('tipsGrid'); |
| 501 | + if (!toggleBtn || !tipsGrid) return; |
| 502 | + |
| 503 | + let isExpanded = false; |
| 504 | + |
| 505 | + const updateButtonState = () => { |
| 506 | + const visibleCards = document.querySelectorAll('.tip-card:not(.filter-hidden)'); |
| 507 | + const hasVisibleCards = visibleCards.length > 0; |
| 508 | + |
| 509 | + toggleBtn.disabled = !hasVisibleCards; |
| 510 | + if (!hasVisibleCards) { |
| 511 | + toggleBtn.style.opacity = '0.5'; |
| 512 | + toggleBtn.style.cursor = 'not-allowed'; |
| 513 | + } else { |
| 514 | + toggleBtn.style.opacity = '1'; |
| 515 | + toggleBtn.style.cursor = 'pointer'; |
| 516 | + } |
| 517 | + }; |
| 518 | + |
| 519 | + toggleBtn.addEventListener('click', () => { |
| 520 | + isExpanded = !isExpanded; |
| 521 | + |
| 522 | + if (isExpanded) { |
| 523 | + tipsGrid.classList.add('expanded'); |
| 524 | + toggleBtn.querySelector('.view-toggle-icon').textContent = '⊟'; |
| 525 | + toggleBtn.querySelector('.view-toggle-text').textContent = 'Collapse All'; |
| 526 | + |
| 527 | + // Remove toggled class from all cards when expanding |
| 528 | + document.querySelectorAll('.tip-card').forEach(card => { |
| 529 | + card.classList.remove('toggled'); |
| 530 | + }); |
| 531 | + } else { |
| 532 | + tipsGrid.classList.remove('expanded'); |
| 533 | + toggleBtn.querySelector('.view-toggle-icon').textContent = '⊞'; |
| 534 | + toggleBtn.querySelector('.view-toggle-text').textContent = 'Expand All'; |
| 535 | + } |
| 536 | + }); |
| 537 | + |
| 538 | + // Check initial state |
| 539 | + updateButtonState(); |
| 540 | + |
| 541 | + // Make updateButtonState available for filter to call |
| 542 | + window.updateViewToggleState = updateButtonState; |
| 543 | + }; |
| 544 | + |
473 | 545 | /* ========================================================== |
474 | 546 | Utilities |
475 | 547 | ========================================================== */ |
|
488 | 560 | }); |
489 | 561 | initFilters(); |
490 | 562 | initCardToggle(); |
| 563 | + initViewToggle(); |
491 | 564 | initCopyButtons(); |
492 | 565 | initSyntaxHighlighting(); |
493 | 566 | initNewsletter(); |
|
0 commit comments