{"version":3,"file":"static/chunks/39799-70549b56f9a7ccef.js","mappings":"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","sources":["webpack://_N_E/./src/components/BlogPostContentFooter/BlogPostContentFooter.tsx","webpack://_N_E/./src/components/ConfettiGeyser/default-sprites.ts","webpack://_N_E/./src/hooks/use-debounced-effect.ts","webpack://_N_E/./src/components/ContentProvider/ContentProvider.helpers.ts","webpack://_N_E/./src/components/ContentProvider/ContentProvider.tsx","webpack://_N_E/./src/components/ContentProvider/index.ts","webpack://_N_E/./src/components/FadeIn/FadeIn.tsx","webpack://_N_E/./src/components/FadeIn/index.ts","webpack://_N_E/./src/components/HitCounter/HitCounter.tsx","webpack://_N_E/./src/components/HitCounter/index.ts","webpack://_N_E/./src/components/JericaMascot/JericaMascot.tsx","webpack://_N_E/./src/components/JericaMascot/index.ts","webpack://_N_E/./src/components/LayoutArticle/FloatingSidebar.tsx","webpack://_N_E/./src/components/GlassyBackdrop/GlassyBackdrop.tsx","webpack://_N_E/./src/components/GlassyBackdrop/index.ts","webpack://_N_E/./src/components/LayoutArticle/GlassyHeaderBackdrop.tsx","webpack://_N_E/./src/components/LikeButton/ConnectedLikeButton.tsx","webpack://_N_E/./src/components/LikeButton/ConnectedLikeCount.tsx","webpack://_N_E/./src/hooks/use-mouse-position-when-near-element.ts","webpack://_N_E/./src/components/LikeButton/LikeButton.helpers.ts","webpack://_N_E/./src/components/LikeButton/LikeButton.tsx","webpack://_N_E/./src/components/LikeButton/Particle.tsx","webpack://_N_E/./src/components/LikeButton/LikeButtonParticles.tsx","webpack://_N_E/./src/components/SiteFooter/UpsideDownJerica.tsx","webpack://_N_E/./src/components/SkipNav/SkipNav.tsx","webpack://_N_E/./src/hooks/use-scroll-position.ts","webpack://_N_E/./src/hooks/use-toggle.ts","webpack://_N_E/./src/post-helpers/custom-css-reset/index.ts","webpack://_N_E/./src/components/BlogPostContentFooter/BlogPostContentFooter.linaria.module.css","webpack://_N_E/./src/components/BlogPostHeadingMetadata/BlogPostHeadingMetadata.linaria.module.css","webpack://_N_E/./src/components/BlogPostTitle/BlogPostTitle.linaria.module.css","webpack://_N_E/./src/components/ContentGrids/ArticleGrid.linaria.module.css","webpack://_N_E/./src/components/FadeIn/FadeIn.linaria.module.css","webpack://_N_E/./src/components/GlassyBackdrop/GlassyBackdrop.linaria.module.css","webpack://_N_E/./src/components/HitCounter/HitCounter.linaria.module.css","webpack://_N_E/./src/components/JericaMascot/JericaMascot.linaria.module.css","webpack://_N_E/./src/components/LayoutArticle/ArticleSwoops.linaria.module.css","webpack://_N_E/./src/components/LayoutArticle/FloatingSidebar.linaria.module.css","webpack://_N_E/./src/components/LayoutArticle/GlassyHeaderBackdrop.linaria.module.css","webpack://_N_E/./src/components/LayoutArticle/LayoutArticle.linaria.module.css","webpack://_N_E/./src/components/LikeButton/ConnectedLikeButton.linaria.module.css","webpack://_N_E/./src/components/LikeButton/ConnectedLikeCount.linaria.module.css","webpack://_N_E/./src/components/LikeButton/LikeButton.linaria.module.css","webpack://_N_E/./src/components/LikeButton/LikeButtonParticles.linaria.module.css","webpack://_N_E/./src/components/LikeButton/Particle.linaria.module.css","webpack://_N_E/./src/components/RelatedPosts/RelatedPost.linaria.module.css","webpack://_N_E/./src/components/RelatedPosts/RelatedPosts.linaria.module.css","webpack://_N_E/./src/components/SiteFooter/ExtraCloud.linaria.module.css","webpack://_N_E/./src/components/SiteFooter/FooterSwoops.linaria.module.css","webpack://_N_E/./src/components/SiteFooter/FullFatSiteFooter.linaria.module.css","webpack://_N_E/./src/components/SiteFooter/UpsideDownJerica.linaria.module.css","webpack://_N_E/./src/components/SkipNav/SkipNav.linaria.module.css"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { BREAKPOINTS } from '@/constants';\nimport useIsOnscreen from '@/hooks/use-is-onscreen';\n\nimport { ContentContext } from '@/components/ContentProvider';\nimport HitCounter from '@/components/HitCounter';\nimport Spacer from '@/components/Spacer';\n\nfunction BlogPostContentFooter() {\n const { contentData, metrics } = React.useContext(ContentContext);\n const humanReadableDate =\n contentData.formattedDates.updatedOn?.humanReadable ??\n contentData.formattedDates.publishedOn.humanReadable;\n\n const wrapperRef = React.useRef(null);\n\n // The Hit Counter I created years ago is incredibly inefficient, in terms of DOM structure; it creates a BUNCH of nodes. We can wait until the user scrolls to this point before adding that stuff.\n const hasReachedFooter = useIsOnscreen(wrapperRef, false, {\n threshold: [0],\n ignoreSubsequentEntries: true,\n });\n\n return (\n \n \n {/* Optical alignment */}\n Last updated on\n {humanReadableDate}\n \n \n # of hits\n \n {typeof metrics.hits === 'number' && hasReachedFooter && (\n \n )}\n \n \n );\n}\n\nconst Wrapper = styled.div`\n display: flex;\n justify-content: space-between;\n padding-top: 72px;\n\n /*\n We don’t track hits for snippets, so we want to center the date.\n */\n &[data-content-type='snippet'] {\n justify-content: center;\n }\n`;\n\nconst Prefix = styled.h3`\n color: var(--color-gray-600);\n font-size: 0.8125rem;\n font-weight: var(--font-weight-light);\n font-family: var(--font-family-mono);\n font-style: italic;\n /* Make it look slightly bolder: */\n -webkit-font-smoothing: subpixel-antialiased;\n\n @media ${BREAKPOINTS.smAndSmaller} {\n font-size: 0.75rem;\n }\n`;\n\nconst Title = styled.p`\n font-size: 1.125rem;\n font-weight: var(--font-weight-medium);\n margin-top: 0.325rem;\n`;\n\nconst DateWrapper = styled.div`\n display: flex;\n flex-direction: column;\n\n ${Wrapper}[data-content-type='snippet'] & {\n text-align: center;\n }\n ${Wrapper}[data-content-type='blog-post'] & {\n flex: 2;\n }\n`;\n\nconst HitsWrapper = styled.div`\n display: flex;\n flex-direction: column;\n /* HACK: The hit counter changes height which moves the entire layout. */\n min-height: 4.5rem;\n text-align: right;\n\n ${Wrapper}[data-content-type='snippet'] & {\n display: none;\n }\n`;\n\nexport default BlogPostContentFooter;\n","import type { Sprite } from './ConfettiGeyser.types';\n\nconst DEFAULT_SPRITES: Array = [\n {\n src: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCA1MSAxOCIgZmlsbD0ibm9u%0D%0AZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQ3LjQ3MDYg%0D%0AM0wzOC41NzY1IDE0LjExNzZMMjkuNjgyMyAzTDIwLjc4ODIgMTQuMTE3NkwxMS44OTQxIDIuOTk5%0D%0AOTlMMi45OTk5OSAxNC4xMTc2IiBzdHJva2U9IiM5RTNFRkYiIHN0cm9rZS13aWR0aD0iNiIgc3Ry%0D%0Ab2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=',\n width: 51,\n height: 18,\n airFrictionMultiplier: 0.75,\n },\n {\n src: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAxMiAxOCIgZmlsbD0ibm9u%0D%0AZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjEyIiBo%0D%0AZWlnaHQ9IjE4IiBmaWxsPSIjNUE3RkZGIi8+Cjwvc3ZnPgo=',\n width: 12,\n height: 18,\n airFrictionMultiplier: 1.2,\n },\n {\n src: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9u%0D%0AZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iOCIgY3k9%0D%0AIjgiIHI9IjgiIGZpbGw9IiNGRjQwMkUiLz4KPC9zdmc+Cg==',\n width: 16,\n height: 16,\n airFrictionMultiplier: 1.15,\n },\n {\n src: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMiAyMSIgZmlsbD0ibm9u%0D%0AZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMuNTI5NDIg%0D%0AMThMMTguMzUyOSAzLjE3NjQ1TTMuNTI5NDIgMy4xNzY0NUwxMC45NDEyIDEwLjU4ODJMMTguMzUy%0D%0AOSAxOCIgc3Ryb2tlPSIjRkZFQjMzIiBzdHJva2Utd2lkdGg9IjYiIHN0cm9rZS1saW5lY2FwPSJy%0D%0Ab3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K',\n width: 20,\n height: 20,\n airFrictionMultiplier: 0.9,\n },\n {\n src: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMiAyMSIgZmlsbD0ibm9u%0D%0AZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMuNTQzOTcg%0D%0AMTcuNDExMUMzLjE4NjY4IDE1LjQ0NzkgMy4zMzIwOSAxMy40MjYxIDMuOTY2NjYgMTEuNTM0MkM0%0D%0ALjYwMTIyIDkuNjQyMzEgNS43MDQzIDcuOTQxNzkgNy4xNzMxNCA2LjU5MTA1QzguNjQxOTggNS4y%0D%0ANDAzMSAxMC40Mjg4IDQuMjgzMyAxMi4zNjcxIDMuODA5MTdDMTQuMzA1NSAzLjMzNTAzIDE2LjMz%0D%0AMjMgMy4zNTkyIDE4LjI1ODggMy44Nzk0MiIgc3Ryb2tlPSIjMzJGRjk4IiBzdHJva2Utd2lkdGg9%0D%0AIjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2%0D%0AZz4K',\n width: 16,\n height: 14,\n airFrictionMultiplier: 1,\n },\n {\n src: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzMiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAzMyAxOCIgZmlsbD0ibm9u%0D%0AZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTI5LjY4MjQg%0D%0AM0wyMC43ODgzIDE0LjExNzZMMTEuODk0MSAzTDMuMDAwMDIgMTQuMTE3NiIgc3Ryb2tlPSIjRkYy%0D%0AN0ZGIiBzdHJva2Utd2lkdGg9IjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVq%0D%0Ab2luPSJyb3VuZCIvPgo8L3N2Zz4K',\n width: 33,\n height: 18,\n airFrictionMultiplier: 0.8,\n },\n];\n\nexport default DEFAULT_SPRITES;\n","import * as React from 'react';\n\nfunction useDebouncedEffect(\n callback: Function,\n dependencies: Array,\n debounceBy: number = 100\n) {\n React.useEffect(() => {\n const timeoutId = window.setTimeout(callback, debounceBy);\n\n return () => {\n window.clearTimeout(timeoutId);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n\nexport default useDebouncedEffect;\n","import * as React from 'react';\n\nimport { MAX_NUM_OF_LIKES } from '@/constants';\nimport useDebouncedEffect from '@/hooks/use-debounced-effect';\nimport type { ContentData } from '@/types/content.types';\n\nimport type { Metrics } from './ContentProvider.types';\n\nconst PERSIST_IN_DEV = true;\n\nexport function useBlogPostMetrics(contentData: ContentData) {\n const { slug, category, contentType } = contentData;\n const categorySlug = category.slug;\n\n const [metrics, setMetrics] = React.useState({\n hits: null,\n totalNumLikes: null,\n totalNumLikesFromUser: null,\n lastInteractionAt: 0,\n });\n\n const metricsRef = React.useRef(metrics);\n metricsRef.current = metrics;\n\n React.useEffect(() => {\n // We don’t track metrics for snippets.\n if (contentType === 'snippet') {\n return;\n }\n\n fetch(\n `/api/get-article-metrics?slug=${slug}&categorySlug=${categorySlug}`\n )\n .then((res) => res.json())\n .then(\n ({ error, hits, totalNumLikes, totalNumLikesFromUser }) => {\n if (\n error ||\n typeof hits !== 'number' ||\n typeof totalNumLikes !== 'number' ||\n typeof totalNumLikesFromUser !== 'number'\n ) {\n console.error('Could not fetch article metrics');\n return;\n }\n\n setMetrics((currentMetrics) => ({\n ...currentMetrics,\n hits,\n totalNumLikes,\n totalNumLikesFromUser,\n }));\n }\n );\n }, [contentType, slug, categorySlug]);\n\n // Whenever the like button is incremented/decremented, we’ll fire off a fetch request to update the DB, but we debounce it so that we don’t spam the server when the user clicks quickly.\n useDebouncedEffect(\n () => {\n // Ignore the effect that runs when we first load all of the metrics.\n if (\n typeof metrics.totalNumLikesFromUser !== 'number' ||\n metricsRef.current.lastInteractionAt === 0\n ) {\n return;\n }\n\n if (process.env.NODE_ENV === 'production' || PERSIST_IN_DEV) {\n fetch('/api/toggle-like-button/', {\n method: 'POST',\n body: JSON.stringify({\n slug,\n categorySlug,\n numLikes: metrics.totalNumLikesFromUser,\n }),\n });\n }\n },\n [slug, categorySlug, metrics.totalNumLikesFromUser],\n 500\n );\n\n const toggleLikeButton = React.useCallback(\n (action: 'increment' | 'decrement') => {\n const metrics = metricsRef.current;\n\n if (\n typeof metrics.totalNumLikes !== 'number' ||\n typeof metrics.totalNumLikesFromUser !== 'number'\n ) {\n throw new Error(\n 'Tried to toggle like button before we have any metrics! This shouldn’t happen, since we shouldn’t show the like button until the metrics have been fetched.'\n );\n }\n\n let incrementBy = 0;\n if (\n action === 'increment' &&\n metrics.totalNumLikesFromUser < MAX_NUM_OF_LIKES\n ) {\n incrementBy = 1;\n } else if (\n action === 'decrement' &&\n metrics.totalNumLikesFromUser > 0\n ) {\n incrementBy = -1;\n }\n\n const newTotalNumLikes = metrics.totalNumLikes + incrementBy;\n const newTotalNumLikesFromUser =\n metrics.totalNumLikesFromUser + incrementBy;\n\n setMetrics({\n ...metricsRef.current,\n totalNumLikes: newTotalNumLikes,\n totalNumLikesFromUser: newTotalNumLikesFromUser,\n lastInteractionAt: Date.now(),\n });\n\n return newTotalNumLikesFromUser;\n },\n []\n );\n\n return { metrics, actions: { toggleLikeButton } };\n}\n","/*\n This context provider shares all of the information about the current blog post, so that we can access stuff within our interactive components.\n\n It also manages the hit counter, fetching and incrementing the value. We need to do it up here since some blog posts render the hit counter in multiple places.\n*/\n'use client';\n\nimport * as React from 'react';\n\nimport type { ContentData } from '@/types/content.types';\n\nimport { useBlogPostMetrics } from './ContentProvider.helpers';\nimport { ContentContextValues } from './ContentProvider.types';\n\ninterface Props {\n contentData: ContentData;\n children: React.ReactNode;\n}\n\nexport const ContentContext =\n React.createContext({\n // @ts-ignore\n contentData: null,\n metrics: {\n hits: null,\n totalNumLikes: null,\n totalNumLikesFromUser: null,\n lastInteractionAt: 0,\n },\n actions: {\n toggleLikeButton: () => 0,\n },\n });\n\nfunction ContentProvider({ contentData, children }: Props) {\n const { metrics, actions } = useBlogPostMetrics(contentData);\n\n const data = React.useMemo(\n () => ({\n contentData,\n metrics,\n actions,\n }),\n [contentData, metrics, actions]\n );\n\n return (\n \n {children}\n \n );\n}\n\nexport function useContent() {\n const context = React.useContext(ContentContext);\n\n if (context === undefined) {\n throw new Error(\n 'useContent must be used within a ContentProvider'\n );\n }\n\n return context;\n}\n\nexport default ContentProvider;\n","export {\n default,\n ContentContext,\n useContent,\n} from './ContentProvider';\n","import React from 'react';\nimport { styled } from '@linaria/react';\n\ninterface Props extends React.HTMLAttributes {\n duration?: number;\n delay?: number;\n children: React.ReactNode;\n}\n\nconst FadeIn = ({\n duration = 333,\n delay = 0,\n children,\n ...delegated\n}: Props) => {\n return (\n \n {children}\n \n );\n};\n\nconst Wrapper = styled.div`\n @media (prefers-reduced-motion: no-preference) {\n animation-name: fadeIn;\n animation-fill-mode: backwards;\n }\n`;\n\nexport default FadeIn;\n","export { default } from './FadeIn';\n","import React from 'react';\nimport RetroHitCounter from 'react-retro-hit-counter';\nimport { styled } from '@linaria/react';\n\nimport useToggle from '@/hooks/use-toggle';\nimport useSound from '@/hooks/use-sound';\n\nconst HitCounter = ({ hits }: { hits: number }) => {\n const [isOn, toggleOn] = useToggle(false);\n\n const [playPress, { stop: pausePress }] = useSound(\n '/sounds/pop-down.mp3',\n {\n volume: 0.25,\n }\n );\n const [playOn] = useSound('/sounds/pop-up-on.mp3', {\n volume: 0.25,\n });\n const [playOff] = useSound('/sounds/pop-up-off.mp3', {\n volume: 0.25,\n });\n\n function toggleCounter() {\n pausePress();\n\n if (isOn) {\n playOff();\n } else {\n playOn();\n }\n\n toggleOn();\n }\n\n return (\n \n playPress()}\n onMouseUp={toggleCounter}\n onKeyDown={(ev) => {\n if (ev.key === 'Enter') {\n toggleCounter();\n }\n }}\n style={{\n border: isOn\n ? 'none'\n : '5px solid var(--hit-counter-background)',\n }}\n aria-label={`Retro-style hit counter, showing that ${hits} ${\n hits === 1 ? 'person has' : 'people have'\n } visited this page.`}\n >\n \n \n \n );\n};\n\nconst Wrapper = styled.div`\n --hit-counter-background: var(--syntax-bg);\n --hit-counter-active-segment: hsl(225deg 18% 50%);\n --hit-counter-inactive-segment: hsl(213deg 40% 87%);\n position: relative;\n /* Bafflingly, the hit counter library sets 'z-index: 2', which causes it to float above the header. Flatten it: */\n isolation: isolate;\n width: 98px;\n height: 38px;\n margin-right: -8px;\n\n & > button {\n border-radius: 2px;\n }\n\n html[data-color-mode='dark'] & {\n --hit-counter-background: var(--color-gray-100);\n --hit-counter-active-segment: hsl(210deg 18% 60%);\n --hit-counter-inactive-segment: hsl(213deg 30% 20%);\n }\n`;\n\nconst Button = styled.button`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n\n & > div {\n display: block !important;\n }\n\n & svg {\n max-width: revert !important;\n }\n\n & canvas {\n max-width: revert !important;\n }\n`;\n\nexport default HitCounter;\n","export { default } from './HitCounter';\n","'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { UserPreferencesContext } from '@/components/UserPreferencesProvider';\nimport FadeIn from '@/components/FadeIn';\n\n// I have other moods, but I need to fix the dark mode images before I can use them. See instructions in /images/josh/__README.md\nexport type Mood = 'happy' | 'sad' | 'very-happy' | 'heart-eyes';\n\nexport interface Props extends React.HTMLAttributes {\n colorModeOverride?: 'light' | 'dark';\n mood?: Mood;\n fadeDuration?: number;\n fadeDelay?: number;\n}\n\nfunction JericaMascot({\n colorModeOverride,\n mood = 'happy',\n fadeDuration = 600,\n fadeDelay = 200,\n ...delegated\n}: Props) {\n const isUsingGlobalColorMode = !colorModeOverride;\n\n const { colorMode: globalColorMode } = React.useContext(\n UserPreferencesContext\n );\n\n const colorMode = colorModeOverride || globalColorMode;\n\n return (\n \n \n \n \n \n \n {mood !== 'happy' && (\n \n \n \n \n )}\n \n \n \n \n \n \n {mood !== 'happy' && (\n \n \n \n \n )}\n \n \n );\n}\n\nconst Wrapper = styled(FadeIn)`\n position: relative;\n`;\n\nconst DarkLayer = styled.div`\n position: relative;\n`;\n\nconst LightLayer = styled.div`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: var(--opacity);\n transition: opacity calc(var(--color-swap-duration) + 500ms)\n var(--color-swap-timing-function);\n\n /*\n Ok there's some tricky business here.\n When this component first renders on the server, we don't know what the user’s chosen color mode is. If we specify an override, we don't care, but otherwise, we'll read the global color value from the HTML tag. That way, the correct mascot is shown from the very first paint.\n */\n html[data-color-mode='light'] &[data-use-global-color-mode='true'] {\n opacity: 1;\n }\n html[data-color-mode='dark'] &[data-use-global-color-mode='true'] {\n opacity: 0;\n }\n`;\n\nconst MascotBase = styled.img`\n display: block;\n top: 0;\n left: 0;\n width: 137.5px;\n height: 232px;\n user-select: none;\n pointer-events: none;\n`;\n\nconst Head = styled.img`\n position: absolute;\n display: block;\n top: 0;\n left: 0;\n right: 0;\n width: 100%;\n /* Dragging the face off is SUPER creepy */\n user-select: none;\n pointer-events: none;\n`;\n\nexport default JericaMascot;\n","export { default } from './JericaMascot';\n","'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\n\nimport useScrollPosition from '@/hooks/use-scroll-position';\nimport useWindowDimensions from '@/hooks/use-window-dimensions';\n\nimport ConnectedLikeButton from '@/components/LikeButton/ConnectedLikeButton';\nimport ConnectedLikeCount from '@/components/LikeButton/ConnectedLikeCount';\n\nconst MINIMUM_BUFFER = 300;\n\ninterface Props {\n maxArticleWidth: number;\n}\n\nconst FloatingSidebar = ({ maxArticleWidth }: Props) => {\n const [, scrollY] = useScrollPosition();\n const { width: windowWidth } = useWindowDimensions();\n\n // The tricky thing here is that different articles have different maximum widths. I used to dynamically generate the media query using the `maxArticleWidth` prop, but that doesn’t work with Linaria / static CSS-in-JS.\n // So here’s what I need to do instead: we’ll track the window width in state, and derive whether it’s visible or not based on that value.\n const maxArticleWidthInPixels = maxArticleWidth * 16;\n const isVisible =\n typeof windowWidth === 'number' &&\n typeof scrollY === 'number' &&\n scrollY >= 250 &&\n windowWidth > maxArticleWidthInPixels + MINIMUM_BUFFER;\n\n const shiftBy = maxArticleWidth / 2 + 4;\n\n return (\n \n \n \n \n );\n};\n\nconst Wrapper = styled.div`\n position: fixed;\n top: 16rem;\n left: calc(50vw + var(--shift-by));\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n`;\n\nexport default FloatingSidebar;\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\n\ninterface Props extends React.HTMLAttributes {\n ref?: React.RefObject;\n backgroundColor?: string;\n glassColor: string;\n opacity?: number;\n children?: React.ReactNode;\n}\n\nfunction GlassyBackdrop({\n ref,\n backgroundColor,\n glassColor,\n opacity = 1,\n children,\n style = {},\n ...delegated\n}: Props) {\n return (\n \n \n {children}\n \n );\n}\n\nconst Wrapper = styled.div`\n position: relative;\n background: linear-gradient(\n to top,\n transparent 0%,\n var(--fade-to-color) 100%\n );\n`;\n\nconst Backdrop = styled.div`\n --extended-by: 100px;\n --cutoff: calc(100% - var(--extended-by));\n position: absolute;\n inset: 0;\n bottom: calc(var(--extended-by) * -1);\n background: hsl(from var(--glass-color) h s l / 0.7);\n -webkit-mask-image: linear-gradient(\n to bottom,\n black 0,\n black var(--cutoff),\n transparent var(--cutoff)\n );\n mask-image: linear-gradient(\n to bottom,\n black 0,\n black var(--cutoff),\n transparent var(--cutoff)\n );\n\n backdrop-filter: blur(var(--blur-amount));\n pointer-events: none;\n transition: opacity 600ms;\n`;\n\nconst ChildWrapper = styled.div`\n position: relative;\n`;\n\nexport default GlassyBackdrop;\n","export { default } from './GlassyBackdrop';\n","'use client';\n\nimport * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { HEADER_HEIGHT, SUPERHEADER_HEIGHT } from '@/constants';\n\nimport { useGlobalUIState } from '@/components/GlobalUIProvider';\nimport GlassyBackdrop from '@/components/GlassyBackdrop';\n\nfunction GlassyHeaderBackdrop({\n children,\n}: {\n children?: React.ReactNode;\n}) {\n const { superheader } = useGlobalUIState();\n\n const [opacity, setOpacity] = React.useState(1);\n const ref = React.useRef(null);\n\n const hasMounted = React.useRef(false);\n\n React.useEffect(() => {\n hasMounted.current = true;\n }, []);\n\n React.useEffect(() => {\n const target = ref.current; // Element to observe\n const observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n if (entry.intersectionRatio < 1) {\n setOpacity(1);\n } else {\n setOpacity(0);\n }\n },\n {\n root: null,\n threshold: [0, 1.0],\n // Technically, the header never crosses the top of the viewport, since it sticks at 0px, so we'll pretend that it's 1px higher up than it is.\n rootMargin: '-1px 0px 0px 0px',\n }\n );\n\n if (target) {\n observer.observe(target);\n }\n\n // Cleanup on component unmount\n return () => {\n if (target) {\n observer.unobserve(target);\n }\n };\n }, []);\n\n const blockerHeight = superheader\n ? HEADER_HEIGHT + SUPERHEADER_HEIGHT\n : HEADER_HEIGHT;\n\n return (\n \n {children}\n \n );\n}\n\nconst Wrapper = styled(GlassyBackdrop)`\n && {\n position: sticky;\n top: 0;\n height: var(--height);\n z-index: 2;\n }\n`;\n\nexport default GlassyHeaderBackdrop;\n","'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { MAX_NUM_OF_LIKES } from '@/constants';\nimport useSound from '@/hooks/use-sound';\n\nimport { useContent } from '@/components/ContentProvider';\n\nimport LikeButton from './LikeButton';\nimport LikeButtonParticles from './LikeButtonParticles';\n\ninterface Props extends React.HTMLAttributes {\n size?: number;\n}\n\nfunction ConnectedLikeButton({ size = 48, ...delegated }: Props) {\n const {\n metrics,\n actions: { toggleLikeButton },\n } = useContent();\n\n const [playFill] = useSound('/sounds/glug-b.mp3', {\n interrupt: true,\n volume: 0.25,\n });\n const [playPop] = useSound('/sounds/pop.mp3', { volume: 0.5 });\n\n if (typeof metrics.totalNumLikesFromUser !== 'number') {\n return null;\n }\n\n const totalNumLikesFromUser =\n metrics.totalNumLikesFromUser as number;\n\n return (\n \n \n {\n if (totalNumLikesFromUser < MAX_NUM_OF_LIKES) {\n const newNumOfLikes = toggleLikeButton('increment');\n\n playFill({\n playbackRate:\n (newNumOfLikes - 1) / (MAX_NUM_OF_LIKES - 1) + 0.9,\n });\n\n if (newNumOfLikes === MAX_NUM_OF_LIKES) {\n playPop();\n }\n }\n }}\n onUnlike={() => {\n if (totalNumLikesFromUser > 0) {\n const newNumOfLikes = toggleLikeButton('decrement');\n\n playFill({\n playbackRate:\n (newNumOfLikes - 1) / (MAX_NUM_OF_LIKES - 1) + 0.9,\n });\n }\n }}\n // We want to retrigger the \"MAX\" label whenever they click a maxed-out like button\n onMaxLike={() => toggleLikeButton('increment')}\n />\n \n );\n}\n\nconst Wrapper = styled.div`\n position: relative;\n`;\n\nexport default ConnectedLikeButton;\n","'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\nimport { useSpring, animated } from 'react-spring';\n\nimport { MAX_NUM_OF_LIKES } from '@/constants';\n\nimport { useContent } from '@/components/ContentProvider';\n\nfunction LikeCount() {\n const { metrics } = useContent();\n const previousNumOfLikes = React.useRef(metrics.totalNumLikes);\n\n React.useEffect(() => {\n previousNumOfLikes.current = metrics.totalNumLikes;\n }, [metrics.totalNumLikes]);\n\n const action = getAction(\n metrics.totalNumLikes,\n metrics.totalNumLikesFromUser,\n previousNumOfLikes.current\n );\n\n const style = useSpring({\n from: {\n transform:\n action === 'increment'\n ? 'translateY(0px)'\n : action === 'decrement'\n ? 'translateY(-6px)'\n : 'translateY(0px) scale(0.65)',\n opacity: 1,\n },\n to: {\n transform:\n action === 'increment'\n ? 'translateY(-12px)'\n : action === 'decrement'\n ? 'translateY(6px)'\n : 'translateY(-5px) scale(1.25)',\n opacity: 0,\n },\n config: {\n tension: 100,\n friction: 40,\n },\n reset: true,\n });\n\n if (typeof metrics.totalNumLikes !== 'number') {\n return null;\n }\n\n const numOfLikes = metrics.totalNumLikes as number;\n\n return (\n 0\n }\n >\n \n {numOfLikes.toLocaleString()}\n {action && (\n \n \n \n )}\n \n \n );\n}\n\nconst LABELS_BY_ACTION = {\n increment: '+1',\n decrement: '-1',\n 'at-maximum': 'MAX',\n};\n\nconst getAction = (\n totalNumLikes: number | null,\n totalNumLikesFromUser: number | null,\n previousNumOfLikes: number | null\n) => {\n if (\n totalNumLikes === null ||\n previousNumOfLikes === null ||\n totalNumLikesFromUser === null\n ) {\n return null;\n }\n\n if (totalNumLikesFromUser === MAX_NUM_OF_LIKES) {\n return 'at-maximum';\n }\n\n return totalNumLikes > previousNumOfLikes\n ? 'increment'\n : 'decrement';\n};\n\nconst Wrapper = styled.div`\n font-size: 0.9375rem;\n font-weight: var(--font-weight-bold);\n font-family: var(--font-family-mono);\n color: var(--color-gray-700);\n animation: fadeIn 400ms 200ms both;\n\n &[data-has-been-liked-by-user='true'] {\n color: var(--color-secondary);\n }\n`;\n\nconst InnerWrapper = styled.span`\n position: relative;\n display: inline-block;\n`;\n\nconst LabelWrapper = styled.div`\n position: absolute;\n top: 0;\n right: 0;\n transform: translateX(calc(100% + 4px));\n pointer-events: none;\n`;\n\nconst Label = styled(animated.div)`\n font-size: 0.6875rem;\n font-weight: var(--font-weight-bold);\n color: var(--color-gray-500);\n transform-origin: left center;\n`;\n\nexport default React.memo(LikeCount);\n","/*\n I frequently need to track the user’s mouse position, which means re-rendering 60+ times a second when they move the mouse.\n\n Typically, I only care about the mouse position when it’s near a particular element (eg. the \"Like\" button tilting at the cursor when it’s nearby). This hook allows us to track the mouse position, but only re-render when the mouse is near the element. The global event handler still fires on every mousemove, but we skip the state update if it’s not near the element.\n\n When the cursor is not near the element, x/y are both set to `null`.\n*/\nimport * as React from 'react';\n\nimport { getDistanceBetweenPoints } from '@/utils';\n\ninterface MousePosition {\n x: number | null;\n y: number | null;\n}\n\nfunction useMousePositionWhenNearElement({\n boundingBox,\n radius,\n}: {\n boundingBox: DOMRect | null;\n radius: number;\n}) {\n const [mousePosition, setMousePosition] =\n React.useState({\n x: null,\n y: null,\n });\n\n const cachedMousePosition =\n React.useRef(mousePosition);\n cachedMousePosition.current = mousePosition;\n\n React.useEffect(() => {\n const updateMousePosition = (ev: MouseEvent) => {\n if (!boundingBox) {\n return;\n }\n\n const mousePoint = { x: ev.clientX, y: ev.clientY };\n\n const centerPoint = {\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height / 2,\n };\n\n const distance = getDistanceBetweenPoints(\n mousePoint,\n centerPoint\n );\n\n if (distance < radius) {\n setMousePosition(mousePoint);\n } else {\n // We want to set the mouse position to null if the mouse is outside the radius, but we don't want to cause re-renders on every single mouse-move on the other side of the document. Use the cached mouse position to see if we need to change anything\n if (\n cachedMousePosition.current.x !== null ||\n cachedMousePosition.current.y !== null\n ) {\n setMousePosition({ x: null, y: null });\n }\n }\n };\n\n window.addEventListener('mousemove', updateMousePosition);\n\n return () =>\n window.removeEventListener('mousemove', updateMousePosition);\n }, [boundingBox, radius]);\n\n return mousePosition;\n}\n\nexport default useMousePositionWhenNearElement;\n","import {\n clamp,\n getDistanceBetweenPoints,\n convertRadiansToDegrees,\n} from '@/utils';\n\nimport type { MousePosition, PointObj } from './LikeButton.types';\n\nexport const getIsWithinRadius = (\n size: number,\n svgBoundingBox: DOMRect | null,\n cursorPoint: MousePosition\n) => {\n if (!svgBoundingBox || !isMouseNearButton(cursorPoint)) {\n return false;\n }\n\n const areaOfEffectRadius = size * 2;\n\n const headCenterPoint = {\n x: svgBoundingBox.left + svgBoundingBox.width / 2,\n y: svgBoundingBox.top + svgBoundingBox.height / 2,\n };\n\n const distanceToHead = getDistanceBetweenPoints(\n cursorPoint,\n headCenterPoint\n );\n\n return distanceToHead <= areaOfEffectRadius;\n};\n\nexport const getBodyRotation = (\n size: number,\n svgBoundingBox: DOMRect | null,\n cursorPoint: MousePosition\n) => {\n if (!svgBoundingBox || !isMouseNearButton(cursorPoint)) {\n return 0;\n }\n\n const areaOfEffectRadius = size * 2;\n\n const headCenterPoint = {\n x: svgBoundingBox.left + svgBoundingBox.width / 2,\n y: svgBoundingBox.top + svgBoundingBox.height / 2,\n };\n\n const distanceToHead = getDistanceBetweenPoints(\n cursorPoint,\n headCenterPoint\n );\n\n if (distanceToHead > areaOfEffectRadius) {\n return 0;\n }\n\n const deltaX = headCenterPoint.x - cursorPoint.x;\n const deltaY = headCenterPoint.y - cursorPoint.y;\n\n const angleInRads = Math.atan2(deltaY, deltaX);\n const angleInDegrees = 180 + convertRadiansToDegrees(angleInRads);\n\n const rotationMax = 10;\n\n let a, b;\n if (angleInDegrees < 180) {\n a = (rotationMax / 90) * -1;\n b = rotationMax;\n } else {\n a = rotationMax / 90;\n b = rotationMax * -3;\n }\n\n return a * angleInDegrees + b;\n};\n\nexport const getEyeTranslation = (\n size: number,\n svgBoundingBox: DOMRect | null,\n cursorPoint: MousePosition\n) => {\n if (!svgBoundingBox || !isMouseNearButton(cursorPoint)) {\n return 0;\n }\n\n const areaOfEffectRadius = size * 2;\n\n const headCenterPoint = {\n x: svgBoundingBox.left + svgBoundingBox.width / 2,\n y: svgBoundingBox.top + svgBoundingBox.height / 2,\n };\n\n const distanceToHead = getDistanceBetweenPoints(\n cursorPoint,\n headCenterPoint\n );\n\n if (distanceToHead > areaOfEffectRadius) {\n return 0;\n }\n\n const deltaX = cursorPoint.x - headCenterPoint.x;\n const deltaY = cursorPoint.y - headCenterPoint.y;\n\n const maxDisplacement = size * 0.025;\n const reachMaxAt = areaOfEffectRadius / 2;\n\n const unboundTranslateX = (deltaX / reachMaxAt) * maxDisplacement;\n const unboundTranslateY = (deltaY / reachMaxAt) * maxDisplacement;\n\n return {\n x: clamp(unboundTranslateX, -maxDisplacement, maxDisplacement),\n y: clamp(unboundTranslateY, -maxDisplacement, maxDisplacement),\n };\n};\n\nconst isMouseNearButton = (\n mousePosition: MousePosition\n): mousePosition is PointObj => {\n return mousePosition.x !== null && mousePosition.y !== null;\n};\n","import React from 'react';\nimport { styled } from '@linaria/react';\nimport { useSpring, animated, to } from 'react-spring';\n\nimport { MAX_NUM_OF_LIKES } from '@/constants';\nimport useMousePositionWhenNearElement from '@/hooks/use-mouse-position-when-near-element';\nimport useBoundingBox from '@/hooks/use-bounding-box';\nimport usePrefersReducedMotion from '@/hooks/use-prefers-reduced-motion';\n\nimport VisuallyHidden from '@/components/VisuallyHidden';\n\nimport {\n getBodyRotation,\n getEyeTranslation,\n getIsWithinRadius,\n} from './LikeButton.helpers';\nimport type { Status, MousePosition } from './LikeButton.types';\n\n// NOTE: These constants are provided as a convenience, but they are *NOT* used throughout. This means you can't change these values and expect everything to scale properly :( sorry about that!\nconst VIEWBOX_WIDTH = 50;\nconst VIEWBOX_HEIGHT = 42;\n\nconst FAST_SPRING = { tension: 1270, friction: 200 };\n\ninterface Props {\n size?: number;\n totalNumLikesFromUser: number;\n enableBounceOnMaxout?: boolean;\n onLike: () => void;\n onUnlike: () => void;\n onMaxLike: () => void;\n}\n\nfunction LikeButton({\n size = 48,\n totalNumLikesFromUser,\n enableBounceOnMaxout = false,\n onLike,\n onUnlike,\n onMaxLike,\n}: Props) {\n const id = React.useId().replace(/:/g, '');\n\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const svgRef = React.useRef(null);\n const svgBoundingBox = useBoundingBox(svgRef);\n\n const cursorPoint = useMousePositionWhenNearElement({\n boundingBox: svgBoundingBox,\n radius: size * 3,\n });\n\n const bodyStyle = useBodyRotation(\n size,\n svgBoundingBox,\n cursorPoint,\n prefersReducedMotion\n );\n\n const [status, setStatus] = useStatus(\n totalNumLikesFromUser,\n size,\n svgBoundingBox,\n cursorPoint\n );\n\n // Magnification controls the zoom on mouseover/click.\n const [magnification, setMagnification] = React.useState(1);\n\n const width = size;\n const height = width * 0.84;\n\n return (\n setMagnification(1.1)}\n onMouseLeave={() => setMagnification(1)}\n onMouseDown={(ev) => {\n if (ev.buttons === 1) {\n setMagnification(1.2);\n }\n }}\n onMouseUp={() => setMagnification(1.1)}\n onClick={() => {\n if (totalNumLikesFromUser < MAX_NUM_OF_LIKES) {\n onLike();\n setStatus(\n totalNumLikesFromUser + 1 === MAX_NUM_OF_LIKES\n ? 'super-happy'\n : 'slightly-happy'\n );\n } else {\n onMaxLike();\n }\n }}\n onContextMenu={(ev) => {\n ev.preventDefault();\n if (totalNumLikesFromUser > 0) {\n onUnlike();\n }\n\n setStatus('sad');\n }}\n style={{\n transform: `scale(${\n prefersReducedMotion ? 1 : magnification\n })`,\n transition: 'transform 250ms',\n }}\n >\n \"Like\" this post\n \n \n \n\n {/* Backgrounds */}\n \n \n \n \n \n\n \n\n \n\n \n \n \n \n \n );\n}\n\n// This hook controls the masking to show the pink/red background.\nconst useFillingUpAnimation = (\n totalNumLikesFromUser: number,\n prefersReducedMotion: boolean\n) => {\n const progress = totalNumLikesFromUser / MAX_NUM_OF_LIKES;\n\n const skewedProgress = 0.75 * Math.log10(progress * 1.75) + 0.818;\n\n const spring = useSpring({\n amount:\n totalNumLikesFromUser === 0\n ? VIEWBOX_HEIGHT\n : VIEWBOX_HEIGHT - skewedProgress * VIEWBOX_HEIGHT,\n config: FAST_SPRING,\n immediate: prefersReducedMotion,\n });\n\n return spring;\n};\n\nconst useFrownIfDisengaged = (\n size: number,\n svgBoundingBox: DOMRect | null,\n cursorPoint: MousePosition,\n totalNumLikesFromUser: number,\n status: Status,\n setStatus: React.Dispatch>\n) => {\n const wasWithinRadiusRef = React.useRef(false);\n const isWithinRadius = getIsWithinRadius(\n size,\n svgBoundingBox,\n cursorPoint\n );\n\n React.useEffect(() => {\n if (isWithinRadius) {\n wasWithinRadiusRef.current = true;\n } else {\n if (!isWithinRadius && wasWithinRadiusRef.current) {\n wasWithinRadiusRef.current = false;\n if (totalNumLikesFromUser === 0) {\n setStatus('sad');\n\n window.setTimeout(() => {\n setStatus((status) => {\n if (status === 'sad') {\n return 'slightly-happy';\n } else {\n return status;\n }\n });\n }, 3000);\n }\n }\n }\n }, [isWithinRadius, totalNumLikesFromUser, status, setStatus]);\n};\n\nconst useBodyRotation = (\n size: number,\n svgBoundingBox: DOMRect | null,\n cursorPoint: MousePosition,\n prefersReducedMotion: boolean\n) => {\n const bodyRotationRaw = getBodyRotation(\n size,\n svgBoundingBox,\n cursorPoint\n );\n\n const rotation = prefersReducedMotion ? 0 : bodyRotationRaw;\n\n return useSpring({\n transform: `rotate(${rotation}deg)`,\n });\n};\n\n// This hook provides values for the way the button reacts to mousemove. The eyes translate around, the overall shape rotates.\nconst useEyePosition = (\n size: number,\n svgBoundingBox: DOMRect | null,\n cursorPoint: MousePosition,\n prefersReducedMotion: boolean\n) => {\n const eyeTranslationRaw = getEyeTranslation(\n size,\n svgBoundingBox,\n cursorPoint\n ) || { x: 0, y: 0 };\n\n const spring = useSpring({\n x: prefersReducedMotion ? 0 : eyeTranslationRaw.x,\n y: prefersReducedMotion ? 0 : eyeTranslationRaw.y,\n });\n\n return spring;\n};\n\nconst useStatus = (\n totalNumLikesFromUser: number,\n size: number,\n svgBoundingBox: DOMRect | null,\n cursorPoint: MousePosition\n): [Status, React.Dispatch>] => {\n const defaultStatus =\n totalNumLikesFromUser === MAX_NUM_OF_LIKES\n ? 'super-happy'\n : 'slightly-happy';\n\n const [status, setStatus] = React.useState(defaultStatus);\n\n useFrownIfDisengaged(\n size,\n svgBoundingBox,\n cursorPoint,\n totalNumLikesFromUser,\n status,\n setStatus\n );\n\n return [status, setStatus];\n};\n\n// This hook controls the transition between the `slightly-happy` and `sad` statuses.\nconst useMouthControlPoint = (status: Status) => {\n // When our button is not liked, it has a quadratic curve for a mouth. That curve can be pointing down, when 'slightly-happy', or up, when 'sad'. We want to animate that transition, so we'll interpolate the point that controls that quadratic Bezier curve.\n const happyControlPosition = VIEWBOX_HEIGHT * 0.8;\n const sadControlPosition = VIEWBOX_HEIGHT * 0.6;\n\n const getPosition = (status: Status) =>\n status === 'sad' ? sadControlPosition : happyControlPosition;\n\n const defaultPosition = getPosition(status);\n\n const spring = useSpring({\n position: defaultPosition,\n config: FAST_SPRING,\n });\n\n return spring;\n};\n\nfunction Effects() {\n return (\n \n \n \n \n \n );\n}\n\nconst GradientsAndMasks = React.memo(function GradientsAndMasks({\n id,\n totalNumLikesFromUser,\n prefersReducedMotion,\n}: {\n id: string;\n totalNumLikesFromUser: number;\n prefersReducedMotion: boolean;\n}) {\n const pinkFillSpring = useFillingUpAnimation(\n totalNumLikesFromUser,\n prefersReducedMotion\n );\n\n return (\n <>\n \n {/* \"Filled\" gradient (pink and red) */}\n \n \n \n \n \n \n \n \n \n\n {/*\n This mask is essentially `overflow: hidden` for the heart outline. It helps make sure our wide-sweeping lower shadow only shows on the heart.\n */}\n \n \n \n\n \n `\n 0,${VIEWBOX_HEIGHT}\n ${VIEWBOX_WIDTH},${VIEWBOX_HEIGHT}\n ${VIEWBOX_WIDTH},${height}\n 0,${height}\n `\n )}\n fill=\"#000000\"\n />\n \n \n );\n});\n\nconst Mouth = React.memo(function Mouth({\n status,\n hasMaxed,\n}: {\n status: Status;\n hasMaxed: boolean;\n}) {\n const spring = useMouthControlPoint(status);\n\n return (\n \n \n \n \n {/* Really-happy mouth */}\n \n \n \n \n {/* Happy/Sad inverting mouth */}\n `\n M 20 30\n Q 25 ${y} 30 30\n `\n )}\n stroke=\"var(--face-color)\"\n strokeLinecap=\"round\"\n style={{\n opacity: !hasMaxed ? 1 : 0,\n }}\n />\n \n );\n});\n\nconst Eyes = React.memo(function Eyes({\n status,\n size,\n svgBoundingBox,\n cursorPoint,\n prefersReducedMotion,\n}: {\n status: Status;\n size: number;\n svgBoundingBox: DOMRect | null;\n cursorPoint: MousePosition;\n prefersReducedMotion: boolean;\n}) {\n const eyePosition = useEyePosition(\n size,\n svgBoundingBox,\n cursorPoint,\n prefersReducedMotion\n );\n\n return (\n <>\n {/* eyes - default */}\n `translate(${x}px, ${y}px)`\n ),\n }}\n >\n \n \n \n {/* Eyes - extra happy */}\n \n \n \n \n \n );\n});\n\nconst Button = styled.button`\n animation: fadeIn 400ms;\n -webkit-tap-highlight-color: transparent;\n`;\n\nconst BounceWrapper = styled.span`\n display: block;\n animation: bounce 400ms alternate\n cubic-bezier(0.17, 0.67, 0.54, 0.93);\n animation-iteration-count: 6;\n\n &[data-bounce='false'] {\n animation: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n\n @keyframes bounce {\n 0% {\n transform: translateY(0);\n }\n 100% {\n transform: translateY(-20%);\n }\n }\n`;\n\nconst Svg = styled(animated.svg)`\n --empty-heart-lower: hsl(225deg 15% 75%);\n --empty-heart-upper: hsl(225deg 40% 86%);\n --face-color: hsl(210deg 15% 6% / 0.5);\n --open-mouth-color: hsl(345deg 65% 30%);\n --tongue-color: hsl(350deg 64% 44%);\n\n html[data-color-mode='dark'] & {\n --empty-heart-lower: hsl(225deg 15% 75% / 0.5);\n --empty-heart-upper: hsl(225deg 40% 86% / 0.5);\n --face-color: hsl(210deg 15% 6% / 0.9);\n --open-mouth-color: hsl(345deg 65% 20%);\n --tongue-color: hsl(350deg 64% 40%);\n }\n`;\n\nexport default LikeButton;\n","import React from 'react';\nimport { styled } from '@linaria/react';\nimport { useSpring, animated } from 'react-spring';\n\nimport type { ParticleData } from './LikeButton.types';\n\nfunction Particle({\n angleInRads,\n distance,\n sprite,\n rotation,\n springConfig,\n}: ParticleData) {\n const fromX = Math.cos(angleInRads) * (distance * 0.75);\n const fromY = Math.sin(angleInRads) * (distance * 0.75);\n const toX = Math.cos(angleInRads) * distance;\n const toY = Math.sin(angleInRads) * distance;\n\n const style = useSpring({\n from: {\n transform: `translate(${fromX}px, ${fromY}px) rotate(0deg)`,\n },\n to: {\n transform: `translate(${toX}px, ${toY}px) rotate(${rotation}deg)`,\n },\n config: springConfig,\n });\n\n return (\n \n );\n}\n\nconst Image = styled(animated.img)`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n margin: auto;\n transform-origin: center center;\n animation: fadeOut 750ms 200ms both;\n`;\n\nexport default React.memo(Particle);\n","import React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { MAX_NUM_OF_LIKES } from '@/constants';\nimport useInterval from '@/hooks/use-interval';\nimport {\n generateId,\n sample,\n random,\n range,\n normalize,\n} from '@/utils';\n\nimport defaultSprites from '@/components/ConfettiGeyser/default-sprites';\nimport Particle from './Particle';\n\nimport type { ParticleData } from './LikeButton.types';\n\nfunction generateParticles(\n num: number,\n size: number\n): Array {\n const createdAt = Date.now();\n\n return range(1, num).map((i) => {\n const [sprite] = sample(defaultSprites);\n\n // I want to distribute the particles roughly equally across 360 degrees. If we are generating 4 particles, each should be in its own quadrant. For that, I need to figure out the \"ratio\" of this sprite:\n // 1/4 is 0.25, 2/4 is 0.5, 3/4 is 0.75, 4/4 is 1.\n const angleMin = (i / num) * 360;\n const angleMax = ((i + 1) / num) * 360;\n\n const angle = random(angleMin, angleMax);\n const angleInRads = (angle * Math.PI) / 180;\n\n let distance = random(size * 0.5, size * 1.5);\n if (angle > 45 && angle < 135) {\n distance *= 0.5;\n }\n\n const rotation = random(0, 180);\n\n const tension = normalize(distance, size * 0.5, size, 150, 300);\n const friction = normalize(distance, size * 0.5, size, 22, 26);\n const mass = normalize(sprite.width, 12, 50, 0.75, 1.5);\n\n return {\n id: generateId(8),\n createdAt,\n sprite,\n angle,\n angleInRads,\n distance,\n rotation,\n springConfig: {\n tension,\n friction,\n mass,\n },\n };\n });\n}\n\ninterface Props {\n totalNumLikesFromUser: number;\n size: number;\n}\n\nfunction LikeButtonParticles({ totalNumLikesFromUser, size }: Props) {\n const [particles, setParticles] = React.useState<\n Array\n >([]);\n const cachedNumOfMyLikes = React.useRef(totalNumLikesFromUser);\n\n React.useEffect(() => {\n const diff = totalNumLikesFromUser - cachedNumOfMyLikes.current;\n\n if (diff > 0 && totalNumLikesFromUser === MAX_NUM_OF_LIKES) {\n setParticles((currentParticles) => {\n return [...currentParticles, ...generateParticles(9, size)];\n });\n }\n\n cachedNumOfMyLikes.current = totalNumLikesFromUser;\n }, [size, totalNumLikesFromUser]);\n\n // Garbage collection\n useInterval(() => {\n const now = Date.now();\n const freshParticles = particles.filter((particle) => {\n const delta = now - particle.createdAt;\n\n return delta < 1500;\n });\n\n if (freshParticles.length < particles.length) {\n setParticles(freshParticles);\n }\n }, 5000);\n\n return (\n \n {particles.map((particle) => (\n \n ))}\n \n );\n}\n\nconst Wrapper = styled.div`\n position: absolute;\n inset: 0;\n`;\n\nexport default LikeButtonParticles;\n","'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\nimport { useSpring, animated } from 'react-spring';\n\nimport { BREAKPOINTS } from '@/constants';\n\nimport JericaMascot from '@/components/JericaMascot';\n\nfunction UpsideDownJerica() {\n const [offset, setOffset] = React.useState(-216);\n const wrapperRef = React.useRef(null);\n\n React.useEffect(() => {\n const target = wrapperRef.current;\n\n if (!target) {\n return;\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.intersectionRatio < 0.2) {\n setOffset(-226);\n } else if (entry.intersectionRatio < 0.5) {\n setOffset(-150);\n } else {\n setOffset(-82);\n }\n },\n {\n threshold: [0.2, 0.5],\n }\n );\n\n observer.observe(target);\n\n return () => {\n if (target) {\n observer.disconnect();\n }\n };\n }, []);\n\n const style = useSpring({\n '--offset': `${offset}px`,\n config: {\n tension: 160,\n friction: 32,\n },\n });\n\n return (\n \n \n \n \n \n );\n}\n\nconst MascotWrapper = styled.div`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: clip;\n`;\n\nconst Slider = styled(animated.div)`\n position: absolute;\n left: 50%;\n transform: translate(-533px, var(--offset)) rotate(180deg);\n will-change: transform;\n\n @media (max-width: 67.5rem) {\n left: 0;\n transform: translateY(-82px) rotate(180deg);\n }\n @media ${BREAKPOINTS.smAndSmaller} {\n display: none;\n }\n`;\n\nexport default UpsideDownJerica;\n","'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\n\nconst SKIP_TARGET_ID = `jwc-skip-here`;\n\nexport function SkipNavTrigger({\n children = `Skip to content`,\n}: {\n children?: React.ReactNode;\n}) {\n const [hasAValidTarget, setHasAValidTarget] = React.useState(false);\n\n React.useEffect(() => {\n const target = document.querySelector(`#${SKIP_TARGET_ID}`);\n\n if (!!target !== hasAValidTarget) {\n setHasAValidTarget(!!target);\n }\n // We only want to do this on-mount, because we have no way of knowing when the SkipNavTarget will show up. We assume it's there on mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // If we've rendered the trigger, but there is no target available, we don't want to show the trigger. Doing so would just be frustrating, since it wouldn't skip anything.\n if (!hasAValidTarget) {\n return null;\n }\n\n return {children};\n}\n\nexport function SkipNavTarget({\n scrollMarginTop = 64,\n}: {\n scrollMarginTop?: number;\n}) {\n return ;\n}\n\nconst Trigger = styled.a`\n position: fixed;\n z-index: 99999;\n top: 32px;\n left: 32px;\n padding: 16px 24px;\n border-radius: 12px;\n background: var(--color-background);\n color: var(--color-text);\n box-shadow:\n 0 -5.9px 2.7px rgba(0, 0, 0, 0.018),\n 0 -1.2px 6.9px rgba(0, 0, 0, 0.024),\n 0 8px 14.2px rgba(0, 0, 0, 0.03),\n 0 21.9px 29.2px rgba(0, 0, 0, 0.039),\n 0 49px 80px rgba(0, 0, 0, 0.07);\n\n /* Visually hidden stuff */\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n overflow: hidden;\n position: absolute !important;\n width: 1px;\n\n &:focus {\n width: auto;\n height: auto;\n clip: auto;\n }\n`;\n\nconst Target = styled.div`\n contain: none;\n`;\n","import React from 'react';\n\nimport { throttle } from '@/utils';\n\ninterface ScrollPosition {\n x: number | null;\n y: number | null;\n}\n\nconst useScrollPosition = (throttleBy = 500) => {\n const [scrollPosition, setScrollPosition] =\n React.useState({\n x: null,\n y: null,\n });\n\n React.useEffect(() => {\n const handleScroll = throttle(() => {\n setScrollPosition({ x: window.scrollX, y: window.scrollY });\n }, throttleBy);\n\n // Calculate the initial scroll position:\n handleScroll();\n\n window.addEventListener('scroll', handleScroll);\n\n return () => window.removeEventListener('scroll', handleScroll);\n }, [throttleBy]);\n\n return [scrollPosition.x, scrollPosition.y];\n};\n\nexport default useScrollPosition;\n","import React from 'react';\n\ntype ToggleFn = (newVal?: any) => void;\n\nexport default function useToggle(\n initialValue: boolean = false\n): [boolean, ToggleFn] {\n const [value, setValue] = React.useState(initialValue);\n\n const toggle = React.useCallback((newVal: any) => {\n setValue((v) => {\n // The main use case for this function is to be called without any arguments, which flips the `value` between true/false.\n // However, the user can supply a new boolean value if they want to explicitly turn it on or off.\n // The trick here is that we want to ignore any non-boolean values. This becomes relevant when the `toggle` function is passed as a callback function to an event handler; we want to ignore the MouseEvent or whatever that is automatically passed in.\n if (typeof newVal === 'boolean') {\n return newVal;\n }\n\n return !v;\n });\n }, []);\n\n return [value, toggle];\n}\n","'use client';\n\nimport dynamic from 'next/dynamic';\n\nexport const BoxModelQuiz = dynamic(() => import('./BoxModelQuiz'));\nexport const HeightAccordionDemo = dynamic(\n () => import('./HeightAccordionDemo')\n);\nexport const NoInterpolateSize = dynamic(\n () => import('./NoInterpolateSize')\n);\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wn1j5xj\":\"wn1j5xj\",\"pi40lrf\":\"pi40lrf\",\"tgqp2fj\":\"tgqp2fj\",\"d66f43p\":\"d66f43p\",\"h15tjzrj\":\"h15tjzrj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1cj4f62\":\"w1cj4f62\",\"r16cvir6\":\"r16cvir6\",\"k1ck4psj\":\"k1ck4psj\",\"v18wai4v\":\"v18wai4v\",\"vspfqj7\":\"vspfqj7\",\"l1mtlr64\":\"l1mtlr64\",\"slreaoj\":\"slreaoj\",\"lt8ff1b\":\"lt8ff1b\",\"s13aepni\":\"s13aepni\",\"o1mqqjdj\":\"o1mqqjdj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"t1k33q0w\":\"t1k33q0w\",\"tfn08jb\":\"tfn08jb\",\"a6iob7g\":\"a6iob7g\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"a1perbvc\":\"a1perbvc\",\"full-bleed\":\"full-bleed\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wv8ehy8\":\"wv8ehy8\",\"fadeIn\":\"fadeIn\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1hm4zut\":\"w1hm4zut\",\"b1bneqkz\":\"b1bneqkz\",\"chcghc5\":\"chcghc5\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wop3cuv\":\"wop3cuv\",\"b3r748y\":\"b3r748y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wvm4gg4\":\"wvm4gg4\",\"d1qadnsl\":\"d1qadnsl\",\"l1enswin\":\"l1enswin\",\"mr2l5ys\":\"mr2l5ys\",\"hjm134z\":\"hjm134z\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1z0sj4v\":\"w1z0sj4v\",\"stp2p9w\":\"stp2p9w\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w13k5jd7\":\"w13k5jd7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w126hx4k\":\"w126hx4k\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wsget5k\":\"wsget5k\",\"hgi1u0t\":\"hgi1u0t\",\"hk16vgu\":\"hk16vgu\",\"ct8xn3p\":\"ct8xn3p\",\"t1wzz3cs\":\"t1wzz3cs\",\"a1pqas9\":\"a1pqas9\",\"gcstchc\":\"gcstchc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1cefnex\":\"w1cefnex\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1s5vu77\":\"w1s5vu77\",\"fadeIn\":\"fadeIn\",\"ios0xdl\":\"ios0xdl\",\"l19dwcuh\":\"l19dwcuh\",\"lac7mu2\":\"lac7mu2\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"b3tctqx\":\"b3tctqx\",\"fadeIn\":\"fadeIn\",\"bqupjym\":\"bqupjym\",\"bounce-bqupjym\":\"bounce-bqupjym\",\"s1xkxsxh\":\"s1xkxsxh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wiqb88y\":\"wiqb88y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"idjdwyl\":\"idjdwyl\",\"fadeOut\":\"fadeOut\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"otmfpu7\":\"otmfpu7\",\"w192eflb\":\"w192eflb\",\"ohu97qs\":\"ohu97qs\",\"t1jfxdgt\":\"t1jfxdgt\",\"an8t860\":\"an8t860\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w6wwq2r\":\"w6wwq2r\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wfzqr02\":\"wfzqr02\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1r7oec7\":\"w1r7oec7\",\"s1q6y8ki\":\"s1q6y8ki\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1e2q9l8\":\"w1e2q9l8\",\"s1uqj89y\":\"s1uqj89y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mzwsl9m\":\"mzwsl9m\",\"scefed4\":\"scefed4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"t1v2vbab\":\"t1v2vbab\",\"t1jehbg7\":\"t1jehbg7\"};"],"names":["Wrapper","styled","name","class","propsAsIs","Prefix","Title","DateWrapper","HitsWrapper","BlogPostContentFooter","contentData","metrics","React","ContentContext","humanReadableDate","formattedDates","updatedOn","humanReadable","publishedOn","wrapperRef","HTMLDivElement","hasReachedFooter","useIsOnscreen","ignoreSubsequentEntries","contentType","marginLeft","hits","src","DEFAULT_SPRITES","width","height","airFrictionMultiplier","useDebouncedEffect","dependencies","debounceBy","timeoutId","window","setTimeout","callback","clearTimeout","totalNumLikes","totalNumLikesFromUser","lastInteractionAt","actions","toggleLikeButton","useContent","context","undefined","ContentProvider","children","useBlogPostMetrics","slug","category","categorySlug","setMetrics","metricsRef","current","fetch","then","res","json","error","console","currentMetrics","method","body","JSON","stringify","numLikes","incrementBy","action","MAX_NUM_OF_LIKES","newTotalNumLikes","newTotalNumLikesFromUser","Date","now","data","Provider","value","FadeIn","duration","delay","delegated","style","animationDuration","animationDelay","Button","HitCounter","isOn","toggleOn","useToggle","playPress","stop","pausePress","useSound","volume","playOn","playOff","toggleCounter","ev","key","border","DarkLayer","LightLayer","MascotBase","Head","JericaMascot","colorModeOverride","mood","fadeDuration","fadeDelay","colorMode","globalColorMode","UserPreferencesContext","FloatingSidebar","maxArticleWidth","scrollY","useScrollPosition","windowWidth","useWindowDimensions","isVisible","maxArticleWidthInPixels","MINIMUM_BUFFER","shiftBy","opacity","visibility","transition","Backdrop","ChildWrapper","GlassyBackdrop","ref","backgroundColor","glassColor","GlassyHeaderBackdrop","superheader","useGlobalUIState","setOpacity","hasMounted","target","IntersectionObserver","entry","intersectionRatio","root","threshold","observer","observe","unobserve","blockerHeight","HEADER_HEIGHT","SUPERHEADER_HEIGHT","ConnectedLikeButton","size","playFill","interrupt","playPop","newNumOfLikes","playbackRate","LABELS_BY_ACTION","increment","decrement","getAction","previousNumOfLikes","InnerWrapper","LabelWrapper","Label","animated","div","LikeCount","useSpring","from","transform","to","config","tension","friction","reset","numOfLikes","toLocaleString","useMousePositionWhenNearElement","boundingBox","radius","mousePosition","setMousePosition","x","y","cachedMousePosition","updateMousePosition","mousePoint","clientX","clientY","centerPoint","left","top","distance","getDistanceBetweenPoints","addEventListener","removeEventListener","getIsWithinRadius","svgBoundingBox","cursorPoint","isMouseNearButton","headCenterPoint","areaOfEffectRadius","a","b","deltaX","angleInRads","Math","atan2","deltaY","angleInDegrees","convertRadiansToDegrees","rotationMax","getEyeTranslation","distanceToHead","maxDisplacement","reachMaxAt","unboundTranslateX","unboundTranslateY","clamp","FAST_SPRING","useFillingUpAnimation","skewedProgress","progress","amount","VIEWBOX_HEIGHT","immediate","prefersReducedMotion","useFrownIfDisengaged","MousePosition","Status","isWithinRadius","wasWithinRadiusRef","setStatus","status","useBodyRotation","getBodyRotation","bodyRotationRaw","useEyePosition","eyeTranslationRaw","useStatus","defaultStatus","useMouthControlPoint","position","defaultPosition","sadControlPosition","happyControlPosition","Effects","GradientsAndMasks","id","pinkFillSpring","VIEWBOX_WIDTH","Mouth","hasMaxed","spring","Eyes","eyePosition","BounceWrapper","Svg","svg","LikeButton","enableBounceOnMaxout","onLike","onUnlike","onMaxLike","replace","usePrefersReducedMotion","svgRef","useBoundingBox","bodyStyle","setMagnification","magnification","Image","img","Particle","sprite","rotation","springConfig","fromX","cos","fromY","sin","toX","toY","LikeButtonParticles","particles","setParticles","Array","cachedNumOfMyLikes","currentParticles","generateParticles","createdAt","range","num","map","sample","defaultSprites","angle","random","angleMin","i","PI","normalize","mass","generateId","useInterval","freshParticles","filter","delta","particle","length","MascotWrapper","Slider","UpsideDownJerica","offset","setOffset","disconnect","SKIP_TARGET_ID","SkipNavTrigger","hasAValidTarget","setHasAValidTarget","document","querySelector","SkipNavTarget","scrollMarginTop","Trigger","Target","throttleBy","scrollPosition","setScrollPosition","handleScroll","throttle","scrollX","initialValue","setValue","newVal","v","BoxModelQuiz","dynamic"],"sourceRoot":"","ignoreList":[]}