@alextheman/components 5.2.0 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/CollapsableItem.tsx","../src/components/DarkModeToggle.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["export * from \"src/components\";\nexport * from \"src/hooks\";\nexport * from \"src/providers\";\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\n\nimport { useMode } from \"src/providers\";\n\nfunction DarkModeToggle() {\n const { mode, toggleMode } = useMode();\n\n return (\n <Tooltip title={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}>\n <IconButton\n sx={{ marginLeft: \"auto\" }}\n onClick={toggleMode}\n aria-label={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}\n >\n {mode === \"dark\" ? <LightMode /> : <DarkMode />}\n </IconButton>\n </Tooltip>\n );\n}\n\nexport default DarkModeToggle;\n","import type { ReactNode } from \"react\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n isLoading: boolean;\n data?: T;\n dataParser?: (data: unknown) => T;\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\nexport interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {\n error: unknown;\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n dataParser?: (data: unknown) => T;\n loadingComponent?: ReactNode;\n onUndefined?: () => ReactNode | void;\n showOnError?: boolean;\n}\n\nfunction LoaderData<T>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<T>();\n const warnedOnce = useRef(false);\n\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n if (!warnedOnce.current) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n warnedOnce.current = true;\n }\n\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? (\n <>{children(dataParser(data) as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component={\"a\"} href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n onUndefined?: () => ReactNode | void;\n};\n\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["index_exports","__export","CollapsableItem_default","DarkModeToggle_default","DropdownMenu_default","ExternalLink_default","FileInput_default","FileInputList_default","FileType","IconWithPopover_default","InternalLink_default","ListItemInternalLink_default","Loader_default","LoaderData_default","LoaderError_default","LoaderProvider_default","ModeProvider_default","NavigationBottom_default","NavigationDrawer_default","PopoverText_default","ReactPlayground_default","ScreenSizeProvider_default","SkeletonRow_default","SnackbarProvider_default","SubmitButton_default","SwitchWithIcons_default","useHash_default","useLoader","useMode","useScreenSize","useSnackbar","__toCommonJS","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_ButtonBase","import_Collapse","import_react","import_jsx_runtime","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","import_DarkMode","import_LightMode","import_IconButton","import_Tooltip","import_CircularProgress","import_react","import_jsx_runtime","LoaderContext","useLoader","context","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","import_react","import_jsx_runtime","LoaderData","children","loaderDataParser","loadingComponent","onUndefined","showOnError","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","warnedOnce","dataParser","result","LoaderData_default","import_Alert","import_jsx_runtime","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","import_CssBaseline","import_styles","import_react","import_jsx_runtime","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","CssBaseline","ModeProvider_default","import_react","import_jsx_runtime","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","import_utility","import_Alert","import_Snackbar","import_react","import_jsx_runtime","SnackbarContext","useSnackbar","context","SnackbarProvider","children","autoHideDuration","open","setOpen","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","Snackbar","Alert","SnackbarProvider_default","import_jsx_runtime","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_Button","import_Menu","import_react","import_jsx_runtime","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","isDropdownOpen","buttonProps","__spreadProps","__spreadValues","event","Box","Menu","DropdownMenu_default","import_Link","import_jsx_runtime","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","import_CloudUpload","import_Button","import_styles","import_react","import_jsx_runtime","FileType","VisuallyHiddenInput","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","import_Delete","import_Box","import_IconButton","import_List","import_ListItem","import_ListItemText","import_jsx_runtime","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","import_Box","import_Popover","import_react","import_jsx_runtime","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","isPopoverOpen","popoverId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","import_Link","import_react_router_dom","import_jsx_runtime","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","import_ListItemButton","import_jsx_runtime","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","import_CircularProgress","import_jsx_runtime","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","import_BottomNavigation","import_BottomNavigationAction","import_Box","import_Paper","import_react","import_react_router_dom","import_jsx_runtime","NavigationBottom","children","navItems","value","setValue","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","NavigationBottom_default","import_utility","import_ChevronLeft","import_ChevronRight","import_Menu","import_AppBar","import_Box","import_CssBaseline","import_Divider","import_Drawer","import_IconButton","import_List","import_ListItem","import_ListItemButton","import_ListItemIcon","import_ListItemText","import_styles","import_Toolbar","import_Typography","import_react","import_react_router_dom","import_jsx_runtime","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","setOpen","location","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","List","option","ListItem","ListItemButton","ListItemIcon","ListItemText","NavigationDrawer_default","import_Typography","import_jsx_runtime","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","import_Box","import_Typography","import_common_tags","import_react_live","import_jsx_runtime","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","Typography","ReactPlayground_default","import_utility","import_Skeleton","import_TableCell","import_TableRow","import_jsx_runtime","SkeletonRow","columns","TableRow","index","TableCell","Skeleton","SkeletonRow_default","import_Button","import_react_hook_form","import_jsx_runtime","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","Button","__spreadProps","__spreadValues","SubmitButton_default","import_Box","import_styles","import_Switch","import_jsx_runtime","StyledSwitch","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","import_react","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/CollapsableItem.tsx","../src/components/DarkModeToggle.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["export * from \"src/components\";\nexport * from \"src/hooks\";\nexport * from \"src/providers\";\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\n\nimport { useMode } from \"src/providers\";\n\nfunction DarkModeToggle() {\n const { mode, toggleMode } = useMode();\n\n return (\n <Tooltip title={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}>\n <IconButton\n sx={{ marginLeft: \"auto\" }}\n onClick={toggleMode}\n aria-label={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}\n >\n {mode === \"dark\" ? <LightMode /> : <DarkMode />}\n </IconButton>\n </Tooltip>\n );\n}\n\nexport default DarkModeToggle;\n","import type { ReactNode } from \"react\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** The component to show when the data is being fetched. */\n isLoading: boolean;\n /** The data being loaded. */\n data?: T;\n /** A parser for the data. */\n dataParser?: (data: unknown) => T;\n /** The component to show when loading. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\nexport interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {\n /** The error given if the request gave an error. */\n error: unknown;\n /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\n/** A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n */\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n /** The elements to show after data has been loaded.\n * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.\n */\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n /** A parser for the data. */\n dataParser?: (data: unknown) => T;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */\n onUndefined?: () => ReactNode | void;\n /** An option to show the children of this component if an error has been thrown. */\n showOnError?: boolean;\n}\n\n/** The component responsible for showing the data provided by LoaderProvider. */\nfunction LoaderData<T>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<T>();\n const warnedOnce = useRef(false);\n\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n if (!warnedOnce.current) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n warnedOnce.current = true;\n }\n\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? (\n <>{children(dataParser(data) as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\n/** The component responsible for showing any errors provided by LoaderProvider. */\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component=\"a\" href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n /** The elements to show after data has been loaded.\n * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.\n */\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */\n onUndefined?: () => ReactNode | void;\n};\n\n/** An in-line component that deals with state management when fetching data from an API.\n * This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.\n */\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["index_exports","__export","CollapsableItem_default","DarkModeToggle_default","DropdownMenu_default","ExternalLink_default","FileInput_default","FileInputList_default","FileType","IconWithPopover_default","InternalLink_default","ListItemInternalLink_default","Loader_default","LoaderData_default","LoaderError_default","LoaderProvider_default","ModeProvider_default","NavigationBottom_default","NavigationDrawer_default","PopoverText_default","ReactPlayground_default","ScreenSizeProvider_default","SkeletonRow_default","SnackbarProvider_default","SubmitButton_default","SwitchWithIcons_default","useHash_default","useLoader","useMode","useScreenSize","useSnackbar","__toCommonJS","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_ButtonBase","import_Collapse","import_react","import_jsx_runtime","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","import_DarkMode","import_LightMode","import_IconButton","import_Tooltip","import_CircularProgress","import_react","import_jsx_runtime","LoaderContext","useLoader","context","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","import_react","import_jsx_runtime","LoaderData","children","loaderDataParser","loadingComponent","onUndefined","showOnError","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","warnedOnce","dataParser","result","LoaderData_default","import_Alert","import_jsx_runtime","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","import_CssBaseline","import_styles","import_react","import_jsx_runtime","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","CssBaseline","ModeProvider_default","import_react","import_jsx_runtime","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","import_utility","import_Alert","import_Snackbar","import_react","import_jsx_runtime","SnackbarContext","useSnackbar","context","SnackbarProvider","children","autoHideDuration","open","setOpen","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","Snackbar","Alert","SnackbarProvider_default","import_jsx_runtime","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_Button","import_Menu","import_react","import_jsx_runtime","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","isDropdownOpen","buttonProps","__spreadProps","__spreadValues","event","Box","Menu","DropdownMenu_default","import_Link","import_jsx_runtime","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","import_CloudUpload","import_Button","import_styles","import_react","import_jsx_runtime","FileType","VisuallyHiddenInput","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","import_Delete","import_Box","import_IconButton","import_List","import_ListItem","import_ListItemText","import_jsx_runtime","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","import_Box","import_Popover","import_react","import_jsx_runtime","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","isPopoverOpen","popoverId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","import_Link","import_react_router_dom","import_jsx_runtime","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","import_ListItemButton","import_jsx_runtime","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","import_CircularProgress","import_jsx_runtime","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","import_BottomNavigation","import_BottomNavigationAction","import_Box","import_Paper","import_react","import_react_router_dom","import_jsx_runtime","NavigationBottom","children","navItems","value","setValue","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","NavigationBottom_default","import_utility","import_ChevronLeft","import_ChevronRight","import_Menu","import_AppBar","import_Box","import_CssBaseline","import_Divider","import_Drawer","import_IconButton","import_List","import_ListItem","import_ListItemButton","import_ListItemIcon","import_ListItemText","import_styles","import_Toolbar","import_Typography","import_react","import_react_router_dom","import_jsx_runtime","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","setOpen","location","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","List","option","ListItem","ListItemButton","ListItemIcon","ListItemText","NavigationDrawer_default","import_Typography","import_jsx_runtime","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","import_Box","import_Typography","import_common_tags","import_react_live","import_jsx_runtime","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","Typography","ReactPlayground_default","import_utility","import_Skeleton","import_TableCell","import_TableRow","import_jsx_runtime","SkeletonRow","columns","TableRow","index","TableCell","Skeleton","SkeletonRow_default","import_Button","import_react_hook_form","import_jsx_runtime","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","Button","__spreadProps","__spreadValues","SubmitButton_default","import_Box","import_styles","import_Switch","import_jsx_runtime","StyledSwitch","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","import_react","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
package/dist/index.d.cts CHANGED
@@ -101,9 +101,13 @@ interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, "href"> {
101
101
  declare function ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps): react_jsx_runtime.JSX.Element;
102
102
 
103
103
  interface LoaderProviderBaseProps<T> {
104
+ /** The component to show when the data is being fetched. */
104
105
  isLoading: boolean;
106
+ /** The data being loaded. */
105
107
  data?: T;
108
+ /** A parser for the data. */
106
109
  dataParser?: (data: unknown) => T;
110
+ /** The component to show when loading. */
107
111
  loadingComponent?: ReactNode;
108
112
  }
109
113
  interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {
@@ -111,7 +115,9 @@ interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {
111
115
  errorComponent?: never;
112
116
  }
113
117
  interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {
118
+ /** The error given if the request gave an error. */
114
119
  error: unknown;
120
+ /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */
115
121
  errorComponent?: ReactNode | ((error: unknown) => ReactNode);
116
122
  }
117
123
  type LoaderContextValue<T> = LoaderProviderPropsWithNoError<T> | LoaderProviderPropsWithError<T>;
@@ -119,17 +125,29 @@ type LoaderProviderProps<T> = LoaderContextValue<T> & {
119
125
  children: ReactNode;
120
126
  };
121
127
  declare function useLoader<T>(): LoaderContextValue<T>;
128
+ /** A provider for a context that deals with state management when fetching data from an API.
129
+ * This may be used over Loader if you require more control over the placement of the error message and data display.
130
+ */
122
131
  declare function LoaderProvider<T>({ children, loadingComponent, ...contextProps }: LoaderProviderProps<T>): react_jsx_runtime.JSX.Element;
123
132
 
124
133
  interface LoaderDataProps<T> {
134
+ /** The elements to show after data has been loaded.
135
+ * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.
136
+ */
125
137
  children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);
138
+ /** A parser for the data. */
126
139
  dataParser?: (data: unknown) => T;
140
+ /** The component to show when the data is being fetched. */
127
141
  loadingComponent?: ReactNode;
142
+ /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */
128
143
  onUndefined?: () => ReactNode | void;
144
+ /** An option to show the children of this component if an error has been thrown. */
129
145
  showOnError?: boolean;
130
146
  }
147
+ /** The component responsible for showing the data provided by LoaderProvider. */
131
148
  declare function LoaderData<T>({ children, dataParser: loaderDataParser, loadingComponent, onUndefined, showOnError, }: LoaderDataProps<T>): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element;
132
149
 
150
+ /** The component responsible for showing any errors provided by LoaderProvider. */
133
151
  declare function LoaderError(): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
134
152
 
135
153
  declare function useMode(): {
@@ -167,9 +185,16 @@ declare function useSnackbar(): SnackbarContextValue;
167
185
  declare function SnackbarProvider({ children, autoHideDuration }: SnackbarProviderProps): react_jsx_runtime.JSX.Element;
168
186
 
169
187
  type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"> & {
188
+ /** The elements to show after data has been loaded.
189
+ * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.
190
+ */
170
191
  children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);
192
+ /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */
171
193
  onUndefined?: () => ReactNode | void;
172
194
  };
195
+ /** An in-line component that deals with state management when fetching data from an API.
196
+ * This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.
197
+ */
173
198
  declare function Loader<T>({ children, onUndefined, loadingComponent, ...loaderProviderProps }: LoaderProps<T>): react_jsx_runtime.JSX.Element;
174
199
 
175
200
  interface NavItemBottom {
package/dist/index.d.ts CHANGED
@@ -101,9 +101,13 @@ interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, "href"> {
101
101
  declare function ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps): react_jsx_runtime.JSX.Element;
102
102
 
103
103
  interface LoaderProviderBaseProps<T> {
104
+ /** The component to show when the data is being fetched. */
104
105
  isLoading: boolean;
106
+ /** The data being loaded. */
105
107
  data?: T;
108
+ /** A parser for the data. */
106
109
  dataParser?: (data: unknown) => T;
110
+ /** The component to show when loading. */
107
111
  loadingComponent?: ReactNode;
108
112
  }
109
113
  interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {
@@ -111,7 +115,9 @@ interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {
111
115
  errorComponent?: never;
112
116
  }
113
117
  interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {
118
+ /** The error given if the request gave an error. */
114
119
  error: unknown;
120
+ /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */
115
121
  errorComponent?: ReactNode | ((error: unknown) => ReactNode);
116
122
  }
117
123
  type LoaderContextValue<T> = LoaderProviderPropsWithNoError<T> | LoaderProviderPropsWithError<T>;
@@ -119,17 +125,29 @@ type LoaderProviderProps<T> = LoaderContextValue<T> & {
119
125
  children: ReactNode;
120
126
  };
121
127
  declare function useLoader<T>(): LoaderContextValue<T>;
128
+ /** A provider for a context that deals with state management when fetching data from an API.
129
+ * This may be used over Loader if you require more control over the placement of the error message and data display.
130
+ */
122
131
  declare function LoaderProvider<T>({ children, loadingComponent, ...contextProps }: LoaderProviderProps<T>): react_jsx_runtime.JSX.Element;
123
132
 
124
133
  interface LoaderDataProps<T> {
134
+ /** The elements to show after data has been loaded.
135
+ * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.
136
+ */
125
137
  children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);
138
+ /** A parser for the data. */
126
139
  dataParser?: (data: unknown) => T;
140
+ /** The component to show when the data is being fetched. */
127
141
  loadingComponent?: ReactNode;
142
+ /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */
128
143
  onUndefined?: () => ReactNode | void;
144
+ /** An option to show the children of this component if an error has been thrown. */
129
145
  showOnError?: boolean;
130
146
  }
147
+ /** The component responsible for showing the data provided by LoaderProvider. */
131
148
  declare function LoaderData<T>({ children, dataParser: loaderDataParser, loadingComponent, onUndefined, showOnError, }: LoaderDataProps<T>): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element;
132
149
 
150
+ /** The component responsible for showing any errors provided by LoaderProvider. */
133
151
  declare function LoaderError(): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
134
152
 
135
153
  declare function useMode(): {
@@ -167,9 +185,16 @@ declare function useSnackbar(): SnackbarContextValue;
167
185
  declare function SnackbarProvider({ children, autoHideDuration }: SnackbarProviderProps): react_jsx_runtime.JSX.Element;
168
186
 
169
187
  type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"> & {
188
+ /** The elements to show after data has been loaded.
189
+ * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.
190
+ */
170
191
  children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);
192
+ /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */
171
193
  onUndefined?: () => ReactNode | void;
172
194
  };
195
+ /** An in-line component that deals with state management when fetching data from an API.
196
+ * This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.
197
+ */
173
198
  declare function Loader<T>({ children, onUndefined, loadingComponent, ...loaderProviderProps }: LoaderProps<T>): react_jsx_runtime.JSX.Element;
174
199
 
175
200
  interface NavItemBottom {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/CollapsableItem.tsx","../src/components/DarkModeToggle.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\n\nimport { useMode } from \"src/providers\";\n\nfunction DarkModeToggle() {\n const { mode, toggleMode } = useMode();\n\n return (\n <Tooltip title={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}>\n <IconButton\n sx={{ marginLeft: \"auto\" }}\n onClick={toggleMode}\n aria-label={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}\n >\n {mode === \"dark\" ? <LightMode /> : <DarkMode />}\n </IconButton>\n </Tooltip>\n );\n}\n\nexport default DarkModeToggle;\n","import type { ReactNode } from \"react\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n isLoading: boolean;\n data?: T;\n dataParser?: (data: unknown) => T;\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\nexport interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {\n error: unknown;\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n dataParser?: (data: unknown) => T;\n loadingComponent?: ReactNode;\n onUndefined?: () => ReactNode | void;\n showOnError?: boolean;\n}\n\nfunction LoaderData<T>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<T>();\n const warnedOnce = useRef(false);\n\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n if (!warnedOnce.current) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n warnedOnce.current = true;\n }\n\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? (\n <>{children(dataParser(data) as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component={\"a\"} href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n onUndefined?: () => ReactNode | void;\n};\n\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["ArrowDropDown","ArrowDropUp","Box","ButtonBase","Collapse","useEffect","useState","jsx","jsxs","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","useState","useEffect","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","DarkMode","LightMode","IconButton","Tooltip","CircularProgress","createContext","useContext","jsx","LoaderContext","createContext","useLoader","context","useContext","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","useRef","Fragment","jsx","LoaderData","children","loaderDataParser","loadingComponent","onUndefined","showOnError","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","warnedOnce","useRef","dataParser","result","LoaderData_default","Alert","Fragment","jsx","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useState","jsx","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","context","useContext","SnackbarProvider","children","autoHideDuration","open","setOpen","useState","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","wait","Snackbar","Alert","SnackbarProvider_default","jsx","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","ArrowDropDown","ArrowDropUp","Box","MUIButton","Menu","useEffect","useMemo","useState","jsx","jsxs","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","useState","isDropdownOpen","useMemo","buttonProps","__spreadProps","__spreadValues","event","useEffect","Box","Menu","DropdownMenu_default","MUILink","jsx","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","CloudUploadIcon","Button","styled","useState","jsx","jsxs","FileType","VisuallyHiddenInput","styled","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","useState","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","DeleteIcon","Box","IconButton","List","ListItem","ListItemText","jsx","jsxs","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","Box","Popover","useId","useState","jsx","jsxs","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","useState","isPopoverOpen","popoverId","useId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","MUILink","ReactDOMLink","jsx","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","ListItemButton","jsx","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","CircularProgress","jsx","jsxs","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","BottomNavigation","BottomNavigationAction","Box","Paper","useState","Link","Fragment","jsx","jsxs","NavigationBottom","children","navItems","value","setValue","useState","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","Link","NavigationBottom_default","truncate","ChevronLeftIcon","ChevronRightIcon","MenuIcon","MuiAppBar","Box","CssBaseline","Divider","MuiDrawer","IconButton","List","ListItem","ListItemButton","ListItemIcon","ListItemText","styled","useTheme","Toolbar","Typography","Fragment","useState","Link","useLocation","jsx","jsxs","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","styled","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","useTheme","setOpen","useState","location","useLocation","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","Fragment","List","truncate","option","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","NavigationDrawer_default","Typography","Fragment","jsx","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","Box","Typography","stripIndent","LiveEditor","LiveError","LivePreview","LiveProvider","jsx","jsxs","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","stripIndent","Typography","LiveEditor","LivePreview","LiveError","ReactPlayground_default","fillArray","Skeleton","TableCell","TableRow","jsx","SkeletonRow","columns","index","SkeletonRow_default","Button","useFormContext","jsx","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","useFormContext","Button","__spreadProps","__spreadValues","SubmitButton_default","Box","styled","Switch","jsx","StyledSwitch","styled","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","useCallback","useEffect","useState","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
1
+ {"version":3,"sources":["../src/components/CollapsableItem.tsx","../src/components/DarkModeToggle.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\n\nimport { useMode } from \"src/providers\";\n\nfunction DarkModeToggle() {\n const { mode, toggleMode } = useMode();\n\n return (\n <Tooltip title={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}>\n <IconButton\n sx={{ marginLeft: \"auto\" }}\n onClick={toggleMode}\n aria-label={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}\n >\n {mode === \"dark\" ? <LightMode /> : <DarkMode />}\n </IconButton>\n </Tooltip>\n );\n}\n\nexport default DarkModeToggle;\n","import type { ReactNode } from \"react\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** The component to show when the data is being fetched. */\n isLoading: boolean;\n /** The data being loaded. */\n data?: T;\n /** A parser for the data. */\n dataParser?: (data: unknown) => T;\n /** The component to show when loading. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\nexport interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {\n /** The error given if the request gave an error. */\n error: unknown;\n /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\n/** A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n */\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n /** The elements to show after data has been loaded.\n * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.\n */\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n /** A parser for the data. */\n dataParser?: (data: unknown) => T;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */\n onUndefined?: () => ReactNode | void;\n /** An option to show the children of this component if an error has been thrown. */\n showOnError?: boolean;\n}\n\n/** The component responsible for showing the data provided by LoaderProvider. */\nfunction LoaderData<T>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<T>();\n const warnedOnce = useRef(false);\n\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n if (!warnedOnce.current) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n warnedOnce.current = true;\n }\n\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? (\n <>{children(dataParser(data) as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\n/** The component responsible for showing any errors provided by LoaderProvider. */\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component=\"a\" href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n /** The elements to show after data has been loaded.\n * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.\n */\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n /** A function to run if the data is undefined and not loading. This may either return React components or nothing. */\n onUndefined?: () => ReactNode | void;\n};\n\n/** An in-line component that deals with state management when fetching data from an API.\n * This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.\n */\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["ArrowDropDown","ArrowDropUp","Box","ButtonBase","Collapse","useEffect","useState","jsx","jsxs","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","useState","useEffect","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","DarkMode","LightMode","IconButton","Tooltip","CircularProgress","createContext","useContext","jsx","LoaderContext","createContext","useLoader","context","useContext","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","useRef","Fragment","jsx","LoaderData","children","loaderDataParser","loadingComponent","onUndefined","showOnError","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","warnedOnce","useRef","dataParser","result","LoaderData_default","Alert","Fragment","jsx","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useState","jsx","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","context","useContext","SnackbarProvider","children","autoHideDuration","open","setOpen","useState","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","wait","Snackbar","Alert","SnackbarProvider_default","jsx","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","ArrowDropDown","ArrowDropUp","Box","MUIButton","Menu","useEffect","useMemo","useState","jsx","jsxs","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","useState","isDropdownOpen","useMemo","buttonProps","__spreadProps","__spreadValues","event","useEffect","Box","Menu","DropdownMenu_default","MUILink","jsx","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","CloudUploadIcon","Button","styled","useState","jsx","jsxs","FileType","VisuallyHiddenInput","styled","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","useState","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","DeleteIcon","Box","IconButton","List","ListItem","ListItemText","jsx","jsxs","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","Box","Popover","useId","useState","jsx","jsxs","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","useState","isPopoverOpen","popoverId","useId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","MUILink","ReactDOMLink","jsx","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","ListItemButton","jsx","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","CircularProgress","jsx","jsxs","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","BottomNavigation","BottomNavigationAction","Box","Paper","useState","Link","Fragment","jsx","jsxs","NavigationBottom","children","navItems","value","setValue","useState","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","Link","NavigationBottom_default","truncate","ChevronLeftIcon","ChevronRightIcon","MenuIcon","MuiAppBar","Box","CssBaseline","Divider","MuiDrawer","IconButton","List","ListItem","ListItemButton","ListItemIcon","ListItemText","styled","useTheme","Toolbar","Typography","Fragment","useState","Link","useLocation","jsx","jsxs","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","styled","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","useTheme","setOpen","useState","location","useLocation","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","Fragment","List","truncate","option","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","NavigationDrawer_default","Typography","Fragment","jsx","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","Box","Typography","stripIndent","LiveEditor","LiveError","LivePreview","LiveProvider","jsx","jsxs","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","stripIndent","Typography","LiveEditor","LivePreview","LiveError","ReactPlayground_default","fillArray","Skeleton","TableCell","TableRow","jsx","SkeletonRow","columns","index","SkeletonRow_default","Button","useFormContext","jsx","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","useFormContext","Button","__spreadProps","__spreadValues","SubmitButton_default","Box","styled","Switch","jsx","StyledSwitch","styled","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","useCallback","useEffect","useState","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alextheman/components",
3
- "version": "5.2.0",
3
+ "version": "5.2.1",
4
4
  "description": "A package containing common React components used across my projects",
5
5
  "license": "ISC",
6
6
  "author": "alextheman",
@@ -41,7 +41,7 @@
41
41
  "react-live": "^4.1.8"
42
42
  },
43
43
  "devDependencies": {
44
- "@alextheman/eslint-plugin": "^2.2.1",
44
+ "@alextheman/eslint-plugin": "^2.4.1",
45
45
  "@eslint/compat": "^1.4.0",
46
46
  "@eslint/eslintrc": "^3.3.1",
47
47
  "@eslint/js": "^9.38.0",