Spaces:
Sleeping
Sleeping
| /*! | |
| * Hugo Theme Stack | |
| * | |
| * @author: Jimmy Cai | |
| * @website: https://jimmycai.com | |
| * @link: https://github.com/CaiJimmy/hugo-theme-stack | |
| */ | |
| import StackGallery from "ts/gallery"; | |
| import { getColor } from 'ts/color'; | |
| import menu from 'ts/menu'; | |
| import createElement from 'ts/createElement'; | |
| import StackColorScheme from 'ts/colorScheme'; | |
| import { setupScrollspy } from 'ts/scrollspy'; | |
| import { setupSmoothAnchors } from "ts/smoothAnchors"; | |
| let Stack = { | |
| init: () => { | |
| /** | |
| * Bind menu event | |
| */ | |
| menu(); | |
| const articleContent = document.querySelector('.article-content') as HTMLElement; | |
| if (articleContent) { | |
| new StackGallery(articleContent); | |
| setupSmoothAnchors(); | |
| setupScrollspy(); | |
| } | |
| /** | |
| * Add linear gradient background to tile style article | |
| */ | |
| const articleTile = document.querySelector('.article-list--tile'); | |
| if (articleTile) { | |
| let observer = new IntersectionObserver(async (entries, observer) => { | |
| entries.forEach(entry => { | |
| if (!entry.isIntersecting) return; | |
| observer.unobserve(entry.target); | |
| const articles = entry.target.querySelectorAll('article.has-image'); | |
| articles.forEach(async articles => { | |
| const image = articles.querySelector('img'), | |
| imageURL = image.src, | |
| key = image.getAttribute('data-key'), | |
| hash = image.getAttribute('data-hash'), | |
| articleDetails: HTMLDivElement = articles.querySelector('.article-details'); | |
| const colors = await getColor(key, hash, imageURL); | |
| articleDetails.style.background = ` | |
| linear-gradient(0deg, | |
| rgba(${colors.DarkMuted.rgb[0]}, ${colors.DarkMuted.rgb[1]}, ${colors.DarkMuted.rgb[2]}, 0.5) 0%, | |
| rgba(${colors.Vibrant.rgb[0]}, ${colors.Vibrant.rgb[1]}, ${colors.Vibrant.rgb[2]}, 0.75) 100%)`; | |
| }) | |
| }) | |
| }); | |
| observer.observe(articleTile) | |
| } | |
| /** | |
| * Add copy button to code block | |
| */ | |
| const highlights = document.querySelectorAll('.article-content div.highlight'); | |
| const copyText = `Copy`, | |
| copiedText = `Copied!`; | |
| highlights.forEach(highlight => { | |
| const copyButton = document.createElement('button'); | |
| copyButton.innerHTML = copyText; | |
| copyButton.classList.add('copyCodeButton'); | |
| highlight.appendChild(copyButton); | |
| const codeBlock = highlight.querySelector('code[data-lang]'); | |
| if (!codeBlock) return; | |
| copyButton.addEventListener('click', () => { | |
| navigator.clipboard.writeText(codeBlock.textContent) | |
| .then(() => { | |
| copyButton.textContent = copiedText; | |
| setTimeout(() => { | |
| copyButton.textContent = copyText; | |
| }, 1000); | |
| }) | |
| .catch(err => { | |
| alert(err) | |
| console.log('Something went wrong', err); | |
| }); | |
| }); | |
| }); | |
| new StackColorScheme(document.getElementById('dark-mode-toggle')); | |
| } | |
| } | |
| window.addEventListener('load', () => { | |
| setTimeout(function () { | |
| Stack.init(); | |
| }, 0); | |
| }) | |
| declare global { | |
| interface Window { | |
| createElement: any; | |
| Stack: any | |
| } | |
| } | |
| window.Stack = Stack; | |
| window.createElement = createElement; |