{"version":3,"sources":["utils/detectHost.ts","utils/releases.ts","utils/groupBy.ts","config.ts","utils/meta.ts","utils/formatRelease.ts","components/OSIcon.tsx","components/AlternativeDownloads.tsx","components/ShowcasedDownload.tsx","components/Releases.tsx","hooks/useReleases.ts","theme.ts","components/SVGGradientProvider.tsx","Guides.tsx","hooks/useConfig.ts","instructions.ts","Repositories.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["UnsupportedHost","Symbol","detectHost","a","detectHostUserAgentData","userAgentDataHost","userAgentHost","detectHostUserAgent","platform","arch","navigator","userAgentData","getHighEntropyValues","architecture","bitness","ourPlatform","ourArch","userAgent","includes","parseReleases","meta","baseUrl","entries","map","entry","resolvedUrl","URL","url","toString","os","splitReleases","releases","host","hostLatestRelease","undefined","otherLatestReleases","find","x","filter","sortReleases","sort","b","localeCompare","groupReleasesByPlatform","fn","release","reduce","acc","item","key","config","load","remoteConfigPath","envKeyPrefix","fetchMeta","fetch","headers","Accept","res","json","resBody","isMeta","Error","shape","getExt","filename","slice","lastIndexOf","formatReleaseGeneric","r","ext","name","text","formatReleaseLinux","subtext","formatReleaseMacos","formatReleaseWindows","formatRelease","OSIcon","props","src","style","width","height","alt","AlternativeDownloads","React","memo","Typography","variant","gutterBottom","Stack","direction","xs","sm","justifyContent","sx","flexBasis","Object","spacing","alignItems","Download","Button","href","target","display","ml","flexDirection","Box","DisabledDownload","alignSelf","disabled","ShowcasedDownload","ShowReleases","NoReleases","component","Releases","useState","state","status","setStatus","useEffect","loadMeta","metaUrl","Promise","allSettled","loadMetaResult","detectHostResult","error","String","reason","value","hostInfo","grouped","data","useReleases","CircularProgress","keys","length","mainSvgGradientId","mainGradient","textGradientStyle","background","WebkitBackgroundClip","WebkitTextFillColor","gradientedBackgroundButton","color","boxShadow","baseTheme","createTheme","palette","mode","typography","fontFamily","h1","fontSize","lineHeight","textTransform","letterSpacing","h2","fontWeight","body1","body2","overline","button","borderRadius","theme","components","MuiCssBaseline","styleOverrides","backgroundColor","MuiLinearProgress","bar","colorPrimary","MuiCircularProgress","circle","stroke","MuiCard","root","backgroundImage","padding","MuiCardContent","MuiCardActions","MuiTabs","indicator","MuiTab","MuiFab","primary","MuiPaper","MuiAccordion","content","MuiButton","borderColor","containedPrimary","containedSecondary","outlinedPrimary","borderWidth","textPrimary","MuiListItemButton","MuiMenuItem","MuiDialog","paper","SVGGradientProvider","children","id","x1","y1","x2","y2","offset","stopColor","HelpLinks","link","icon","BookOutlined","Guides","Card","startIcon","useConfig","cache","setCache","then","val","yumInstructions","repoName","packageName","Repositories","repoUrl","cfg","title","instructions","aptRepoUrl","aptRepoSourceName","aptPackageName","yumRepoUrl","yumRepoSourceName","yumPackageName","Repository","CardContent","overflow","join","App","StyledEngineProvider","injectFirst","ThemeProvider","CssBaseline","position","top","left","objectFit","zIndex","Container","maxWidth","m","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.5ae37240.chunk.js","sourcesContent":["import { Release } from \"./releases\";\n\nexport type HostInfo = Pick<Release, \"platform\" | \"arch\">;\n\n// For when the host is detected but it is explicitly unsupported.\nexport const UnsupportedHost = Symbol(\"detectHostUnsupported\");\n\nexport const detectHost = async (): Promise<\n HostInfo | typeof UnsupportedHost\n> => {\n const userAgentDataHost = await detectHostUserAgentData();\n if (userAgentDataHost) {\n return userAgentDataHost;\n }\n\n const userAgentHost = detectHostUserAgent();\n if (userAgentHost) {\n return userAgentHost;\n }\n\n // fallback: most common\n return { platform: \"win32\", arch: \"x64\" };\n};\n\nexport const detectHostUserAgentData = async (): Promise<\n HostInfo | null | typeof UnsupportedHost\n> => {\n const { userAgentData } = navigator;\n if (!userAgentData) {\n // User agent data unsupported in this browser.\n return null;\n }\n\n const { architecture, bitness, platform } =\n await userAgentData.getHighEntropyValues([\"architecture\", \"bitness\"]);\n\n if (!architecture) {\n return null;\n }\n\n let ourPlatform: null | Release[\"platform\"] = null;\n let ourArch: null | Release[\"arch\"] = null;\n\n if (platform === \"macOS\") {\n ourPlatform = \"darwin\";\n } else if (platform === \"Windows\") {\n ourPlatform = \"win32\";\n } else if (platform === \"Linux\") {\n ourPlatform = \"linux\";\n }\n\n if (architecture === \"arm\" && bitness === \"64\") {\n ourArch = \"arm64\";\n } else if (architecture === \"x86\" && bitness == \"64\") {\n ourArch = \"x64\";\n }\n\n if (ourPlatform !== null && ourArch !== null) {\n return { platform: ourPlatform, arch: ourArch };\n }\n\n return null;\n};\n\nexport const detectHostUserAgent = (): HostInfo | null => {\n const userAgent = navigator.userAgent;\n if (userAgent.includes(\"Mac OS\")) {\n if (userAgent.includes(\"Intel\")) {\n return { platform: \"darwin\", arch: \"x64\" };\n } else {\n return { platform: \"darwin\", arch: \"arm64\" };\n }\n } else if (userAgent.includes(\"Windows\")) {\n return { platform: \"win32\", arch: \"x64\" };\n } else if (userAgent.includes(\"Linux\")) {\n return { platform: \"linux\", arch: \"x64\" };\n }\n\n return null;\n};\n","import { HostInfo, UnsupportedHost } from \"./detectHost\";\nimport { groupBy } from \"./groupBy\";\nimport { Entry, Meta } from \"./meta\";\n\nexport type OS = \"linux\" | \"windows\" | \"macos\";\n\nexport type Release = Entry & {\n resolvedUrl: string;\n os: OS;\n};\n\nconst platformToOs = (platform: string): OS => {\n if (platform.includes(\"linux\")) return \"linux\";\n if (platform.includes(\"mac\") || platform.includes(\"darwin\")) return \"macos\";\n return \"windows\";\n};\n\nexport const parseReleases = (meta: Meta, baseUrl: string): Release[] =>\n meta.entries.map((entry) => {\n const resolvedUrl = new URL(entry.url, baseUrl).toString();\n const os = platformToOs(entry.platform);\n return {\n ...entry,\n url: resolvedUrl,\n os,\n resolvedUrl,\n };\n });\n\nexport type SplitReleases = {\n hostLatestRelease?: Release;\n otherLatestReleases: Release[];\n};\n\nexport const splitReleases = (\n releases: Release[],\n host: HostInfo | typeof UnsupportedHost\n): SplitReleases => {\n if (host === UnsupportedHost) {\n return {\n hostLatestRelease: undefined,\n otherLatestReleases: releases,\n };\n }\n\n const hostLatestRelease = releases.find(\n (x) => x.arch === host.arch && x.platform === host.platform\n );\n return {\n hostLatestRelease,\n otherLatestReleases: releases.filter((x) => x !== hostLatestRelease),\n };\n};\n\nexport const sortReleases = (releases: Release[]): Release[] =>\n [...releases].sort((a, b) => a.platform.localeCompare(b.platform));\n\nexport const groupReleasesByPlatform = (\n releases: Release[]\n): Record<Release[\"platform\"], Release[]> => {\n return groupBy<Release, Release[\"platform\"]>(\n releases,\n (release) => release.platform\n );\n};\n","export const groupBy = <T, U extends string>(\n arr: T[],\n fn: (item: T) => U\n): Record<U, T[]> => {\n return arr.reduce((acc, item) => {\n const key = fn(item);\n return {\n ...acc,\n [key]: [...(acc[key] ?? []), item],\n };\n }, {} as Record<U, T[]>);\n};\n","import { load, PlainConfig } from \"hybridconfig\";\n\ntype AllowedKeys =\n | \"metaUrl\"\n | \"aptRepoUrl\"\n | \"aptRepoSourceName\"\n | \"aptPackageName\"\n | \"yumRepoUrl\"\n | \"yumRepoSourceName\"\n | \"yumPackageName\";\n\nconst config = load<AllowedKeys>({\n remoteConfigPath: \"/config.json\",\n envKeyPrefix: \"APP_\",\n});\n\nexport type Config = PlainConfig<AllowedKeys>;\n\nexport default config;\n","export type Entry = {\n name: string;\n url: string;\n platform: string;\n arch: string;\n};\n\nexport type Meta = {\n version: string;\n entries: Entry[];\n};\n\nexport const fetchMeta = async (url: string): Promise<Meta> => {\n const res = await fetch(url, {\n headers: {\n Accept: \"application/json\",\n },\n });\n const resBody: unknown = await res.json();\n if (isMeta(resBody)) {\n return resBody;\n }\n throw new Error(\"invalid meta\");\n};\n\nconst isMeta = (shape: unknown): shape is Meta => {\n return shape !== null && typeof shape === \"object\" && \"entries\" in shape;\n};\n","import { Release } from \"./releases\";\n\nexport type ReleaseData = {\n text: string;\n subtext?: string;\n};\n\nconst formatRelease = (r: Release): ReleaseData => {\n switch (r.os) {\n case \"linux\":\n return formatReleaseLinux(r);\n case \"macos\":\n return formatReleaseMacos(r);\n case \"windows\":\n return formatReleaseWindows(r);\n default:\n return formatReleaseGeneric(r);\n }\n};\n\nconst getExt = (filename: string) =>\n filename.slice(filename.lastIndexOf(\".\") + 1);\n\nconst formatReleaseGeneric = (r: Release): ReleaseData => {\n const ext = getExt(r.name);\n return { text: `${r.platform} ${r.arch} (${ext})` };\n};\n\nconst formatReleaseLinux = (r: Release): ReleaseData => {\n const ext = getExt(r.name);\n\n const platformName = r.arch == \"x64\" ? \"Linux amd64\" : `Linux ${r.arch}`;\n\n const distribution =\n ext === \"deb\"\n ? \"Debian package\"\n : ext === \"rpm\"\n ? \"RPM package\"\n : ext === \"zip\"\n ? \"ZIP-archive\"\n : `(${ext})`;\n\n return { text: platformName, subtext: distribution };\n};\n\nconst formatReleaseMacos = (r: Release): ReleaseData => {\n const ext = getExt(r.name);\n\n // For macOS, we convert architectures to the more user-friendly names.\n const platformName =\n r.arch === \"arm64\"\n ? \"macOS on Apple Silicon\"\n : r.arch === \"x64\"\n ? \"macOS on Intel\"\n : `macOS on ${r.arch}`;\n\n const distribution = ext === \"zip\" ? \"ZIP-archive\" : ext;\n\n return { text: platformName, subtext: distribution };\n};\n\nconst formatReleaseWindows = (r: Release): ReleaseData => {\n const ext = getExt(r.name);\n\n // For Windows, x64 is default, so we just omit the arch.\n const platformName = r.arch === \"x64\" ? \"Windows\" : `Windows ${r.arch}`;\n\n // The .exe installer is just the default option for windows.\n const distribution =\n ext === \"exe\" ? undefined : ext === \"zip\" ? \"ZIP-archive\" : ext;\n\n return { text: platformName, subtext: distribution };\n};\n\nexport default formatRelease;\n","import React from \"react\";\nimport { OS } from \"../utils/releases\";\n\nexport const OSIcon: React.FC<{ os: OS }> = (props) => (\n <img\n src={`/assets/social-${props.os}-white.svg`}\n style={{ width: 30, height: 30 }}\n alt={\"os \" + props.os}\n />\n);\n","import { Button, Stack, Typography } from \"@mui/material\";\nimport { Box } from \"@mui/system\";\nimport React from \"react\";\nimport { ReleasesData } from \"../hooks/useReleases\";\nimport formatRelease from \"../utils/formatRelease\";\nimport { Release } from \"../utils/releases\";\nimport { OSIcon } from \"./OSIcon\";\n\ntype Props = {\n releases: ReleasesData[\"otherLatestReleases\"];\n};\n\nconst AlternativeDownloads: React.FC<Props> = React.memo((props) => {\n const { releases } = props;\n\n return (\n <Box width={\"100%\"}>\n <Typography variant=\"h6\" gutterBottom>\n Also available on\n </Typography>\n <Stack\n direction={{ xs: \"column\", sm: \"row\" }}\n justifyContent=\"space-between\"\n sx={{\n \"> *\": {\n flexBasis: \"100%\",\n },\n }}\n >\n {Object.entries(releases).map(([platform, releases]) => (\n <Stack\n direction=\"column\"\n spacing={1}\n key={platform}\n sx={{\n alignItems: \"center\",\n }}\n >\n {releases.map((release) => (\n <Download key={release.name} release={release} />\n ))}\n </Stack>\n ))}\n </Stack>\n </Box>\n );\n});\n\ntype DownloadProps = {\n release: Release;\n};\n\nconst Download: React.FC<DownloadProps> = React.memo((props) => {\n const { release } = props;\n const { text, subtext } = formatRelease(release);\n\n return (\n <Box>\n <Button href={release.url} target=\"_blank\">\n <Box display=\"flex\" alignItems=\"center\">\n <OSIcon os={release.os} />\n <Box ml={1} />\n <Box display=\"flex\" flexDirection=\"column\">\n <Box>{text}</Box>\n <Box>\n <Typography variant=\"body2\">{subtext}</Typography>\n </Box>\n </Box>\n </Box>\n </Button>\n </Box>\n );\n});\n\nexport default AlternativeDownloads;\n","import { Box, Button, Stack, Typography } from \"@mui/material\";\nimport React from \"react\";\nimport formatRelease from \"../utils/formatRelease\";\nimport { Release } from \"../utils/releases\";\nimport { OSIcon } from \"./OSIcon\";\n\ntype Props = { release: Release | undefined };\n\nconst ShowcasedDownload: React.FC<Props> = (props) => {\n const { release } = props;\n return release ? <Download release={release} /> : <DisabledDownload />;\n};\n\ntype DownloadProps = {\n release: Release;\n};\n\nconst Download: React.FC<DownloadProps> = (props) => {\n const { release } = props;\n const { text, subtext } = formatRelease(release);\n\n return (\n <Stack spacing={1} direction=\"column\" alignItems=\"center\">\n <Button variant=\"contained\" href={release.url} target=\"_blank\">\n <Stack spacing={1} direction=\"row\" alignItems=\"center\">\n <OSIcon os={release.os} />\n <Box ml={1} />\n Download now\n </Stack>\n </Button>\n <Box display=\"flex\" flexDirection=\"column\" alignItems=\"center\">\n <Box>{text}</Box>\n <Box>\n <Typography variant=\"body2\">{subtext}</Typography>\n </Box>\n </Box>\n </Stack>\n );\n};\n\nconst DisabledDownload: React.FC = () => {\n return (\n <Box alignSelf=\"center\">\n <Button variant=\"contained\" href=\"\" target=\"_blank\" disabled>\n <Stack spacing={1} direction=\"row\" alignItems=\"center\">\n Download now\n </Stack>\n </Button>\n </Box>\n );\n};\n\nexport default ShowcasedDownload;\n","import { Box, CircularProgress } from \"@mui/material\";\nimport React from \"react\";\nimport { ReleasesData, useReleases } from \"../hooks/useReleases\";\nimport AlternativeDownloads from \"./AlternativeDownloads\";\nimport ShowcasedDownload from \"./ShowcasedDownload\";\n\nconst Releases: React.FC = () => {\n const releases = useReleases();\n\n return (\n <>\n {releases.state === \"loading\" ? (\n <CircularProgress />\n ) : releases.state === \"error\" ? (\n <NoReleases />\n ) : releases.data.hostLatestRelease === undefined &&\n Object.keys(releases.data.otherLatestReleases).length === 0 ? (\n <NoReleases />\n ) : (\n <ShowReleases releases={releases.data} />\n )}\n </>\n );\n};\n\ntype Props = { releases: ReleasesData };\n\nconst ShowReleases: React.FC<Props> = (props) => {\n const { releases } = props;\n\n return (\n <>\n <ShowcasedDownload release={releases.hostLatestRelease} />\n <AlternativeDownloads releases={releases.otherLatestReleases} />\n </>\n );\n};\n\nconst NoReleases: React.FC = () => {\n return (\n <>\n <ShowcasedDownload release={undefined} />\n <Box component=\"p\">No releases found.</Box>\n </>\n );\n};\n\nexport default Releases;\n","import { useEffect, useState } from \"react\";\nimport {\n groupReleasesByPlatform,\n parseReleases,\n Release,\n sortReleases,\n splitReleases,\n} from \"../utils/releases\";\nimport config from \"../config\";\nimport { fetchMeta } from \"../utils/meta\";\nimport { detectHost } from \"../utils/detectHost\";\n\nexport type ReleasesData = {\n hostLatestRelease?: Release;\n otherLatestReleases: Record<Release[\"platform\"], Release[]>;\n};\n\nexport type UseReleasesState =\n | { state: \"loading\" }\n | { state: \"error\"; error: string }\n | {\n state: \"ready\";\n data: ReleasesData;\n };\n\nexport const useReleases = (): UseReleasesState => {\n const [status, setStatus] = useState<UseReleasesState>({ state: \"loading\" });\n\n useEffect(() => {\n const loadMeta = async () => {\n const { metaUrl } = await config;\n const meta = await fetchMeta(metaUrl);\n return { metaUrl, meta };\n };\n\n const fn = async () => {\n const [loadMetaResult, detectHostResult] = await Promise.allSettled([\n loadMeta(),\n detectHost(),\n ]);\n\n if (loadMetaResult.status === \"rejected\") {\n setStatus({ state: \"error\", error: String(loadMetaResult.reason) });\n return;\n }\n const { meta, metaUrl } = loadMetaResult.value;\n\n if (detectHostResult.status === \"rejected\") {\n setStatus({ state: \"error\", error: String(detectHostResult.reason) });\n return;\n }\n const hostInfo = detectHostResult.value;\n\n const releases = parseReleases(meta, metaUrl);\n\n const { hostLatestRelease, otherLatestReleases } = splitReleases(\n sortReleases(releases),\n hostInfo\n );\n\n const grouped = groupReleasesByPlatform(otherLatestReleases);\n\n setStatus({\n state: \"ready\",\n data: {\n hostLatestRelease,\n otherLatestReleases: grouped,\n },\n });\n };\n void fn();\n }, []);\n\n return status;\n};\n","import { createTheme, Theme } from \"@mui/material/styles\";\nimport { CSSInterpolation } from \"@mui/system\";\ndeclare module \"@mui/material/styles\" {\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface DefaultTheme extends Theme {}\n}\n\nexport const mainSvgGradientId = \"main-svg-gradient\";\nexport const mainGradient = \"linear-gradient(45deg, #C62A1F 0%, #F8C16C 100%)\";\nexport const textGradientStyle = {\n background: `-webkit-${mainGradient}`,\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n};\nexport const gradientedBackgroundButton: CSSInterpolation = {\n background: mainGradient,\n color: \"#fff\",\n \"&:hover\": {\n boxShadow: \"inset 10px 10px 40px #FFFFFF33\",\n },\n \"&:active\": {\n boxShadow: \"inset 14px 14px 30px 9px #30272733\",\n },\n \"&:disabled\": {\n background: \"#303030\",\n color: \"#fff\",\n },\n};\nconst baseTheme = createTheme({\n palette: {\n mode: \"dark\",\n },\n typography: {\n fontFamily: \"FuturaPT\",\n h1: {\n fontSize: \"27px\",\n lineHeight: \"35px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5rem\",\n },\n h2: {\n fontSize: \"0.95rem\",\n textTransform: \"uppercase\",\n fontWeight: 400,\n letterSpacing: \"0.1rem\",\n color: \"#fff\",\n },\n body1: {\n fontSize: \"0.90rem\",\n fontWeight: 300,\n lineHeight: 1,\n color: \"#fff\",\n },\n body2: {\n fontSize: \"0.85rem\",\n color: \"#929292\",\n },\n overline: {\n letterSpacing: \"0.08em\",\n fontSize: \"13px\",\n color: \"#ffffff88\",\n },\n button: {\n letterSpacing: \"0.15em\",\n fontSize: \"13px\",\n },\n },\n shape: {\n borderRadius: 0,\n },\n});\n\nconst theme = createTheme(\n {\n components: {\n MuiCssBaseline: {\n styleOverrides: {\n \"*::-webkit-scrollbar\": {\n width: 15,\n height: 15,\n },\n \"*::-webkit-scrollbar-track\": {\n width: 15,\n height: 15,\n backgroundColor: \"#1A1A1A\",\n },\n \"*::-webkit-scrollbar-thumb\": {\n width: 15,\n height: 15,\n backgroundColor: \"#242424\",\n },\n \"*::-webkit-scrollbar-corner\": {\n backgroundColor: \"#1A1A1A\",\n },\n },\n },\n MuiLinearProgress: {\n styleOverrides: {\n bar: {\n background: mainGradient,\n },\n colorPrimary: {\n backgroundColor: \"#363636\",\n },\n },\n },\n MuiCircularProgress: {\n styleOverrides: {\n circle: {\n stroke: `url(#${mainSvgGradientId})`,\n },\n },\n },\n MuiCard: {\n styleOverrides: {\n root: {\n backgroundColor: \"#202020\",\n backgroundImage: \"none\",\n padding: \"35px 50px\",\n },\n },\n },\n MuiCardContent: {\n styleOverrides: {\n root: {\n padding: \"0\",\n },\n },\n },\n MuiCardActions: {\n styleOverrides: {\n root: {\n padding: \"0\",\n },\n },\n },\n MuiTabs: {\n styleOverrides: {\n indicator: {\n ...gradientedBackgroundButton,\n },\n },\n },\n MuiTab: {\n styleOverrides: {\n root: {\n textTransform: \"none\",\n letterSpacing: \"0.1em\",\n color: \"#8B8B8B\",\n fontWeight: 400,\n \"&.Mui-selected\": textGradientStyle,\n },\n },\n },\n MuiFab: {\n styleOverrides: {\n primary: {\n borderRadius: 0,\n ...gradientedBackgroundButton,\n },\n },\n },\n MuiPaper: {\n styleOverrides: {\n root: {\n boxShadow: \"none\",\n backgroundColor: \"#101010\",\n },\n },\n },\n MuiAccordion: {\n styleOverrides: {\n root: {\n \"&:before\": {\n content: \"none\",\n },\n },\n },\n },\n MuiButton: {\n styleOverrides: {\n root: {\n \"&:hover\": {\n borderColor: \"#ffa08b\",\n backgroundColor: \"rgba(255, 255, 255, 0.10)\",\n },\n },\n containedPrimary: {\n ...gradientedBackgroundButton,\n \"&:hover\": {\n backgroundColor: \"#C62A1F88\",\n boxShadow: \"inset 0px 0px 20px 20px #C62A1F88\",\n },\n },\n containedSecondary: {\n color: \"#fff8\",\n textTransform: \"none\",\n backgroundColor: \"#1A1A1A\",\n boxShadow: \"none\",\n \"&:hover\": {\n background: \"#262626\",\n color: \"#fff\",\n boxShadow: \"none\",\n },\n \"&:disabled\": {\n background: \"#303030\",\n },\n },\n outlinedPrimary: {\n color: \"#fff\",\n borderColor: \"#979797\",\n borderWidth: 1,\n \"&:disabled\": {\n borderColor: \"#575757\",\n },\n },\n textPrimary: {\n textTransform: \"none\",\n color: \"#fff\",\n },\n },\n },\n MuiListItemButton: {\n styleOverrides: {\n root: {\n backgroundColor: \"#151515\",\n \"&.Mui-selected\": gradientedBackgroundButton,\n \"&:hover\": {\n backgroundColor: \"#262626\",\n },\n },\n },\n },\n MuiMenuItem: {\n styleOverrides: {\n root: {\n \"&.Mui-selected\": gradientedBackgroundButton,\n },\n },\n },\n MuiDialog: {\n styleOverrides: {\n paper: {\n backgroundColor: \"#202020\",\n backgroundImage: \"none\",\n },\n },\n },\n },\n },\n baseTheme\n);\nexport default theme;\n","import { mainSvgGradientId } from \"../theme\";\nimport React from \"react\";\n\nexport const SVGGradientProvider: React.FC = ({ children }) => {\n return (\n <>\n <svg style={{ height: 0, width: 0, display: \"block\" }}>\n <linearGradient id={mainSvgGradientId} x1=\"0\" y1=\"1\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stopColor=\"#C62A1F\" />\n <stop offset=\"100%\" stopColor=\"#F8C16C\" />\n </linearGradient>\n </svg>\n {children}\n </>\n );\n};\n","import { Card, Stack, Typography, Button } from \"@mui/material\";\nimport { BookOutlined } from \"@mui/icons-material\";\n\nexport const HelpLinks = [\n {\n link: \"https://link.humanode.io/guide/launcher\",\n name: \"Guide for setting up a node with the launcher\",\n icon: <BookOutlined />,\n },\n {\n link: \"https://link.humanode.io/docs\",\n name: \"Documentation\",\n icon: <BookOutlined />,\n },\n];\nexport const Guides: React.FC = () => {\n return (\n <Card>\n <Stack spacing={3}>\n <Typography variant=\"h6\" gutterBottom>\n Useful links\n </Typography>\n <Stack spacing={1}>\n {HelpLinks.map((link) => (\n <Button\n key={link.name}\n href={link.link}\n target=\"_blank\"\n variant=\"text\"\n startIcon={link.icon}\n sx={{ justifyContent: \"flex-start\" }}\n >\n {link.name}\n </Button>\n ))}\n </Stack>\n </Stack>\n </Card>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport config, { Config } from \"../config\";\n\nexport const useConfig = (): Config | null => {\n const [cache, setCache] = useState<Config | null>(null);\n\n useEffect(() => {\n void config.then((val) => {\n setCache(val);\n });\n }, []);\n\n return cache;\n};\n\nexport default useConfig;\n","export const aptInstructions = (\n repoUrl: string,\n repoName: string,\n packageName: string\n): string[] => {\n return [\n `sudo apt-get install apt-transport-https`,\n `echo \"deb [trusted=yes] ${repoUrl} ./\" | sudo tee /etc/apt/sources.list.d/${repoName}.list`,\n \"sudo apt-get update\",\n `sudo apt-get install ${packageName}`,\n ];\n};\n\nexport const yumInstructions = (\n url: string,\n repoName: string,\n packageName: string\n): string[] => {\n return [\n `cat <<EOF | sudo tee /etc/yum.repos.d/${repoName}.repo`,\n `[${repoName}]`,\n `name=${repoName}`,\n `baseurl=${url}`,\n `enabled=1`,\n `gpgcheck=0`,\n `EOF`,\n `sudo yum install ${packageName}`,\n ];\n};\n","import { Box, Card, CardContent, Typography } from \"@mui/material\";\nimport React from \"react\";\nimport useConfig from \"./hooks/useConfig\";\nimport { aptInstructions, yumInstructions } from \"./instructions\";\n\nexport const Repositories: React.FC = () => {\n const cfg = useConfig();\n if (cfg === null) {\n return <></>;\n }\n return (\n <>\n <Repository\n title=\"Using APT\"\n instructions={aptInstructions(\n cfg.aptRepoUrl,\n cfg.aptRepoSourceName,\n cfg.aptPackageName\n )}\n />\n <Repository\n title=\"Using YUM\"\n instructions={yumInstructions(\n cfg.yumRepoUrl,\n cfg.yumRepoSourceName,\n cfg.yumPackageName\n )}\n />\n </>\n );\n};\n\nconst Repository: React.FC<{ title: string; instructions: string[] }> = ({\n title,\n instructions,\n}) => {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Box width=\"100%\" overflow=\"overlay\">\n <code>\n <pre>{instructions.join(\"\\n\")}</pre>\n </code>\n </Box>\n </CardContent>\n </Card>\n );\n};\n","import { Card, Container, CssBaseline, Stack, Typography } from \"@mui/material\";\nimport { StyledEngineProvider, ThemeProvider } from \"@mui/system\";\nimport React from \"react\";\nimport Releases from \"./components/Releases\";\nimport { SVGGradientProvider } from \"./components/SVGGradientProvider\";\nimport { Guides } from \"./Guides\";\nimport { Repositories } from \"./Repositories\";\nimport theme from \"./theme\";\n\nconst App: React.FC = () => {\n return (\n <SVGGradientProvider>\n <StyledEngineProvider injectFirst>\n <ThemeProvider theme={theme}>\n <CssBaseline>\n <img\n src=\"/assets/white-eyes-face.png\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n height: \"100%\",\n objectFit: \"contain\",\n zIndex: -1,\n }}\n ></img>\n <Container component=\"div\" maxWidth=\"md\">\n <Stack spacing={4} m={4}>\n <Card>\n <Stack spacing={3} alignItems=\"center\">\n <img\n src=\"/assets/humanode-logo.png\"\n alt=\"Humanode\"\n width={240}\n height={240}\n />\n <Typography variant=\"h6\">\n Get the Humanode Launcher and run your node!\n </Typography>\n <Releases />\n </Stack>\n </Card>\n <Guides />\n <Repositories />\n </Stack>\n </Container>\n </CssBaseline>\n </ThemeProvider>\n </StyledEngineProvider>\n </SVGGradientProvider>\n );\n};\n\nexport default App;\n","import { ReportHandler } from \"web-vitals\";\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler): void => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n void import(\"web-vitals\").then(\n ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n }\n );\n }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById(\"root\")\n);\n\nreportWebVitals();\n"],"sourceRoot":""}