summaryrefslogtreecommitdiffstats
path: root/public/js/main.js.map
blob: 5e4682a0139cd4de4df1854a695ad24ffce894bf (plain)
1
{"version":3,"sources":["file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/theme-toggle.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/matrix-rain.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/progress-bar.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/copy-code.js"],"sourcesContent":["// theme-toggle.js\n(function() {\n  const STORAGE_KEY = 'danix-theme';\n  const DARK_CLASS = 'theme-dark';\n  const LIGHT_CLASS = 'theme-light';\n\n  // Initialize theme on page load\n  function init() {\n    const saved = localStorage.getItem(STORAGE_KEY);\n    const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n    const isDark = saved === null ? prefersDark : saved === 'dark';\n\n    applyTheme(isDark ? 'dark' : 'light');\n  }\n\n  // Apply theme to document\n  function applyTheme(theme) {\n    const html = document.documentElement;\n\n    html.classList.remove(DARK_CLASS, LIGHT_CLASS);\n\n    if (theme === 'dark') {\n      html.classList.remove(LIGHT_CLASS);\n      localStorage.setItem(STORAGE_KEY, 'dark');\n    } else {\n      html.classList.add(LIGHT_CLASS);\n      localStorage.setItem(STORAGE_KEY, 'light');\n    }\n  }\n\n  // Get current theme\n  function getCurrentTheme() {\n    return document.documentElement.classList.contains(LIGHT_CLASS) ? 'light' : 'dark';\n  }\n\n  // Toggle theme\n  function toggleTheme() {\n    const current = getCurrentTheme();\n    const next = current === 'dark' ? 'light' : 'dark';\n    applyTheme(next);\n\n    // Dispatch custom event for other scripts to listen\n    window.dispatchEvent(new CustomEvent('theme-changed', { detail: { theme: next } }));\n  }\n\n  // Setup toggle button\n  function setupToggleButton() {\n    const btn = document.getElementById('theme-toggle-btn');\n    if (btn) {\n      btn.addEventListener('click', toggleTheme);\n      updateToggleButtonLabel();\n\n      // Listen for theme changes to update button label\n      window.addEventListener('theme-changed', updateToggleButtonLabel);\n    }\n  }\n\n  function updateToggleButtonLabel() {\n    const btn = document.getElementById('theme-toggle-btn');\n    if (btn) {\n      const current = getCurrentTheme();\n      btn.textContent = current === 'dark' ? '☀️ light' : '🌙 dark';\n    }\n  }\n\n  // Initialize on DOMContentLoaded\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function() {\n      init();\n      setupToggleButton();\n    });\n  } else {\n    init();\n    setupToggleButton();\n  }\n\n  // Expose to global scope for testing\n  window.ThemeToggle = {\n    toggle: toggleTheme,\n    set: applyTheme,\n    get: getCurrentTheme,\n  };\n})();\n","// matrix-rain.js\n(function () {\n  const canvas = document.getElementById('matrix-canvas');\n  if (!canvas) return;\n  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n  const ctx   = canvas.getContext('2d');\n  const CHARS = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン0123456789ABCDEF\u003c\u003e/\\\\|{}[]$#@!';\n  const FS    = 14;  // font size / column width in px\n  let cols, drops, raf;\n\n  function init() {\n    canvas.width  = canvas.offsetWidth;\n    canvas.height = canvas.offsetHeight;\n    cols  = Math.floor(canvas.width / FS) + 1;\n    drops = Array.from({ length: cols }, () =\u003e Math.random() * -(canvas.height / FS));\n  }\n\n  function tick() {\n    const light = document.documentElement.classList.contains('theme-light');\n    // Fade trail: near-transparent fill each frame\n    ctx.fillStyle = light ? 'rgba(240,244,248,0.07)' : 'rgba(6,11,16,0.055)';\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n    ctx.font = `${FS}px \"JetBrains Mono\", monospace`;\n\n    for (let i = 0; i \u003c cols; i++) {\n      const char = CHARS[Math.floor(Math.random() * CHARS.length)];\n      // 4% chance of bright \"head\" char, otherwise use accent color\n      ctx.fillStyle = Math.random() \u003e 0.96\n        ? (light ? '#008f5a' : '#00ff88')   // bright green head\n        : (light ? '#7c3aed' : '#a855f7');  // purple trail\n      ctx.fillText(char, i * FS, drops[i] * FS);\n\n      if (drops[i] * FS \u003e canvas.height \u0026\u0026 Math.random() \u003e 0.975) {\n        drops[i] = Math.random() * -20;  // reset column randomly\n      }\n      drops[i] += 0.5;  // slow fall speed\n    }\n    raf = requestAnimationFrame(tick);\n  }\n\n  // Listen for theme changes and reinit\n  window.addEventListener('theme-changed', function() {\n    // Matrix rain auto-colors based on theme-light class\n  }, { passive: true });\n\n  init();\n  window.addEventListener('resize', () =\u003e {\n    cancelAnimationFrame(raf);\n    init();\n    tick();\n  }, { passive: true });\n\n  document.addEventListener('visibilitychange', () =\u003e {\n    if (document.hidden) {\n      cancelAnimationFrame(raf);\n    } else {\n      tick();\n    }\n  });\n\n  tick();\n\n  window.MatrixRain = { init, tick };\n})();\n","// progress-bar.js\n(function() {\n  const progressBar = document.querySelector('.reading-progress');\n  if (!progressBar) return;\n\n  // Only enable on pages with substantial content\n  const mainContent = document.querySelector('main');\n  if (!mainContent) return;\n\n  function updateProgress() {\n    // Calculate scroll percentage\n    const windowHeight = window.innerHeight;\n    const docHeight = document.documentElement.scrollHeight - windowHeight;\n    const scrolled = window.scrollY;\n    const percent = docHeight \u003e 0 ? (scrolled / docHeight) * 100 : 0;\n\n    progressBar.style.width = percent + '%';\n  }\n\n  // Mark body as scrollable if there's significant content\n  const contentHeight = mainContent.offsetHeight;\n  if (contentHeight \u003e window.innerHeight * 1.5) {\n    document.body.classList.add('scrollable');\n  }\n\n  // Use requestAnimationFrame for smooth updates\n  let ticking = false;\n  window.addEventListener('scroll', function() {\n    if (!ticking) {\n      requestAnimationFrame(updateProgress);\n      ticking = true;\n      setTimeout(() =\u003e { ticking = false; }, 100);\n    }\n  }, { passive: true });\n\n  // Initial update\n  updateProgress();\n})();\n","// copy-code.js\n(function() {\n  // Add copy button to all code blocks\n  const codeBlocks = document.querySelectorAll('pre, .highlight');\n\n  codeBlocks.forEach(block =\u003e {\n    // Create copy button\n    const btn = document.createElement('button');\n    btn.className = 'code-copy-btn';\n    btn.textContent = 'copy';\n    btn.type = 'button';\n    btn.setAttribute('aria-label', 'Copy code');\n\n    // Get code text\n    const code = block.querySelector('code');\n    const text = code ? code.textContent : block.textContent;\n\n    // Copy on click\n    btn.addEventListener('click', async function() {\n      try {\n        await navigator.clipboard.writeText(text);\n\n        // Show feedback\n        const originalText = btn.textContent;\n        btn.textContent = 'copied!';\n        btn.classList.add('copied');\n\n        setTimeout(() =\u003e {\n          btn.textContent = originalText;\n          btn.classList.remove('copied');\n        }, 2000);\n      } catch (err) {\n        console.error('Failed to copy:', err);\n        btn.textContent = 'error';\n      }\n    });\n\n    // Add button to block\n    block.style.position = 'relative';\n    block.appendChild(btn);\n  });\n})();\n"],"mappings":"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","names":[]}