minor tweaks and polish
This commit is contained in:
		@@ -117,32 +117,6 @@ const { post, nextPost, prevPost } = Astro.props;
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  document.addEventListener('astro:page-load', () => {
 | 
			
		||||
    // Show button when scrolled down
 | 
			
		||||
    const backToTopButton = document.getElementById('back-to-top');
 | 
			
		||||
    if (backToTopButton) {
 | 
			
		||||
      const toggleBackToTopButton = () => {
 | 
			
		||||
        if (window.scrollY > 300) {
 | 
			
		||||
          backToTopButton.classList.remove('opacity-0', 'invisible');
 | 
			
		||||
          backToTopButton.classList.add('opacity-100', 'visible');
 | 
			
		||||
        } else {
 | 
			
		||||
          backToTopButton.classList.remove('opacity-100', 'visible');
 | 
			
		||||
          backToTopButton.classList.add('opacity-0', 'invisible');
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      // Scroll to top when clicked
 | 
			
		||||
      backToTopButton.addEventListener('click', () => {
 | 
			
		||||
        window.scrollTo({
 | 
			
		||||
          top: 0,
 | 
			
		||||
          behavior: 'smooth',
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // Check scroll position
 | 
			
		||||
      window.addEventListener('scroll', toggleBackToTopButton);
 | 
			
		||||
      toggleBackToTopButton();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Add smooth reveal animations for content after loading
 | 
			
		||||
    const animateContent = () => {
 | 
			
		||||
      // Animate hero section
 | 
			
		||||
@@ -258,24 +232,6 @@ const { post, nextPost, prevPost } = Astro.props;
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
  /* Content reveal animations */
 | 
			
		||||
  .hero-text h1,
 | 
			
		||||
  .hero-text span,
 | 
			
		||||
  .hero-text p,
 | 
			
		||||
  .hero-text ~ div,
 | 
			
		||||
  article.group {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
    transform: translateY(20px);
 | 
			
		||||
    transition:
 | 
			
		||||
      opacity 0.8s ease,
 | 
			
		||||
      transform 0.8s ease;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .animate-reveal {
 | 
			
		||||
    opacity: 1 !important;
 | 
			
		||||
    transform: translateY(0) !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Language badge styling */
 | 
			
		||||
  .language-badge {
 | 
			
		||||
    font-family:
 | 
			
		||||
@@ -296,7 +252,7 @@ const { post, nextPost, prevPost } = Astro.props;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Enhanced typography for blog content - Responsive adjustments */
 | 
			
		||||
  /* Typography for blog content  */
 | 
			
		||||
  .prose {
 | 
			
		||||
    @reference text-zinc-800 dark:text-zinc-200;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -133,7 +133,7 @@ const years = Object.keys(postsByYear).sort((a, b) => b - a);
 | 
			
		||||
                  href={`#year-${year}`}
 | 
			
		||||
                  class={`mr-3 flex items-center rounded-xl border border-zinc-300 bg-white/50 px-4 py-2 whitespace-nowrap transition-all duration-300 hover:bg-zinc-50 sm:rounded-2xl md:mr-0 md:w-full md:px-0 md:py-3 md:whitespace-normal dark:border-zinc-800 dark:hover:bg-zinc-800/70 ${index === 0 ? 'bg-white/50 dark:bg-zinc-900/50' : ''}`}
 | 
			
		||||
                >
 | 
			
		||||
                  <span class="ml-3 text-base font-medium text-zinc-900 md:text-lg dark:text-zinc-100">
 | 
			
		||||
                  <span class="mr-3 ml-3 text-base font-medium text-zinc-900 md:text-lg dark:text-zinc-100">
 | 
			
		||||
                    {year}
 | 
			
		||||
                  </span>
 | 
			
		||||
                  <span class="mr-3 text-xs text-zinc-500 md:ml-auto md:text-sm dark:text-zinc-400">
 | 
			
		||||
@@ -244,56 +244,6 @@ const years = Object.keys(postsByYear).sort((a, b) => b - a);
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  document.addEventListener('astro:page-load', () => {
 | 
			
		||||
    // Force the viewport to be exactly the width of the device
 | 
			
		||||
    const fixViewportWidth = () => {
 | 
			
		||||
      const viewport = document.querySelector('meta[name="viewport"]');
 | 
			
		||||
      if (!viewport) {
 | 
			
		||||
        const meta = document.createElement('meta');
 | 
			
		||||
        meta.name = 'viewport';
 | 
			
		||||
        meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';
 | 
			
		||||
        document.getElementsByTagName('head')[0].appendChild(meta);
 | 
			
		||||
      } else {
 | 
			
		||||
        viewport.setAttribute(
 | 
			
		||||
          'content',
 | 
			
		||||
          'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Fix for horizontal overflow
 | 
			
		||||
      document.body.style.overflowX = 'hidden';
 | 
			
		||||
      document.documentElement.style.overflowX = 'hidden';
 | 
			
		||||
      document.documentElement.style.width = '100%';
 | 
			
		||||
      document.body.style.width = '100%';
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    fixViewportWidth();
 | 
			
		||||
 | 
			
		||||
    // Show button when scrolled down
 | 
			
		||||
    const backToTopButton = document.getElementById('back-to-top');
 | 
			
		||||
    if (backToTopButton) {
 | 
			
		||||
      const toggleBackToTopButton = () => {
 | 
			
		||||
        if (window.scrollY > 300) {
 | 
			
		||||
          backToTopButton.classList.remove('opacity-0', 'invisible');
 | 
			
		||||
          backToTopButton.classList.add('opacity-100', 'visible');
 | 
			
		||||
        } else {
 | 
			
		||||
          backToTopButton.classList.remove('opacity-100', 'visible');
 | 
			
		||||
          backToTopButton.classList.add('opacity-0', 'invisible');
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      // Scroll to top when clicked
 | 
			
		||||
      backToTopButton.addEventListener('click', () => {
 | 
			
		||||
        window.scrollTo({
 | 
			
		||||
          top: 0,
 | 
			
		||||
          behavior: 'smooth',
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // Check scroll position
 | 
			
		||||
      window.addEventListener('scroll', toggleBackToTopButton);
 | 
			
		||||
      toggleBackToTopButton();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Add smooth reveal animations for content after loading
 | 
			
		||||
    const animateContent = () => {
 | 
			
		||||
      // Animate hero section
 | 
			
		||||
@@ -322,453 +272,10 @@ const years = Object.keys(postsByYear).sort((a, b) => b - a);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    animateContent();
 | 
			
		||||
 | 
			
		||||
    // Add smooth scrolling to year links
 | 
			
		||||
    document.querySelectorAll('a[href^="#year-"]').forEach((anchor) => {
 | 
			
		||||
      anchor.addEventListener('click', function (e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetId = this.getAttribute('href');
 | 
			
		||||
        const targetElement = document.querySelector(targetId);
 | 
			
		||||
 | 
			
		||||
        if (targetElement) {
 | 
			
		||||
          window.scrollTo({
 | 
			
		||||
            top: targetElement.offsetTop - 100,
 | 
			
		||||
            behavior: 'smooth',
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          // Update URL hash without jumping
 | 
			
		||||
          history.pushState(null, null, targetId);
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Adjust tag items based on screen size with extreme precision
 | 
			
		||||
    const adjustTagItems = () => {
 | 
			
		||||
      const tagItems = document.querySelectorAll('.theme-ripple');
 | 
			
		||||
      const width =
 | 
			
		||||
        window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
 | 
			
		||||
      const isVerySmall = width < 360;
 | 
			
		||||
      const isExtremelySmall = width < 280;
 | 
			
		||||
      const isMicroScreen = width < 240;
 | 
			
		||||
 | 
			
		||||
      // Fix container width to match viewport exactly
 | 
			
		||||
      const container = document.querySelector('.tag-cloud');
 | 
			
		||||
      if (container) {
 | 
			
		||||
        container.style.maxWidth = '100vw';
 | 
			
		||||
        container.style.width = '100%';
 | 
			
		||||
        container.style.boxSizing = 'border-box';
 | 
			
		||||
 | 
			
		||||
        // Remove any margins that might cause overflow
 | 
			
		||||
        container.style.marginLeft = '0';
 | 
			
		||||
        container.style.marginRight = '0';
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Fix grid width
 | 
			
		||||
      const grid = document.querySelector('.grid');
 | 
			
		||||
      if (grid) {
 | 
			
		||||
        grid.style.width = '100%';
 | 
			
		||||
        grid.style.maxWidth = '100%';
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      tagItems.forEach((item) => {
 | 
			
		||||
        // Set appropriate classes based on screen size
 | 
			
		||||
        if (isMicroScreen) {
 | 
			
		||||
          item.classList.add('micro-screen');
 | 
			
		||||
          item.classList.remove('extremely-small-screen', 'very-small-screen');
 | 
			
		||||
        } else if (isExtremelySmall) {
 | 
			
		||||
          item.classList.add('extremely-small-screen');
 | 
			
		||||
          item.classList.remove('very-small-screen', 'micro-screen');
 | 
			
		||||
        } else if (isVerySmall) {
 | 
			
		||||
          item.classList.add('very-small-screen');
 | 
			
		||||
          item.classList.remove('extremely-small-screen', 'micro-screen');
 | 
			
		||||
        } else {
 | 
			
		||||
          item.classList.remove('very-small-screen', 'extremely-small-screen', 'micro-screen');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Ensure text doesn't overflow on small screens
 | 
			
		||||
        const tagName = item.querySelector('h3');
 | 
			
		||||
        const tagCount = item.querySelector('p');
 | 
			
		||||
 | 
			
		||||
        if (tagName) {
 | 
			
		||||
          // Set title for accessibility
 | 
			
		||||
          tagName.title = tagName.textContent.trim();
 | 
			
		||||
 | 
			
		||||
          // Adjust text length based on screen size
 | 
			
		||||
          if (isMicroScreen && tagName.textContent.length > 6) {
 | 
			
		||||
            tagName.dataset.fullText = tagName.textContent;
 | 
			
		||||
            tagName.textContent = tagName.textContent.substring(0, 6) + '...';
 | 
			
		||||
          } else if (isExtremelySmall && tagName.textContent.length > 8) {
 | 
			
		||||
            tagName.dataset.fullText = tagName.textContent;
 | 
			
		||||
            tagName.textContent = tagName.textContent.substring(0, 8) + '...';
 | 
			
		||||
          } else if (isVerySmall && tagName.textContent.length > 12) {
 | 
			
		||||
            tagName.dataset.fullText = tagName.textContent;
 | 
			
		||||
            tagName.textContent = tagName.textContent.substring(0, 12) + '...';
 | 
			
		||||
          } else if (tagName.dataset.fullText) {
 | 
			
		||||
            tagName.textContent = tagName.dataset.fullText;
 | 
			
		||||
            delete tagName.dataset.fullText;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Set the tag hue for hover effects
 | 
			
		||||
        const hue = item.style.getPropertyValue('--tag-hue');
 | 
			
		||||
        item.style.setProperty('--hover-hue', hue);
 | 
			
		||||
      });
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    adjustTagItems();
 | 
			
		||||
 | 
			
		||||
    // Run on resize with optimized debounce
 | 
			
		||||
    let resizeTimer;
 | 
			
		||||
    const handleResize = () => {
 | 
			
		||||
      if (resizeTimer) {
 | 
			
		||||
        window.cancelAnimationFrame(resizeTimer);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      resizeTimer = window.requestAnimationFrame(() => {
 | 
			
		||||
        fixViewportWidth();
 | 
			
		||||
        adjustTagItems();
 | 
			
		||||
      });
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    window.addEventListener('resize', handleResize);
 | 
			
		||||
    window.addEventListener('orientationchange', handleResize);
 | 
			
		||||
 | 
			
		||||
    // Ensure layout is recalculated after page is fully loaded
 | 
			
		||||
    window.addEventListener('load', () => {
 | 
			
		||||
      fixViewportWidth();
 | 
			
		||||
      adjustTagItems();
 | 
			
		||||
      // Force recalculation after images and fonts are loaded
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
        fixViewportWidth();
 | 
			
		||||
        adjustTagItems();
 | 
			
		||||
      }, 500);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Add touch support for hover effects
 | 
			
		||||
    const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
 | 
			
		||||
 | 
			
		||||
    if (isTouchDevice) {
 | 
			
		||||
      const articles = document.querySelectorAll('article');
 | 
			
		||||
 | 
			
		||||
      articles.forEach((article) => {
 | 
			
		||||
        article.addEventListener('touchstart', () => {
 | 
			
		||||
          article.classList.add('is-touched');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        article.addEventListener('touchend', () => {
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            article.classList.remove('is-touched');
 | 
			
		||||
          }, 300);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Add touch support for mobile devices
 | 
			
		||||
    const addTouchSupport = () => {
 | 
			
		||||
      const tagItems = document.querySelectorAll('.theme-ripple');
 | 
			
		||||
 | 
			
		||||
      tagItems.forEach((item) => {
 | 
			
		||||
        item.addEventListener(
 | 
			
		||||
          'touchstart',
 | 
			
		||||
          () => {
 | 
			
		||||
            item.classList.add('touch-active');
 | 
			
		||||
          },
 | 
			
		||||
          { passive: true }
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        item.addEventListener(
 | 
			
		||||
          'touchend',
 | 
			
		||||
          () => {
 | 
			
		||||
            setTimeout(() => {
 | 
			
		||||
              item.classList.remove('touch-active');
 | 
			
		||||
            }, 150);
 | 
			
		||||
          },
 | 
			
		||||
          { passive: true }
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Cancel active state if touch moves away
 | 
			
		||||
        item.addEventListener(
 | 
			
		||||
          'touchmove',
 | 
			
		||||
          (e) => {
 | 
			
		||||
            const touch = e.touches[0];
 | 
			
		||||
            const rect = item.getBoundingClientRect();
 | 
			
		||||
 | 
			
		||||
            if (
 | 
			
		||||
              touch.clientX < rect.left ||
 | 
			
		||||
              touch.clientX > rect.right ||
 | 
			
		||||
              touch.clientY < rect.top ||
 | 
			
		||||
              touch.clientY > rect.bottom
 | 
			
		||||
            ) {
 | 
			
		||||
              item.classList.remove('touch-active');
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          { passive: true }
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    addTouchSupport();
 | 
			
		||||
 | 
			
		||||
    // Fix for iOS Safari and other mobile browsers
 | 
			
		||||
    if (/iPhone|iPad|iPod|Android/.test(navigator.userAgent)) {
 | 
			
		||||
      document.documentElement.style.setProperty(
 | 
			
		||||
        '--safe-area-inset-bottom',
 | 
			
		||||
        'env(safe-area-inset-bottom)'
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      // Fix for mobile viewport height issues
 | 
			
		||||
      const setVh = () => {
 | 
			
		||||
        const vh = window.innerHeight * 0.01;
 | 
			
		||||
        document.documentElement.style.setProperty('--vh', `${vh}px`);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      setVh();
 | 
			
		||||
      window.addEventListener('resize', setVh);
 | 
			
		||||
      window.addEventListener('orientationchange', () => {
 | 
			
		||||
        // Wait for orientation change to complete
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
          setVh();
 | 
			
		||||
          fixViewportWidth();
 | 
			
		||||
        }, 100);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
  /* Content reveal animations */
 | 
			
		||||
  .hero-text h1,
 | 
			
		||||
  .hero-text span,
 | 
			
		||||
  .hero-text p,
 | 
			
		||||
  .hero-text ~ div,
 | 
			
		||||
  article.group {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
    transform: translateY(20px);
 | 
			
		||||
    transition:
 | 
			
		||||
      opacity 0.8s ease,
 | 
			
		||||
      transform 0.8s ease;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .animate-reveal {
 | 
			
		||||
    opacity: 1 !important;
 | 
			
		||||
    transform: translateY(0) !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Search container hover effect */
 | 
			
		||||
  .search-container:hover .search-pulse {
 | 
			
		||||
    animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @keyframes pulse {
 | 
			
		||||
    0%,
 | 
			
		||||
    100% {
 | 
			
		||||
      opacity: 0;
 | 
			
		||||
    }
 | 
			
		||||
    50% {
 | 
			
		||||
      opacity: 1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Shadow for dark mode */
 | 
			
		||||
  :global(.dark) .tag-cloud {
 | 
			
		||||
    box-shadow:
 | 
			
		||||
      0 0 0 1px rgba(255, 255, 255, 0.05),
 | 
			
		||||
      0 2px 4px rgba(0, 0, 0, 0.1),
 | 
			
		||||
      0 4px 8px rgba(0, 0, 0, 0.15);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Input focus animation */
 | 
			
		||||
  input:focus + div .search-pulse {
 | 
			
		||||
    animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Base styles */
 | 
			
		||||
  .tag-cloud {
 | 
			
		||||
    box-shadow:
 | 
			
		||||
      0 0 0 1px rgba(0, 0, 0, 0.03),
 | 
			
		||||
      0 2px 4px rgba(0, 0, 0, 0.03),
 | 
			
		||||
      0 4px 8px rgba(0, 0, 0, 0.05);
 | 
			
		||||
    transform-style: preserve-3d;
 | 
			
		||||
    perspective: 1000px;
 | 
			
		||||
    transition: all var(--theme-transition);
 | 
			
		||||
    width: 100% !important;
 | 
			
		||||
    max-width: 100% !important;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    margin-left: 0 !important;
 | 
			
		||||
    margin-right: 0 !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Fix for horizontal overflow */
 | 
			
		||||
  :global(html),
 | 
			
		||||
  :global(body) {
 | 
			
		||||
    overflow-x: hidden;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  :global(.max-w-6xl) {
 | 
			
		||||
    max-width: 100% !important;
 | 
			
		||||
    width: 100% !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Micro screens (below 240px) */
 | 
			
		||||
  @media (max-width: 239px) {
 | 
			
		||||
    .tag-cloud {
 | 
			
		||||
      padding: 0.5rem !important;
 | 
			
		||||
      margin: 0 !important;
 | 
			
		||||
      border-radius: 0.25rem !important;
 | 
			
		||||
      width: 100% !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .tag-cloud h2 {
 | 
			
		||||
      font-size: 0.875rem !important;
 | 
			
		||||
      margin-bottom: 0.375rem !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .grid {
 | 
			
		||||
      grid-template-columns: repeat(1, minmax(0, 1fr)) !important;
 | 
			
		||||
      gap: 0.375rem !important;
 | 
			
		||||
      width: 100% !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .micro-screen .flex {
 | 
			
		||||
      padding: 0.25rem !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .micro-screen h3 {
 | 
			
		||||
      font-size: 0.625rem !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .micro-screen p {
 | 
			
		||||
      font-size: 0.5rem !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Extra extra extra small screens (240px-279px) */
 | 
			
		||||
  @media (min-width: 240px) and (max-width: 279px) {
 | 
			
		||||
    .xxxs\:grid-cols-2 {
 | 
			
		||||
      grid-template-columns: repeat(2, minmax(0, 1fr));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxxs\:px-2 {
 | 
			
		||||
      padding-left: 0.5rem;
 | 
			
		||||
      padding-right: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxxs\:py-2 {
 | 
			
		||||
      padding-top: 0.5rem;
 | 
			
		||||
      padding-bottom: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxxs\:w-6 {
 | 
			
		||||
      width: 1.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxxs\:h-6 {
 | 
			
		||||
      height: 1.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxxs\:text-xs {
 | 
			
		||||
      font-size: 0.75rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxxs\:gap-2 {
 | 
			
		||||
      gap: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxxs\:text-\[9px\] {
 | 
			
		||||
      font-size: 9px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Extra extra small screens (280px-359px) */
 | 
			
		||||
  @media (min-width: 280px) {
 | 
			
		||||
    .xxs\:grid-cols-2 {
 | 
			
		||||
      grid-template-columns: repeat(2, minmax(0, 1fr));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxs\:px-2 {
 | 
			
		||||
      padding-left: 0.5rem;
 | 
			
		||||
      padding-right: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxs\:py-2 {
 | 
			
		||||
      padding-top: 0.5rem;
 | 
			
		||||
      padding-bottom: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxs\:w-6 {
 | 
			
		||||
      width: 1.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxs\:h-6 {
 | 
			
		||||
      height: 1.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxs\:text-xs {
 | 
			
		||||
      font-size: 0.75rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxs\:gap-2 {
 | 
			
		||||
      gap: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xxs\:text-\[9px\] {
 | 
			
		||||
      font-size: 9px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Extra small screens (360px-639px) */
 | 
			
		||||
  @media (min-width: 360px) {
 | 
			
		||||
    .xs\:grid-cols-3 {
 | 
			
		||||
      grid-template-columns: repeat(3, minmax(0, 1fr));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:px-2 {
 | 
			
		||||
      padding-left: 0.5rem;
 | 
			
		||||
      padding-right: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:py-2 {
 | 
			
		||||
      padding-top: 0.5rem;
 | 
			
		||||
      padding-bottom: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:w-7 {
 | 
			
		||||
      width: 1.75rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:h-7 {
 | 
			
		||||
      height: 1.75rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:text-xs {
 | 
			
		||||
      font-size: 0.75rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:text-sm {
 | 
			
		||||
      font-size: 0.875rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:gap-2 {
 | 
			
		||||
      gap: 0.5rem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .xs\:text-\[10px\] {
 | 
			
		||||
      font-size: 10px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Hide scrollbar but keep functionality */
 | 
			
		||||
  .hide-scrollbar {
 | 
			
		||||
    -ms-overflow-style: none;
 | 
			
		||||
    scrollbar-width: none;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .hide-scrollbar::-webkit-scrollbar {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Line clamp for descriptions */
 | 
			
		||||
  .line-clamp-2 {
 | 
			
		||||
    display: -webkit-box;
 | 
			
		||||
@@ -833,13 +340,4 @@ const years = Object.keys(postsByYear).sort((a, b) => b - a);
 | 
			
		||||
      transform 0.15s ease-in-out,
 | 
			
		||||
      opacity 0.15s ease-in-out !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Fix for iOS Safari notch */
 | 
			
		||||
  @supports (padding: max(0px)) {
 | 
			
		||||
    .tag-cloud {
 | 
			
		||||
      padding-left: max(0.75rem, env(safe-area-inset-left));
 | 
			
		||||
      padding-right: max(0.75rem, env(safe-area-inset-right));
 | 
			
		||||
      padding-bottom: max(0.75rem, env(safe-area-inset-bottom));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user