@alextheman/components 5.8.0 → 5.8.2

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.
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { CollapseProps } from '@mui/material/Collapse';
3
3
  import { SxProps, PaletteMode, Theme } from '@mui/material/styles';
4
4
  import * as react from 'react';
5
- import { ReactNode, ElementType, Dispatch, SetStateAction, JSX, ComponentProps, ComponentType, CSSProperties } from 'react';
5
+ import { ReactNode, ElementType, Ref, Dispatch, SetStateAction, JSX, ComponentProps, ComponentType, CSSProperties } from 'react';
6
6
  import { ButtonOwnProps, ButtonProps } from '@mui/material/Button';
7
7
  import { LinkProps } from '@mui/material/Link';
8
8
  import { OverridableComponent, CommonProps } from '@mui/material/OverridableComponent';
@@ -44,11 +44,12 @@ interface DropdownMenuProps {
44
44
  declare function DropdownMenu({ children, button: Button, buttonChildren, buttonProps: incomingButtonProps, isOpenIcon, isClosedIcon, onOpen, onClose, }: DropdownMenuProps): react_jsx_runtime.JSX.Element;
45
45
 
46
46
  interface ExternalLinkProps extends Omit<LinkProps, "to" | "target" | "rel"> {
47
- href: `https://${string}` | `http://${string}`;
47
+ href: `https://${string}` | `http://${string}` | (string & {});
48
48
  to?: never;
49
49
  children: ReactNode;
50
+ ref?: Ref<HTMLAnchorElement>;
50
51
  }
51
- declare function ExternalLink({ href, children, ...linkProps }: ExternalLinkProps): react_jsx_runtime.JSX.Element;
52
+ declare function ExternalLink({ href, children, ref, ...linkProps }: ExternalLinkProps): react_jsx_runtime.JSX.Element;
52
53
 
53
54
  declare const FileType: {
54
55
  readonly PDF: "application/pdf";
@@ -89,11 +90,12 @@ interface IconWithPopoverProps {
89
90
  declare function IconWithPopover({ icon: Icon, onOpen, onClose, iconProps, children, }: IconWithPopoverProps): react_jsx_runtime.JSX.Element;
90
91
 
91
92
  interface InternalLinkProps extends Omit<LinkProps, "href"> {
92
- to: `/${string}` | `~/${string}`;
93
+ to: `/${string}` | `~/${string}` | (string & {});
93
94
  href?: never;
94
95
  children: ReactNode;
96
+ ref?: Ref<HTMLAnchorElement>;
95
97
  }
96
- declare function InternalLink({ to, children, ...linkProps }: InternalLinkProps): react_jsx_runtime.JSX.Element;
98
+ declare function InternalLink({ to, children, ref, ...linkProps }: InternalLinkProps): react_jsx_runtime.JSX.Element;
97
99
 
98
100
  interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, "href"> {
99
101
  children: ReactNode;
@@ -232,7 +234,7 @@ interface SnackbarContextValue {
232
234
  declare function useSnackbar<Strict extends boolean = true>({ strict, }?: ContextHookOptions<Strict>): OptionalOnCondition<Strict, SnackbarContextValue>;
233
235
  declare function SnackbarProvider({ children, autoHideDuration }: SnackbarProviderProps): react_jsx_runtime.JSX.Element;
234
236
 
235
- type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"> & Omit<LoaderErrorProps, "errorComponent"> & Omit<LoaderDataProps<T>, "showOnError" | "onUndefined" | "onNull" | "onNullable">;
237
+ type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"> & Omit<LoaderErrorProps, "errorComponent" | "children"> & Omit<LoaderDataProps<T>, "showOnError" | "onUndefined" | "onNull" | "onNullable">;
236
238
  /** An in-line component that deals with state management when fetching data from an API.
237
239
  * This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.
238
240
  */
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- var we=Object.defineProperty,Ie=Object.defineProperties;var ke=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var Y=(e,o,r)=>o in e?we(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,d=(e,o)=>{for(var r in o||(o={}))q.call(o,r)&&Y(e,r,o[r]);if(B)for(var r of B(o))Z.call(o,r)&&Y(e,r,o[r]);return e},c=(e,o)=>Ie(e,ke(o));var x=(e,o)=>{var r={};for(var n in e)q.call(e,n)&&o.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&B)for(var n of B(e))o.indexOf(n)<0&&Z.call(e,n)&&(r[n]=e[n]);return r};var Q=(e,o,r)=>new Promise((n,i)=>{var t=s=>{try{a(r.next(s))}catch(f){i(f)}},p=s=>{try{a(r.throw(s))}catch(f){i(f)}},a=s=>s.done?n(s.value):Promise.resolve(s.value).then(t,p);a((r=r.apply(e,o)).next())});import Ne from"@mui/icons-material/ArrowDropDown";import Te from"@mui/icons-material/ArrowDropUp";import Be from"@mui/material/Box";import M from"@mui/material/ButtonBase";import Ee from"@mui/material/Collapse";import{useEffect as Re,useState as Oe}from"react";import{jsx as A,jsxs as j}from"react/jsx-runtime";function De({isInitiallyOpen:e,onOpen:o,onClose:r,children:n,buttonStyles:i,buttonContents:t,buttonComponent:p=M,collapseProps:a,openIcon:s=A(Te,{}),closedIcon:f=A(Ne,{}),useDefaultStyling:u=p===M}){let[m,l]=Oe(!!e);return Re(()=>{m&&o?o():!m&&r&&r()},[m]),j(Be,{children:[j(p,{onClick:()=>{l(P=>!P)},sx:u?d({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":p===M?{backgroundColor:"action.hover"}:null},i):i,"aria-expanded":m,children:[t,m?s:f]}),A(Ee,c(d({in:m},a),{children:n}))]})}var Me=De;import yo from"@mui/icons-material/DarkMode";import vo from"@mui/icons-material/LightMode";import go from"@mui/material/IconButton";import ho from"@mui/material/Tooltip";import Ae from"@mui/material/CircularProgress";import{createContext as Fe,useContext as We}from"react";import{jsx as ee}from"react/jsx-runtime";var oe=Fe(void 0);function w({strict:e=!0}={}){let o=We(oe);if(e&&!o)throw new Error("LOADER_PROVIDER_NOT_FOUND");return o}function Ve(n){var i=n,{children:e,loadingComponent:o=ee(Ae,{})}=i,r=x(i,["children","loadingComponent"]);return ee(oe.Provider,{value:d({loadingComponent:o},r),children:e})}var F=Ve;import{Fragment as g,jsx as h}from"react/jsx-runtime";function ze({children:e,dataParser:o,loadingComponent:r,onNullable:n,onUndefined:i,onNull:t}){let{isLoading:p,data:a,dataParser:s,loadingComponent:f,error:u}=w(),m=o!=null?o:s;if(p)return h(g,{children:r!=null?r:f});if(u)return h(g,{});if(a==null){if(n){let l=n();return l!=null?l:h(g,{})}if(a===void 0&&i){let l=i();return l!=null?l:h(g,{})}if(a===null&&t){let l=t();return l!=null?l:h(g,{})}return h(g,{})}return m?typeof e=="function"?h(g,{children:e(m(a))}):h(g,{children:e}):typeof e=="function"?h(g,{children:e(a)}):h(g,{children:e})}var W=ze;import re from"@mui/material/Alert";import{useRef as He}from"react";import{Fragment as I,jsx as S}from"react/jsx-runtime";function Ue({errorComponent:e,children:o,undefinedComponent:r,nullComponent:n,nullableComponent:i,logError:t}){var v,K;let{isLoading:p,data:a,error:s,errorComponent:f,logError:u}=w(),m=t!=null?t:u,l=He(!1),P=(v=o!=null?o:e)!=null?v:f;return s?(m&&!l.current&&(console.error(s),l.current=!0),typeof P=="function"?P(s):P?S(I,{children:P}):S(re,{severity:"error",children:(K=s==null?void 0:s.message)!=null?K:"An unknown error has occured. Please try again later."})):!p&&a==null?i?(m&&!l.current&&(console.error("Data is nullable after loading."),l.current=!0),S(I,{children:i})):a===void 0&&(m&&!l.current&&(console.error("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."),l.current=!0),r)?S(I,{children:r}):a===null&&(m&&!l.current&&(console.error("Data is null after loading."),l.current=!0),n)?S(I,{children:n}):S(re,{severity:"error",children:"Failed to load data. Please try again later."}):S(I,{})}var V=Ue;import _e from"@mui/material/CssBaseline";import{createTheme as $e,ThemeProvider as Xe}from"@mui/material/styles";import{createContext as Ge,useContext as Je,useMemo as Ke,useState as Ye}from"react";import{jsx as te,jsxs as Qe}from"react/jsx-runtime";var ne=Ge({toggleMode:()=>{},mode:"dark"});function k({strict:e=!0}={}){let o=Je(ne);if(e&&!o)throw new Error("MODE_PROVIDER_NOT_FOUND");return o}function qe({children:e,mode:o="dark"}){let[r,n]=Ye(o),i=Ke(()=>$e({palette:{mode:r}}),[r]);return te(ne.Provider,{value:{mode:r,toggleMode:()=>{n(t=>t==="light"?"dark":"light")}},children:Qe(Xe,{theme:i,children:[te(_e,{}),e]})})}var Ze=qe;import{createContext as je,useContext as eo,useEffect as oo,useMemo as ro,useState as ie}from"react";import{jsx as ao}from"react/jsx-runtime";var ae=je({windowWidth:0,windowHeight:0,isLargeScreen:!1});function to({strict:e=!0}={}){let o=eo(ae);if(e&&!o)throw new Error("SCREEN_SIZE_PROVIDER_NOT_FOUND");return o}function no({children:e,largeScreenWidth:o=669,largeScreenHeight:r=660}){let[n,i]=ie(window.innerWidth),[t,p]=ie(window.innerHeight);oo(()=>{function s(){i(window.innerWidth),p(window.innerHeight)}return s(),window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[]);let a=ro(()=>n>o&&t>r,[n,t,o,r]);return ao(ae.Provider,{value:{isLargeScreen:a,windowWidth:n,windowHeight:t},children:e})}var io=no;import{wait as po}from"@alextheman/utility";import so from"@mui/material/Alert";import lo from"@mui/material/Snackbar";import{createContext as mo,useContext as co,useState as E}from"react";import{jsx as pe,jsxs as Po}from"react/jsx-runtime";var se=mo(void 0);function uo({strict:e=!0}={}){let o=co(se);if(e&&!o)throw new Error("SNACKBAR_PROVIDER_NOT_FOUND");return o}function fo({children:e,autoHideDuration:o=5e3}){let[r,n]=E(!1),[i,t]=E(o),[p,a]=E(""),[s,f]=E("info");function u(l,P,v){n(!0),t(v!=null?v:o),f(P!=null?P:"info"),a(l)}function m(){return Q(this,null,function*(){n(!1),yield po(.2),a("")})}return Po(se.Provider,{value:{addSnackbar:u},children:[pe(lo,{open:r,autoHideDuration:i,onClose:m,children:pe(so,{onClose:m,severity:s,children:p})}),e]})}var xo=fo;import{jsx as R}from"react/jsx-runtime";function Lo(){let{mode:e,toggleMode:o}=k();return R(ho,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:R(go,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?R(vo,{}):R(yo,{})})})}var So=Lo;import bo from"@mui/icons-material/ArrowDropDown";import Co from"@mui/icons-material/ArrowDropUp";import de from"@mui/material/Box";import le from"@mui/material/Button";import wo from"@mui/material/Menu";import{useEffect as Io,useMemo as ko,useState as No}from"react";import{jsx as N,jsxs as Eo}from"react/jsx-runtime";function To({children:e,button:o=le,buttonChildren:r="Menu",buttonProps:n,isOpenIcon:i=N(Co,{}),isClosedIcon:t=N(bo,{}),onOpen:p,onClose:a}){let[s,f]=No(null),u=ko(()=>!!s,[s]),m=c(d({},n),{onClick:l=>{f(l.currentTarget)},"aria-controls":u?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":u});return o===le&&(m.endIcon=u?i:t),Io(()=>{u&&p?p():!u&&a&&a()},[u,p,a]),Eo(de,{children:[N(o,c(d({},m),{children:r})),N(wo,{id:"dropdown-menu",anchorEl:s,open:u,onClose:()=>{f(null)},children:typeof e=="function"?N(de,{children:e(()=>{f(null)})}):e})]})}var Bo=To;import Ro from"@mui/material/Link";import{jsx as Mo}from"react/jsx-runtime";function Oo(n){var i=n,{href:e,children:o}=i,r=x(i,["href","children"]);return Mo(Ro,c(d({component:"a",href:e,target:"_blank",rel:"noopener noreferrer"},r),{children:o}))}var Do=Oo;import Ao from"@mui/icons-material/CloudUpload";import Fo from"@mui/material/Button";import{styled as me}from"@mui/material/styles";import{useState as Wo}from"react";import{jsx as z,jsxs as _o}from"react/jsx-runtime";var Vo={PDF:"application/pdf",PNG:"image/png",JPEG:"image/jpeg",JPG:"image/jpg",XLSX:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",DOCX:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",MP3:"audio/mp3",MP4:"video/mp4",WAV:"audio/wav"},zo=me("input")({clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:1,overflow:"hidden",position:"absolute",bottom:0,left:0,whiteSpace:"nowrap",width:1}),Ho=me("div")(({theme:e,$dragging:o})=>({border:"2px dashed",borderColor:o?e.palette.primary.main:"#ccc",backgroundColor:o?e.palette.action.hover:"transparent",borderRadius:8,padding:"1.5rem",textAlign:"center",transition:"border-color 0.2s",cursor:"pointer"}));function Uo(p){var a=p,{onFileInput:e,label:o="Upload files",multiple:r,accept:n,useDropzone:i}=a,t=x(a,["onFileInput","label","multiple","accept","useDropzone"]);var m;let[s,f]=Wo(!1),u=_o(Fo,c(d({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:l=>{var P;(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),(P=document.getElementById("file-input"))==null||P.click())}},t),{startIcon:(m=t.startIcon)!=null?m:z(Ao,{}),children:[o,z(zo,{id:"file-input",type:"file",onChange:l=>{var v;let P=l.target;e(Array.from((v=P.files)!=null?v:[])),P.value=""},multiple:r,accept:n==null?void 0:n.join(","),disabled:t.disabled})]}));return i?z(Ho,{$dragging:s,onDragOver:l=>{l.preventDefault(),!t.disabled&&f(!0)},onDragLeave:l=>{l.preventDefault(),f(!1)},onDrop:l=>{var v;if(l.preventDefault(),f(!1),t.disabled)return;let P=Array.from((v=l.dataTransfer.files)!=null?v:[]);e(P)},children:u}):u}var H=Uo;import $o from"@mui/icons-material/Delete";import Xo from"@mui/material/Box";import Go from"@mui/material/IconButton";import Jo from"@mui/material/List";import Ko from"@mui/material/ListItem";import Yo from"@mui/material/ListItemText";import{jsx as C,jsxs as Qo}from"react/jsx-runtime";function qo(n){var i=n,{files:e,setFiles:o}=i,r=x(i,["files","setFiles"]);function t(a){o(s=>[...s,...a])}let p=c(d({},r),{onFileInput:t});return(p==null?void 0:p.multiple)===void 0&&(p.multiple=!0),Qo(Xo,{children:[C(H,d({},p)),C(Jo,{children:e.map(a=>C(Ko,{secondaryAction:C(Go,{"aria-label":"Delete",edge:"end",onClick:()=>{o(s=>s.filter(f=>f!==a))},children:C($o,{})}),children:C(Yo,{primary:a.name})},a.name))})]})}var Zo=qo;import jo from"@mui/material/Box";import er from"@mui/material/Popover";import{useId as or,useState as rr}from"react";import{jsx as ce,jsxs as ir}from"react/jsx-runtime";function tr({icon:e,onOpen:o,onClose:r,iconProps:n,children:i}){let[t,p]=rr(null),a=!!t,s=or();function f(m){p(m.currentTarget),o&&o()}function u(){p(null),r&&r()}return ir(jo,{children:[ce(e,d({"aria-owns":a?s:void 0,"aria-haspopup":"true",onMouseEnter:f,onMouseLeave:u},n)),ce(er,{id:s,sx:{pointerEvents:"none"},open:a,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:u,disableRestoreFocus:!0,children:i})]})}var nr=tr;import ar from"@mui/material/Link";import{Link as pr}from"react-router-dom";import{jsx as dr}from"react/jsx-runtime";function sr(n){var i=n,{to:e,children:o}=i,r=x(i,["to","children"]);return dr(ar,c(d({component:pr,to:e},r),{children:o}))}var U=sr;import lr from"@mui/material/ListItemButton";import{jsx as ur}from"react/jsx-runtime";function mr(r){var n=r,{children:e}=n,o=x(n,["children"]);return ur(lr,c(d({component:U},o),{children:e}))}var cr=mr;import fr from"@mui/material/CircularProgress";import{jsx as _,jsxs as yr}from"react/jsx-runtime";function xr(a){var s=a,{children:e,errorComponent:o,undefinedComponent:r,nullComponent:n,nullableComponent:i,loadingComponent:t=_(fr,{})}=s,p=x(s,["children","errorComponent","undefinedComponent","nullComponent","nullableComponent","loadingComponent"]);return yr(F,c(d({loadingComponent:t},p),{children:[_(V,{undefinedComponent:r,nullComponent:n,nullableComponent:i,children:o}),_(W,{children:e})]}))}var Pr=xr;import vr from"@mui/material/BottomNavigation";import gr from"@mui/material/BottomNavigationAction";import hr from"@mui/material/Box";import Lr from"@mui/material/Paper";import{useState as Sr}from"react";import{Link as br}from"react-router-dom";import{Fragment as Ir,jsx as O,jsxs as kr}from"react/jsx-runtime";function Cr({children:e,navItems:o}){let[r,n]=Sr("");return kr(Ir,{children:[O(hr,{sx:{paddingBottom:7},children:e}),O(Lr,{sx:{position:"fixed",bottom:0,left:0,right:0},children:O(vr,{showLabels:!0,value:r,onChange:(i,t)=>{n(t)},children:o.map(i=>O(gr,c(d({},i),{component:br}),i.value))})})]})}var wr=Cr;import{truncate as ue}from"@alextheman/utility";import Nr from"@mui/icons-material/ChevronLeft";import Tr from"@mui/icons-material/ChevronRight";import Br from"@mui/icons-material/Menu";import Er from"@mui/material/AppBar";import fe from"@mui/material/Box";import Rr from"@mui/material/CssBaseline";import xe from"@mui/material/Divider";import Or from"@mui/material/Drawer";import Pe from"@mui/material/IconButton";import Dr from"@mui/material/List";import Mr from"@mui/material/ListItem";import Ar from"@mui/material/ListItemButton";import Fr from"@mui/material/ListItemIcon";import Wr from"@mui/material/ListItemText";import{styled as X,useTheme as Vr}from"@mui/material/styles";import zr from"@mui/material/Toolbar";import $ from"@mui/material/Typography";import{Fragment as Hr,useState as Ur}from"react";import{Link as _r,useLocation as $r}from"react-router-dom";import{jsx as y,jsxs as b}from"react/jsx-runtime";var D=240;function ye(e){return{width:D,transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:"hidden"}}function ve(e){return{transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.leavingScreen}),overflowX:"hidden",width:`calc(${e.spacing(7)} + 1px)`,[e.breakpoints.up("sm")]:{width:`calc(${e.spacing(8)} + 1px)`}}}var ge=X("div")(({theme:e})=>d({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Xr=X(Er,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({zIndex:e.zIndex.drawer+1,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.leavingScreen}),variants:[{props:({open:o})=>o,style:{marginLeft:D,width:`calc(100% - ${D}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Gr=X(Or,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:D,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:c(d({},ye(e)),{"& .MuiDrawer-paper":ye(e)})},{props:({open:o})=>!o,style:c(d({},ve(e)),{"& .MuiDrawer-paper":ve(e)})}]}));function Jr({title:e,navItems:o,children:r,headerElements:n}){let i=Vr(),[t,p]=Ur(!0),a=$r();function s(){p(!0)}function f(){p(!1)}return b(fe,{sx:{display:"flex"},children:[y(Rr,{}),y(Xr,{position:"fixed",open:t,children:b(zr,{children:[y(Pe,{color:"inherit","aria-label":"open drawer",onClick:s,edge:"start",sx:[{marginRight:5},t&&{display:"none"}],children:y(Br,{})}),y($,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),b(Gr,{variant:"permanent",open:t,children:[y(ge,{children:y(Pe,{onClick:f,children:i.direction==="rtl"?y(Tr,{}):y(Nr,{})})}),y(xe,{}),o.map(u=>b(Hr,{children:[b(Dr,{children:[y($,{variant:t?"h5":"h6",paddingLeft:t?2:1,children:t?u.category:ue(u.category,4)}),u.options.map(m=>y(Mr,{disablePadding:!0,sx:{display:"block"},children:b(Ar,{sx:[{minHeight:48,px:2.5},t?{justifyContent:"initial"}:{justifyContent:"center"}],component:_r,to:m.to,selected:a.pathname===m.to,children:[y(Fr,{sx:[{minWidth:0,justifyContent:"center"},t?{mr:3}:{mr:"auto"}],children:m.icon?m.icon:t?null:y($,{children:ue(m.label,4)})}),y(Wr,{primary:m.label,sx:[t?{opacity:1}:{opacity:0}]})]})},m.to))]}),y(xe,{})]},u.category))]}),b(fe,{component:"main",sx:{flexGrow:1,p:3},children:[y(ge,{}),r]})]})}var Kr=Jr;import Yr from"@mui/material/Typography";import{Fragment as Qr,jsx as he}from"react/jsx-runtime";function qr(n){var i=n,{text:e,sx:o}=i,r=x(i,["text","sx"]);return he(Qr,{children:e.split(`
2
- `).map((t,p)=>he(Yr,c(d({sx:d({margin:1},o)},r),{children:t}),p))})}var Zr=qr;import G from"@mui/material/Box";import Le from"@mui/material/Typography";import{stripIndent as jr}from"common-tags";import{LiveEditor as et,LiveError as ot,LivePreview as rt,LiveProvider as tt}from"react-live";import{jsx as L,jsxs as Se}from"react/jsx-runtime";function nt(n){var i=n,{code:e,previewStyles:o}=i,r=x(i,["code","previewStyles"]);let{mode:t}=k(),p={backgroundColor:t==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},a=o?d(d({},p),o):d({},p);return L(G,{sx:{borderRadius:1,border:.5,padding:2},children:Se(tt,c(d({},r),{code:jr(e!=null?e:""),children:[L(Le,{variant:"h5",children:"Code"}),L(G,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:L(et,{})}),L("br",{}),L(Le,{variant:"h5",children:"Result"}),Se(G,{sx:a,children:[L(rt,{}),L(ot,{})]})]}))})}var it=nt;import{fillArray as at}from"@alextheman/utility";import pt from"@mui/material/Skeleton";import st from"@mui/material/TableCell";import dt from"@mui/material/TableRow";import{jsx as J}from"react/jsx-runtime";function lt({columns:e}){return J(dt,{children:at(o=>J(st,{children:J(pt,{})},o),e)})}var mt=lt;import ct from"@mui/material/Button";import{useFormContext as ut}from"react-hook-form";import{jsx as Pt}from"react/jsx-runtime";function ft(n){var i=n,{disableClean:e,label:o}=i,r=x(i,["disableClean","label"]);let{formState:{disabled:t,isDirty:p,isSubmitting:a}}=ut();return Pt(ct,c(d({color:"primary",disabled:r.disabled||e&&!p||t,loading:a,type:"submit",variant:"contained"},r),{children:o}))}var xt=ft;import be from"@mui/material/Box";import{styled as yt}from"@mui/material/styles";import vt from"@mui/material/Switch";import{jsx as T}from"react/jsx-runtime";var gt=yt(vt)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function ht(t){var p=t,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:r,uncheckedIconStyles:n}=p,i=x(p,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let a={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},s={color:"black",maxWidth:16.5,maxHeight:16.5};return T(gt,d({checkedIcon:T(be,{sx:a,children:T(e,{style:d(d({},s),o)})}),icon:T(be,{sx:a,children:T(r,{style:d(d({},s),n)})})},i))}var Lt=ht;import{useCallback as Ce,useEffect as St,useState as bt}from"react";function Ct(e){let[o,r]=bt(()=>{let t=window.location.hash.replace("#","");return e&&t===""?e:t}),n=Ce(()=>{let t=window.location.hash.replace("#","");r(e&&t===""?e:t)},[r,e]);St(()=>(window.addEventListener("hashchange",n),()=>{window.removeEventListener("hashchange",n)}),[n]);let i=Ce(t=>{let p=typeof t=="function"?t(o):t;p!==o&&(window.location.hash=p)},[o]);return[o,i]}var wt=Ct;export{Me as CollapsableItem,So as DarkModeToggle,Bo as DropdownMenu,Do as ExternalLink,H as FileInput,Zo as FileInputList,Vo as FileType,nr as IconWithPopover,U as InternalLink,cr as ListItemInternalLink,Pr as Loader,W as LoaderData,V as LoaderError,F as LoaderProvider,Ze as ModeProvider,wr as NavigationBottom,Kr as NavigationDrawer,Zr as PopoverText,it as ReactPlayground,io as ScreenSizeProvider,mt as SkeletonRow,xo as SnackbarProvider,xt as SubmitButton,Lt as SwitchWithIcons,wt as useHash,w as useLoader,k as useMode,to as useScreenSize,uo as useSnackbar};
1
+ var we=Object.defineProperty,Ie=Object.defineProperties;var ke=Object.getOwnPropertyDescriptors;var R=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var Y=(e,o,r)=>o in e?we(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,d=(e,o)=>{for(var r in o||(o={}))q.call(o,r)&&Y(e,r,o[r]);if(R)for(var r of R(o))Z.call(o,r)&&Y(e,r,o[r]);return e},c=(e,o)=>Ie(e,ke(o));var x=(e,o)=>{var r={};for(var n in e)q.call(e,n)&&o.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&R)for(var n of R(e))o.indexOf(n)<0&&Z.call(e,n)&&(r[n]=e[n]);return r};var Q=(e,o,r)=>new Promise((n,i)=>{var t=s=>{try{a(r.next(s))}catch(f){i(f)}},p=s=>{try{a(r.throw(s))}catch(f){i(f)}},a=s=>s.done?n(s.value):Promise.resolve(s.value).then(t,p);a((r=r.apply(e,o)).next())});import Ne from"@mui/icons-material/ArrowDropDown";import Te from"@mui/icons-material/ArrowDropUp";import Re from"@mui/material/Box";import M from"@mui/material/ButtonBase";import Ee from"@mui/material/Collapse";import{useEffect as Be,useState as Oe}from"react";import{jsx as A,jsxs as j}from"react/jsx-runtime";function De({isInitiallyOpen:e,onOpen:o,onClose:r,children:n,buttonStyles:i,buttonContents:t,buttonComponent:p=M,collapseProps:a,openIcon:s=A(Te,{}),closedIcon:f=A(Ne,{}),useDefaultStyling:u=p===M}){let[m,l]=Oe(!!e);return Be(()=>{m&&o?o():!m&&r&&r()},[m]),j(Re,{children:[j(p,{onClick:()=>{l(P=>!P)},sx:u?d({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":p===M?{backgroundColor:"action.hover"}:null},i):i,"aria-expanded":m,children:[t,m?s:f]}),A(Ee,c(d({in:m},a),{children:n}))]})}var Me=De;import yo from"@mui/icons-material/DarkMode";import vo from"@mui/icons-material/LightMode";import go from"@mui/material/IconButton";import ho from"@mui/material/Tooltip";import Ae from"@mui/material/CircularProgress";import{createContext as Fe,useContext as We}from"react";import{jsx as ee}from"react/jsx-runtime";var oe=Fe(void 0);function w({strict:e=!0}={}){let o=We(oe);if(e&&!o)throw new Error("LOADER_PROVIDER_NOT_FOUND");return o}function He(n){var i=n,{children:e,loadingComponent:o=ee(Ae,{})}=i,r=x(i,["children","loadingComponent"]);return ee(oe.Provider,{value:d({loadingComponent:o},r),children:e})}var F=He;import{Fragment as g,jsx as h}from"react/jsx-runtime";function Ve({children:e,dataParser:o,loadingComponent:r,onNullable:n,onUndefined:i,onNull:t}){let{isLoading:p,data:a,dataParser:s,loadingComponent:f,error:u}=w(),m=o!=null?o:s;if(p)return h(g,{children:r!=null?r:f});if(u)return h(g,{});if(a==null){if(n){let l=n();return l!=null?l:h(g,{})}if(a===void 0&&i){let l=i();return l!=null?l:h(g,{})}if(a===null&&t){let l=t();return l!=null?l:h(g,{})}return h(g,{})}return m?typeof e=="function"?h(g,{children:e(m(a))}):h(g,{children:e}):typeof e=="function"?h(g,{children:e(a)}):h(g,{children:e})}var W=Ve;import re from"@mui/material/Alert";import{useRef as ze}from"react";import{Fragment as I,jsx as S}from"react/jsx-runtime";function Ue({errorComponent:e,children:o,undefinedComponent:r,nullComponent:n,nullableComponent:i,logError:t}){var v,K;let{isLoading:p,data:a,error:s,errorComponent:f,logError:u}=w(),m=t!=null?t:u,l=ze(!1),P=(v=o!=null?o:e)!=null?v:f;return s?(m&&!l.current&&(console.error(s),l.current=!0),typeof P=="function"?P(s):P?S(I,{children:P}):S(re,{severity:"error",children:(K=s==null?void 0:s.message)!=null?K:"An unknown error has occured. Please try again later."})):!p&&a==null?i?(m&&!l.current&&(console.error("Data is nullable after loading."),l.current=!0),S(I,{children:i})):a===void 0&&(m&&!l.current&&(console.error("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."),l.current=!0),r)?S(I,{children:r}):a===null&&(m&&!l.current&&(console.error("Data is null after loading."),l.current=!0),n)?S(I,{children:n}):S(re,{severity:"error",children:"Failed to load data. Please try again later."}):S(I,{})}var H=Ue;import _e from"@mui/material/CssBaseline";import{createTheme as $e,ThemeProvider as Xe}from"@mui/material/styles";import{createContext as Ge,useContext as Je,useMemo as Ke,useState as Ye}from"react";import{jsx as te,jsxs as Qe}from"react/jsx-runtime";var ne=Ge({toggleMode:()=>{},mode:"dark"});function k({strict:e=!0}={}){let o=Je(ne);if(e&&!o)throw new Error("MODE_PROVIDER_NOT_FOUND");return o}function qe({children:e,mode:o="dark"}){let[r,n]=Ye(o),i=Ke(()=>$e({palette:{mode:r}}),[r]);return te(ne.Provider,{value:{mode:r,toggleMode:()=>{n(t=>t==="light"?"dark":"light")}},children:Qe(Xe,{theme:i,children:[te(_e,{}),e]})})}var Ze=qe;import{createContext as je,useContext as eo,useEffect as oo,useMemo as ro,useState as ie}from"react";import{jsx as ao}from"react/jsx-runtime";var ae=je({windowWidth:0,windowHeight:0,isLargeScreen:!1});function to({strict:e=!0}={}){let o=eo(ae);if(e&&!o)throw new Error("SCREEN_SIZE_PROVIDER_NOT_FOUND");return o}function no({children:e,largeScreenWidth:o=669,largeScreenHeight:r=660}){let[n,i]=ie(window.innerWidth),[t,p]=ie(window.innerHeight);oo(()=>{function s(){i(window.innerWidth),p(window.innerHeight)}return s(),window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[]);let a=ro(()=>n>o&&t>r,[n,t,o,r]);return ao(ae.Provider,{value:{isLargeScreen:a,windowWidth:n,windowHeight:t},children:e})}var io=no;import{wait as po}from"@alextheman/utility";import so from"@mui/material/Alert";import lo from"@mui/material/Snackbar";import{createContext as mo,useContext as co,useState as E}from"react";import{jsx as pe,jsxs as Po}from"react/jsx-runtime";var se=mo(void 0);function uo({strict:e=!0}={}){let o=co(se);if(e&&!o)throw new Error("SNACKBAR_PROVIDER_NOT_FOUND");return o}function fo({children:e,autoHideDuration:o=5e3}){let[r,n]=E(!1),[i,t]=E(o),[p,a]=E(""),[s,f]=E("info");function u(l,P,v){n(!0),t(v!=null?v:o),f(P!=null?P:"info"),a(l)}function m(){return Q(this,null,function*(){n(!1),yield po(.2),a("")})}return Po(se.Provider,{value:{addSnackbar:u},children:[pe(lo,{open:r,autoHideDuration:i,onClose:m,children:pe(so,{onClose:m,severity:s,children:p})}),e]})}var xo=fo;import{jsx as B}from"react/jsx-runtime";function Lo(){let{mode:e,toggleMode:o}=k();return B(ho,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:B(go,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?B(vo,{}):B(yo,{})})})}var So=Lo;import bo from"@mui/icons-material/ArrowDropDown";import Co from"@mui/icons-material/ArrowDropUp";import de from"@mui/material/Box";import le from"@mui/material/Button";import wo from"@mui/material/Menu";import{useEffect as Io,useMemo as ko,useState as No}from"react";import{jsx as N,jsxs as Eo}from"react/jsx-runtime";function To({children:e,button:o=le,buttonChildren:r="Menu",buttonProps:n,isOpenIcon:i=N(Co,{}),isClosedIcon:t=N(bo,{}),onOpen:p,onClose:a}){let[s,f]=No(null),u=ko(()=>!!s,[s]),m=c(d({},n),{onClick:l=>{f(l.currentTarget)},"aria-controls":u?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":u});return o===le&&(m.endIcon=u?i:t),Io(()=>{u&&p?p():!u&&a&&a()},[u,p,a]),Eo(de,{children:[N(o,c(d({},m),{children:r})),N(wo,{id:"dropdown-menu",anchorEl:s,open:u,onClose:()=>{f(null)},children:typeof e=="function"?N(de,{children:e(()=>{f(null)})}):e})]})}var Ro=To;import Bo from"@mui/material/Link";import{jsx as Mo}from"react/jsx-runtime";function Oo(i){var t=i,{href:e,children:o,ref:r}=t,n=x(t,["href","children","ref"]);return Mo(Bo,c(d({component:"a",href:e,ref:r,target:"_blank",rel:"noopener noreferrer"},n),{children:o}))}var Do=Oo;import Ao from"@mui/icons-material/CloudUpload";import Fo from"@mui/material/Button";import{styled as me}from"@mui/material/styles";import{useState as Wo}from"react";import{jsx as V,jsxs as _o}from"react/jsx-runtime";var Ho={PDF:"application/pdf",PNG:"image/png",JPEG:"image/jpeg",JPG:"image/jpg",XLSX:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",DOCX:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",MP3:"audio/mp3",MP4:"video/mp4",WAV:"audio/wav"},Vo=me("input")({clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:1,overflow:"hidden",position:"absolute",bottom:0,left:0,whiteSpace:"nowrap",width:1}),zo=me("div")(({theme:e,$dragging:o})=>({border:"2px dashed",borderColor:o?e.palette.primary.main:"#ccc",backgroundColor:o?e.palette.action.hover:"transparent",borderRadius:8,padding:"1.5rem",textAlign:"center",transition:"border-color 0.2s",cursor:"pointer"}));function Uo(p){var a=p,{onFileInput:e,label:o="Upload files",multiple:r,accept:n,useDropzone:i}=a,t=x(a,["onFileInput","label","multiple","accept","useDropzone"]);var m;let[s,f]=Wo(!1),u=_o(Fo,c(d({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:l=>{var P;(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),(P=document.getElementById("file-input"))==null||P.click())}},t),{startIcon:(m=t.startIcon)!=null?m:V(Ao,{}),children:[o,V(Vo,{id:"file-input",type:"file",onChange:l=>{var v;let P=l.target;e(Array.from((v=P.files)!=null?v:[])),P.value=""},multiple:r,accept:n==null?void 0:n.join(","),disabled:t.disabled})]}));return i?V(zo,{$dragging:s,onDragOver:l=>{l.preventDefault(),!t.disabled&&f(!0)},onDragLeave:l=>{l.preventDefault(),f(!1)},onDrop:l=>{var v;if(l.preventDefault(),f(!1),t.disabled)return;let P=Array.from((v=l.dataTransfer.files)!=null?v:[]);e(P)},children:u}):u}var z=Uo;import $o from"@mui/icons-material/Delete";import Xo from"@mui/material/Box";import Go from"@mui/material/IconButton";import Jo from"@mui/material/List";import Ko from"@mui/material/ListItem";import Yo from"@mui/material/ListItemText";import{jsx as C,jsxs as Qo}from"react/jsx-runtime";function qo(n){var i=n,{files:e,setFiles:o}=i,r=x(i,["files","setFiles"]);function t(a){o(s=>[...s,...a])}let p=c(d({},r),{onFileInput:t});return(p==null?void 0:p.multiple)===void 0&&(p.multiple=!0),Qo(Xo,{children:[C(z,d({},p)),C(Jo,{children:e.map(a=>C(Ko,{secondaryAction:C(Go,{"aria-label":"Delete",edge:"end",onClick:()=>{o(s=>s.filter(f=>f!==a))},children:C($o,{})}),children:C(Yo,{primary:a.name})},a.name))})]})}var Zo=qo;import jo from"@mui/material/Box";import er from"@mui/material/Popover";import{useId as or,useState as rr}from"react";import{jsx as ce,jsxs as ir}from"react/jsx-runtime";function tr({icon:e,onOpen:o,onClose:r,iconProps:n,children:i}){let[t,p]=rr(null),a=!!t,s=or();function f(m){p(m.currentTarget),o&&o()}function u(){p(null),r&&r()}return ir(jo,{children:[ce(e,d({"aria-owns":a?s:void 0,"aria-haspopup":"true",onMouseEnter:f,onMouseLeave:u},n)),ce(er,{id:s,sx:{pointerEvents:"none"},open:a,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:u,disableRestoreFocus:!0,children:i})]})}var nr=tr;import ar from"@mui/material/Link";import{Link as pr}from"react-router-dom";import{jsx as dr}from"react/jsx-runtime";function sr(i){var t=i,{to:e,children:o,ref:r}=t,n=x(t,["to","children","ref"]);return dr(ar,c(d({component:pr,to:e,ref:r},n),{children:o}))}var U=sr;import lr from"@mui/material/ListItemButton";import{jsx as ur}from"react/jsx-runtime";function mr(r){var n=r,{children:e}=n,o=x(n,["children"]);return ur(lr,c(d({component:U},o),{children:e}))}var cr=mr;import fr from"@mui/material/CircularProgress";import{jsx as _,jsxs as yr}from"react/jsx-runtime";function xr(a){var s=a,{children:e,errorComponent:o,undefinedComponent:r,nullComponent:n,nullableComponent:i,loadingComponent:t=_(fr,{})}=s,p=x(s,["children","errorComponent","undefinedComponent","nullComponent","nullableComponent","loadingComponent"]);return yr(F,c(d({loadingComponent:t},p),{children:[_(H,{undefinedComponent:r,nullComponent:n,nullableComponent:i,children:o}),_(W,{children:e})]}))}var Pr=xr;import vr from"@mui/material/BottomNavigation";import gr from"@mui/material/BottomNavigationAction";import hr from"@mui/material/Box";import Lr from"@mui/material/Paper";import{useState as Sr}from"react";import{Link as br}from"react-router-dom";import{Fragment as Ir,jsx as O,jsxs as kr}from"react/jsx-runtime";function Cr({children:e,navItems:o}){let[r,n]=Sr("");return kr(Ir,{children:[O(hr,{sx:{paddingBottom:7},children:e}),O(Lr,{sx:{position:"fixed",bottom:0,left:0,right:0},children:O(vr,{showLabels:!0,value:r,onChange:(i,t)=>{n(t)},children:o.map(i=>O(gr,c(d({},i),{component:br}),i.value))})})]})}var wr=Cr;import{truncate as ue}from"@alextheman/utility";import Nr from"@mui/icons-material/ChevronLeft";import Tr from"@mui/icons-material/ChevronRight";import Rr from"@mui/icons-material/Menu";import Er from"@mui/material/AppBar";import fe from"@mui/material/Box";import Br from"@mui/material/CssBaseline";import xe from"@mui/material/Divider";import Or from"@mui/material/Drawer";import Pe from"@mui/material/IconButton";import Dr from"@mui/material/List";import Mr from"@mui/material/ListItem";import Ar from"@mui/material/ListItemButton";import Fr from"@mui/material/ListItemIcon";import Wr from"@mui/material/ListItemText";import{styled as X,useTheme as Hr}from"@mui/material/styles";import Vr from"@mui/material/Toolbar";import $ from"@mui/material/Typography";import{Fragment as zr,useState as Ur}from"react";import{Link as _r,useLocation as $r}from"react-router-dom";import{jsx as y,jsxs as b}from"react/jsx-runtime";var D=240;function ye(e){return{width:D,transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:"hidden"}}function ve(e){return{transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.leavingScreen}),overflowX:"hidden",width:`calc(${e.spacing(7)} + 1px)`,[e.breakpoints.up("sm")]:{width:`calc(${e.spacing(8)} + 1px)`}}}var ge=X("div")(({theme:e})=>d({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Xr=X(Er,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({zIndex:e.zIndex.drawer+1,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.leavingScreen}),variants:[{props:({open:o})=>o,style:{marginLeft:D,width:`calc(100% - ${D}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Gr=X(Or,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:D,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:c(d({},ye(e)),{"& .MuiDrawer-paper":ye(e)})},{props:({open:o})=>!o,style:c(d({},ve(e)),{"& .MuiDrawer-paper":ve(e)})}]}));function Jr({title:e,navItems:o,children:r,headerElements:n}){let i=Hr(),[t,p]=Ur(!0),a=$r();function s(){p(!0)}function f(){p(!1)}return b(fe,{sx:{display:"flex"},children:[y(Br,{}),y(Xr,{position:"fixed",open:t,children:b(Vr,{children:[y(Pe,{color:"inherit","aria-label":"open drawer",onClick:s,edge:"start",sx:[{marginRight:5},t&&{display:"none"}],children:y(Rr,{})}),y($,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),b(Gr,{variant:"permanent",open:t,children:[y(ge,{children:y(Pe,{onClick:f,children:i.direction==="rtl"?y(Tr,{}):y(Nr,{})})}),y(xe,{}),o.map(u=>b(zr,{children:[b(Dr,{children:[y($,{variant:t?"h5":"h6",paddingLeft:t?2:1,children:t?u.category:ue(u.category,4)}),u.options.map(m=>y(Mr,{disablePadding:!0,sx:{display:"block"},children:b(Ar,{sx:[{minHeight:48,px:2.5},t?{justifyContent:"initial"}:{justifyContent:"center"}],component:_r,to:m.to,selected:a.pathname===m.to,children:[y(Fr,{sx:[{minWidth:0,justifyContent:"center"},t?{mr:3}:{mr:"auto"}],children:m.icon?m.icon:t?null:y($,{children:ue(m.label,4)})}),y(Wr,{primary:m.label,sx:[t?{opacity:1}:{opacity:0}]})]})},m.to))]}),y(xe,{})]},u.category))]}),b(fe,{component:"main",sx:{flexGrow:1,p:3},children:[y(ge,{}),r]})]})}var Kr=Jr;import Yr from"@mui/material/Typography";import{Fragment as Qr,jsx as he}from"react/jsx-runtime";function qr(n){var i=n,{text:e,sx:o}=i,r=x(i,["text","sx"]);return he(Qr,{children:e.split(`
2
+ `).map((t,p)=>he(Yr,c(d({sx:d({margin:1},o)},r),{children:t}),p))})}var Zr=qr;import G from"@mui/material/Box";import Le from"@mui/material/Typography";import{stripIndent as jr}from"common-tags";import{LiveEditor as et,LiveError as ot,LivePreview as rt,LiveProvider as tt}from"react-live";import{jsx as L,jsxs as Se}from"react/jsx-runtime";function nt(n){var i=n,{code:e,previewStyles:o}=i,r=x(i,["code","previewStyles"]);let{mode:t}=k(),p={backgroundColor:t==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},a=o?d(d({},p),o):d({},p);return L(G,{sx:{borderRadius:1,border:.5,padding:2},children:Se(tt,c(d({},r),{code:jr(e!=null?e:""),children:[L(Le,{variant:"h5",children:"Code"}),L(G,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:L(et,{})}),L("br",{}),L(Le,{variant:"h5",children:"Result"}),Se(G,{sx:a,children:[L(rt,{}),L(ot,{})]})]}))})}var it=nt;import{fillArray as at}from"@alextheman/utility";import pt from"@mui/material/Skeleton";import st from"@mui/material/TableCell";import dt from"@mui/material/TableRow";import{jsx as J}from"react/jsx-runtime";function lt({columns:e}){return J(dt,{children:at(o=>J(st,{children:J(pt,{})},o),e)})}var mt=lt;import ct from"@mui/material/Button";import{useFormContext as ut}from"react-hook-form";import{jsx as Pt}from"react/jsx-runtime";function ft(n){var i=n,{disableClean:e,label:o}=i,r=x(i,["disableClean","label"]);let{formState:{disabled:t,isDirty:p,isSubmitting:a}}=ut();return Pt(ct,c(d({color:"primary",disabled:r.disabled||e&&!p||t,loading:a,type:"submit",variant:"contained"},r),{children:o}))}var xt=ft;import be from"@mui/material/Box";import{styled as yt}from"@mui/material/styles";import vt from"@mui/material/Switch";import{jsx as T}from"react/jsx-runtime";var gt=yt(vt)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function ht(t){var p=t,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:r,uncheckedIconStyles:n}=p,i=x(p,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let a={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},s={color:"black",maxWidth:16.5,maxHeight:16.5};return T(gt,d({checkedIcon:T(be,{sx:a,children:T(e,{style:d(d({},s),o)})}),icon:T(be,{sx:a,children:T(r,{style:d(d({},s),n)})})},i))}var Lt=ht;import{useCallback as Ce,useEffect as St,useState as bt}from"react";function Ct(e){let[o,r]=bt(()=>{let t=window.location.hash.replace("#","");return e&&t===""?e:t}),n=Ce(()=>{let t=window.location.hash.replace("#","");r(e&&t===""?e:t)},[r,e]);St(()=>(window.addEventListener("hashchange",n),()=>{window.removeEventListener("hashchange",n)}),[n]);let i=Ce(t=>{let p=typeof t=="function"?t(o):t;p!==o&&(window.location.hash=p)},[o]);return[o,i]}var wt=Ct;export{Me as CollapsableItem,So as DarkModeToggle,Ro as DropdownMenu,Do as ExternalLink,z as FileInput,Zo as FileInputList,Ho as FileType,nr as IconWithPopover,U as InternalLink,cr as ListItemInternalLink,Pr as Loader,W as LoaderData,H as LoaderError,F as LoaderProvider,Ze as ModeProvider,wr as NavigationBottom,Kr as NavigationDrawer,Zr as PopoverText,it as ReactPlayground,io as ScreenSizeProvider,mt as SkeletonRow,xo as SnackbarProvider,xt as SubmitButton,Lt as SwitchWithIcons,wt as useHash,w as useLoader,k as useMode,to as useScreenSize,uo as useSnackbar};
3
3
  //# sourceMappingURL=index.js.map
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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** The current loading status (true if loading, false if not) */\n isLoading: boolean;\n /** The data being loaded. */\n data?: T;\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<T>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {\n error?: never;\n errorComponent?: never;\n logError?: 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 /** Whether you want to log the error to the console or not. */\n logError?: boolean;\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);\n\nexport function useLoader<T, Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, LoaderContextValue<T>> {\n const context = useContext(LoaderContext);\n if (strict && !context) {\n throw new Error(\"LOADER_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, 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 { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataBaseProps<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: NonNullable<T>) => ReactNode);\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<T>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderDataPropsOnNullable<T> extends LoaderDataBaseProps<T> {\n onUndefined?: never;\n onNull?: never;\n /** A function to run if the data is undefined or null, and not loading. This may either return React components or nothing.\n * @deprecated Please use the nullableComponent prop on LoaderError instead */\n onNullable: () => ReactNode | void;\n}\n\nexport interface LoaderDataPropsOnUndefinedOrNull<T> extends LoaderDataBaseProps<T> {\n /** A function to run if the data is undefined and not loading. This may either return React components or nothing.\n * @deprecated Please use the nullableComponent prop on LoaderError instead */\n onUndefined?: () => ReactNode | void;\n /** A function to run if the data is null and not loading. This may either return React components or nothing.\n * @deprecated Please use the nullableComponent prop on LoaderError instead */\n onNull?: () => ReactNode | void;\n onNullable?: never;\n}\n\nexport type LoaderDataProps<T> = LoaderDataPropsOnUndefinedOrNull<T> | LoaderDataPropsOnNullable<T>;\n\n/** The component responsible for showing the data provided by LoaderProvider. */\nfunction LoaderData<T>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n onNullable,\n onUndefined,\n onNull,\n}: LoaderDataProps<T>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<T>();\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === null || data === undefined) {\n if (onNullable) {\n const result = onNullable();\n return result ?? <></>;\n }\n\n if (data === undefined && onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n\n if (data === null && onNull) {\n const result = onNull();\n return result ?? <></>;\n }\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? <>{children(dataParser(data))}</> : <>{children}</>;\n }\n\n return typeof children === \"function\" ? <>{children(data)}</> : <>{children}</>;\n}\n\nexport default LoaderData;\n","/* eslint-disable react-hooks/refs */\nimport type { ReactNode } from \"react\";\n\nimport Alert from \"@mui/material/Alert\";\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderErrorBaseProps {\n /**\n * The component to show if an error has been thrown.\n * @deprecated Please pass in the content to show on error as children instead.\n */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n /** The component to show if an error has been thrown. */\n children?: ReactNode | ((error: unknown) => ReactNode);\n /** Whether you want to log the error to the console or not. */\n logError?: boolean;\n}\n\nexport interface LoaderErrorPropsWithUndefinedOrNull extends LoaderErrorBaseProps {\n /** The component to show if no error was thrown but data is undefined */\n undefinedComponent?: ReactNode;\n /** The component to show if no error was thrown but data is null */\n nullComponent?: ReactNode;\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\n /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: ReactNode;\n}\n\nexport type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;\n\n/** The component responsible for showing any errors provided by LoaderProvider. */\nfunction LoaderError({\n errorComponent: propsErrorComponent,\n children,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n logError: propsLogError,\n}: LoaderErrorProps) {\n const {\n isLoading,\n data,\n error,\n errorComponent: contextErrorComponent,\n logError: contextLogError,\n } = useLoader();\n const logError = propsLogError ?? contextLogError;\n const warnedOnce = useRef(false);\n\n const errorComponent = children ?? propsErrorComponent ?? contextErrorComponent;\n\n if (error) {\n if (logError && !warnedOnce.current) {\n console.error(error);\n warnedOnce.current = true;\n }\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\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 if (!isLoading && (data === null || data === undefined)) {\n if (nullableComponent) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is nullable after loading.\");\n warnedOnce.current = true;\n }\n return <>{nullableComponent}</>;\n }\n\n if (data === undefined) {\n if (logError && !warnedOnce.current) {\n console.error(\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 (undefinedComponent) {\n return <>{undefinedComponent}</>;\n }\n }\n\n if (data === null) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is null after loading.\");\n warnedOnce.current = true;\n }\n\n if (nullComponent) {\n return <>{nullComponent}</>;\n }\n }\n\n return <Alert severity=\"error\">Failed to load data. Please try again later.</Alert>;\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { PaletteMode } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\n/** @deprecated Please use `PaletteMode` from `@mui/material/styles` instead. */\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeContextValue {\n toggleMode: () => void;\n mode: PaletteMode;\n}\n\nconst ModeContext = createContext<ModeContextValue>({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ModeContextValue> {\n const context = useContext(ModeContext);\n if (strict && !context) {\n throw new Error(\"MODE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: PaletteMode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<PaletteMode>(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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, 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<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ScreenSizeContextValue> {\n const context = useContext(ScreenSizeContext);\n if (strict && !context) {\n throw new Error(\"SCREEN_SIZE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nfunction ScreenSizeProvider({\n children,\n largeScreenWidth = 669,\n largeScreenHeight = 660,\n}: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\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 const isLargeScreen = useMemo(() => {\n return windowWidth > largeScreenWidth && windowHeight > largeScreenHeight;\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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\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);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\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 { LoaderDataProps, LoaderProviderProps } from \"src/providers\";\nimport type { LoaderErrorProps } from \"src/providers/LoaderProvider/LoaderError\";\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 Omit<LoaderErrorProps, \"errorComponent\"> &\n Omit<LoaderDataProps<T>, \"showOnError\" | \"onUndefined\" | \"onNull\" | \"onNullable\">;\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 errorComponent,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n {/* @ts-expect-error: We need to pass all four to LoaderError for the wrapper to work. It is ok as Loader will then do its own checks to enforce mutual exclusivity, and LoaderError knows how to deal with it anyway. */}\n <LoaderError\n undefinedComponent={undefinedComponent}\n nullComponent={nullComponent}\n nullableComponent={nullableComponent}\n >\n {errorComponent}\n </LoaderError>\n <LoaderData<T>>{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\";\nimport type { ComponentProps } from \"react\";\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 extends ComponentProps<typeof LiveProvider> {\n previewStyles?: SxProps<Theme>;\n}\n\nfunction ReactPlayground({ code, previewStyles, ...liveProviderProps }: 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 {...liveProviderProps} code={stripIndent(code ?? \"\")}>\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","strict","context","useContext","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","Fragment","jsx","LoaderData","children","loaderDataParser","loadingComponent","onNullable","onUndefined","onNull","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","dataParser","result","LoaderData_default","Alert","useRef","Fragment","jsx","LoaderError","propsErrorComponent","children","undefinedComponent","nullComponent","nullableComponent","propsLogError","_a","_b","isLoading","data","error","contextErrorComponent","contextLogError","useLoader","logError","warnedOnce","useRef","errorComponent","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","strict","context","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useMemo","useState","jsx","ScreenSizeContext","useScreenSize","strict","context","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","setDimensions","isLargeScreen","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","strict","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","errorComponent","undefinedComponent","nullComponent","nullableComponent","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","_a","_b","code","previewStyles","liveProviderProps","__objRest","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","__spreadProps","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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** The current loading status (true if loading, false if not) */\n isLoading: boolean;\n /** The data being loaded. */\n data?: T;\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<T>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {\n error?: never;\n errorComponent?: never;\n logError?: 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 /** Whether you want to log the error to the console or not. */\n logError?: boolean;\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);\n\nexport function useLoader<T, Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, LoaderContextValue<T>> {\n const context = useContext(LoaderContext);\n if (strict && !context) {\n throw new Error(\"LOADER_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, 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 { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataBaseProps<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: NonNullable<T>) => ReactNode);\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<T>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderDataPropsOnNullable<T> extends LoaderDataBaseProps<T> {\n onUndefined?: never;\n onNull?: never;\n /** A function to run if the data is undefined or null, and not loading. This may either return React components or nothing.\n * @deprecated Please use the nullableComponent prop on LoaderError instead */\n onNullable: () => ReactNode | void;\n}\n\nexport interface LoaderDataPropsOnUndefinedOrNull<T> extends LoaderDataBaseProps<T> {\n /** A function to run if the data is undefined and not loading. This may either return React components or nothing.\n * @deprecated Please use the nullableComponent prop on LoaderError instead */\n onUndefined?: () => ReactNode | void;\n /** A function to run if the data is null and not loading. This may either return React components or nothing.\n * @deprecated Please use the nullableComponent prop on LoaderError instead */\n onNull?: () => ReactNode | void;\n onNullable?: never;\n}\n\nexport type LoaderDataProps<T> = LoaderDataPropsOnUndefinedOrNull<T> | LoaderDataPropsOnNullable<T>;\n\n/** The component responsible for showing the data provided by LoaderProvider. */\nfunction LoaderData<T>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n onNullable,\n onUndefined,\n onNull,\n}: LoaderDataProps<T>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<T>();\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === null || data === undefined) {\n if (onNullable) {\n const result = onNullable();\n return result ?? <></>;\n }\n\n if (data === undefined && onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n\n if (data === null && onNull) {\n const result = onNull();\n return result ?? <></>;\n }\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? <>{children(dataParser(data))}</> : <>{children}</>;\n }\n\n return typeof children === \"function\" ? <>{children(data)}</> : <>{children}</>;\n}\n\nexport default LoaderData;\n","import type { ReactNode } from \"react\";\n\nimport Alert from \"@mui/material/Alert\";\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderErrorBaseProps {\n /**\n * The component to show if an error has been thrown.\n * @deprecated Please pass in the content to show on error as children instead.\n */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n /** The component to show if an error has been thrown. */\n children?: ReactNode | ((error: unknown) => ReactNode);\n /** Whether you want to log the error to the console or not. */\n logError?: boolean;\n}\n\nexport interface LoaderErrorPropsWithUndefinedOrNull extends LoaderErrorBaseProps {\n /** The component to show if no error was thrown but data is undefined */\n undefinedComponent?: ReactNode;\n /** The component to show if no error was thrown but data is null */\n nullComponent?: ReactNode;\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\n /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: ReactNode;\n}\n\nexport type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;\n\n/** The component responsible for showing any errors provided by LoaderProvider. */\nfunction LoaderError({\n errorComponent: propsErrorComponent,\n children,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n logError: propsLogError,\n}: LoaderErrorProps) {\n const {\n isLoading,\n data,\n error,\n errorComponent: contextErrorComponent,\n logError: contextLogError,\n } = useLoader();\n const logError = propsLogError ?? contextLogError;\n const warnedOnce = useRef(false);\n\n const errorComponent = children ?? propsErrorComponent ?? contextErrorComponent;\n\n if (error) {\n if (logError && !warnedOnce.current) {\n console.error(error);\n warnedOnce.current = true;\n }\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\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 if (!isLoading && (data === null || data === undefined)) {\n if (nullableComponent) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is nullable after loading.\");\n warnedOnce.current = true;\n }\n return <>{nullableComponent}</>;\n }\n\n if (data === undefined) {\n if (logError && !warnedOnce.current) {\n console.error(\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 (undefinedComponent) {\n return <>{undefinedComponent}</>;\n }\n }\n\n if (data === null) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is null after loading.\");\n warnedOnce.current = true;\n }\n\n if (nullComponent) {\n return <>{nullComponent}</>;\n }\n }\n\n return <Alert severity=\"error\">Failed to load data. Please try again later.</Alert>;\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { PaletteMode } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\n/** @deprecated Please use `PaletteMode` from `@mui/material/styles` instead. */\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeContextValue {\n toggleMode: () => void;\n mode: PaletteMode;\n}\n\nconst ModeContext = createContext<ModeContextValue>({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ModeContextValue> {\n const context = useContext(ModeContext);\n if (strict && !context) {\n throw new Error(\"MODE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: PaletteMode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<PaletteMode>(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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, 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<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ScreenSizeContextValue> {\n const context = useContext(ScreenSizeContext);\n if (strict && !context) {\n throw new Error(\"SCREEN_SIZE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nfunction ScreenSizeProvider({\n children,\n largeScreenWidth = 669,\n largeScreenHeight = 660,\n}: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\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 const isLargeScreen = useMemo(() => {\n return windowWidth > largeScreenWidth && windowHeight > largeScreenHeight;\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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\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);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\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, Ref } 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}` | (string & {});\n to?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\nfunction ExternalLink({ href, children, ref, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink\n component=\"a\"\n href={href}\n ref={ref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...linkProps}\n >\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, Ref } 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}` | (string & {});\n href?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\nfunction InternalLink({ to, children, ref, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} ref={ref} {...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 { LoaderDataProps, LoaderProviderProps } from \"src/providers\";\nimport type { LoaderErrorProps } from \"src/providers/LoaderProvider/LoaderError\";\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 Omit<LoaderErrorProps, \"errorComponent\" | \"children\"> &\n Omit<LoaderDataProps<T>, \"showOnError\" | \"onUndefined\" | \"onNull\" | \"onNullable\">;\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 errorComponent,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n {/* @ts-expect-error: We need to pass all four to LoaderError for the wrapper to work. It is ok as Loader will then do its own checks to enforce mutual exclusivity, and LoaderError knows how to deal with it anyway. */}\n <LoaderError\n undefinedComponent={undefinedComponent}\n nullComponent={nullComponent}\n nullableComponent={nullableComponent}\n >\n {errorComponent}\n </LoaderError>\n <LoaderData<T>>{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\";\nimport type { ComponentProps } from \"react\";\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 extends ComponentProps<typeof LiveProvider> {\n previewStyles?: SxProps<Theme>;\n}\n\nfunction ReactPlayground({ code, previewStyles, ...liveProviderProps }: 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 {...liveProviderProps} code={stripIndent(code ?? \"\")}>\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","strict","context","useContext","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","Fragment","jsx","LoaderData","children","loaderDataParser","loadingComponent","onNullable","onUndefined","onNull","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","dataParser","result","LoaderData_default","Alert","useRef","Fragment","jsx","LoaderError","propsErrorComponent","children","undefinedComponent","nullComponent","nullableComponent","propsLogError","_a","_b","isLoading","data","error","contextErrorComponent","contextLogError","useLoader","logError","warnedOnce","useRef","errorComponent","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","strict","context","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useMemo","useState","jsx","ScreenSizeContext","useScreenSize","strict","context","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","setDimensions","isLargeScreen","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","strict","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","ref","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","ref","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","errorComponent","undefinedComponent","nullComponent","nullableComponent","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","_a","_b","code","previewStyles","liveProviderProps","__objRest","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","__spreadProps","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"]}