{"version":3,"file":"static/chunks/83675-6cfb00ebd8058049.js","mappings":"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","sources":["webpack://_N_E/./src/components/NavigationTrackerProvider/NavigationTrackerProvider.tsx","webpack://_N_E/./src/components/UserPreferencesProvider/UserPreferencesProvider.helpers.ts","webpack://_N_E/./src/components/UserPreferencesProvider/UserPreferencesProvider.tsx","webpack://_N_E/./src/components/UserPreferencesProvider/index.ts","webpack://_N_E/./src/components/VisuallyHidden/VisuallyHidden.tsx","webpack://_N_E/./src/components/VisuallyHidden/VisuallyHiddenDynamic.ts","webpack://_N_E/./src/components/VisuallyHidden/index.ts","webpack://_N_E/./src/constants/colors.ts","webpack://_N_E/./src/constants/constants.ts","webpack://_N_E/./src/constants/index.ts","webpack://_N_E/./src/hooks/use-boop-minimal.ts","webpack://_N_E/./src/hooks/use-prefers-reduced-motion.ts","webpack://_N_E/./src/utils.ts","webpack://_N_E/./src/components/MaxWidthWrapper/MaxWidthWrapper.linaria.module.css","webpack://_N_E/./src/components/VisuallyHidden/VisuallyHidden.linaria.module.css"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nexport const SetNavigationTrackerContext = React.createContext<\n (navigationFrom: string) => void\n>(() => {});\nexport const NavigationTrackerContext = React.createContext<\n string | null\n>(null);\n\nfunction NavigationProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [mostRecentNavigationFrom, setMostRecentNavigationFrom] =\n React.useState(null);\n\n return (\n \n \n {children}\n \n \n );\n}\n\nexport default NavigationProvider;\n","import * as React from 'react';\n\nimport { ColorMode } from '@/constants';\n\nexport type ToggleColorMode = (colorMode?: ColorMode) => void;\nexport type ToggleSoundEnabled = (value?: boolean) => void;\n\nexport const SAVED_SOUND_ENABLED_KEY = 'saved-sound-enabled';\n\nexport function useRestoredValuesFromDevice({\n initialColorMode,\n setColorMode,\n initialSoundEnabled,\n setSoundEnabled,\n}: {\n initialColorMode: ColorMode;\n setColorMode: React.Dispatch>;\n initialSoundEnabled: boolean;\n setSoundEnabled: React.Dispatch>;\n}) {\n React.useEffect(() => {\n // Initializing color is weird, since we have that `THEME_INITIALIZER_SCRIPT` that writes a data-attribute to the root HTML tag. We’ll read that HTML value to get the actual color mode of the page.\n const appliedColorMode =\n document.documentElement.getAttribute('data-color-mode');\n\n if (\n checkIsColorMode(appliedColorMode) &&\n appliedColorMode !== initialColorMode\n ) {\n setColorMode(appliedColorMode);\n }\n\n // For sound, it's more traditional.\n const savedSoundEnabled = localStorage.getItem(\n SAVED_SOUND_ENABLED_KEY\n );\n\n if (typeof savedSoundEnabled === 'string') {\n const parsed = JSON.parse(savedSoundEnabled);\n\n if (\n typeof parsed === 'boolean' &&\n parsed !== initialSoundEnabled\n ) {\n setSoundEnabled(parsed);\n }\n }\n\n // React complains that we’re not depending on `initialColorMode` or `initialSoundEnabled`, but this is intentional; we *don't* want to re-run when these things change!\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nconst checkIsColorMode = (\n colorMode: string | null\n): colorMode is ColorMode => {\n return (\n typeof colorMode === 'string' &&\n ['dark', 'light'].includes(colorMode)\n );\n};\n","'use client';\n\nimport * as React from 'react';\nimport { usePathname } from 'next/navigation';\nimport Cookie from 'js-cookie';\n\nimport {\n DEFAULT_COLOR_MODE,\n COLOR_THEME_COOKIE_NAME,\n ColorMode,\n} from '@/constants';\n\nimport {\n useRestoredValuesFromDevice,\n ToggleColorMode,\n ToggleSoundEnabled,\n SAVED_SOUND_ENABLED_KEY,\n} from './UserPreferencesProvider.helpers';\n\nexport const SetUserPreferencesContext = React.createContext<{\n toggleColorMode: ToggleColorMode;\n toggleSoundEnabled: ToggleSoundEnabled;\n}>(\n // Unused initial values for TS\n { toggleColorMode: () => {}, toggleSoundEnabled: () => {} }\n);\n\nexport const UserPreferencesContext = React.createContext<{\n colorMode: ColorMode;\n soundEnabled: boolean;\n}>({\n // Unused initial values for TS\n colorMode: 'light',\n soundEnabled: true,\n});\n\n/*\n Certain routes require a specific color mode. For example,\n /shadow-palette will always display in “dark mode”. Instead of\n using the user’s saved value, we’ll use this as the initial value.\n Technically the value isn't locked, it can still be changed, but these routes shouldn't give the user the option, they shouldn't render the toggle.\n*/\nconst FORCED_COLOR_ROUTES: Record = {\n '/shadow-palette/': 'dark',\n};\n\nfunction UserPreferencesProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const pathname = usePathname();\n\n const [colorMode, setColorMode] = React.useState(() => {\n // `pathname` should always exist, but TypeScript isn't so sure.\n const forcedColorMode = pathname\n ? FORCED_COLOR_ROUTES[pathname]\n : undefined;\n\n // We initialize to `DEFAULT_COLOR_MODE`. A snippet inside `HtmlRoot` will edit the HTML based on the user's saved preferences, and we'll sync this up in an effect below.\n return forcedColorMode ?? DEFAULT_COLOR_MODE;\n });\n\n const [soundEnabled, setSoundEnabled] =\n React.useState(true);\n\n useRestoredValuesFromDevice({\n initialColorMode: colorMode,\n setColorMode,\n initialSoundEnabled: soundEnabled,\n setSoundEnabled,\n });\n\n const toggleColorMode: ToggleColorMode = React.useCallback(\n (newColorMode?: ColorMode) => {\n setColorMode((currentColorMode) => {\n const nextColorMode =\n newColorMode ??\n (currentColorMode === 'light' ? 'dark' : 'light');\n\n Cookie.set(COLOR_THEME_COOKIE_NAME, nextColorMode, {\n expires: 1000,\n });\n\n return nextColorMode;\n });\n },\n []\n );\n const toggleSoundEnabled = React.useCallback(\n (newValue?: boolean) => {\n const nextValue = newValue ?? !soundEnabled;\n setSoundEnabled(nextValue);\n\n window.localStorage.setItem(\n SAVED_SOUND_ENABLED_KEY,\n String(nextValue)\n );\n },\n [soundEnabled]\n );\n\n const providedSetters = React.useMemo(() => {\n return {\n toggleColorMode,\n toggleSoundEnabled,\n };\n }, [toggleColorMode, toggleSoundEnabled]);\n\n const providedValues = React.useMemo(() => {\n return {\n colorMode,\n soundEnabled,\n };\n }, [colorMode, soundEnabled]);\n\n return (\n \n \n {children}\n \n \n );\n}\n\nexport function useColorMode() {\n const value = React.useContext(UserPreferencesContext);\n\n if (!value) {\n throw new Error(\n 'Cannot call useColorMode outside of UserPreferencesProvider'\n );\n }\n\n return value.colorMode;\n}\n\nexport default UserPreferencesProvider;\n","export {\n default,\n UserPreferencesContext,\n SetUserPreferencesContext,\n useColorMode,\n} from './UserPreferencesProvider';\n\nexport type {\n ToggleColorMode,\n ToggleSoundEnabled,\n} from './UserPreferencesProvider.helpers';\n","import { styled } from '@linaria/react';\n\nimport type { Props } from './VisuallyHiddenProps';\n\nconst VisuallyHidden = ({ children, ...delegated }: Props) => {\n return {children};\n};\n\nconst Wrapper = styled.span`\n position: absolute;\n overflow: hidden;\n clip: rect(0 0 0 0);\n height: 1px;\n width: 1px;\n padding: 0;\n border: 0;\n`;\n\nexport default VisuallyHidden;\n","// In development, I have a keyboard shortcut that allows me to view the hidden text. In production, it's a much simpler component.\n// Decided to split it up this way to avoid polluting the client bundle with development-only code. This way, the production component is a Server Component.\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./VisuallyHidden');\n} else {\n module.exports = require('./VisuallyHidden.dev');\n}\n","// In development, I have a keyboard shortcut that allows me to view the hidden text. In production, it's a much simpler component.\n// Decided to split it up this way to avoid polluting the client bundle with development-only code. This way, the production component is a Server Component.\nimport * as React from 'react';\n\nimport { Props } from './VisuallyHiddenProps';\n// TypeScript doesn't understand CommonJS, but we need to use CommonJS to have conditional imports. Ignore this error.\n// @ts-ignore\nimport VisuallyHiddenRaw from './VisuallyHiddenDynamic';\n\nconst VisuallyHidden = VisuallyHiddenRaw as React.FC;\n\nexport default VisuallyHidden;\n","import kebab from 'lodash.kebabcase';\n\nimport { transformObject } from '@/utils';\n\nexport type ColorTuple = [number, number, number, number?];\ntype ColorMapRaw = Record;\n\nexport interface ColorMap {\n [key: `--${string}`]: string;\n}\n\nexport const DARK_COLORS_RAW: ColorMapRaw = {\n colorText: [210, 10, 90],\n colorBackground: [210, 15, 6],\n colorBlurredBackground: [210, 15, 6, 0.75],\n colorMutedBackground: [210, 38, 15, 0.85],\n\n colorAction: [240, 95, 62],\n colorPrimary: [225, 100, 75],\n colorSecondary: [333, 100, 55],\n colorTertiary: [280, 100, 85],\n colorDecorative: [200, 50, 60],\n colorInfo100: [214, 40, 15],\n colorInfo200: [218, 32, 20],\n colorInfo300: [218, 30, 25],\n colorInfo400: [218, 45, 40],\n colorInfo500: [225, 100, 60],\n colorInfo700: [215, 100, 72],\n colorWarning100: [30, 25, 11],\n colorWarning200: [32, 20, 15],\n colorWarning300: [32, 25, 20],\n colorWarning400: [35, 45, 35],\n colorWarning500: [40, 100, 50],\n colorWarning700: [43, 100, 72],\n colorSuccess100: [176, 35, 10],\n colorSuccess200: [176, 26, 14],\n colorSuccess300: [176, 28, 20],\n colorSuccess400: [176, 45, 30],\n colorSuccess500: [160, 100, 40],\n colorSuccess700: [160, 80, 65],\n\n // Colors for the sky effects across the site\n colorCloud100: [210, 15, 6],\n colorCloud300: [212, 40, 9],\n colorCloud400: [213, 40, 10],\n colorCloud500: [213, 40, 12],\n colorSkyFrom: [214, 40, 11],\n colorSkyTo: [200, 50, 30],\n colorSkySubtle: [210, 40, 16],\n\n colorGray50: [210, 19, 9],\n colorGray100: [210, 15, 12],\n colorGray200: [210, 15, 18],\n colorGray300: [210, 10, 30],\n colorGray400: [210, 9, 40],\n colorGray500: [210, 8, 50],\n colorGray600: [210, 12, 55],\n colorGray700: [210, 14, 66],\n colorGray800: [210, 20, 77],\n colorGray900: [210, 25, 88],\n colorGray1000: [210, 25, 96],\n\n // This color is used when I want something that APPEARS white.\n // In “Dark Mode”, actual white would be painfully bright, so this tones it down a bit.\n colorAdaptiveWhite: [210, 25, 92],\n\n syntaxBg: [210, 15, 6], // Same as `background`\n syntaxHighlight: [210, 30, 18],\n syntaxTxt: [0, 0, 100],\n syntaxComment: [200, 18, 51],\n syntaxProp: [326, 100, 61],\n syntaxBool: [50, 100, 50],\n syntaxVal: [210, 12, 65],\n syntaxStr: [259, 100, 71],\n syntaxName: [280, 100, 66],\n syntaxDel: [0, 100, 67],\n syntaxRegex: [50, 100, 50], // Same as 'syntaxBool'\n syntaxFn: [195, 100, 50],\n\n // LEGACY colors:\n colorInfo: [225, 100, 80],\n colorInfoBackground: [225, 100, 80, 0.1],\n colorError: [340, 95, 60],\n colorErrorBackground: [340, 95, 43, 0.1],\n colorSuccess: [160, 100, 40],\n colorSuccessBackground: [160, 100, 40, 0.1],\n colorAlert: [40, 100, 50],\n colorAlertBackground: [40, 100, 50, 0.1],\n};\n\n// For certain slices of the tree, we’ll overwrite `--color-background`. For example, a warning sidenote will set it to `--color-warning-500`. If I need to know the PAGE background within those elements, I can use this value:\nDARK_COLORS_RAW.colorPageBackground = DARK_COLORS_RAW.colorBackground;\n\n// Same deal for primary color:\nDARK_COLORS_RAW.colorPagePrimary = DARK_COLORS_RAW.colorPrimary;\n\nDARK_COLORS_RAW.kbdBackgroundColor = DARK_COLORS_RAW.colorGray400;\nDARK_COLORS_RAW.kbdBorderColor = DARK_COLORS_RAW.colorGray300;\n\n// The background color for and similar things:\nDARK_COLORS_RAW.colorCodeBg = DARK_COLORS_RAW.colorGray100;\n// In Dark Mode, elements like code snippets and Demo have an outline. This color only exists in Dark Mode:\nDARK_COLORS_RAW.colorContentOutline = DARK_COLORS_RAW.colorGray300;\n\nexport const LIGHT_COLORS_RAW: ColorMapRaw = {\n colorText: [222, 22, 5],\n // Was thinking of shifting to an off-white, but sadly I have so many images with a white background, which clashes with any non-white page bg.\n colorBackground: [0, 0, 100],\n colorBlurredBackground: [0, 0, 95, 0.75],\n colorMutedBackground: [200, 45, 76, 0.85],\n\n colorAction: [240, 95, 62],\n colorPrimary: [240, 95, 62],\n colorSecondary: [333, 100, 45],\n colorTertiary: [255, 85, 30],\n colorDecorative: [200, 75, 65],\n colorInfo100: [213, 80, 95],\n colorInfo200: [220, 70, 91],\n colorInfo300: [220, 58, 87],\n colorInfo400: [220, 70, 78],\n colorInfo500: [245, 100, 60],\n colorInfo700: [245, 64, 40],\n colorError100: [340, 80, 95],\n colorError200: [340, 70, 85],\n colorError500: [340, 95, 39],\n colorWarning100: [50, 85, 90],\n colorWarning200: [48, 80, 85],\n colorWarning300: [45, 77, 80],\n colorWarning400: [37, 80, 60],\n colorWarning500: [37, 100, 50],\n colorWarning700: [33, 100, 40],\n colorSuccess100: [157, 48, 95],\n colorSuccess200: [155, 44, 87],\n colorSuccess300: [155, 40, 82],\n colorSuccess500: [145, 100, 25],\n colorSuccess700: [145, 80, 17],\n\n colorCloud100: [203, 60, 95],\n colorCloud300: [202, 68, 92],\n colorCloud400: [201, 60, 86],\n colorCloud500: [200, 80, 83],\n colorCloud700: [210, 30, 55],\n colorSkyFrom: [200, 70, 78],\n colorSkyTo: [200, 70, 70],\n colorSkySubtle: [200, 90, 88],\n\n colorGray50: [225, 40, 96],\n colorGray100: [225, 25, 92],\n colorGray200: [225, 16, 86],\n colorGray300: [225, 8, 80],\n colorGray400: [225, 8, 70],\n colorGray500: [225, 7, 60],\n colorGray600: [225, 15, 50],\n colorGray700: [225, 12, 40],\n colorGray800: [225, 20, 30],\n colorGray900: [225, 25, 20],\n colorGray1000: [225, 15, 15],\n\n colorAdaptiveWhite: [0, 0, 100],\n\n syntaxBg: [213, 80, 95],\n syntaxHighlight: [225, 25, 93],\n syntaxTxt: [0, 0, 16],\n syntaxComment: [225, 15, 42],\n syntaxProp: [327, 100, 43],\n syntaxBool: [302, 100, 37],\n syntaxVal: [200, 15, 40],\n syntaxStr: [259, 100, 56],\n syntaxName: [280, 100, 50],\n syntaxDel: [0, 100, 67],\n syntaxRegex: [255, 100, 42],\n syntaxFn: [231, 99, 62],\n\n // Legacy colors\n colorInfo: [245, 100, 60],\n colorInfoBackground: [215, 100, 40, 0.1],\n colorError: [340, 95, 39],\n colorErrorBackground: [340, 95, 43, 0.1],\n colorSuccess: [145, 100, 27],\n colorSuccessBackground: [145, 100, 40, 0.1],\n colorAlert: [37, 100, 50],\n colorAlertBackground: [52, 100, 50, 0.25],\n};\n\nLIGHT_COLORS_RAW.colorPageBackground =\n LIGHT_COLORS_RAW.colorBackground;\nLIGHT_COLORS_RAW.colorPagePrimary = LIGHT_COLORS_RAW.colorPrimary;\n\nLIGHT_COLORS_RAW.kbdBackgroundColor = LIGHT_COLORS_RAW.colorGray100;\nLIGHT_COLORS_RAW.kbdBorderColor = LIGHT_COLORS_RAW.colorGray300;\nLIGHT_COLORS_RAW.colorCodeBg = LIGHT_COLORS_RAW.syntaxBg;\n// In light mode, content isn't outlined, and so we pass transparent as a value:\nLIGHT_COLORS_RAW.colorContentOutline = [0, 0, 0, 0];\n\nexport const LIGHT_COLORS = createStyleObject(LIGHT_COLORS_RAW);\nexport const DARK_COLORS = createStyleObject(DARK_COLORS_RAW);\n\nexport const LIGHT_COLORS_CSS = createCssString(LIGHT_COLORS);\nexport const DARK_COLORS_CSS = createCssString(DARK_COLORS);\n\n// This method takes the raw H/S/L values and produces an object that can be passed to `style`:\n// Input: { gray500: [210, 10, 90] }\n// Output: { '--color-gray-500': 'hsl(210deg 10% 90%)' }\nfunction createStyleObject(colors: ColorMapRaw): ColorMap {\n return transformObject(colors, (key, value) => {\n if (typeof value === 'string') {\n // This allows us to \"share\" a value across keys.\n value = colors[value];\n }\n\n const [h, s, l, a = 1] = value;\n\n const newKey = `--${kebab(key)}`;\n const newValue =\n a === 1\n ? `hsl(${h}deg ${s}% ${l}%)`\n : `hsl(${h}deg ${s}% ${l}% / ${a})`;\n\n return [newKey, newValue];\n });\n}\n\nfunction createCssString(colorMap: ColorMap): string {\n return Object.entries(colorMap)\n .map(([key, value]) => `${key}: ${value};`)\n .join('\\n');\n}\n\n/*\n Sometimes I want to grab the raw HSL values and combine them with a custom opacity. This helper function makes it easier.\n\n Example usage:\n color: hsl(${vals(DARK_COLORS.colorText)} / 0.5);\n*/\nexport function vals(colorValues: ColorTuple) {\n return `${colorValues[0]}deg ${colorValues[1]}% ${colorValues[2]}%`;\n}\n","export {\n LIGHT_COLORS,\n DARK_COLORS,\n LIGHT_COLORS_RAW,\n DARK_COLORS_RAW,\n LIGHT_COLORS_CSS,\n DARK_COLORS_CSS,\n vals,\n} from './colors';\nexport type { ColorMap } from './colors';\n\nexport const BREAKPOINT_SIZES = {\n xs: 320,\n sm: 563,\n md: 768,\n lg: 1200,\n xl: 1570,\n};\n\nexport const BREAKPOINTS = {\n xs: `(max-width: ${BREAKPOINT_SIZES.xs / 16}rem)`,\n sm: `(min-width: ${BREAKPOINT_SIZES.xs / 16}rem) and (max-width: ${\n BREAKPOINT_SIZES.sm / 16\n }rem)`,\n md: `(min-width: ${BREAKPOINT_SIZES.sm / 16}rem) and (max-width: ${\n BREAKPOINT_SIZES.md / 16\n }rem)`,\n lg: `(min-width: ${BREAKPOINT_SIZES.md / 16}rem) and (max-width: ${\n BREAKPOINT_SIZES.lg / 16\n }rem)`,\n xl: `(min-width: ${BREAKPOINT_SIZES.lg / 16}rem) and (max-width: ${\n BREAKPOINT_SIZES.xl / 16\n }rem)`,\n xsAndSmaller: `(max-width: ${BREAKPOINT_SIZES.xs / 16}rem)`,\n smAndSmaller: `(max-width: ${BREAKPOINT_SIZES.sm / 16}rem)`,\n mdAndSmaller: `(max-width: ${BREAKPOINT_SIZES.md / 16}rem)`,\n lgAndSmaller: `(max-width: ${BREAKPOINT_SIZES.lg / 16}rem)`,\n xlAndSmaller: `(max-width: ${BREAKPOINT_SIZES.xl / 16}rem)`,\n xsAndLarger: `(min-width: ${(BREAKPOINT_SIZES.xs + 0.25) / 16}rem)`,\n smAndLarger: `(min-width: ${(BREAKPOINT_SIZES.sm + 0.25) / 16}rem)`,\n mdAndLarger: `(min-width: ${(BREAKPOINT_SIZES.md + 0.25) / 16}rem)`,\n lgAndLarger: `(min-width: ${(BREAKPOINT_SIZES.lg + 0.25) / 16}rem)`,\n xlAndLarger: `(min-width: ${(BREAKPOINT_SIZES.xl + 0.25) / 16}rem)`,\n mobile: `(max-width: ${BREAKPOINT_SIZES.md / 16}rem)`,\n desktop: `(min-width: ${(BREAKPOINT_SIZES.md + 0.25) / 16}rem)`,\n};\n\nexport const SPRINGS = {\n default: {\n // This is literally the default for React Spring.\n // Kept here for reference, not because I should use it.\n tension: 170,\n friction: 26,\n },\n springy: {\n tension: 300,\n friction: 10,\n },\n};\n\nexport const COLOR_SWAP_TRANSITION = {\n duration: 350,\n timingFunction: 'cubic-bezier(0.41, 0.1, 0.13, 1)',\n};\n\nexport type ColorMode = 'light' | 'dark';\n\nexport const COLOR_THEME_COOKIE_NAME = 'saved-color-theme';\nexport const DEFAULT_COLOR_MODE: ColorMode = 'light';\n\nexport const THUMB_FOCUS_GRADIENT = `\n radial-gradient(\n hsl(48deg 100% 75% / 1),\n hsl(48deg 100% 75% / 0) 40%\n ),\n conic-gradient(\n from 90deg at 50% 50%,\n hsl(45deg 100% 55%),\n hsl(52deg 100% 75%),\n hsl(45deg 100% 55%),\n hsl(52deg 100% 75%),\n hsl(45deg 100% 55%),\n hsl(52deg 100% 95%),\n hsl(45deg 100% 55%)\n )\n`;\n\nexport const FANCY_SHADOW = `\n 0 1.3px 2.5px -3px rgba(0, 0, 0, 0.02),\n 0 3.1px 6.1px -3px rgba(0, 0, 0, 0.028),\n 0 5.9px 11.4px -3px rgba(0, 0, 0, 0.035),\n 0 10.5px 20.3px -3px rgba(0, 0, 0, 0.042),\n 0 19.6px 38px -3px rgba(0, 0, 0, 0.05),\n 0 47px 91px -3px rgba(0, 0, 0, 0.07)\n`;\n\nexport const MAX_NUM_OF_LIKES = 16;\n\n// The number of articles to show on the homepage by default:\nexport const HOMEPAGE_ARTICLE_LIMIT = 12;\n\nexport type HomepagePromo = 'bundle' | 'none';\nexport const HOMEPAGE_PROMO: HomepagePromo = 'none';\n\n// In rems:\nexport const HEADER_WIDTH = 1100 / 16;\nexport const HEADER_HEIGHT = 80 / 16;\nexport const USE_HAMBURGER_MENU_BELOW = 800 / 16;\nexport const SUPERHEADER_HEIGHT = 2.75;\n\nexport const CONVERTKIT_FORMS_BY_ID = {\n primaryNewsletter: '1214974',\n effectivePortfolio: '1602808',\n};\nexport const CONVERTKIT_TAGS_BY_ID = {\n primaryNewsletter: '1800626',\n // TODO: The rest of these should be unused. Delete them if they stay that way after I've finished the migration.\n spring: '1800658',\n careers: '1350186',\n technical: '1350187',\n 'joy-of-react-updates': '2988052',\n 'react-summit-2023': '4264707',\n};\n\nexport type NewsletterFormName = keyof typeof CONVERTKIT_FORMS_BY_ID;\nexport type NewsletterTagName = keyof typeof CONVERTKIT_TAGS_BY_ID;\n\nexport const TIGHT_SPRING = {\n tension: 450,\n friction: 25,\n};\n\nexport const SEARCH_MODAL_ID = 'search';\n\nexport const ALGOLIA_APP_ID = '467U7YTK53';\nexport const ALGOLIA_PUBLIC_KEY = '148ecd3e28d6bffafe80daaa81725c11';\n\nexport const RECAPTCHA_PROJECT_ID = 'tinkersynth';\nexport const RECAPTCHA_PUBLIC_KEY =\n '6LepiggqAAAAABuxDy1b107GmLy_ANNZjPKrwy87';\n\nexport const PARTYKIT_HOST =\n process.env.NODE_ENV === 'production'\n ? 'https://blog-v3-party.joshwcomeau.partykit.dev'\n : '127.0.0.1:1999';\nexport const PROTOCOL =\n process.env.NODE_ENV === 'production' ? 'https' : 'http';\nexport const PARTYKIT_URL = `${PROTOCOL}://${PARTYKIT_HOST}`;\n","export { BREAKPOINT_SIZES, BREAKPOINTS, SPRINGS, COLOR_SWAP_TRANSITION, COLOR_THEME_COOKIE_NAME, DEFAULT_COLOR_MODE, THUMB_FOCUS_GRADIENT, FANCY_SHADOW, MAX_NUM_OF_LIKES, HOMEPAGE_ARTICLE_LIMIT, HOMEPAGE_PROMO, HEADER_WIDTH, HEADER_HEIGHT, USE_HAMBURGER_MENU_BELOW, SUPERHEADER_HEIGHT, CONVERTKIT_FORMS_BY_ID, CONVERTKIT_TAGS_BY_ID, TIGHT_SPRING, SEARCH_MODAL_ID, ALGOLIA_APP_ID, ALGOLIA_PUBLIC_KEY, RECAPTCHA_PROJECT_ID, RECAPTCHA_PUBLIC_KEY, PARTYKIT_HOST, PROTOCOL, PARTYKIT_URL, LIGHT_COLORS, DARK_COLORS, LIGHT_COLORS_RAW, DARK_COLORS_RAW, LIGHT_COLORS_CSS, DARK_COLORS_CSS, vals } from \"./constants\";","/*\nThis hook is like `useBoop`, but lower-level. It has no API for\nstyles. Instead, it returns an `isBooped` value based on an\n`isHovering` state.\n*/\n\nimport * as React from 'react';\n\nimport usePrefersReducedMotion from '@/hooks/use-prefers-reduced-motion';\n\nfunction useBoopMinimal(isHovering: boolean, timing = 150) {\n const [isBooped, setIsBooped] = React.useState(false);\n const prefersReducedMotion = usePrefersReducedMotion();\n\n React.useEffect(() => {\n if (!isHovering || prefersReducedMotion) {\n return;\n }\n\n setIsBooped(true);\n }, [isHovering, prefersReducedMotion]);\n\n React.useEffect(() => {\n if (!isBooped) {\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n setIsBooped(false);\n }, timing);\n\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [isBooped, timing]);\n\n return isBooped;\n}\n\nexport default useBoopMinimal;\n","import * as React from 'react';\n\nconst QUERY = '(prefers-reduced-motion: no-preference)';\n\ninterface Options {\n // By default, this hook will always initialize as `false`, since we don't know during SSR if the user prefers reduced motion or not. But, for components that *only* render on the client, we can opt to use the client's preference as the initial value.\n clientOnly?: boolean;\n}\n\nexport default function usePrefersReducedMotion({\n clientOnly,\n}: Options = {}) {\n const [prefersReducedMotion, setPrefersReducedMotion] =\n React.useState(() => {\n if (!clientOnly) {\n return false;\n }\n\n return !window.matchMedia(QUERY).matches;\n });\n\n React.useEffect(() => {\n setPrefersReducedMotion(!window.matchMedia(QUERY).matches);\n\n const mediaQueryList = window.matchMedia(QUERY);\n\n const listener = (event: { matches: any }) => {\n setPrefersReducedMotion(!event.matches);\n };\n\n if (mediaQueryList.addEventListener) {\n mediaQueryList.addEventListener('change', listener);\n } else {\n mediaQueryList.addListener(listener);\n }\n\n return () => {\n if (mediaQueryList.removeEventListener) {\n mediaQueryList.removeEventListener('change', listener);\n } else {\n mediaQueryList.removeListener(listener);\n }\n };\n }, [setPrefersReducedMotion]);\n\n return prefersReducedMotion;\n}\n","type Timeout = ReturnType;\ntype PlainObject = Record;\n\n/* eslint-disable */\nexport const range = (\n start: number,\n end?: number,\n step: number = 1\n) => {\n let output = [];\n if (typeof end === 'undefined') {\n end = start;\n start = 0;\n }\n for (let i = start; i < end; i += step) {\n output.push(i);\n }\n return output;\n};\n/* eslint-enable */\n\nexport function sampleOne(arr: readonly T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nexport function sample(arr: Array, len = 1): Array {\n let output = [];\n\n for (let i = 0; i < len; i++) {\n output.push(sampleOne(arr));\n }\n\n return output;\n}\n\nexport const random = (\n min: number,\n max: number,\n { rounded }: { rounded: boolean } = { rounded: true }\n) => {\n const partialVal = Math.random() * (max - min);\n\n if (rounded) {\n return Math.floor(partialVal) + min;\n } else {\n return partialVal + min;\n }\n};\n\nexport const sum = (values: Array) =>\n values.reduce((sum, value) => sum + value, 0);\n\nexport const mean = (values: Array) =>\n sum(values) / values.length;\n\nexport const clamp = (value: number, min = 0, max = 1) => {\n // We might be passing in \"inverted\" values, eg:\n // clamp(someVal, 10, 5);\n //\n // This is especially common with `clampedNormalize`.\n // In these cases, we'll flip the min/max so that the function works as expected.\n const actualMin = Math.min(min, max);\n const actualMax = Math.max(min, max);\n\n return Math.max(actualMin, Math.min(actualMax, value));\n};\n\nexport const roundTo = (value: number, places = 0) =>\n Math.round(value * 10 ** places) / 10 ** places;\n\nexport const roundToNearest = (value: number, step: number) =>\n Math.round(value / step) * step;\n\nexport const debounce =\n (callback: any, wait: number, timeoutId: Timeout | null = null) =>\n (...args: Array) => {\n if (typeof timeoutId === 'number') {\n window.clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n callback.apply(null, args);\n }, wait);\n };\n\nexport const throttle = (func: Function, limit: number) => {\n let lastFunc: Timeout;\n let lastRan: number;\n return function (...args: any) {\n if (!lastRan) {\n func.apply(null, args);\n lastRan = Date.now();\n } else {\n clearTimeout(lastFunc);\n lastFunc = setTimeout(\n function () {\n if (Date.now() - lastRan >= limit) {\n func.apply(null, args);\n lastRan = Date.now();\n }\n },\n limit - (Date.now() - lastRan)\n );\n }\n };\n};\n\n// This version of `throttle` returns a `cancel` function I can call if I want to cancel the throttle.\n// NOTE: I don't *need* to use this to avoid memory leaks. Even if a component unmounts mid-throttle, it will only trigger 1 more time, and won't set a new `setTimeout`. So it should be used only when I really want to prevent the throttle from running 1 more time.\nexport const throttleV2 = (func: Function, limit: number) => {\n let timeoutId: Timeout;\n let lastRan: number;\n const wrappedFunc = function (...args: any) {\n if (!lastRan) {\n func.apply(null, args);\n lastRan = Date.now();\n } else {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(\n function () {\n if (Date.now() - lastRan >= limit) {\n func.apply(null, args);\n lastRan = Date.now();\n }\n },\n limit - (Date.now() - lastRan)\n );\n }\n };\n\n function cancel() {\n clearTimeout(timeoutId);\n }\n\n return [wrappedFunc, cancel];\n};\n\nexport const slugify = (str = '') => {\n let slug = str\n .toLowerCase()\n .replace(/\\s/g, '-')\n .replace(/[^a-zA-Z0-9-]/g, '');\n\n // Replace all numbers with their word counterpart\n slug = replaceDigits(slug);\n\n return slug;\n};\nexport const isEmpty = (obj: Object) => Object.keys(obj).length === 0;\n\nexport const getInterpolatedValue = (\n y1: number,\n y2: number,\n ratio: number\n) => {\n // We're assuming that `ratio` is a value between 0 and 1.\n // If this were a graph, it'd be our `x`, and we're trying to solve for `y`.\n // First, find the slope of our line.\n const slope = y2 - y1;\n\n return slope * ratio + y1;\n};\n\nexport const camelToDashCase = (val: string) =>\n val.replace(\n /[A-Z0-9]/g,\n (letter: string) => `-${letter.toLowerCase()}`\n );\n\nexport const pick = (obj: PlainObject, keys: Array) => {\n let o: PlainObject = {};\n let i = 0;\n let key;\n\n keys = Array.isArray(keys) ? keys : [keys];\n\n while ((key = keys[i++])) {\n if (typeof obj[key] !== 'undefined') {\n o[key] = obj[key];\n }\n }\n return o;\n};\n\nexport const omit = function (obj: PlainObject, key: string) {\n let newObj: PlainObject = {};\n\n for (var name in obj) {\n if (name !== key) {\n newObj[name] = obj[name];\n }\n }\n\n return newObj;\n};\n\nexport const convertArrayToMap = (arr: Array) =>\n arr.reduce(\n (acc, item) => ({\n ...acc,\n [item.id]: item,\n }),\n {}\n );\n\n// Either removes or adds an item to an array\n// EXAMPLE: toggleInArray([1, 2], 3) -> [1, 2, 3]\n// EXAMPLE: toggleInArray([1, 2], 2) -> [1]\nexport const toggleInArray = (arr: Array, item: any) =>\n arr.includes(item) ? arr.filter((i) => i !== item) : [...arr, item];\n\n// Combines 2 arrays, removing duplicates.\n// EXAMPLE: mergeUnique([1, 2], [2, 3]) -> [1, 2, 3]\nexport const mergeUnique = (arr1: Array, arr2: Array) =>\n arr1.concat(arr2.filter((item) => arr1.indexOf(item) === -1));\n\nexport const findRight = (\n arr: Array,\n predicate: (val: any) => boolean\n) => arr.slice().reverse().find(predicate);\n\nexport function requestAnimationFramePromise() {\n return new Promise((resolve) =>\n window.requestAnimationFrame(resolve)\n );\n}\n\nexport const capitalize = (value: string) =>\n value[0].toUpperCase() + value.slice(1);\n\nexport const capitalizeSentence = (value: string) => {\n return value\n .split(' ')\n .map((word) => {\n return word[0].toUpperCase() + word.slice(1);\n })\n .join(' ');\n};\n\nexport const deleteCookie = (key: string) => {\n document.cookie = `${encodeURIComponent(\n key\n )}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`;\n};\n\nexport const convertHexToRGBA = (hex: string, alpha = 1) => {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nexport const hyphenate = (value: string) =>\n value.replace(/([A-Z])/g, '-$1').toLowerCase();\n\nexport const delay = (duration: number) =>\n new Promise((resolve) => setTimeout(resolve, duration));\n\nexport const getTimeOfDay = () => {\n const now = new Date();\n const hourOfDay = now.getHours();\n\n if (hourOfDay <= 4) {\n return 'night';\n } else if (hourOfDay <= 11) {\n return 'morning';\n } else if (hourOfDay <= 17) {\n return 'afternoon';\n } else if (hourOfDay <= 21) {\n return 'evening';\n } else {\n return 'night';\n }\n};\n\nexport const generateId = (\n len = 4,\n { includeDigits = false } = {}\n) => {\n // prettier-ignore\n let characters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];\n\n if (includeDigits) {\n characters.push('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');\n }\n\n return sample(characters, len).join('');\n};\n\nexport const normalize = (\n number: number,\n currentScaleMin: number,\n currentScaleMax: number,\n newScaleMin = 0,\n newScaleMax = 1\n) => {\n // FIrst, normalize the value between 0 and 1.\n const standardNormalization =\n (number - currentScaleMin) / (currentScaleMax - currentScaleMin);\n\n // Next, transpose that value to our desired scale.\n return (\n (newScaleMax - newScaleMin) * standardNormalization + newScaleMin\n );\n};\n\nexport const clampedNormalize = (\n number: number,\n currentScaleMin: number,\n currentScaleMax: number,\n newScaleMin = 0,\n newScaleMax = 1\n) => {\n return clamp(\n normalize(\n number,\n currentScaleMin,\n currentScaleMax,\n newScaleMin,\n newScaleMax\n ),\n newScaleMin,\n newScaleMax\n );\n};\n\n// TODO: Use a single `Point` type!\ntype Point = [number, number];\ntype PointObj = { x: number; y: number };\n\nexport const getDistanceBetweenPoints = (\n p1: PointObj,\n p2: PointObj\n) => {\n const deltaX = Math.abs(p2.x - p1.x);\n const deltaY = Math.abs(p2.y - p1.y);\n\n return Math.sqrt(deltaX ** 2 + deltaY ** 2);\n};\n\nexport const convertDegreesToRadians = (angle: number) =>\n (angle * Math.PI) / 180;\n\nexport const convertRadiansToDegrees = (angle: number) =>\n (angle * 180) / Math.PI;\n\nexport const convertCartesianToPolar = (\n point: Point,\n centerPoint = [0, 0]\n) => {\n const pointRelativeToCenter: Point = [\n point[0] - centerPoint[0],\n point[1] - centerPoint[1],\n ];\n\n const [x, y] = pointRelativeToCenter;\n\n // When going from cartesian to polar, it struggles with negative numbers.\n // We need to take quadrants into account!\n const quadrant = getQuadrantForPoint(pointRelativeToCenter);\n\n let radiansOffset = 0;\n if (quadrant === 2 || quadrant === 3) {\n radiansOffset += Math.PI;\n } else if (quadrant === 4) {\n radiansOffset += 2 * Math.PI;\n }\n\n const radius = Math.sqrt(x ** 2 + y ** 2);\n let theta = Math.atan(y / x) + radiansOffset;\n\n return [theta, radius];\n};\n\nexport const convertPolarToCartesian = ([θ, radius]: Point): [\n number,\n number,\n] => {\n const x = radius * Math.cos(θ);\n const y = radius * Math.sin(θ);\n\n return [x, y];\n};\n\nexport const getQuadrantForPoint = ([x, y]: Point) => {\n if (x >= 0 && y >= 0) {\n return 1;\n } else if (x < 0 && y >= 0) {\n return 2;\n } else if (x < 0 && y < 0) {\n return 3;\n } else if (x >= 0 && y < 0) {\n return 4;\n } else {\n throw new Error(`Invalid coordinates: ${x} and ${y}`);\n }\n};\n\n/**\n * input: \"js,cat cat, bee, dog\"\n * output: ['js', 'cat cat', 'bee', 'dog']\n */\nexport const splitCommaSeparatedArray = (value: string) => {\n return value.replace(/,\\s+/g, ',').split(',');\n};\n\nexport function hash(value: string) {\n var hash = 0,\n i,\n chr;\n if (value.length === 0) return hash;\n for (i = 0; i < value.length; i++) {\n chr = value.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n}\n\n/**\n * Given 3-4 points for a cubic bezier curve, figure out the X/Y values for\n * `t`, a number from 0-1 representing progress.\n */\nexport const getValuesForBezierCurve = (\n {\n startPoint,\n endPoint,\n controlPoint1,\n controlPoint2,\n }: {\n startPoint: Point;\n endPoint: Point;\n controlPoint1: Point;\n controlPoint2: Point;\n },\n t: number\n): Point => {\n let x, y;\n if (controlPoint2) {\n // Cubic Bezier curve\n x =\n (1 - t) ** 3 * startPoint[0] +\n 3 * (1 - t) ** 2 * t * controlPoint1[0] +\n 3 * (1 - t) * t ** 2 * controlPoint2[0] +\n t ** 3 * endPoint[0];\n\n y =\n (1 - t) ** 3 * startPoint[1] +\n 3 * (1 - t) ** 2 * t * controlPoint1[1] +\n 3 * (1 - t) * t ** 2 * controlPoint2[1] +\n t ** 3 * endPoint[1];\n } else {\n // Quadratic Bezier curve\n x =\n (1 - t) * (1 - t) * startPoint[0] +\n 2 * (1 - t) * t * controlPoint1[0] +\n t * t * endPoint[0];\n y =\n (1 - t) * (1 - t) * startPoint[1] +\n 2 * (1 - t) * t * controlPoint1[1] +\n t * t * endPoint[1];\n }\n\n return [x, y];\n};\n\nexport const getYValueForBezier = function (\n xTarget: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number\n) {\n var xTolerance = 0.0001;\n var myBezier = function (t: number) {\n return getValuesForBezierCurve(\n {\n startPoint: [0, 0],\n controlPoint1: [x1, y1],\n controlPoint2: [x2, y2],\n endPoint: [1, 1],\n },\n t\n );\n };\n\n // Binary search to find an approximation for `X`\n\n //establish bounds\n var lower = 0;\n var upper = 1;\n var percent = (upper + lower) / 2;\n\n var x = myBezier(percent)[0];\n\n while (Math.abs(xTarget - x) > xTolerance) {\n if (xTarget > x) lower = percent;\n else upper = percent;\n\n percent = (upper + lower) / 2;\n x = myBezier(percent)[0];\n }\n\n return myBezier(percent)[1];\n};\n\nexport function moveCursorWithinInput(\n input: HTMLInputElement,\n position: number\n) {\n // Super old browsers (like, IE?) don't support this.\n if (!input.setSelectionRange) {\n return;\n }\n\n input.focus();\n input.setSelectionRange(position, position);\n}\n\nexport async function copyToClipboard(content: string) {\n try {\n await navigator.clipboard.writeText(content);\n } catch (err) {\n console.error('Failed to copy: ', err);\n }\n}\n\n/**\n * This method will call the callback for every value in the\n * object, and return a new object with transformed values.\n * This is useful if, eg., you need to capitalize every value in\n * a dictionary-style object with string values.\n */\nexport const transformValues = (\n obj: PlainObject,\n callback: (key: string, value: any) => any\n) => {\n if (typeof obj !== 'object') {\n return obj;\n }\n\n return Object.entries(obj).reduce((acc, [key, value]) => {\n return {\n ...acc,\n [key]: callback(key, value),\n };\n }, {});\n};\n\n// This method is like `transformValues`, except we can change both the value *and* keys.\nexport const transformObject = (\n obj: PlainObject,\n callback: (key: string, value: any) => [string, any]\n) => {\n if (typeof obj !== 'object') {\n return obj;\n }\n\n return Object.entries(obj).reduce((acc, [key, value]) => {\n const [newKey, newValue] = callback(key, value);\n return {\n ...acc,\n [newKey]: newValue,\n };\n }, {});\n};\n\n// In a string, turn digits (1) into spelled words (one)\nexport const replaceDigits = (value: string) => {\n return value\n .replace(/1/g, 'one')\n .replace(/2/g, 'two')\n .replace(/3/g, 'three')\n .replace(/4/g, 'four')\n .replace(/5/g, 'five')\n .replace(/6/g, 'six')\n .replace(/7/g, 'seven')\n .replace(/8/g, 'eight')\n .replace(/9/g, 'nine')\n .replace(/0/g, 'zero');\n};\n\n// Sometimes, we want to lock a value within a range, having it wrap around. The specific use case in mind was radians: having an angle always be between 0rad and 2rad. A value of 2.5rad would wrap around to 0.5rad.\nexport const wrapCircularValue = (\n value: number,\n min: number,\n max: number\n) => {\n // Our default calculation fails if `min` is less than 0.\n let offset = 0;\n if (min < 0) {\n offset = Math.abs(min);\n min = 0;\n max += offset;\n value += offset;\n }\n\n const range = max - min;\n const newValue = value % range;\n\n let returnValue = newValue < 0 ? newValue + range : newValue;\n\n return returnValue - offset;\n};\n\nexport const mix = (\n v1: number,\n v2: number,\n ratio: number = 0.5\n): number => v1 * (1 - ratio) + v2 * ratio;\n\nexport function mixAngles(\n angle1: number,\n angle2: number,\n ratio: number\n): number {\n // Normalize angles to [0, 2 * Math.PI)\n angle1 = angle1 % (2 * Math.PI);\n if (angle1 < 0) angle1 += 2 * Math.PI;\n\n angle2 = angle2 % (2 * Math.PI);\n if (angle2 < 0) angle2 += 2 * Math.PI;\n\n // Calculate the difference\n let delta = angle2 - angle1;\n\n // Ensure the smallest possible delta (handle wrap-around)\n if (delta > Math.PI) {\n delta -= 2 * Math.PI;\n } else if (delta < -Math.PI) {\n delta += 2 * Math.PI;\n }\n\n // Interpolate\n let mixedAngle = angle1 + delta * ratio;\n\n return mixedAngle;\n}\n\n// This function removes basic HTML tags from strings:\n// \"hello world\" -> \"hello world\"\n//\n// NOTE: It's very basic; I don't think it can handle HTML with attributes, or self-closing tags.\nexport function stripHtmlTags(inputString: string) {\n const htmlTagPattern = /<\\/?[^>]+>/gi;\n return inputString.replace(htmlTagPattern, '');\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"watium4\":\"watium4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wlgbkjj\":\"wlgbkjj\"};"],"names":["SetNavigationTrackerContext","React","NavigationTrackerContext","NavigationProvider","children","mostRecentNavigationFrom","setMostRecentNavigationFrom","Provider","value","SAVED_SOUND_ENABLED_KEY","colorMode","includes","SetUserPreferencesContext","toggleColorMode","toggleSoundEnabled","soundEnabled","useColorMode","UserPreferencesContext","UserPreferencesProvider","pathname","usePathname","setColorMode","forcedColorMode","FORCED_COLOR_ROUTES","undefined","DEFAULT_COLOR_MODE","setSoundEnabled","useRestoredValuesFromDevice","initialColorMode","initialSoundEnabled","appliedColorMode","document","documentElement","getAttribute","checkIsColorMode","savedSoundEnabled","localStorage","getItem","parsed","JSON","parse","nextColorMode","newColorMode","currentColorMode","Cookie","set","COLOR_THEME_COOKIE_NAME","expires","newValue","nextValue","window","setItem","String","providedSetters","providedValues","Wrapper","styled","name","class","propsAsIs","VisuallyHidden","delegated","module","VisuallyHiddenRaw","DARK_COLORS_RAW","colorText","colorBackground","colorBlurredBackground","colorMutedBackground","colorAction","colorPrimary","colorSecondary","colorTertiary","colorDecorative","colorInfo100","colorInfo200","colorInfo300","colorInfo400","colorInfo500","colorInfo700","colorWarning100","colorWarning200","colorWarning300","colorWarning400","colorWarning500","colorWarning700","colorSuccess100","colorSuccess200","colorSuccess300","colorSuccess400","colorSuccess500","colorSuccess700","colorCloud100","colorCloud300","colorCloud400","colorCloud500","colorSkyFrom","colorSkyTo","colorSkySubtle","colorGray50","colorGray100","colorGray200","colorGray300","colorGray400","colorGray500","colorGray600","colorGray700","colorGray800","colorGray900","colorGray1000","colorAdaptiveWhite","syntaxBg","syntaxHighlight","syntaxTxt","syntaxComment","syntaxProp","syntaxBool","syntaxVal","syntaxStr","syntaxName","syntaxDel","syntaxRegex","syntaxFn","colorInfo","colorInfoBackground","colorError","colorErrorBackground","colorSuccess","colorSuccessBackground","colorAlert","colorAlertBackground","colorPageBackground","colorPagePrimary","kbdBackgroundColor","kbdBorderColor","colorCodeBg","colorContentOutline","LIGHT_COLORS_RAW","colorError100","colorError200","colorError500","colorCloud700","LIGHT_COLORS","createStyleObject","DARK_COLORS","colors","transformObject","key","h","s","l","a","kebab","createCssString","colorMap","Object","entries","map","join","BREAKPOINT_SIZES","xs","sm","md","lg","xl","default","tension","friction","springy","duration","timingFunction","HEADER_HEIGHT","USE_HAMBURGER_MENU_BELOW","SUPERHEADER_HEIGHT","ALGOLIA_PUBLIC_KEY","process","PARTYKIT_HOST","isHovering","timing","useBoopMinimal","isBooped","setIsBooped","prefersReducedMotion","usePrefersReducedMotion","timeoutId","setTimeout","clearTimeout","QUERY","clientOnly","setPrefersReducedMotion","matchMedia","matches","mediaQueryList","listener","event","addEventListener","addListener","removeEventListener","removeListener","range","start","end","step","output","i","push","sampleOne","arr","Math","floor","random","length","sample","len","min","max","rounded","partialVal","actualMin","places","round","debounce","callback","wait","args","apply","func","limit","lastFunc","lastRan","Date","now","cancel","str","replaceDigits","toLowerCase","slug","replace","y1","y2","ratio","slope","pick","obj","keys","o","Array","isArray","Promise","resolve","getTimeOfDay","hourOfDay","getHours","includeDigits","characters","number","currentScaleMin","currentScaleMax","newScaleMin","newScaleMax","standardNormalization","clamp","normalize","getDistanceBetweenPoints","p1","p2","sqrt","abs","x","deltaY","y","convertDegreesToRadians","PI","point","centerPoint","pointRelativeToCenter","quadrant","getQuadrantForPoint","radiansOffset","radius","atan","convertPolarToCartesian","θ","cos","sin","t","startPoint","endPoint","controlPoint1","controlPoint2","xTarget","x1","x2","myBezier","getValuesForBezierCurve","lower","upper","percent","xTolerance","moveCursorWithinInput","input","position","setSelectionRange","focus","copyToClipboard","content","navigator","clipboard","writeText","err","console","error","transformValues","reduce","acc","newKey","wrapCircularValue","offset","returnValue","v1","v2"],"sourceRoot":"","ignoreList":[]}