{"version":3,"file":"static/chunks/66026-41af60369dc6f9ab.js","mappings":"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","sources":["webpack://_N_E/./src/components/ColorModeContainer/ColorModeContainer.tsx","webpack://_N_E/./src/components/ColorModeContainer/index.ts","webpack://_N_E/./src/components/Icons/IconArrowBullet.tsx","webpack://_N_E/./src/components/Icons/IconHamburger.helpers.ts","webpack://_N_E/./src/components/InPortal/InPortal.tsx","webpack://_N_E/./src/components/InPortal/index.ts","webpack://_N_E/./src/components/Logo/Logo.tsx","webpack://_N_E/./src/components/Logo/index.ts","webpack://_N_E/./src/components/ModalBase/OverlayBase.tsx","webpack://_N_E/./src/components/ModalBase/ModalBase.tsx","webpack://_N_E/./src/components/ModalBase/index.ts","webpack://_N_E/./src/components/Paper/Paper.tsx","webpack://_N_E/./src/components/Paper/index.ts","webpack://_N_E/./src/hooks/use-on-resize.ts","webpack://_N_E/./src/components/Icons/IconLatest.tsx","webpack://_N_E/./src/components/Icons/IconCategories.tsx","webpack://_N_E/./src/components/Icons/IconCourses.tsx","webpack://_N_E/./src/components/Icons/IconGoodies.tsx","webpack://_N_E/./src/components/Icons/IconNewsletter.tsx","webpack://_N_E/./src/components/Icons/Cats/CategoryIconBase.tsx","webpack://_N_E/./src/components/Icons/Cats/IconReact.tsx","webpack://_N_E/./src/components/Icons/Cats/IconCSS.tsx","webpack://_N_E/./src/components/Icons/Cats/IconAnimation.tsx","webpack://_N_E/./src/components/Icons/Cats/IconJS.tsx","webpack://_N_E/./src/components/Icons/Cats/IconCareer.tsx","webpack://_N_E/./src/components/Icons/Cats/IconBlog.tsx","webpack://_N_E/./src/components/NavigationContents/CategoryGrid.tsx","webpack://_N_E/./src/components/MobileMenu/ExpandableGroup.tsx","webpack://_N_E/./src/components/NavigationContents/CoursesList.data.ts","webpack://_N_E/./src/components/NavigationContents/NavigationContents.shared.ts","webpack://_N_E/./src/components/NavigationContents/CoursesListMobile.tsx","webpack://_N_E/./src/components/Icons/Goods/IconGradient.tsx","webpack://_N_E/./src/components/Icons/Goods/IconShadows.tsx","webpack://_N_E/./src/components/Icons/Goods/IconOperatorsActualText.tsx","webpack://_N_E/./src/components/Icons/Goods/IconPortfolioBook.tsx","webpack://_N_E/./src/components/Icons/Goods/IconSnippets.tsx","webpack://_N_E/./src/components/NavigationContents/GoodiesGrid.tsx","webpack://_N_E/./src/components/MobileMenu/JericaLinks.tsx","webpack://_N_E/./src/components/MobileMenu/MobileMenu.helpers.ts","webpack://_N_E/./src/components/MobileMenu/MobileMenu.tsx","webpack://_N_E/./src/components/MobileMenu/index.ts","webpack://_N_E/./src/components/Icons/IconHamburger.tsx","webpack://_N_E/./src/components/SiteHeader/SiteHeader.constants.ts","webpack://_N_E/./src/components/SiteHeader/DesktopNavigation.helpers.ts","webpack://_N_E/./src/components/NavigationContents/CoursesListDesktop.tsx","webpack://_N_E/./src/components/SiteHeader/NavigationTip.tsx","webpack://_N_E/./src/components/SiteHeader/NavigationDropdown.tsx","webpack://_N_E/./src/components/SiteHeader/DesktopNavigation.tsx","webpack://_N_E/./src/components/SiteHeader/IconDrop.tsx","webpack://_N_E/./src/components/SiteHeader/SiteHeader.tsx","webpack://_N_E/./src/helpers/category.helpers.ts","webpack://_N_E/./src/hooks/use-bounding-box.ts","webpack://_N_E/./src/hooks/use-has-hydrated.ts","webpack://_N_E/./src/hooks/use-on-click-outside.ts","webpack://_N_E/./src/components/Icons/Cats/IconAnimation.linaria.module.css","webpack://_N_E/./src/components/Icons/Goods/IconGradient.linaria.module.css","webpack://_N_E/./src/components/Icons/Goods/IconOperatorsActualText.linaria.module.css","webpack://_N_E/./src/components/Icons/Goods/IconPortfolioBook.linaria.module.css","webpack://_N_E/./src/components/Icons/Goods/IconShadows.linaria.module.css","webpack://_N_E/./src/components/Icons/Goods/IconSnippets.linaria.module.css","webpack://_N_E/./src/components/Icons/IconArrowBullet.linaria.module.css","webpack://_N_E/./src/components/Icons/IconHamburger.linaria.module.css","webpack://_N_E/./src/components/Icons/IconNewsletter.linaria.module.css","webpack://_N_E/./src/components/MobileMenu/ExpandableGroup.linaria.module.css","webpack://_N_E/./src/components/MobileMenu/JericaLinks.linaria.module.css","webpack://_N_E/./src/components/MobileMenu/MobileMenu.linaria.module.css","webpack://_N_E/./src/components/ModalBase/ModalBase.linaria.module.css","webpack://_N_E/./src/components/ModalBase/OverlayBase.linaria.module.css","webpack://_N_E/./src/components/NavigationContents/CategoryGrid.linaria.module.css","webpack://_N_E/./src/components/NavigationContents/CoursesListDesktop.linaria.module.css","webpack://_N_E/./src/components/NavigationContents/CoursesListMobile.linaria.module.css","webpack://_N_E/./src/components/NavigationContents/GoodiesGrid.linaria.module.css","webpack://_N_E/./src/components/NavigationContents/NavigationContents.shared.linaria.module.css","webpack://_N_E/./src/components/SiteHeader/DesktopNavigation.linaria.module.css","webpack://_N_E/./src/components/SiteHeader/IconDrop.linaria.module.css","webpack://_N_E/./src/components/SiteHeader/NavigationDropdown.linaria.module.css","webpack://_N_E/./src/components/SiteHeader/NavigationTip.linaria.module.css","webpack://_N_E/./src/components/SiteHeader/SiteHeader.linaria.module.css"],"sourcesContent":["/**\n This component allows us to create pockets of DOM that apply a specific color mode, regardless of the user's settings. For example, should always be dark.\n\n NOTE: Unlike ColorModeContainer in Course Platform, this one doesn’t inherit the default value from context. That's because it would lead to a FOUC: the context value isn't known during the initial SSR render. If I want a chunk of the site to be colored based on the global color mode preference, I should use the LIGHT_COLORS_CSS / DARK_COLORS_CSS strings. See `/app/email/[emailSlug]/page.tsx` for an example (the Content styled component).\n*/\n\nimport * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport {\n LIGHT_COLORS_CSS,\n DARK_COLORS_CSS,\n LIGHT_COLORS,\n ColorMode,\n} from '@/constants';\n\nexport interface Props extends React.HTMLAttributes {\n colorMode: ColorMode;\n // For light containers In Dark Mode, we set the background to --color-adaptive-white instead of the standard white, to make it easier on the eyes. Sometimes, though, this causes contrast issues with other elements. We can disable this behavior by setting useAdaptiveColors to false.\n useAdaptiveColors?: boolean;\n forwardedAs?: React.ElementType;\n}\n\nfunction ColorModeContainer(\n {\n colorMode,\n useAdaptiveColors = true,\n forwardedAs = 'div',\n ...delegated\n }: Props,\n ref: React.Ref\n) {\n const Wrapper = colorMode === 'light' ? LightWrapper : DarkWrapper;\n\n return (\n \n );\n}\n\nexport const LightWrapper = styled.div`\n ${LIGHT_COLORS_CSS}\n color: var(--color-text);\n background: var(--color-background);\n border-radius: 4px;\n color-scheme: light;\n\n /* The default background for our paper cards in Dark Mode is the “adaptive white” offwhite (specified below). In some cases, we *want* it to use the same white as Light Mode. This variable allows for that: */\n --color-original-white: ${LIGHT_COLORS['--color-background']};\n\n --selection-background-color: hsl(50deg 100% 78%);\n --selection-text-color: black;\n\n /*\n When displaying a light-colored section in dark mode, we don't want to overwrite \"adaptive\" colors. These colors are intended to soften contrast, and so it would be harsh to have true white in dark mode.\n */\n html[data-color-mode='dark'] &[data-use-adaptive-colors='true'] {\n --color-adaptive-white: inherit !important;\n --color-background: var(--color-adaptive-white);\n }\n`;\n\nexport const DarkWrapper = styled.div`\n ${DARK_COLORS_CSS}\n color: var(--color-text);\n background: var(--color-background);\n border-radius: 4px;\n color-scheme: dark;\n\n --selection-background-color: hsl(250deg 20% 60% / 0.35);\n --selection-text-color: white;\n`;\n\nexport default React.forwardRef(\n ColorModeContainer\n);\n","export {\n default,\n LightWrapper,\n DarkWrapper,\n} from './ColorModeContainer';\nexport type { Props } from './ColorModeContainer';\n","/*\n Based on ArrowRight from Feather Icons, except it can be booped to point towards something. Meant to be used as a bullet in a list.\n*/\nimport { styled } from '@linaria/react';\nimport { useSpring, animated } from 'react-spring';\n\nimport useBoopMinimal from '@/hooks/use-boop-minimal';\n\nconst SPRING_CONFIG = {\n tension: 300,\n friction: 16,\n};\n\ninterface Props extends React.SVGProps {\n size?: number;\n isHovering?: boolean;\n}\n\nfunction IconArrowBullet({\n size = 20,\n isHovering = false,\n ...delegated\n}: Props) {\n const isBooped = useBoopMinimal(isHovering);\n\n const lineProps = useSpring({\n x2: isBooped ? 23 : 18,\n config: SPRING_CONFIG,\n });\n const polyLineProps = useSpring({\n points: isBooped ? '17 6 24 12 17 18' : '12 5 19 12 12 19',\n config: SPRING_CONFIG,\n });\n\n return (\n \n \n \n \n );\n}\n\nconst Svg = styled.svg`\n display: block;\n overflow: visible;\n`;\n\nexport default IconArrowBullet;\n","export const VIEWBOX_SIZE = 24;\nconst HAMBURGER_LINE_WIDTH = 18;\nconst HAMBURGER_X_INSET = (VIEWBOX_SIZE - HAMBURGER_LINE_WIDTH) / 2;\nconst HAMBURGER_Y_INSET = HAMBURGER_X_INSET + 2;\nconst CLOSE_INSET = HAMBURGER_X_INSET + 2;\n\nexport type IconStatus = 'closed' | 'opening' | 'open' | 'closing';\n\nexport function getFirstLineProps(\n iconStatus: IconStatus,\n isBooped: boolean\n) {\n switch (iconStatus) {\n case 'closed': {\n const y = isBooped ? HAMBURGER_Y_INSET + 2 : HAMBURGER_Y_INSET;\n\n return {\n x1: HAMBURGER_X_INSET,\n y1: y,\n x2: VIEWBOX_SIZE - HAMBURGER_X_INSET,\n y2: y,\n };\n }\n case 'opening':\n case 'closing':\n return {\n x1: HAMBURGER_X_INSET,\n y1: VIEWBOX_SIZE / 2,\n x2: VIEWBOX_SIZE - HAMBURGER_X_INSET,\n y2: VIEWBOX_SIZE / 2,\n };\n case 'open':\n if (isBooped) {\n return {\n x1: CLOSE_INSET,\n y1: CLOSE_INSET + 2,\n x2: VIEWBOX_SIZE - CLOSE_INSET,\n y2: VIEWBOX_SIZE - CLOSE_INSET - 2,\n };\n }\n return {\n x1: CLOSE_INSET,\n y1: CLOSE_INSET,\n x2: VIEWBOX_SIZE - CLOSE_INSET,\n y2: VIEWBOX_SIZE - CLOSE_INSET,\n };\n }\n}\n\nexport function getSecondLineProps() {\n // The second one is super simple: it doesn't move during the close, and while open, it doesn't even exist.\n return {\n x1: HAMBURGER_X_INSET,\n y1: VIEWBOX_SIZE / 2,\n x2: VIEWBOX_SIZE - HAMBURGER_X_INSET,\n y2: VIEWBOX_SIZE / 2,\n };\n}\nexport function getThirdLineProps(\n iconStatus: IconStatus,\n isBooped: boolean\n) {\n switch (iconStatus) {\n case 'closed': {\n const y = isBooped\n ? VIEWBOX_SIZE - HAMBURGER_Y_INSET - 2\n : VIEWBOX_SIZE - HAMBURGER_Y_INSET;\n return {\n x1: HAMBURGER_X_INSET,\n y1: y,\n x2: VIEWBOX_SIZE - HAMBURGER_X_INSET,\n y2: y,\n };\n }\n case 'opening':\n case 'closing':\n return {\n x1: HAMBURGER_X_INSET,\n y1: VIEWBOX_SIZE / 2,\n x2: VIEWBOX_SIZE - HAMBURGER_X_INSET,\n y2: VIEWBOX_SIZE / 2,\n };\n case 'open':\n if (isBooped) {\n return {\n x1: CLOSE_INSET,\n y1: VIEWBOX_SIZE - CLOSE_INSET - 2,\n x2: VIEWBOX_SIZE - CLOSE_INSET,\n y2: CLOSE_INSET + 2,\n };\n }\n return {\n x1: CLOSE_INSET,\n y1: VIEWBOX_SIZE - CLOSE_INSET,\n x2: VIEWBOX_SIZE - CLOSE_INSET,\n y2: CLOSE_INSET,\n };\n }\n}\n","import * as React from 'react';\nimport ReactDOM from 'react-dom';\n\ninterface Props {\n id?: string;\n children: React.ReactNode;\n parent?: HTMLElement;\n}\n\nconst InPortal = ({ id, children, parent }: Props) => {\n const [hostElement, setHostElement] =\n React.useState(null);\n\n React.useEffect(() => {\n const actualParent = parent || document.body;\n\n const elm = id\n ? document.querySelector(`#${id}`)\n : document.createElement('div');\n\n if (!elm) {\n return;\n }\n\n setHostElement(elm);\n\n if (!id) {\n actualParent.appendChild(elm);\n }\n\n return () => {\n if (!id) {\n // In localhost, this error often masks other errors when a hot reload occurs. We'll wrap it in a try/catch to prevent this.\n try {\n actualParent.removeChild(elm);\n } catch (err) {\n // Swallow it.\n }\n }\n };\n }, [parent, id]);\n\n if (!hostElement) {\n return null;\n }\n\n return ReactDOM.createPortal(children, hostElement);\n};\n\nexport default React.memo(InPortal);\n","export { default } from './InPortal';\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport Link from '@/components/Link';\n\ninterface Props extends React.HTMLAttributes {\n animated?: boolean;\n}\n\nconst Logo = ({ animated, ...delegated }: Props) => {\n const GivenName = animated ? GivenNameAnimated : GivenNameBase;\n const Initial = animated ? InitialAnimated : InitialBase;\n const FamilyName = animated ? FamilyNameAnimated : FamilyNameBase;\n const LilCaret = animated ? LilCaretAnimated : LilCaretBase;\n\n return (\n \n Jerica\n \n \n \n \n\n \n \n \n W\n \n Lancaster\n \n );\n};\n\nconst INITIAL_DELAY = 750;\nconst SCOOCH_DURATION = 300;\nconst UNDER_DRAW_DURATION = 150;\nconst W_DRAW_DURATION = 600;\n\nconst UNDER_PATH_LENGTH = 18;\nconst W_PATH_LENGTH = 26;\n\nconst Wrapper = styled(Link)`\n display: inline-flex;\n font-size: 1.5rem;\n letter-spacing: -0.0625rem;\n padding: 0;\n text-decoration: none;\n color: var(--color-primary);\n`;\n\nconst GivenNameBase = styled.span`\n display: inline-block;\n font-weight: var(--font-weight-medium);\n`;\n\nconst GivenNameAnimated = styled(GivenNameBase)`\n @media (prefers-reduced-motion: no-preference) {\n animation: scoochLeft ${SCOOCH_DURATION}ms ${INITIAL_DELAY}ms\n cubic-bezier(0.27, 0.22, 0.44, 1.03) both;\n }\n\n @keyframes scoochLeft {\n from {\n transform: translateX(6px);\n }\n to {\n transform: translateX(0);\n }\n }\n`;\n\nconst FamilyNameBase = styled.span`\n display: inline-block;\n font-weight: var(--font-weight-medium);\n`;\n\nconst FamilyNameAnimated = styled(FamilyNameBase)`\n @media (prefers-reduced-motion: no-preference) {\n animation: scoochRight ${SCOOCH_DURATION}ms\n ${INITIAL_DELAY + SCOOCH_DURATION * 0.25}ms\n cubic-bezier(0.27, 0.22, 0.44, 1.03) both;\n }\n\n @keyframes scoochRight {\n from {\n transform: translateX(-6px);\n }\n to {\n transform: translateX(0);\n }\n }\n`;\n\nconst LilCaretBase = styled.svg`\n position: absolute;\n left: 6px;\n bottom: 0;\n`;\n\nconst LilCaretAnimated = styled(LilCaretBase)`\n @media (prefers-reduced-motion: no-preference) {\n & path {\n stroke-dasharray: ${UNDER_PATH_LENGTH};\n stroke-dashoffset: ${UNDER_PATH_LENGTH};\n animation: selfDraw ${UNDER_DRAW_DURATION}ms\n ${INITIAL_DELAY + SCOOCH_DURATION}ms both;\n }\n }\n\n @keyframes selfDraw {\n to {\n stroke-dashoffset: 0;\n }\n }\n`;\n\nconst InitialBase = styled.svg`\n position: absolute;\n left: 2px;\n top: -1px;\n`;\n\nconst InitialAnimated = styled(InitialBase)`\n @media (prefers-reduced-motion: no-preference) {\n & path {\n stroke-dasharray: ${W_PATH_LENGTH};\n stroke-dashoffset: ${W_PATH_LENGTH};\n animation: selfDraw ${W_DRAW_DURATION}ms\n ${INITIAL_DELAY + SCOOCH_DURATION + UNDER_DRAW_DURATION}ms\n both cubic-bezier(0.27, 0.22, 0.44, 1.03);\n }\n }\n\n @keyframes selfDraw {\n to {\n stroke-dashoffset: 0;\n }\n }\n`;\n\nconst Path = styled.path`\n stroke: var(--color-gray-700);\n`;\n\nconst InitialWrapper = styled.span`\n display: inline-block;\n position: relative;\n width: 18px;\n`;\n\nconst Invisible = styled.span`\n opacity: 0;\n`;\n\nexport default Logo;\n","export { default } from './Logo';\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\n\nexport interface Props {\n isOpen: boolean;\n enterDuration?: number;\n exitDuration?: number;\n enterDelay?: number;\n exitDelay?: number;\n openOpacity?: number;\n handleDismiss: () => void;\n}\n\nfunction OverlayBase({\n isOpen,\n enterDuration = 1000,\n enterDelay = 0,\n exitDuration = 600,\n exitDelay = 400,\n openOpacity = 1,\n handleDismiss,\n}: Props) {\n return (\n \n );\n}\n\nconst Wrapper = styled.div`\n position: absolute;\n inset: 0;\n background-color: var(--color-muted-background);\n opacity: var(--opacity);\n transition: opacity var(--transition-duration);\n transition-delay: var(--transition-delay);\n pointer-events: auto;\n\n animation: fadeFromTransparent var(--transition-duration)\n var(--transition-delay) backwards;\n`;\n\nexport default OverlayBase;\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\nimport FocusLock from 'react-focus-lock';\n\nimport InPortal from '@/components/InPortal';\nimport OverlayBase, { Props as OverlayProps } from './OverlayBase';\n\ntype DelegatedOverlayProps = Omit<\n OverlayProps,\n 'isOpen' | 'handleDismiss'\n>;\n\ninterface Props extends React.HTMLAttributes {\n isOpen: boolean;\n portalId?: string;\n skipPortal?: boolean;\n returnFocus?: boolean;\n allowScroll?: boolean;\n overlay?: React.ComponentType | null;\n overlayProps?: DelegatedOverlayProps;\n dismissDuration?: number;\n enableDismissAfter?: number;\n handleDismiss: () => void;\n children: React.ReactNode;\n}\n\nfunction ModalBase({\n isOpen,\n portalId,\n skipPortal,\n returnFocus = false,\n allowScroll = false,\n overlay: Overlay = OverlayBase,\n overlayProps = {},\n dismissDuration = 1000,\n enableDismissAfter = 0,\n handleDismiss,\n children,\n ...delegated\n}: Props) {\n const [isRendered, setIsRendered] = React.useState(isOpen);\n\n const lastOpenedTimestamp = React.useRef(0);\n React.useEffect(() => {\n if (isOpen) {\n lastOpenedTimestamp.current = Date.now();\n }\n }, [isOpen]);\n\n React.useEffect(() => {\n if (isOpen) {\n setIsRendered(true);\n return;\n }\n\n const timeoutId = setTimeout(() => {\n setIsRendered(false);\n }, dismissDuration);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [isOpen, isRendered, dismissDuration]);\n\n const handleDismissRef = React.useRef(handleDismiss);\n handleDismissRef.current = handleDismiss;\n\n React.useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n function handleKeyDown(ev: KeyboardEvent) {\n if (ev.key === 'Escape') {\n // In some cases, modals can't be dismissed for a short duration after opening, since doing so would create bugs or jank.\n const timeSinceOpen =\n Date.now() - lastOpenedTimestamp.current;\n const wasOpenedTooRecently =\n timeSinceOpen < enableDismissAfter;\n\n if (!wasOpenedTooRecently) {\n handleDismissRef.current();\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, enableDismissAfter]);\n\n if (!isRendered) {\n return null;\n }\n\n const elem = (\n \n {Overlay && (\n \n )}\n\n \n {children}\n \n \n );\n\n return skipPortal ? (\n elem\n ) : (\n {elem}\n );\n}\n\nconst Wrapper = styled.div`\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n isolation: isolate;\n pointer-events: none;\n`;\n\nconst ChildWrapper = styled.div`\n position: absolute;\n inset: 0;\n width: fit-content;\n height: fit-content;\n margin: auto;\n pointer-events: auto;\n`;\n\nexport default ModalBase;\n","export { default } from './ModalBase';\n","// NOTE: Going forwards, I should use ColorModeContainer directly. This feels like too silly an abstraction. There are 100+ callsites though, so I'm not worrying about it for now.\n\nimport ColorModeContainer, {\n type Props as ColorModeProps,\n} from '@/components/ColorModeContainer';\n\ntype Props = Omit;\n\nfunction Paper(props: Props) {\n return ;\n}\n\nexport default Paper;\n","export { default } from './Paper';\n","import * as React from 'react';\n\nimport { throttle } from '@/utils';\n\nconst useOnResize = (callback: Function, throttleBy = 500) => {\n let isMounted = React.useRef(true);\n\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n\n const handleResize = React.useMemo(() => {\n return throttle((...args: any) => {\n if (isMounted.current) {\n callbackRef.current(...args);\n }\n }, throttleBy);\n }, [throttleBy]);\n\n React.useEffect(() => {\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [handleResize]);\n\n React.useEffect(() => {\n isMounted.current = true;\n\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return null;\n};\n\nexport default useOnResize;\n","import React from 'react';\n\ninterface Props extends React.SVGProps {\n size?: number;\n}\n\nfunction IconLatest({ size = 20 }: Props) {\n return (\n \n \n \n \n \n \n \n );\n}\n\nexport default IconLatest;\n","'use client';\n\nimport React from 'react';\nimport { useSpring, animated } from 'react-spring';\n\ninterface Props extends React.SVGProps {\n size?: number;\n isBooped?: boolean;\n}\n\nconst INSET = 3;\n\nfunction IconCategories({ size = 20, isBooped }: Props) {\n const config = {\n tension: 350,\n friction: 10,\n clamp: isBooped,\n };\n const topStyle = useSpring({\n transform: `translateY(${isBooped ? INSET : 0}px)`,\n config,\n });\n const leftStyle = useSpring({\n transform: `translateX(${isBooped ? INSET : 0}px)`,\n config,\n });\n const rightStyle = useSpring({\n transform: `translateX(${isBooped ? -INSET : 0}px)`,\n config,\n });\n const bottomStyle = useSpring({\n transform: `translateY(${isBooped ? -INSET : 0}px)`,\n config,\n });\n\n return (\n \n \n \n \n \n \n );\n}\n\nexport default IconCategories;\n","'use client';\n\nimport React from 'react';\nimport { useSpring, animated } from 'react-spring';\n\nimport { IconProps } from './Icon.types';\n\nfunction IconCourses({ size = 20, isBooped }: IconProps) {\n const config = {\n tension: 350,\n friction: 10,\n clamp: isBooped,\n };\n\n const spring = useSpring({\n d: isBooped\n ? `\n M 11.562 5\n a 0.5 0.5 0 0 1 .876 0\n L15.39 8.87\n a1 1 0 0 0 1.516.294\n L19.183 5.5\n a 0.5 0.5 0 0 1 .798.519\n l -0.834 10.246\n a1 1 0 0 1-.956.734\n H5.81\n a1 1 0 0 1-.957-.734\n L 4.02 6.02\n a 0.5 0.5 0 0 1 .798-.519\n l 2.276 3.664\n a1 1 0 0 0 1.516-.294z\n `\n : `\n M 11.562 3.266\n a 0.5 0.5 0 0 1 .876 0\n L15.39 8.87\n a1 1 0 0 0 1.516.294\n L21.183 5.5\n a 0.5 0.5 0 0 1 .798.519\n l -2.834 10.246\n a1 1 0 0 1-.956.734\n H5.81\n a1 1 0 0 1-.957-.734\n L 2.02 6.02\n a 0.5 0.5 0 0 1 .798-.519\n l 4.276 3.664\n a1 1 0 0 0 1.516-.294z\n `,\n config,\n });\n\n return (\n \n \n \n \n );\n}\n\nexport default IconCourses;\n","'use client';\n\nimport React from 'react';\nimport { useSpring, animated } from 'react-spring';\n\ninterface Props extends React.SVGProps {\n size?: number;\n isBooped?: boolean;\n}\n\nfunction IconGoodies({ size = 20, isBooped }: Props) {\n const config = {\n tension: 350,\n friction: 10,\n clamp: isBooped,\n };\n const svgStyle = useSpring({\n transform: isBooped ? `rotate(-20deg)` : 'rotate(0deg)',\n transformOrigin: 'center center',\n config,\n });\n\n return (\n \n {/* Bonbon oval */}\n \n\n {/* Stripes */}\n \n \n\n {/* Top twisty wrapper */}\n {/* Tried to animate it, but it just looked funny. */}\n \n {/* Bottom twisty wrapper */}\n \n \n );\n}\n\nexport default IconGoodies;\n","import React from 'react';\nimport { useSpring, animated } from 'react-spring';\nimport { styled } from '@linaria/react';\n\ninterface Props extends React.SVGProps {\n youveGotMail?: boolean;\n mailFlagColor?: string;\n size?: number;\n}\n\nfunction IconNewsletter({\n youveGotMail = false,\n mailFlagColor = 'hsl(340deg 100% 50%)',\n size = 20,\n ...delegated\n}: Props) {\n const mailFlagProps = useSpring({\n points: youveGotMail ? '15,9 15,2 18,2' : '15,9 18,9 18,11',\n config: {\n tension: 300,\n friction: 20,\n clamp: !youveGotMail,\n },\n });\n\n return (\n \n \n \n \n \n \n );\n}\n\nconst MailFlag = styled(animated.polyline)`\n transition: stroke 400ms;\n`;\n\nexport default IconNewsletter;\n","import { IconProps } from '../Icon.types';\n\nfunction CategoryIconBase({\n size = 20,\n children,\n ...delegated\n}: IconProps) {\n return (\n \n {children}\n \n );\n}\n\nexport default CategoryIconBase;\n","import CategoryIconBase from './CategoryIconBase';\nimport { IconProps } from '../Icon.types';\n\nfunction IconReact(props: IconProps) {\n return (\n \n \n \n \n \n );\n}\n\nexport default IconReact;\n","import CategoryIconBase from './CategoryIconBase';\nimport { IconProps } from '../Icon.types';\n\nfunction IconCSS(props: IconProps) {\n return (\n \n \n \n \n \n \n \n \n );\n}\n\nexport default IconCSS;\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport CategoryIconBase from './CategoryIconBase';\nimport { IconProps } from '../Icon.types';\n\nfunction IconAnimation(props: IconProps) {\n const id = React.useId();\n const maskId = `mask-${id}`.replace(/:/g, '');\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst WrappedCategoryIconBase = styled(CategoryIconBase)`\n transform: translateX(2px) rotateY(180deg);\n overflow: visible;\n`;\n\nexport default IconAnimation;\n","import CategoryIconBase from './CategoryIconBase';\nimport { IconProps } from '../Icon.types';\n\nfunction IconJavaScript(props: IconProps) {\n return (\n \n \n \n \n );\n}\n\nexport default IconJavaScript;\n","import CategoryIconBase from './CategoryIconBase';\nimport { IconProps } from '../Icon.types';\n\nfunction IconCareer(props: IconProps) {\n return (\n \n \n \n \n \n \n );\n}\n\nexport default IconCareer;\n","import CategoryIconBase from './CategoryIconBase';\nimport { IconProps } from '../Icon.types';\n\nfunction IconBlog(props: IconProps) {\n return (\n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default IconBlog;\n","/*\n NOTE: This component is both used inside the desktop Dropdown navigation as well as the mobile drawer navigation. Be sure to test both UIs before making any changes.\n*/\nimport * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { CATEGORIES } from '@/helpers/category.helpers';\n\nimport Link from '@/components/Link';\nimport IconReact from '@/components/Icons/Cats/IconReact';\nimport IconCSS from '@/components/Icons/Cats/IconCSS';\nimport IconAnimation from '@/components/Icons/Cats/IconAnimation';\nimport IconJS from '@/components/Icons/Cats/IconJS';\nimport IconCareer from '@/components/Icons/Cats/IconCareer';\nimport IconBlog from '@/components/Icons/Cats/IconBlog';\nimport type { IconProps } from '@/components/Icons/Icon.types';\n\nimport type { Category } from '@/types/content.types';\n\ntype CategorySlug = (typeof CATEGORIES)[number]['slug'];\n\nconst ICONS_BY_CATEGORY: Record = {\n react: IconReact,\n css: IconCSS,\n animation: IconAnimation,\n javascript: IconJS,\n career: IconCareer,\n blog: IconBlog,\n};\n\nconst CATEGORIES_MENU_ITEMS = CATEGORIES.filter(\n (cat: Category) => cat.slug !== 'nextjs'\n).map((cat: Category) => {\n return {\n ...cat,\n icon: ICONS_BY_CATEGORY[cat.slug],\n };\n});\n\nfunction CategoryGrid({ onClick }: { onClick?: () => void }) {\n return (\n \n {CATEGORIES_MENU_ITEMS.map((category) => {\n const Icon = category.icon as React.ComponentType;\n\n if (!Icon) {\n throw new Error(\n 'missing icon for category: ' + category.slug\n );\n }\n\n return (\n
  • \n \n \n \n {category.name}\n \n \n
  • \n );\n })}\n
    \n );\n}\n\nconst Wrapper = styled.ol`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(7.5rem, 1fr));\n list-style-type: none;\n margin: 0;\n padding: 8px;\n\n /*\n On larger devices (eg. iPad Mini), it looks weird to have 4+ columns. Limit it to 3 columns.\n */\n @container (min-width: 25rem) {\n grid-template-columns: repeat(3, 1fr);\n }\n`;\n\nconst CatLink = styled(Link)`\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n border-radius: 4px;\n color: inherit;\n font-size: 0.875rem;\n\n /* Desktop-specific styles */\n --hover-bg: var(--color-cloud-300);\n\n html[data-color-mode='dark'] & {\n --hover-bg: var(--color-cloud-400);\n }\n\n @media (hover: hover) and (pointer: fine) {\n &:hover {\n --icon-outline-color: var(--hover-bg);\n background: var(--hover-bg);\n }\n\n /*\n This is a subtle thing: if the next item in the grid is hovered, the hover backdrop shows up *above* the focus outline, since it comes later in the DOM. Prevent this by promoting the focused link to use positioned layout, so that it sits atop the hover backdrop.\n */\n &:focus {\n position: relative;\n }\n }\n`;\n\nexport default CategoryGrid;\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\nimport { useSpring, animated } from 'react-spring';\n\ninterface Props extends React.HTMLAttributes {\n Icon: React.ComponentType;\n label: string;\n initialIsOpen?: boolean;\n children: React.ReactNode;\n}\n\nexport const ExpandableGroupContext =\n React.createContext(false);\n\nfunction ExpandableGroup({\n Icon,\n label,\n initialIsOpen = false,\n children,\n ...delegated\n}: Props) {\n const [isOpen, setIsOpen] = React.useState(initialIsOpen);\n const [height, setHeight] = React.useState(\n initialIsOpen ? 'auto' : 0\n );\n const [isBooped, setIsBooped] = React.useState(false);\n\n const contentsRef = React.useRef(null);\n\n React.useEffect(() => {\n if (!contentsRef.current) {\n return;\n }\n\n const contents = contentsRef.current;\n\n const boundingRect = contents.getBoundingClientRect();\n const newHeight = isOpen ? boundingRect.height : 0;\n\n setHeight(newHeight);\n }, [isOpen]);\n\n const chevronSpring = useSpring({\n points: isOpen ? '6 9 12 15 18 9' : '5 12 12 12 19 12',\n config: {\n tension: 300,\n friction: 20,\n clamp: !isOpen,\n },\n });\n\n // Annoyingly, this hook sometimes logs a warning:\n // “Got NaN while animating”\n // This happens because `height` can be \"auto\", and React Spring doesn't know how to deal with that. Fortunately, everything works perfectly, so we can ignore this warning.\n const contentStyle = useSpring({\n height,\n onRest: () => {\n if (isOpen) {\n setHeight('auto');\n }\n },\n config: {\n tension: 300,\n friction: 20,\n clamp: !isOpen,\n },\n });\n\n return (\n \n {\n setIsOpen(!isOpen);\n setIsBooped(true);\n\n window.setTimeout(() => {\n setIsBooped(false);\n }, 150);\n }}\n >\n \n \n\n \n \n \n \n \n
    {children}
    \n \n
    \n );\n}\n\nconst Toggle = styled.button`\n display: flex;\n align-items: center;\n width: 100%;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n gap: 12px;\n padding: 12px 8px;\n`;\n\nconst Label = styled.span`\n flex: 1;\n`;\n\nconst Contents = styled(animated.div)`\n --shadow-color: hsl(200deg 30% 70% / 0.2);\n /* The “Shadow Palette Generator” icon needs to know the background color for its cutout effect */\n --icon-background-color: var(--color-cloud-300);\n --icon-outline-color: var(--color-cloud-300);\n\n position: relative;\n padding-left: 24px;\n background: var(--color-cloud-300);\n border-radius: 6px;\n overflow: hidden;\n overflow: clip;\n container-type: inline-size;\n box-shadow:\n inset 0px 1px 2px var(--shadow-color),\n inset 0px 2px 4px var(--shadow-color),\n inset 0px 4px 8px var(--shadow-color);\n\n /*\n TODO: When “calc-size” lands in iOS Safari and Android Chrome, get rid of the manual height calculation above, and swap for this elegant CSS:\n\n height: 0;\n transition: height 300ms;\n\n &[data-is-open='true'] {\n height: auto;\n height: calc-size(auto);\n }\n\n */\n`;\n\nexport default ExpandableGroup;\n","export const COURSES = [\n {\n title: 'CSS for JavaScript Developers',\n slug: 'css-for-js',\n href: 'https://stan.store/jrclancaster',\n isNew: false,\n },\n {\n title: 'The Joy of React',\n slug: 'joy-of-react',\n href: 'https://joyofreact.com',\n isNew: false,\n },\n {\n title: 'Whimsical Animations',\n slug: 'whimsical-animations',\n href: 'https://whimsy.joshwcomeau.com',\n isNew: true,\n },\n] as const;\n","import { styled } from '@linaria/react';\n\nexport const New = styled.span`\n display: inline-block;\n font-size: 0.625em;\n font-weight: var(--font-weight-bold);\n color: var(--color-secondary);\n transform: translateY(-25%);\n text-transform: uppercase;\n margin-left: 0.5em;\n`;\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\nimport { ArrowRight } from 'lucide-react';\n\nimport Link from '@/components/Link';\nimport { ExpandableGroupContext } from '@/components/MobileMenu/ExpandableGroup';\n\nimport { COURSES } from './CoursesList.data';\nimport { New } from './NavigationContents.shared';\n\nfunction CoursesList({ isOpen }: { isOpen: boolean }) {\n return (\n <>\n \n \n {COURSES.map(({ title, slug, href, isNew }) => (\n
  • \n \n \n \n {title}\n {isNew && New}\n \n \n
  • \n ))}\n\n \n \n \n
    \n \n );\n}\n\nfunction ConnectedCoursesList() {\n const isOpen = React.useContext(ExpandableGroupContext);\n\n return ;\n}\n\nconst CSSMascot = styled.img`\n position: absolute;\n bottom: 0;\n right: 16px;\n transform: translateY(30%);\n width: min(35%, 200px);\n\n @media (max-width: 30rem) {\n right: -32px;\n }\n`;\n\nconst SubList = styled.ul`\n padding: 8px;\n padding-bottom: 16px;\n font-size: 0.875rem;\n list-style-type: none;\n`;\n\nconst SubNavLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n text-decoration: none;\n color: inherit;\n`;\nconst StudentLoginListItem = styled.li`\n margin-top: 2rem;\n padding-bottom: 0.5rem;\n padding-left: 8px;\n`;\n\nconst Button = styled(Link)`\n padding: 10px 28px;\n border-radius: 4px;\n background: hsl(200deg 50% 50% / 0.25);\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: var(--font-weight-medium);\n color: inherit;\n`;\n\nexport default ConnectedCoursesList;\n","import { styled } from '@linaria/react';\n\nfunction IconGradient(props: React.HTMLAttributes) {\n return (\n \n \n \n \n \n \n );\n}\n\nconst Wrapper = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 1rem;\n height: 1.5rem;\n`;\n\nconst Col = styled.div`\n width: 0.1875rem;\n height: 1rem;\n background: var(--color);\n border-radius: 0.09375rem;\n`;\n\nexport default IconGradient;\n","import { styled } from '@linaria/react';\n\nfunction IconShadows(props: React.HTMLAttributes) {\n return (\n \n \n \n \n );\n}\n\nconst Wrapper = styled.div`\n position: relative;\n display: flex;\n align-items: center;\n width: 1rem;\n height: 1.5rem;\n`;\n\nconst Square = styled.div`\n position: relative;\n width: 0.875rem;\n height: 0.875rem;\n border-radius: 100px;\n`;\n\nconst FrontSquare = styled(Square)`\n background: var(--icon-background-color, var(--color-background));\n border: 0.09375rem solid black;\n outline: 0.0625rem solid\n var(--icon-outline-color, var(--color-background));\n`;\nconst BackSquare = styled(Square)`\n position: absolute;\n top: 0.4375rem;\n left: 0.1875rem;\n background: repeating-linear-gradient(\n 45deg,\n var(--color-gray-800) 0px 1px,\n transparent 1px 2px\n );\n`;\n\nexport default IconShadows;\n","import { styled } from '@linaria/react';\n\nfunction IconOperators(props: React.HTMLAttributes) {\n return (\n \n &&\n \n );\n}\n\nconst Wrapper = styled.div`\n align-self: baseline;\n position: relative;\n display: flex;\n align-items: center;\n width: 1rem;\n height: 1.5rem;\n font-family: var(--font-family-mono);\n letter-spacing: -0.5px;\n font-weight: var(--font-weight-medium);\n /* Optical alignment */\n transform: translateY(-1px);\n`;\n\nexport default IconOperators;\n","import { styled } from '@linaria/react';\n\nfunction IconPortfolioBook(props: React.HTMLAttributes) {\n return (\n \n \n \n \n );\n}\n\nconst Svg = styled.svg`\n display: block;\n width: 1rem;\n height: 1.5rem;\n`;\n\nexport default IconPortfolioBook;\n","import { styled } from '@linaria/react';\n\nfunction IconSnippets(props: React.HTMLAttributes) {\n return (\n \n \n \n \n \n );\n}\n\nconst Svg = styled.svg`\n display: block;\n width: 1rem;\n height: 1.5rem;\n`;\n\nexport default IconSnippets;\n","/*\n NOTE: This component is both used inside the desktop Dropdown navigation as well as the mobile drawer navigation. Be sure to test both UIs before making any changes.\n*/\nimport * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { USE_HAMBURGER_MENU_BELOW } from '@/constants';\n\nimport Link from '@/components/Link';\nimport IconGradient from '@/components/Icons/Goods/IconGradient';\nimport IconShadows from '@/components/Icons/Goods/IconShadows';\nimport IconOperators from '@/components/Icons/Goods/IconOperatorsActualText';\nimport IconPortfolioBook from '@/components/Icons/Goods/IconPortfolioBook';\nimport IconSnippets from '@/components/Icons/Goods/IconSnippets';\nimport IconNewsletter from '@/components/Icons/IconNewsletter';\n\ninterface Props {\n onClick?: () => void;\n withShortNames?: boolean;\n includeNewsletter?: boolean;\n}\n\nconst GOODIES_MENU_ITEMS = [\n {\n slug: 'gradient-generator',\n name: 'Gradient Generator',\n Icon: IconGradient,\n },\n {\n slug: 'shadow-palette',\n name: 'Shadow Palette Generator',\n shortName: 'Shadow Generator',\n Icon: IconShadows,\n },\n {\n slug: 'operator-lookup',\n name: 'Operator Lookup',\n Icon: IconOperators,\n },\n { slug: 'snippets', name: 'Snippets', Icon: IconSnippets },\n {\n slug: 'effective-portfolio',\n name: 'Building an Effective Dev Portfolio',\n Icon: IconPortfolioBook,\n },\n];\n\nfunction GoodiesGrid({\n onClick,\n withShortNames,\n includeNewsletter = false,\n}: Props) {\n const [isHoveringNewsletter, setIsHoveringNewsletter] =\n React.useState(false);\n\n return (\n \n {GOODIES_MENU_ITEMS.map(({ slug, name, shortName, Icon }) => {\n return (\n
  • \n \n {Icon && }\n {withShortNames ? shortName ?? name : name}\n \n
  • \n );\n })}\n {includeNewsletter && (\n
  • \n {\n setIsHoveringNewsletter(true);\n }}\n onMouseLeave={() => {\n setIsHoveringNewsletter(false);\n }}\n >\n \n World-Famous Developer Newsletter\n \n
  • \n )}\n
    \n );\n}\n\nconst Wrapper = styled.ol`\n display: grid;\n /* On desktop, render 2 columns */\n grid-template-columns: 1fr 1fr;\n list-style-type: none;\n margin: 0;\n padding: 8px;\n\n /* On mobile, stack in a single column. */\n @media (max-width: 27.5rem) {\n grid-template-columns: 1fr;\n }\n\n /* On larger phones and tablets, use a dynamic number of columns */\n @media (max-width: ${USE_HAMBURGER_MENU_BELOW}rem) {\n grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));\n }\n`;\n\nconst GoodieLink = styled(Link)`\n text-decoration: none;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px;\n color: inherit;\n font-size: 0.875rem;\n line-height: 1.5rem;\n border-radius: 4px;\n\n /* When stacked in a single column, add a border between list items. */\n @media (max-width: 27.5rem) {\n ${Wrapper} li:not(:last-child) & {\n border-bottom: 0.5px solid hsl(210deg 50% 60% / 0.25);\n }\n }\n\n /* Desktop stuff */\n @media (hover: hover) and (pointer: fine) {\n --hover-bg: var(--color-cloud-300);\n\n html[data-color-mode='dark'] & {\n --hover-bg: var(--color-cloud-400);\n }\n\n &:hover {\n --icon-outline-color: var(--hover-bg);\n background: var(--hover-bg);\n }\n\n /*\n This is a subtle thing: if the next item in the grid is hovered, the hover backdrop shows up *above* the focus outline, since it comes later in the DOM. Prevent this by promoting the focused link to use positioned layout, so that it sits atop the hover backdrop.\n */\n &:focus {\n position: relative;\n }\n }\n`;\n\nconst StyledIcon = styled.div`\n flex-shrink: 0;\n`;\n\nexport default GoodiesGrid;\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport Link from '@/components/Link';\n\nfunction JericaLinks({\n handleClickLink,\n}: {\n handleClickLink: () => void;\n}) {\n return (\n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n
  • \n \n About Jerica\n \n
  • \n
  • \n \n About This Blog\n \n
  • \n
  • \n \n Contact\n \n
  • \n
    \n
    \n );\n}\n\nconst Wrapper = styled.div`\n --shadow-color: hsl(214deg 30% 60% / 0.2);\n container-type: inline-size;\n\n position: relative;\n margin-top: 16px;\n border-radius: 4px;\n /* trim corners and Jerica */\n overflow: hidden;\n overflow: clip;\n aspect-ratio: 18 / 10;\n max-height: 250px;\n background: linear-gradient(\n to top,\n var(--color-sky-to) 30%,\n var(--color-sky-from) 100%\n );\n box-shadow:\n inset 0px 1px 2px var(--shadow-color),\n inset 0px 2px 4px var(--shadow-color),\n inset 0px 4px 8px var(--shadow-color);\n`;\n\nconst BackgroundCloud = styled.svg`\n min-width: 475px;\n width: 85%;\n height: 13rem;\n max-width: revert;\n position: absolute;\n right: -1px;\n bottom: 0;\n`;\n\nconst CloudBorder = styled.svg`\n /* Prevent an awkward sub-pixel gap on the left by insetting by half a pixel. */\n width: calc(100% + 1px);\n max-width: revert;\n position: absolute;\n left: -0.5px;\n right: -0.5px;\n bottom: -2px;\n`;\n\nconst StyledJerica = styled.img`\n position: absolute;\n left: 0;\n bottom: 0;\n width: 32%;\n max-width: 150px;\n transform: translateY(28%) rotate(20deg);\n`;\n\nconst LinkList = styled.ul`\n position: absolute;\n right: 8px;\n bottom: 8px;\n display: flex;\n flex-direction: column;\n gap: 0;\n padding: 0;\n padding-bottom: 5%;\n list-style-type: none;\n`;\n\nconst StyledLink = styled(Link)`\n display: block;\n padding: 8px;\n padding-right: 8px;\n color: inherit;\n text-decoration: none;\n font-size: 0.875rem;\n text-align: right;\n`;\n\nexport default JericaLinks;\n","import * as React from 'react';\n\nimport { LIGHT_COLORS, DARK_COLORS } from '@/constants';\n\nimport { UserPreferencesContext } from '@/components/UserPreferencesProvider';\n\nexport function useTintedBackground(isOpen: boolean) {\n const { colorMode } = React.useContext(UserPreferencesContext);\n const colorModeRef = React.useRef(colorMode);\n colorModeRef.current = colorMode;\n\n React.useEffect(() => {\n // We don't need to do this in Dark Mode, it looks fine as-is\n if (!isOpen || colorMode === 'dark') {\n return;\n }\n\n const newBackgroundColor = LIGHT_COLORS['--color-cloud-300'];\n\n document.documentElement.style.setProperty(\n '--color-background',\n newBackgroundColor\n );\n\n return () => {\n document.documentElement.style.setProperty(\n '--color-background',\n colorModeRef.current === 'light'\n ? LIGHT_COLORS['--color-background']\n : DARK_COLORS['--color-background']\n );\n };\n }, [colorMode, isOpen]);\n}\n","import * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { USE_HAMBURGER_MENU_BELOW } from '@/constants';\nimport useOnResize from '@/hooks/use-on-resize';\n\nimport ModalBase from '@/components/ModalBase';\nimport Paper from '@/components/Paper';\nimport Link from '@/components/Link';\nimport IconLatest from '@/components/Icons/IconLatest';\nimport IconCategories from '@/components/Icons/IconCategories';\nimport IconCourses from '@/components/Icons/IconCourses';\nimport IconGoodies from '@/components/Icons/IconGoodies';\nimport IconNewsletter from '@/components/Icons/IconNewsletter';\nimport CategoryGrid from '@/components/NavigationContents/CategoryGrid';\nimport CoursesListMobile from '@/components/NavigationContents/CoursesListMobile';\nimport GoodiesGrid from '@/components/NavigationContents/GoodiesGrid';\n\nimport ExpandableGroup from './ExpandableGroup';\nimport JericaLinks from './JericaLinks';\nimport { useTintedBackground } from './MobileMenu.helpers';\n\ninterface Props {\n isOpen: boolean;\n handleDismiss: () => void;\n handleClickLink: () => void;\n}\n\nfunction MobileMenu({\n isOpen,\n handleDismiss,\n handleClickLink,\n}: Props) {\n const [pressedLink, setPressedLink] = React.useState(\n null\n );\n\n useTintedBackground(isOpen);\n\n // If the user opens the menu on mobile and then increases the window size, we want to automatically dismiss it when we get above the breakpoint.\n // We need to do this in JS, rather than with a media query, because of the fact that open modals change `--color-background`.\n useOnResize(() => {\n if (!isOpen) {\n return;\n }\n\n const windowWidthInRems = window.innerWidth / 16;\n\n if (windowWidthInRems > USE_HAMBURGER_MENU_BELOW) {\n handleDismiss();\n }\n }, 350);\n\n return (\n \n \n \n \n \n \n Latest\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n setPressedLink('newsletter')}\n onMouseUp={() => setPressedLink(null)}\n onMouseLeave={() => setPressedLink(null)}\n onTouchEnd={() => setPressedLink(null)}\n >\n \n World-Famous Newsletter!\n \n \n \n \n \n \n \n \n \n Terms of Use\n \n \n \n \n Privacy Policy\n \n \n \n \n Code of Conduct\n \n \n \n \n \n \n \n );\n}\n\nconst Modal = styled(Paper)`\n --padding: 8px;\n position: fixed;\n inset: var(--padding);\n top: 5rem;\n border-radius: 6px;\n padding: var(--padding);\n padding-top: 0;\n /* Don't use --color-adaptive-white here, too hard to color-match with the other colors. */\n background: white;\n transition: opacity 300ms;\n box-shadow:\n 0px 2px 4px hsl(0deg 0% 0% / 0.25),\n 0px 4px 8px hsl(0deg 0% 0% / 0.2),\n 0px 8px 16px hsl(0deg 0% 0% / 0.15),\n 0px 16px 32px hsl(0deg 0% 0% / 0.12);\n overflow: auto;\n animation: menuEnter 400ms cubic-bezier(0.17, 0.67, 0.51, 1);\n will-change: transform;\n\n @keyframes menuEnter {\n from {\n transform: translateX(25%);\n opacity: 0;\n }\n }\n`;\n\nconst ModalContent = styled.nav`\n display: flex;\n flex-direction: column;\n min-height: 100%;\n animation: fadeIn 300ms backwards;\n animation-delay: 200ms;\n transition: opacity 300ms;\n`;\n\nconst List = styled.ul`\n padding: 0;\n margin: 0;\n list-style-type: none;\n`;\n\nconst ListItem = styled.li`\n padding: 4px 0;\n border-bottom: 1px solid var(--color-gray-200);\n\n &:not(:last-child) {\n }\n`;\n\nconst Flex = styled.div`\n flex: 1;\n`;\n\nconst NavLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 8px;\n text-decoration: none;\n color: inherit;\n`;\n\nconst SubFooter = styled.footer`\n margin: calc(var(--padding) * -1);\n margin-top: var(--padding);\n`;\n\nconst LegalLinksList = styled.ul`\n display: flex;\n justify-content: space-evenly;\n padding: 0;\n list-style-type: none;\n font-size: 0.75rem;\n`;\nconst LegalListItem = styled.li`\n position: relative;\n`;\n\nconst LegalLink = styled(Link)`\n display: block;\n padding: 0.5rem;\n color: inherit;\n font-weight: var(--font-weight-medium);\n text-decoration: none;\n text-align: center;\n`;\n\nexport default MobileMenu;\n","export { default } from './MobileMenu';\n","'use client';\n\nimport React from 'react';\nimport { styled } from '@linaria/react';\nimport { useSpring, animated } from 'react-spring';\n\nimport {\n useGlobalUIState,\n useGlobalUIActions,\n} from '@/components/GlobalUIProvider';\nimport VisuallyHidden from '@/components/VisuallyHidden';\nimport MobileMenu from '@/components/MobileMenu';\n\nimport IconWrapper from './IconWrapper';\nimport {\n IconStatus,\n VIEWBOX_SIZE,\n getFirstLineProps,\n getSecondLineProps,\n getThirdLineProps,\n} from './IconHamburger.helpers';\n\ninterface Props extends React.HTMLAttributes {\n size?: number;\n iconStatus: IconStatus;\n isBooped: boolean;\n}\n\nfunction IconHamburger({\n size = 20,\n iconStatus,\n isBooped,\n ...delegated\n}: Props) {\n const sharedConfig = {\n tension: 300,\n friction: 16,\n clamp: iconStatus === 'opening' || iconStatus === 'closing',\n };\n\n const firstLineProps = useSpring({\n ...getFirstLineProps(iconStatus, isBooped),\n config: sharedConfig,\n });\n const secondLineProps = getSecondLineProps();\n const thirdLineProps = useSpring({\n ...getThirdLineProps(iconStatus, isBooped),\n config: sharedConfig,\n });\n\n const includePatty =\n iconStatus === 'closed' || iconStatus === 'opening';\n\n return (\n <>\n \n \n \n \n \n Toggle menu\n \n );\n}\n\nfunction WrappedIconHamburger(\n props: React.HTMLAttributes\n) {\n const modalId = `modal-${React.useId().replace(/:/g, '')}`;\n const { toggleModal } = useGlobalUIActions();\n const { modals } = useGlobalUIState();\n\n const modalState = modals[modalId];\n const isOpen = modalState?.isOpen || false;\n\n const [isPressed, setIsPressed] = React.useState(false);\n\n // So: If the user taps REALLY quickly, it makes the animation a bit funky and asymmetrical, since the icon isn't fully flattened when it starts animating to the next state. To fix this, we'll enforce a minimum amount of time that we'll spend in the `pressed` state, and track it with refs.\n // HACK: This logic is duplicated in PressableButton, but I don't see a nice way to consolidate it.\n const pressedTimestamp = React.useRef(null);\n const timeoutRef = React.useRef(null);\n\n const handleToggle = React.useCallback(\n (forcedValue?: boolean) => {\n toggleModal(modalId, forcedValue);\n setIsPressed(false);\n },\n [modalId, toggleModal]\n );\n\n const iconStatus = isPressed\n ? isOpen\n ? 'closing'\n : 'opening'\n : isOpen\n ? 'open'\n : 'closed';\n\n const handleDismiss = React.useCallback(() => {\n if (!isOpen) {\n return;\n }\n\n // This function is called when hitting \"Escape\", and I want the animation to match clicking the close button. So we'll have a brief moment where the hamburger closes before the modal dismisses.\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n }\n\n setIsPressed(true);\n\n timeoutRef.current = window.setTimeout(() => {\n setIsPressed(false);\n handleToggle(false);\n }, 166.67);\n }, [isOpen, handleToggle]);\n\n // NOTE: I'm trying to figure out whether I want to do the same thing on dismiss (eg. by clicking escape) and on link click. Depending how this goes in production, I may want to add custom behaviour (eg. preventing default and manually visiting after 200ms or whatever).\n const handleClickLink = handleDismiss;\n\n return (\n <>\n {\n // Start the clock, measure when this event happened:\n pressedTimestamp.current = Date.now();\n\n setIsPressed(true);\n\n // If they tap REALLY QUICKLY, they might re-open it before the `closed` timeout even fires. Interrupt this scheduled timeout by cancelling it.\n if (typeof timeoutRef.current === 'number') {\n window.clearTimeout(timeoutRef.current);\n }\n }}\n onClick={() => {\n // As mentioned above, there's a minimum amount of time that we'll spend in the `opening`/`closing` state. We’ll measure the amount of time here, and postpone this event if not enough time has passed.\n const MIN_TIME = Math.ceil(16.66666 * 7);\n\n const remainingTime = pressedTimestamp.current\n ? MIN_TIME - (Date.now() - pressedTimestamp.current)\n : 0;\n\n if (remainingTime <= 0) {\n handleToggle();\n return;\n }\n\n timeoutRef.current = window.setTimeout(() => {\n handleToggle();\n timeoutRef.current = null;\n }, remainingTime);\n }}\n onPointerLeave={() => {\n setIsPressed(false);\n }}\n >\n {({ isBooped }) => (\n \n )}\n \n\n \n \n );\n}\n\nconst StyledIconWrapper = styled(IconWrapper)`\n transition: transform 400ms;\n will-change: transform;\n`;\n\nconst Svg = styled.svg`\n stroke: currentColor;\n display: block;\n overflow: visible;\n`;\n\nexport default React.memo(WrappedIconHamburger);\n","export const OMIT_OPTIONAL_DESKTOP_LINKS_BREAKPOINT = 900 / 16;\nexport const OMIT_OPTIONAL_ICONS_BREAKPOINT = 480 / 16;\n\nexport const DROPDOWN_SLUGS = [\n 'categories',\n 'courses',\n 'goodies',\n] as const;\n\nexport type DropdownSlug = (typeof DROPDOWN_SLUGS)[number];\n","import * as React from 'react';\n\nimport { USE_HAMBURGER_MENU_BELOW } from '@/constants';\nimport { DropdownSlug } from './SiteHeader.constants';\n\nexport function useDismissOnEscape(\n handleDismissDropdown: () => void,\n {\n isOpen,\n dropdownSlugRef,\n triggersBySlug,\n }: {\n isOpen: boolean;\n dropdownSlugRef: React.RefObject;\n triggersBySlug: Record<\n DropdownSlug,\n React.RefObject\n >;\n }\n) {\n React.useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n function handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n handleDismissDropdown();\n\n // Focus the trigger that opened the dropdown.\n if (dropdownSlugRef.current) {\n triggersBySlug[dropdownSlugRef.current].current?.focus();\n }\n }\n }\n\n window.addEventListener('keydown', handleKeydown);\n\n return () => {\n window.removeEventListener('keydown', handleKeydown);\n };\n }, [\n isOpen,\n handleDismissDropdown,\n dropdownSlugRef,\n triggersBySlug,\n ]);\n}\n\nexport function useDismissOnScroll(\n handleDismissDropdown: () => void,\n {\n enabled,\n isOpen,\n }: {\n enabled: boolean;\n isOpen: boolean;\n }\n) {\n React.useEffect(() => {\n if (!enabled || !isOpen) {\n return;\n }\n\n function handleScroll() {\n handleDismissDropdown();\n }\n\n window.addEventListener('scroll', handleScroll);\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n };\n }, [enabled, isOpen, handleDismissDropdown]);\n}\n\nexport function useDismissOnResize(\n handleDismissDropdown: () => void,\n { isOpen }: { isOpen: boolean }\n) {\n React.useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n function handleResize() {\n if (window.innerWidth <= USE_HAMBURGER_MENU_BELOW * 16) {\n handleDismissDropdown();\n }\n }\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [isOpen, handleDismissDropdown]);\n}\n","import * as React from 'react';\nimport { useSpring, animated } from 'react-spring';\nimport { styled } from '@linaria/react';\n\nimport Link from '@/components/Link';\nimport IconArrowBullet from '@/components/Icons/IconArrowBullet';\n\nimport { COURSES } from './CoursesList.data';\nimport { New } from './NavigationContents.shared';\n\nconst SPRING_CONFIG = {\n tension: 300,\n friction: 16,\n};\n\nfunction CoursesList({ isOpen }: { isOpen: boolean }) {\n const [hoveringCourseSlug, setHoveringCourseSlug] = React.useState<\n string | null\n >(null);\n\n return (\n <>\n \n \n {COURSES.map(({ title, slug, href, isNew }) => (\n
  • \n setHoveringCourseSlug(slug)}\n onMouseLeave={() => setHoveringCourseSlug(null)}\n >\n \n \n {title}\n {isNew && New}\n \n \n
  • \n ))}\n\n \n \n Student Login\n \n \n
    \n \n );\n}\n\nfunction FancyButton({\n width,\n height,\n href,\n children,\n}: {\n width: number;\n height: number;\n href: string;\n children: React.ReactNode;\n}) {\n const [isHovering, setIsHovering] = React.useState(false);\n\n const scaleX = (width + 6) / width;\n const scaleY = (height + 6) / height;\n\n const spring = useSpring({\n transform: isHovering\n ? `scale(${scaleX}, ${scaleY})`\n : 'scale(1, 1)',\n config: SPRING_CONFIG,\n });\n\n return (\n setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n style={{\n width: width / 16 + 'rem',\n height: height / 16 + 'rem',\n '--login-button-border-color': isHovering\n ? 'hsl(200deg 40% 80%)'\n : 'hsl(210deg 30% 20% / 0.15)',\n }}\n >\n \n {children}\n \n );\n}\n\nconst CSSMascot = styled.img`\n position: absolute;\n bottom: 12px;\n right: -40px;\n transform: translateY(30%);\n width: 45%;\n pointer-events: none;\n animation: slideIn 400ms backwards\n cubic-bezier(0.17, 0.67, 0.33, 1.05);\n animation-delay: 80ms;\n opacity: var(--opacity);\n transform: var(--transform);\n transition: var(--transition);\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(30%) translateX(100%);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n opacity: 1;\n transform: translateY(30%);\n transition: none;\n }\n`;\n\nconst SubList = styled.ul`\n --hover-bg: var(--color-cloud-300);\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 8px;\n font-size: 0.875rem;\n list-style-type: none;\n\n html[data-color-mode='dark'] & {\n --hover-bg: var(--color-cloud-400);\n }\n`;\n\nconst SubNavLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px;\n border-radius: 4px;\n text-decoration: none;\n color: inherit;\n\n &:hover {\n background: var(--hover-bg);\n }\n /*\n This is a subtle thing: if the next item in the grid is hovered, the hover backdrop shows up *above* the focus outline, since it comes later in the DOM. Prevent this by promoting the focused link to use positioned layout, so that it sits atop the hover backdrop.\n */\n &:focus {\n position: relative;\n }\n`;\nconst StudentLoginListItem = styled.li`\n margin-top: auto;\n padding-bottom: 0.5rem;\n padding-left: 8px;\n`;\n\nconst Button = styled(Link)`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: var(--font-weight-medium);\n color: inherit;\n border-radius: 4px;\n\n &:hover {\n background: var(--hover-bg);\n }\n`;\nconst ButtonOutline = styled(animated.span)`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 1px solid var(--login-button-border-color);\n border-radius: 6px;\n transition: border-color 200ms;\n`;\n\nexport default CoursesList;\n","// Copied from `/components/Tip`. Seems easier to make a copy than to have Tip adapt to this use case.\nimport React from 'react';\nimport { styled } from '@linaria/react';\nimport { useSpring, animated } from 'react-spring';\n\nimport usePrefersReducedMotion from '@/hooks/use-prefers-reduced-motion';\n\ninterface Props extends React.HTMLAttributes {\n width?: number;\n height?: number;\n travelingFromSlug: string | null;\n}\n\nfunction NavigationTip({\n width = 32,\n height = 12,\n travelingFromSlug,\n ...delegated\n}: Props) {\n // If the user prefers reduced motion, the tip is always erect.\n // We need `prefersReducedMotion` to initialize to the correct value, and this is safe since the navigation dropdown is always closed during the initial SSR.\n const prefersReducedMotion = usePrefersReducedMotion({\n clientOnly: true,\n });\n\n const [isErect, setIsErect] = React.useState(\n prefersReducedMotion\n );\n const [applyViewTransitionName, setApplyViewTransitionName] =\n React.useState(false);\n\n // This is similar to a boop effect; when `travelingFromSlug` changes, we change `isErect` to `false`, but only for a brief period before flipping it back. That way, the tip appears to oscillate.\n React.useEffect(() => {\n if (prefersReducedMotion) {\n return;\n }\n\n if (travelingFromSlug) {\n setIsErect(false);\n\n const timeoutId = window.setTimeout(() => {\n setIsErect(true);\n }, 150);\n\n return () => {\n window.clearTimeout(timeoutId);\n };\n }\n }, [travelingFromSlug, prefersReducedMotion]);\n\n // On mount, we have a similar animation. We delay it a bit since the dropdown fades in and we don't want this animation to finish before it's even fully visible.\n React.useEffect(() => {\n if (prefersReducedMotion) {\n return;\n }\n\n let timeoutId = window.setTimeout(() => {\n setIsErect(true);\n\n // Wait another little bit, and then apply the view-transition-name.\n timeoutId = window.setTimeout(() => {\n setApplyViewTransitionName(true);\n }, 600);\n }, 100);\n\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [prefersReducedMotion]);\n\n const spring = useSpring({\n d: getPath(width, height, isErect),\n config: {\n tension: 300,\n friction: 18,\n },\n });\n\n return (\n \n \n \n );\n}\n\nconst getPath = (width: number, height: number, isErect: boolean) => {\n const pointyFactor = width * 0.2;\n\n return `\n M 0 ${height}\n C ${isErect ? width * 0.25 : 0} ${height}\n ${width / 2 - pointyFactor} ${isErect ? 0 : height * 0.5}\n ${width / 2} ${isErect ? 0 : height * 0.5}\n C ${width / 2 + pointyFactor} ${isErect ? 0 : height * 0.5}\n ${isErect ? width * 0.75 : width} ${height}\n ${width} ${height}\n Z`;\n};\n\nconst Svg = styled.svg`\n display: block;\n overflow: visible;\n transform-origin: 50% 100%;\n will-change: transform;\n\n path {\n fill: currentColor;\n stroke: none;\n }\n`;\n\nexport default NavigationTip;\n","import { styled } from '@linaria/react';\n\nimport InPortal from '@/components/InPortal';\nimport Paper from '@/components/Paper';\n\nimport CategoryGrid from '@/components/NavigationContents/CategoryGrid';\nimport GoodiesGrid from '@/components/NavigationContents/GoodiesGrid';\nimport CoursesListDesktop from '@/components/NavigationContents/CoursesListDesktop';\n\nimport { DROPDOWN_SLUGS, DropdownSlug } from './SiteHeader.constants';\nimport NavigationTip from './NavigationTip';\n\ninterface Props {\n ref: React.RefObject;\n // It's possible for multiple SiteHeader instances to be on the page at once. Rather than rely on IDs, we instead pass a container ref, which’ll be used to ensure we hop between correct dropdowns when navigating by keyboard (doing the focus management stuff).\n containerRef: React.RefObject;\n dropdownSlug: DropdownSlug | null;\n travelingFromSlug: DropdownSlug | null;\n boxCollectionRef: React.MutableRefObject<\n Record\n >;\n handleDismiss: () => void;\n}\n\n// The simplest solution is for each dropdown to have a fixed size. Specified in pixels here since we compare them against bounding boxes, but I'll set them in rems when I actually use them.\nconst DIMENSIONS_BY_SLUG = {\n categories: {\n width: 300,\n height: 127,\n },\n courses: {\n width: 290,\n height: 200,\n },\n goodies: {\n width: 400,\n height: 160,\n },\n} as const;\n\nfunction NavigationDropdown({\n ref,\n containerRef,\n dropdownSlug,\n travelingFromSlug,\n boxCollectionRef,\n handleDismiss,\n}: Props) {\n const triggerBB = dropdownSlug\n ? boxCollectionRef.current[dropdownSlug]\n : null;\n\n if (!dropdownSlug || !triggerBB) {\n return;\n }\n\n const currentSize = DIMENSIONS_BY_SLUG[dropdownSlug];\n\n const top = triggerBB.top + triggerBB.height + 16;\n const triggerCenterX = triggerBB.left + triggerBB.width / 2;\n const offsetLeft = triggerCenterX - currentSize.width / 2;\n\n // We need to do a bit of manual focus management when the user is at the bounds of the dropdown. We want to create the illusion that the dropdown is right after the dropdown’s trigger, in the DOM order.\n function handleKeyDown(event: React.KeyboardEvent) {\n if (event.key !== 'Tab' || !dropdownSlug) {\n return;\n }\n\n const parentElement = event.currentTarget;\n\n const allLinks = Array.from(\n parentElement.querySelectorAll('a, button')\n ) as Array;\n const firstLink = allLinks[0];\n const lastLink = allLinks.at(-1);\n\n const direction = event.shiftKey ? 'backwards' : 'forwards';\n\n let elementToFocus: HTMLButtonElement | HTMLAnchorElement | null =\n null;\n\n if (!containerRef.current) {\n return;\n }\n\n if (\n document.activeElement === lastLink &&\n direction === 'forwards'\n ) {\n const nextTriggerIndex =\n DROPDOWN_SLUGS.indexOf(dropdownSlug) + 1;\n const nextTriggerSlug = DROPDOWN_SLUGS[nextTriggerIndex];\n\n // When we’re at the last link in the dropdown, we want to focus the next dropdown trigger in the header. For example, tabbing out of the \"Categories\" dropdown should focus the \"Courses\" trigger.\n if (nextTriggerSlug) {\n elementToFocus = containerRef.current.querySelector(\n `[data-trigger-for-slug=\"${nextTriggerSlug}\"]`\n ) as HTMLButtonElement;\n } else {\n // But what if we’re in the final dropdown, \"Goodies\"? Things get a bit tricky here. On large desktop screens, we display an optional 4th nav item (currently the \"About Jerica\" link). If this exists, we’ll focus it.\n const finalNavItem = containerRef.current.querySelector(\n '[data-is-final-nav-item=\"true\"]'\n );\n\n if (\n finalNavItem &&\n window.getComputedStyle(finalNavItem).display !== 'none'\n ) {\n const navLink = finalNavItem.querySelector('a');\n elementToFocus = navLink as HTMLAnchorElement;\n } else {\n // If the About link is hidden, we’ll instead skip to the first action in the right-hand-side of the header.\n elementToFocus = containerRef.current.querySelector(\n '#site-header-actions button'\n ) as HTMLButtonElement;\n }\n }\n } else if (\n document.activeElement === firstLink &&\n direction === 'backwards'\n ) {\n // If we’re going backwards, we want to focus the trigger that opened this very menu.\n elementToFocus = containerRef.current.querySelector(\n `[data-trigger-for-slug=\"${dropdownSlug}\"]`\n ) as HTMLButtonElement;\n }\n\n if (elementToFocus) {\n event.preventDefault();\n\n // Since we’re moving focus outside the dropdown to some other element, it makes sense to dismiss the dropdown.\n handleDismiss();\n\n elementToFocus.focus();\n }\n }\n\n return (\n \n \n \n \n \n\n \n {DROPDOWN_SLUGS.map((slug) => (\n \n {slug === 'categories' && }\n {slug === 'courses' && (\n \n )}\n {slug === 'goodies' && (\n \n )}\n \n ))}\n \n \n \n \n \n );\n}\n\nconst OuterWrapper = styled.div`\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n view-transition-name: navigation-dropdown;\n`;\n\n// Weirdly in Chrome, linear() doesn't work if there's extra white-space :/\nconst LINEAR = `linear(0 0%, 0.0049 1.09%, 0.0199 2.27%, 0.0814 4.99%, 0.4635 16.59%, 0.5584 19.86%, 0.6394 23.07%, 0.7095 26.35%, 0.7696 29.74%, 0.8208 33.3%, 0.8637 37.08%, 0.902 41.52%, 0.9323 46.4%, 0.9557 51.88%, 0.973 58.14%, 0.9847 65.2%, 0.9924 73.79%, 0.9992 100%)\n`;\n\nconst Wrapper = styled.div`\n --curve: cubic-bezier(0.51, 0.04, 0.19, 0.98);\n --curve: ${LINEAR};\n position: fixed;\n filter: drop-shadow(0px 1px 2px hsl(210deg 15% 6% / 0.1))\n drop-shadow(0px 2px 4px hsl(210deg 15% 6% / 0.1))\n drop-shadow(0px 8px 16px hsl(210deg 15% 6% / 0.1));\n pointer-events: auto;\n transition:\n width 666ms var(--curve),\n height 666ms var(--curve),\n transform 666ms var(--curve);\n\n @supports not (transition-timing-function: linear(0 0%, 1 100%)) {\n --curve: cubic-bezier(0.31, 0.15, 0.11, 0.99);\n }\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n`;\n\nconst Page = styled(Paper)`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border-radius: 8px;\n background: var(--color-background);\n animation: slideIn 550ms cubic-bezier(0.17, 0.67, 0.51, 1);\n\n @keyframes slideIn {\n from {\n transform: translateY(-8px);\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n`;\n\nconst StyledTip = styled(NavigationTip)`\n position: absolute;\n left: 0;\n right: 0;\n top: -11.9px;\n margin-inline: auto;\n color: var(--color-adaptive-white);\n`;\n\nconst ContentClipper = styled.div`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n overflow: clip;\n border-radius: 8px;\n animation: fadeIn 200ms 100ms backwards;\n`;\n\nconst ContentWrapper = styled.div`\n position: absolute;\n inset: 0;\n opacity: 0;\n transition: opacity 250ms;\n\n &[data-is-active='true'] {\n opacity: 1;\n transition: opacity 400ms;\n transition-delay: 150ms;\n }\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n`;\n\nexport default NavigationDropdown;\n","'use client';\n\nimport * as React from 'react';\nimport { styled } from '@linaria/react';\nimport Link from 'next/link';\nimport { useViewTransition } from 'use-view-transitions/react';\n\nimport useSound from '@/hooks/use-sound';\nimport useBoundingBox from '@/hooks/use-bounding-box';\nimport useOnClickOutside from '@/hooks/use-on-click-outside';\n\nimport {\n OMIT_OPTIONAL_DESKTOP_LINKS_BREAKPOINT,\n DROPDOWN_SLUGS,\n DropdownSlug,\n} from './SiteHeader.constants';\nimport {\n useDismissOnEscape,\n useDismissOnScroll,\n useDismissOnResize,\n} from './DesktopNavigation.helpers';\nimport NavigationDropdown from './NavigationDropdown';\n\ninterface Props extends React.HTMLAttributes {\n dismissDropdownOnScroll?: boolean;\n containerRef: React.RefObject;\n}\n\nfunction DesktopNavigation({\n dismissDropdownOnScroll,\n containerRef,\n ...delegated\n}: Props) {\n const [dropdownSlug, setDropdownSlug] =\n React.useState(null);\n const [travelingFromSlug, setTravelingFromSlug] =\n React.useState(null);\n\n const dropdownRef = React.useRef(null);\n const navigationListRef = React.useRef(null);\n\n const dropdownSlugRef = React.useRef(null);\n dropdownSlugRef.current = dropdownSlug;\n\n const catTriggerRef = React.useRef(null);\n const coursesTriggerRef = React.useRef(null);\n const goodiesTriggerRef = React.useRef(null);\n\n const triggersBySlug = React.useMemo(\n () => ({\n categories: catTriggerRef,\n courses: coursesTriggerRef,\n goodies: goodiesTriggerRef,\n }),\n []\n );\n\n const catTriggerBB = useBoundingBox(catTriggerRef);\n const coursesTriggerBB = useBoundingBox(coursesTriggerRef);\n const goodiesTriggerBB = useBoundingBox(goodiesTriggerRef);\n\n const boxCollectionRef = React.useRef({\n categories: catTriggerBB,\n courses: coursesTriggerBB,\n goodies: goodiesTriggerBB,\n });\n\n boxCollectionRef.current = {\n categories: catTriggerBB,\n courses: coursesTriggerBB,\n goodies: goodiesTriggerBB,\n };\n\n const [playMenuOpen] = useSound('/sounds/menu-open-softer.mp3', {\n volume: 0.6,\n });\n const [playMenuClose] = useSound('/sounds/menu-close.mp3', {\n volume: 0.6,\n });\n\n const [, startTransition] = React.useTransition();\n\n const { startViewTransition } = useViewTransition();\n // Annoyingly, `use-view-transitions` doesn’t wrap this `startViewTransition` function in useCallback, so it gets recreated on every render. Wrap it in a ref.\n const startViewTransitionRef = React.useRef(startViewTransition);\n startViewTransitionRef.current = startViewTransition;\n\n const handleSelectDropdown = React.useCallback(\n (dropdownSlug: DropdownSlug) => {\n setDropdownSlug(dropdownSlug);\n setTravelingFromSlug(dropdownSlugRef.current);\n },\n []\n );\n const handleDismissDropdown = React.useCallback(() => {\n startViewTransitionRef.current(() =>\n startTransition(() => {\n setDropdownSlug(null);\n setTravelingFromSlug(null);\n })\n );\n }, []);\n const handleDismissDropdownImmediately = React.useCallback(() => {\n setDropdownSlug(null);\n setTravelingFromSlug(null);\n }, []);\n\n useOnClickOutside(dropdownRef, handleDismissDropdown, {\n triggerRef: navigationListRef,\n rebindDependency: dropdownSlug,\n });\n\n useDismissOnEscape(handleDismissDropdown, {\n isOpen: !!dropdownSlug,\n dropdownSlugRef,\n triggersBySlug,\n });\n\n // `dismissDropdownOnScroll` is set on the homepage, where the navigation is sticky (so, it moves) and goes behind a cloud. Feels awkward to leave the menu open, so we’ll dismiss on scroll.\n // Skipping View Transitions exit animation because it causes the header to quickly jump in front of the cloud. Could fix this by giving the cloud a view-transition-name, but whatever, this is easier.\n useDismissOnScroll(handleDismissDropdownImmediately, {\n enabled: !!dismissDropdownOnScroll,\n isOpen: !!dropdownSlug,\n });\n\n // If the user resizes the screen while a dropdown is open, and the screen shrinks below the \"hamburger menu\" breakpoint, we want to immediately hide the dropdown. Ideally this would use the View Transitions exit animation, but I get a weird warning about invalid state. This is fine.\n useDismissOnResize(handleDismissDropdownImmediately, {\n isOpen: !!dropdownSlug,\n });\n\n // The dropdown exists in a portal at the bottom of the DOM, but we want to pretend that it exists between triggers, so that tab can move between the trigger and the dropdown.\n function handleKeyDown(\n event: React.KeyboardEvent\n ) {\n if (event.key !== 'Tab' || !dropdownRef.current) {\n return;\n }\n\n if (event.shiftKey) {\n // Shift + Tab goes backwards, and we don't want to manage anything when it comes to backwards navigation.\n return;\n }\n\n const triggerForSlug = event.currentTarget.getAttribute(\n 'data-trigger-for-slug'\n ) as DropdownSlug;\n\n // If this button’s dropdown isn't the one open, we don't have to do anything special.\n if (triggerForSlug !== dropdownSlug) {\n return;\n }\n\n const relevantContent = dropdownRef.current.querySelector(\n `[data-content-for-slug=\"${dropdownSlug}\"]`\n );\n const firstLink = relevantContent?.querySelector('a');\n\n if (firstLink) {\n event.preventDefault();\n firstLink.focus();\n }\n }\n\n return (\n \n \n {DROPDOWN_SLUGS.map((slug) => (\n \n {\n if (slug === dropdownSlug) {\n handleDismissDropdown();\n playMenuClose();\n } else {\n handleSelectDropdown(slug);\n playMenuOpen();\n }\n }}\n onKeyDown={handleKeyDown}\n >\n {slug}\n \n \n ))}\n {/*\n The /about-josh page isn't critical, so we'll hide it on smaller screens.\n */}\n \n \n About\n \n \n \n\n \n \n );\n}\n\nconst Wrapper = styled.nav`\n position: relative;\n`;\n\nconst NavigationList = styled.ul`\n display: flex;\n justify-content: center;\n gap: 0.5rem;\n list-style: none;\n padding: 0;\n margin: 0;\n`;\n\nconst NavButton = styled.button`\n display: flex;\n flex-direction: column;\n justify-content: center;\n height: 3rem;\n color: var(--color-text);\n font-weight: var(--font-weight-light);\n font-size: 1rem;\n text-decoration: none;\n text-transform: capitalize;\n padding: 0 1rem;\n`;\n\nconst ListItem = styled.li`\n position: relative;\n`;\n\nconst OptionalListItem = styled(ListItem)`\n @media (max-width: ${OMIT_OPTIONAL_DESKTOP_LINKS_BREAKPOINT}rem) {\n display: none;\n }\n`;\n\nexport default DesktopNavigation;\n","'use client';\n\nimport * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { USE_HAMBURGER_MENU_BELOW } from '@/constants';\nimport { OMIT_OPTIONAL_ICONS_BREAKPOINT } from './SiteHeader.constants';\nimport useHasHydrated from '@/hooks/use-has-hydrated';\n\nimport { NavigationTrackerContext } from '@/components/NavigationTrackerProvider';\n\nfunction IconDrop({\n isOptional = false,\n children,\n className,\n ...delegated\n}: {\n isOptional?: boolean;\n className?: string;\n children: React.ReactNode;\n}) {\n const mostRecentNavigationFrom = React.useContext(\n NavigationTrackerContext\n );\n const hasHydrated = useHasHydrated();\n\n const isFirstPageView = !mostRecentNavigationFrom;\n\n if (!hasHydrated && isFirstPageView) {\n return null;\n }\n\n if (isFirstPageView) {\n // Alright, so the thing here is that we want to show an enter animation *right after hydration*. This component also mounts when the user navigates using client-side navigation, but everything is already hydrated, and so I don't want to show the same enter animation over and over and over (esp. because it messes with View Transitions!)\n // And so, we will return `null` on the server-side render, but not on subsequent renders. We'll also render a different element.\n if (!hasHydrated) {\n return null;\n }\n\n return (\n \n {children}\n \n );\n }\n\n return (\n \n {children}\n \n );\n}\n\nconst Wrapper = styled.div`\n @media (max-width: ${OMIT_OPTIONAL_ICONS_BREAKPOINT}rem) {\n &[data-is-optional='true'] {\n display: none;\n }\n }\n`;\n\nconst AnimatedWrapper = styled(Wrapper)`\n animation: dropIcon calc(500ms + var(--index) * 100ms)\n cubic-bezier(0.17, 0.67, 0.2, 1) both;\n animation-delay: calc(var(--index) * 100ms);\n\n &:nth-child(1) {\n --index: 1;\n }\n &:nth-child(2) {\n --index: 2;\n }\n &:nth-child(3) {\n --index: 3;\n }\n &:nth-child(4) {\n --index: 4;\n }\n &:nth-child(5) {\n --index: 5;\n }\n\n @media (prefers-reduced-motion: reduce) {\n animation: revert;\n }\n\n /*\n On mobile devices, we only show icons 1, 3, and 5. We omit 2 (sound FX) and 4 (RSS). This means that as the user resizes the screen above mobile, these 2 icons pop in, and they have their standard drop-in animation, while the other icons are static.\n\n The simplest solution is to disable the animation on these sizes.\n */\n @media (max-width: ${USE_HAMBURGER_MENU_BELOW}rem) {\n animation: revert;\n }\n\n @keyframes dropIcon {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n`;\n\nexport default React.memo(IconDrop);\n","'use client';\n\nimport * as React from 'react';\nimport { styled } from '@linaria/react';\n\nimport { HEADER_HEIGHT, USE_HAMBURGER_MENU_BELOW } from '@/constants';\n\nimport Logo from '@/components/Logo';\nimport IconRSS from '@/components/Icons/IconRSS';\nimport IconSearch from '@/components/Icons/IconSearch';\nimport IconColorMode from '@/components/Icons/IconColorMode';\nimport IconSpeaker from '@/components/Icons/IconSpeaker';\nimport IconHamburger from '@/components/Icons/IconHamburger';\n\nimport DesktopNavigation from './DesktopNavigation';\nimport IconDrop from './IconDrop';\n\nfunction SiteHeader({\n skipViewTransitions,\n includeLogoAnimation,\n dismissDropdownOnScroll,\n skipActions = [],\n}: {\n skipViewTransitions?: boolean;\n includeLogoAnimation?: boolean;\n dismissDropdownOnScroll?: boolean;\n skipActions?: Array;\n}) {\n const wrapperRef = React.useRef(null);\n\n return (\n \n \n \n\n \n\n \n {!skipActions.includes('search') && (\n \n \n \n )}\n {!skipActions.includes('sound-toggle') && (\n \n \n \n )}\n {!skipActions.includes('color-toggle') && (\n \n \n \n )}\n {!skipActions.includes('rss') && (\n \n \n \n )}\n \n \n \n \n \n \n );\n}\n\nconst OuterWrapper = styled.div`\n height: ${HEADER_HEIGHT}rem;\n display: flex;\n align-items: center;\n`;\n\nconst Wrapper = styled.header`\n flex: 1;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 3rem;\n height: 3rem;\n\n @media (max-width: 56.25rem) {\n gap: 2rem;\n }\n @media (max-width: 25rem) {\n gap: 1rem;\n }\n`;\n\nconst StyledLogo = styled(Logo)`\n /*\n HACK: Normally I'd use baseline alignment to align the logo with the nav items. The problem is that the nav items disappear below a certain viewport size, and this causes the logo to snap to a new position. So we’ll fake it using translateY.\n */\n transform: translateY(-0.1875rem);\n`;\n\nconst StyledDesktopNavigation = styled(DesktopNavigation)`\n @media (max-width: ${USE_HAMBURGER_MENU_BELOW}rem) {\n display: none;\n }\n`;\n\nconst Actions = styled.div`\n align-self: stretch;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 1rem;\n margin-left: auto;\n\n @media (max-width: 22rem) {\n gap: 0.5rem;\n }\n`;\n\nconst HamburgerWrapper = styled(IconDrop)`\n display: none;\n\n @media (max-width: ${USE_HAMBURGER_MENU_BELOW}rem) {\n display: flex;\n }\n`;\n\nexport default SiteHeader;\n","import type { Category } from '@/types/content.types';\n\n// A hardcoded list of categories.\n// Sorted in preferential order. Certain contexts might only\n// include a subset (eg. mobile nav), and it should be taken\n// from the top.\nexport const CATEGORIES: Array = [\n { name: 'CSS', slug: 'css', translate: 'no' },\n { name: 'React', slug: 'react', translate: 'no' },\n { name: 'Animation', slug: 'animation', translate: 'yes' },\n { name: 'JavaScript', slug: 'javascript', translate: 'no' },\n { name: 'Career', slug: 'career', translate: 'yes' },\n { name: 'Next.js', slug: 'nextjs', translate: 'no' },\n { name: 'General', slug: 'blog', translate: 'yes' },\n] as const;\n\nexport const SNIPPET_CATEGORIES: Array = [\n { name: 'JavaScript', slug: 'javascript', translate: 'no' },\n { name: 'HTML & CSS', slug: 'html', translate: 'yes' },\n {\n name: 'React Component',\n slug: 'react-components',\n translate: 'no',\n },\n { name: 'React Hook', slug: 'react-hooks', translate: 'no' },\n];\n\n// This category is used when an article has no category (eg. meta\n// posts).\nexport const DEFAULT_CATEGORY_SLUG = 'blog';\n\nexport type CategorySlug =\n | (typeof CATEGORIES)[number]['slug']\n | typeof DEFAULT_CATEGORY_SLUG;\n\nexport type SnippetCategorySlug =\n (typeof SNIPPET_CATEGORIES)[number]['slug'];\n\nexport const getFormattedName = (\n categorySlug: CategorySlug | SnippetCategorySlug\n): string => {\n // We have one pseudo-category, 'blog', for \"meta\" posts, and stuff that doesn't fit anywhere else. It isn't included in CATEGORIES because it isn't listed as a category.\n if (categorySlug === 'blog') {\n return '';\n }\n\n const ALL_CATS = [...CATEGORIES, ...SNIPPET_CATEGORIES];\n\n const category = ALL_CATS.find((cat) => cat.slug === categorySlug);\n\n return category?.name || '';\n};\n","import * as React from 'react';\n\nimport { debounce, throttle } from '@/utils';\n\nconst useBoundingBox = (\n ref: React.RefObject,\n scrollDebounce = 80,\n resizeThrottle = 60\n): DOMRect | null => {\n const [box, setBox] = React.useState(null);\n\n React.useEffect(() => {\n // NOTE: This will happen if the element is conditionally rendered and NOT part of the initial render. A better version of this hook should somehow handle this case. For now, the hook just doesn't work (I think?).\n if (!ref.current) {\n return;\n }\n\n // Wait a sec before calculating the initial value.\n window.setTimeout(() => {\n if (!ref.current) {\n return;\n }\n\n setBox(getAugmentedBox(ref.current.getBoundingClientRect()));\n }, 200);\n\n function update() {\n const newBox = ref.current?.getBoundingClientRect();\n\n if (newBox) {\n setBox(getAugmentedBox(newBox));\n }\n }\n\n const handleScroll = scrollDebounce\n ? debounce(update, scrollDebounce)\n : update;\n const handleResize = resizeThrottle\n ? throttle(update, resizeThrottle)\n : update;\n\n window.addEventListener('scroll', handleScroll);\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('resize', handleResize);\n };\n }, [ref, resizeThrottle, scrollDebounce]);\n\n return box;\n};\n\n/*\n DOMRects have some confusing things:\n - `bottom` and `right` are measured from the top/left, rather than the bottom/right\n - `x` and `y` are equivalent to `left` and `top`, rather than the center of the box\n\n This function tweaks these properties to be more useful. `right` is the distance between the right edge of the box and the right edge of the viewport. `x` is the X position of the box’s center.\n\n Rather than adding new properties, I'm overwriting existing ones. That way I can keep using the DOMRect type.\n*/\nfunction getAugmentedBox(box: DOMRect | null): DOMRect | null {\n if (!box) {\n return null;\n }\n\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n return {\n top: box.top,\n left: box.left,\n right: window.innerWidth - box.right - scrollbarWidth,\n bottom: window.innerHeight - box.bottom,\n height: box.height,\n width: box.width,\n x: box.left + box.width / 2,\n y: box.top + box.height / 2,\n toJSON() {\n return this;\n },\n };\n}\n\nexport default useBoundingBox;\n","import React from 'react';\n\nexport default function useHasHydrated() {\n const [hasHydrated, setHasHydrated] = React.useState(false);\n\n React.useEffect(() => {\n setHasHydrated(true);\n }, []);\n\n return hasHydrated;\n}\n","import * as React from 'react';\n\ninterface ExtraOptions {\n triggerRef?: React.RefObject;\n rebindDependency?: any;\n}\n\nexport default function useOnClickOutside(\n ref: React.MutableRefObject,\n handler: (event: MouseEvent | TouchEvent) => void,\n { triggerRef, rebindDependency }: ExtraOptions = {\n triggerRef: { current: null },\n }\n) {\n React.useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n\n // Do nothing if clicking ref's element or descendant elements\n if (!ref.current || ref.current.contains(target)) {\n return;\n }\n\n // Often, this hook is used with a dropdown that can be toggled by clicking a trigger. That trigger exists outside the `ref`, but we still want to ignore clicks on the trigger. Otherwise, the dropdown will be closed and opened as part of the same process.\n if (triggerRef?.current?.contains(target)) {\n return;\n }\n\n handler(event);\n };\n\n document.addEventListener('click', listener, { capture: true });\n document.addEventListener('touchstart', listener, {\n capture: true,\n });\n\n return () => {\n document.removeEventListener('click', listener, {\n capture: true,\n });\n document.removeEventListener('touchstart', listener, {\n capture: true,\n });\n };\n }, [ref, triggerRef, handler, rebindDependency]);\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1see7f3\":\"w1see7f3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wsi9ir8\":\"wsi9ir8\",\"cse0lxf\":\"cse0lxf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w164mbeb\":\"w164mbeb\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"s46qnyg\":\"s46qnyg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w5qvfdf\":\"w5qvfdf\",\"sd8y5an\":\"sd8y5an\",\"fq6j42s\":\"fq6j42s\",\"brdlep1\":\"brdlep1\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"smjtouk\":\"smjtouk\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"s1ivucee\":\"s1ivucee\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"s1wslf2n\":\"s1wslf2n\",\"s1wls44k\":\"s1wls44k\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mxvxiam\":\"mxvxiam\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tyd0rci\":\"tyd0rci\",\"l10yq3dx\":\"l10yq3dx\",\"c1tx393d\":\"c1tx393d\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1klfgeh\":\"w1klfgeh\",\"b1tpecs0\":\"b1tpecs0\",\"cdl3wy9\":\"cdl3wy9\",\"s10f3pnx\":\"s10f3pnx\",\"l1bbd16e\":\"l1bbd16e\",\"s2tykkp\":\"s2tykkp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"moetmyk\":\"moetmyk\",\"menuEnter-moetmyk\":\"menuEnter-moetmyk\",\"mf9l8x6\":\"mf9l8x6\",\"fadeIn\":\"fadeIn\",\"lp1k1ks\":\"lp1k1ks\",\"l1ncp1oj\":\"l1ncp1oj\",\"f1v38vt5\":\"f1v38vt5\",\"nvg9igy\":\"nvg9igy\",\"s1b89zcm\":\"s1b89zcm\",\"l352c3y\":\"l352c3y\",\"l1p49fpz\":\"l1p49fpz\",\"l1c5s8om\":\"l1c5s8om\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wvvtqhu\":\"wvvtqhu\",\"c4b5hm0\":\"c4b5hm0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"whslyen\":\"whslyen\",\"fadeFromTransparent\":\"fadeFromTransparent\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1lgshfa\":\"w1lgshfa\",\"ck529d4\":\"ck529d4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"c8obyh8\":\"c8obyh8\",\"slideIn-c8obyh8\":\"slideIn-c8obyh8\",\"s1osi96j\":\"s1osi96j\",\"subhko2\":\"subhko2\",\"s1n32s22\":\"s1n32s22\",\"b10rj689\":\"b10rj689\",\"b1x0cqvi\":\"b1x0cqvi\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"c1wwe57\":\"c1wwe57\",\"ssibbvq\":\"ssibbvq\",\"sts46w7\":\"sts46w7\",\"s1nny7ly\":\"s1nny7ly\",\"b17zotuv\":\"b17zotuv\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1ilkajt\":\"w1ilkajt\",\"g1g5ab0v\":\"g1g5ab0v\",\"sa154vv\":\"sa154vv\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"n1fcwfbc\":\"n1fcwfbc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1nm8v5u\":\"w1nm8v5u\",\"nqxiycd\":\"nqxiycd\",\"nvlm710\":\"nvlm710\",\"lbj2n6v\":\"lbj2n6v\",\"o17p2a19\":\"o17p2a19\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"w1nwb8mx\":\"w1nwb8mx\",\"a18yhdhc\":\"a18yhdhc\",\"dropIcon-a18yhdhcw1nwb8mx\":\"dropIcon-a18yhdhcw1nwb8mx\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"oilzil0\":\"oilzil0\",\"wmauoxf\":\"wmauoxf\",\"psreo9o\":\"psreo9o\",\"slideIn-psreo9o\":\"slideIn-psreo9o\",\"sfxum9j\":\"sfxum9j\",\"cnome6e\":\"cnome6e\",\"fadeIn\":\"fadeIn\",\"c1mkgl0b\":\"c1mkgl0b\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"s1898y83\":\"s1898y83\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"o16qpys8\":\"o16qpys8\",\"wisp6v7\":\"wisp6v7\",\"sal3l5t\":\"sal3l5t\",\"swt4a33\":\"swt4a33\",\"a5r4dca\":\"a5r4dca\",\"h57b4uk\":\"h57b4uk\"};"],"names":["LightWrapper","styled","name","class","propsAsIs","DarkWrapper","React","ColorModeContainer","ref","Props","colorMode","useAdaptiveColors","delegated","String","SPRING_CONFIG","tension","friction","Svg","IconArrowBullet","size","isHovering","isBooped","useBoopMinimal","lineProps","useSpring","x2","polyLineProps","points","config","VIEWBOX_SIZE","getFirstLineProps","iconStatus","y","HAMBURGER_Y_INSET","x1","HAMBURGER_X_INSET","y1","y2","CLOSE_INSET","getThirdLineProps","HAMBURGER_LINE_WIDTH","InPortal","id","children","parent","hostElement","setHostElement","actualParent","document","body","elm","querySelector","createElement","appendChild","removeChild","err","ReactDOM","Wrapper","_exp","Link","GivenNameBase","GivenNameAnimated","_exp2","FamilyNameBase","FamilyNameAnimated","_exp5","LilCaretBase","LilCaretAnimated","_exp8","InitialBase","InitialAnimated","_exp13","Path","InitialWrapper","Invisible","Logo","animated","OverlayBase","isOpen","enterDuration","enterDelay","exitDuration","exitDelay","openOpacity","handleDismiss","pointerEvents","ChildWrapper","ModalBase","portalId","skipPortal","returnFocus","allowScroll","overlay","Overlay","overlayProps","dismissDuration","enableDismissAfter","isRendered","setIsRendered","lastOpenedTimestamp","current","Date","now","timeoutId","setTimeout","clearTimeout","handleDismissRef","addEventListener","handleKeyDown","removeEventListener","ev","KeyboardEvent","elem","Paper","props","callback","useOnResize","throttleBy","isMounted","callbackRef","handleResize","throttle","args","window","IconLatest","svg","xmlns","width","height","fill","stroke","strokeLinecap","strokeLinejoin","strokeWidth","viewBox","path","d","IconCategories","clamp","topStyle","transform","INSET","leftStyle","rightStyle","bottomStyle","style","IconCourses","spring","IconGoodies","svgStyle","transformOrigin","MailFlag","polyline","IconNewsletter","youveGotMail","mailFlagColor","mailFlagProps","CategoryIconBase","WrappedCategoryIconBase","ICONS_BY_CATEGORY","react","IconReact","circle","cx","cy","r","css","IconCSS","animation","IconAnimation","maskId","replace","javascript","IconJS","IconJavaScript","rect","x","rx","career","IconCareer","blog","IconBlog","CATEGORIES_MENU_ITEMS","CATEGORIES","filter","cat","Category","slug","map","icon","CatLink","CategoryGrid","onClick","category","Icon","flexShrink","translate","ExpandableGroupContext","Label","Contents","div","ExpandableGroup","label","initialIsOpen","setIsOpen","setHeight","contentsRef","boundingRect","newHeight","chevronSpring","contentStyle","onRest","setIsBooped","COURSES","title","href","isNew","New","CoursesList","opacity","transition","CSSMascot","SubList","SubNavLink","StudentLoginListItem","Button","ConnectedCoursesList","Col","Square","FrontSquare","BackSquare","GOODIES_MENU_ITEMS","IconGradient","shortName","IconShadows","IconOperators","IconSnippets","IconPortfolioBook","GoodieLink","StyledIcon","GoodiesGrid","withShortNames","includeNewsletter","isHoveringNewsletter","setIsHoveringNewsletter","BackgroundCloud","CloudBorder","StyledJerica","LinkList","StyledLink","JericaLinks","handleClickLink","Modal","ModalContent","List","ListItem","Flex","NavLink","SubFooter","LegalLinksList","LegalListItem","LegalLink","MobileMenu","pressedLink","setPressedLink","useTintedBackground","UserPreferencesContext","colorModeRef","newBackgroundColor","LIGHT_COLORS","documentElement","setProperty","DARK_COLORS","innerWidth","USE_HAMBURGER_MENU_BELOW","transitionDelay","IconHamburger","sharedConfig","firstLineProps","secondLineProps","getSecondLineProps","thirdLineProps","includePatty","StyledIconWrapper","IconWrapper","WrappedIconHamburger","modalId","toggleModal","useGlobalUIActions","modals","useGlobalUIState","modalState","isPressed","pressedTimestamp","forcedValue","timeoutRef","setIsPressed","handleToggle","MIN_TIME","Math","ceil","remainingTime","DROPDOWN_SLUGS","FancyButton","setIsHovering","scaleY","ButtonOutline","span","hoveringCourseSlug","setHoveringCourseSlug","getPath","isErect","pointyFactor","DIMENSIONS_BY_SLUG","categories","courses","goodies","OuterWrapper","Page","StyledTip","NavigationTip","travelingFromSlug","prefersReducedMotion","usePrefersReducedMotion","clientOnly","setIsErect","applyViewTransitionName","setApplyViewTransitionName","viewTransitionName","undefined","ContentClipper","ContentWrapper","NavigationDropdown","containerRef","dropdownSlug","boxCollectionRef","triggerBB","currentSize","top","offsetLeft","left","event","key","allLinks","Array","currentTarget","querySelectorAll","firstLink","lastLink","at","direction","shiftKey","elementToFocus","HTMLButtonElement","activeElement","nextTriggerIndex","indexOf","nextTriggerSlug","finalNavItem","navLink","getComputedStyle","display","preventDefault","focus","NavigationList","NavButton","OptionalListItem","AnimatedWrapper","IconDrop","isOptional","className","mostRecentNavigationFrom","NavigationTrackerContext","hasHydrated","useHasHydrated","isFirstPageView","StyledLogo","StyledDesktopNavigation","_exp3","DesktopNavigation","dismissDropdownOnScroll","setDropdownSlug","DropdownSlug","setTravelingFromSlug","navigationListRef","HTMLUListElement","dropdownSlugRef","catTriggerRef","coursesTriggerRef","goodiesTriggerRef","catTriggerBB","useBoundingBox","coursesTriggerBB","goodiesTriggerBB","playMenuOpen","useSound","volume","playMenuClose","startTransition","startViewTransition","useViewTransition","startViewTransitionRef","handleDismissDropdown","handleDismissDropdownImmediately","dropdownRef","getAttribute","relevantContent","useOnClickOutside","triggerRef","rebindDependency","useDismissOnEscape","triggersBySlug","handleKeydown","useDismissOnScroll","enabled","handleScroll","useDismissOnResize","handleSelectDropdown","Actions","HamburgerWrapper","SiteHeader","skipViewTransitions","includeLogoAnimation","skipActions","wrapperRef","HTMLDivElement","includes","getAugmentedBox","box","scrollbarWidth","clientWidth","right","bottom","innerHeight","toJSON","scrollDebounce","resizeThrottle","setBox","update","newBox","getBoundingClientRect","debounce","setHasHydrated","handler","listener","target","contains","capture"],"sourceRoot":"","ignoreList":[]}