@alextheman/components 5.4.2 → 5.4.3
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.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -3
- package/dist/index.d.ts +8 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var cr=Object.create;var z=Object.defineProperty,ur=Object.defineProperties,fr=Object.getOwnPropertyDescriptor,xr=Object.getOwnPropertyDescriptors,Pr=Object.getOwnPropertyNames,_=Object.getOwnPropertySymbols,vr=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty,Le=Object.prototype.propertyIsEnumerable;var he=(e,o,r)=>o in e?z(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,d=(e,o)=>{for(var r in o||(o={}))se.call(o,r)&&he(e,r,o[r]);if(_)for(var r of _(o))Le.call(o,r)&&he(e,r,o[r]);return e},x=(e,o)=>ur(e,xr(o));var g=(e,o)=>{var r={};for(var n in e)se.call(e,n)&&o.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&_)for(var n of _(e))o.indexOf(n)<0&&Le.call(e,n)&&(r[n]=e[n]);return r};var gr=(e,o)=>{for(var r in o)z(e,r,{get:o[r],enumerable:!0})},be=(e,o,r,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of Pr(o))!se.call(e,i)&&i!==r&&z(e,i,{get:()=>o[i],enumerable:!(n=fr(o,i))||n.enumerable});return e};var a=(e,o,r)=>(r=e!=null?cr(vr(e)):{},be(o||!e||!e.__esModule?z(r,"default",{value:e,enumerable:!0}):r,e)),yr=e=>be(z({},"__esModule",{value:!0}),e);var Se=(e,o,r)=>new Promise((n,i)=>{var t=l=>{try{p(r.next(l))}catch(u){i(u)}},s=l=>{try{p(r.throw(l))}catch(u){i(u)}},p=l=>l.done?n(l.value):Promise.resolve(l.value).then(t,s);p((r=r.apply(e,o)).next())});var qr={};gr(qr,{CollapsableItem:()=>Te,DarkModeToggle:()=>Ye,DropdownMenu:()=>je,ExternalLink:()=>oo,FileInput:()=>j,FileInputList:()=>fo,FileType:()=>io,IconWithPopover:()=>vo,InternalLink:()=>oe,ListItemInternalLink:()=>bo,Loader:()=>Io,LoaderData:()=>q,LoaderError:()=>Q,LoaderProvider:()=>Y,ModeProvider:()=>Me,NavigationBottom:()=>Ro,NavigationDrawer:()=>Ko,PopoverText:()=>qo,ReactPlayground:()=>Zo,ScreenSizeProvider:()=>Fe,SkeletonRow:()=>tr,SnackbarProvider:()=>$e,SubmitButton:()=>ir,SwitchWithIcons:()=>lr,useHash:()=>mr,useLoader:()=>R,useMode:()=>D,useScreenSize:()=>Ae,useSnackbar:()=>Xe});module.exports=yr(qr);var we=a(require("@mui/icons-material/ArrowDropDown"),1),Ie=a(require("@mui/icons-material/ArrowDropUp"),1),Ce=a(require("@mui/material/Box"),1),G=a(require("@mui/material/ButtonBase"),1),ke=a(require("@mui/material/Collapse"),1),J=require("react");var B=require("react/jsx-runtime");function hr({isInitiallyOpen:e,onOpen:o,onClose:r,children:n,buttonStyles:i,buttonContents:t,buttonComponent:s=G.default,collapseProps:p,openIcon:l=(0,B.jsx)(Ie.default,{}),closedIcon:u=(0,B.jsx)(we.default,{}),useDefaultStyling:m=s===G.default}){let[f,c]=(0,J.useState)(!!e);return(0,J.useEffect)(()=>{f&&o?o():!f&&r&&r()},[f]),(0,B.jsxs)(Ce.default,{children:[(0,B.jsxs)(s,{onClick:()=>{c(y=>!y)},sx:m?d({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":s===G.default?{backgroundColor:"action.hover"}:null},i):i,"aria-expanded":f,children:[t,f?l:u]}),(0,B.jsx)(ke.default,x(d({in:f},p),{children:n}))]})}var Te=hr;var _e=a(require("@mui/icons-material/DarkMode"),1),Ge=a(require("@mui/icons-material/LightMode"),1),Je=a(require("@mui/material/IconButton"),1),Ke=a(require("@mui/material/Tooltip"),1);var Ne=a(require("@mui/material/CircularProgress"),1),K=require("react");var de=require("react/jsx-runtime"),Be=(0,K.createContext)(void 0);function R(){let e=(0,K.useContext)(Be);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function Lr(n){var i=n,{children:e,loadingComponent:o=(0,de.jsx)(Ne.default,{})}=i,r=g(i,["children","loadingComponent"]);return(0,de.jsx)(Be.Provider,{value:d({loadingComponent:o},r),children:e})}var Y=Lr;var v=require("react/jsx-runtime");function br({children:e,dataParser:o,loadingComponent:r,onNullable:n,onUndefined:i,onNull:t}){let{isLoading:s,data:p,dataParser:l,loadingComponent:u,error:m}=R(),f=o!=null?o:l;if(s)return(0,v.jsx)(v.Fragment,{children:r!=null?r:u});if(m)return(0,v.jsx)(v.Fragment,{});if(p==null){if(n){let c=n();return c!=null?c:(0,v.jsx)(v.Fragment,{})}if(p===void 0&&i){let c=i();return c!=null?c:(0,v.jsx)(v.Fragment,{})}if(p===null&&t){let c=t();return c!=null?c:(0,v.jsx)(v.Fragment,{})}return(0,v.jsx)(v.Fragment,{})}return f?typeof e=="function"?(0,v.jsx)(v.Fragment,{children:e(f(p))}):(0,v.jsx)(v.Fragment,{children:e}):typeof e=="function"?(0,v.jsx)(v.Fragment,{children:e(p)}):(0,v.jsx)(v.Fragment,{children:e})}var q=br;var le=a(require("@mui/material/Alert"),1),Ee=require("react");var h=require("react/jsx-runtime"),Sr="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.";function wr({errorComponent:e,undefinedComponent:o,nullComponent:r,nullableComponent:n}){var m;let{isLoading:i,data:t,error:s,errorComponent:p}=R(),l=(0,Ee.useRef)(!1),u=e!=null?e:p;return s?typeof u=="function"?u(s):u?(0,h.jsx)(h.Fragment,{children:u}):(0,h.jsx)(le.default,{severity:"error",children:(m=s==null?void 0:s.message)!=null?m:"An unknown error has occured. Please try again later."}):!i&&t==null?n?(0,h.jsx)(h.Fragment,{children:n}):t===void 0&&(l.current||(console.warn(Sr),l.current=!0),o)?(0,h.jsx)(h.Fragment,{children:o}):t===null&&r?(0,h.jsx)(h.Fragment,{children:r}):(0,h.jsx)(le.default,{severity:"error",children:"Failed to load data. Please try again later."}):(0,h.jsx)(h.Fragment,{})}var Q=wr;var Re=a(require("@mui/material/CssBaseline"),1),Z=require("@mui/material/styles"),k=require("react"),U=require("react/jsx-runtime"),De=(0,k.createContext)({toggleMode:()=>{},mode:"dark"});function D(){return(0,k.useContext)(De)}function Ir({children:e,mode:o="dark"}){let[r,n]=(0,k.useState)(o),i=(0,k.useMemo)(()=>(0,Z.createTheme)({palette:{mode:r}}),[r]);return(0,U.jsx)(De.Provider,{value:{mode:r,toggleMode:()=>{n(t=>t==="light"?"dark":"light")}},children:(0,U.jsxs)(Z.ThemeProvider,{theme:i,children:[(0,U.jsx)(Re.default,{}),e]})})}var Me=Ir;var b=require("react"),We=require("react/jsx-runtime"),Oe=(0,b.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ae(){return(0,b.useContext)(Oe)}function Cr({children:e,largeScreenWidth:o,largeScreenHeight:r}){let[n,i]=(0,b.useState)(window.innerWidth),[t,s]=(0,b.useState)(window.innerHeight);function p(m,f,c=669,y=600){return m>c&&f>y}let[l,u]=(0,b.useState)(p(window.innerWidth,window.innerHeight,o,r));return(0,b.useEffect)(()=>{function m(){i(window.innerWidth),s(window.innerHeight)}return m(),window.addEventListener("resize",m),()=>{window.removeEventListener("resize",m)}},[]),(0,b.useEffect)(()=>{u(p(n,t,o,r))},[n,t,o,r]),(0,We.jsx)(Oe.Provider,{value:{isLargeScreen:l,windowWidth:n,windowHeight:t},children:e})}var Fe=Cr;var ze=require("@alextheman/utility"),Ue=a(require("@mui/material/Alert"),1),He=a(require("@mui/material/Snackbar"),1),w=require("react");var H=require("react/jsx-runtime"),Ve=(0,w.createContext)(void 0);function Xe(){let e=(0,w.useContext)(Ve);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function kr({children:e,autoHideDuration:o=5e3}){let[r,n]=(0,w.useState)(!1),[i,t]=(0,w.useState)(o),[s,p]=(0,w.useState)(""),[l,u]=(0,w.useState)("info");function m(c,y,S){n(!0),t(S!=null?S:o),u(y!=null?y:"info"),p(c)}function f(){return Se(this,null,function*(){n(!1),yield(0,ze.wait)(.2),p("")})}return(0,H.jsxs)(Ve.Provider,{value:{addSnackbar:m},children:[(0,H.jsx)(He.default,{open:r,autoHideDuration:i,onClose:f,children:(0,H.jsx)(Ue.default,{onClose:f,severity:l,children:s})}),e]})}var $e=kr;var V=require("react/jsx-runtime");function Tr(){let{mode:e,toggleMode:o}=D();return(0,V.jsx)(Ke.default,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:(0,V.jsx)(Je.default,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?(0,V.jsx)(Ge.default,{}):(0,V.jsx)(_e.default,{})})})}var Ye=Tr;var qe=a(require("@mui/icons-material/ArrowDropDown"),1),Qe=a(require("@mui/icons-material/ArrowDropUp"),1),me=a(require("@mui/material/Box"),1),ce=a(require("@mui/material/Button"),1),Ze=a(require("@mui/material/Menu"),1),M=require("react");var T=require("react/jsx-runtime");function Nr({children:e,button:o=ce.default,buttonChildren:r="Menu",buttonProps:n,isOpenIcon:i=(0,T.jsx)(Qe.default,{}),isClosedIcon:t=(0,T.jsx)(qe.default,{}),onOpen:s,onClose:p}){let[l,u]=(0,M.useState)(null),m=(0,M.useMemo)(()=>!!l,[l]),f=x(d({},n),{onClick:c=>{u(c.currentTarget)},"aria-controls":m?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":m});return o===ce.default&&(f.endIcon=m?i:t),(0,M.useEffect)(()=>{m&&s?s():!m&&p&&p()},[m,s,p]),(0,T.jsxs)(me.default,{children:[(0,T.jsx)(o,x(d({},f),{children:r})),(0,T.jsx)(Ze.default,{id:"dropdown-menu",anchorEl:l,open:m,onClose:()=>{u(null)},children:typeof e=="function"?(0,T.jsx)(me.default,{children:e(()=>{u(null)})}):e})]})}var je=Nr;var eo=a(require("@mui/material/Link"),1);var ro=require("react/jsx-runtime");function Br(n){var i=n,{href:e,children:o}=i,r=g(i,["href","children"]);return(0,ro.jsx)(eo.default,x(d({component:"a",href:e,target:"_blank",rel:"noopener noreferrer"},r),{children:o}))}var oo=Br;var to=a(require("@mui/icons-material/CloudUpload"),1),no=a(require("@mui/material/Button"),1),ue=require("@mui/material/styles"),ao=require("react");var O=require("react/jsx-runtime"),io={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"},Er=(0,ue.styled)("input")({clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:1,overflow:"hidden",position:"absolute",bottom:0,left:0,whiteSpace:"nowrap",width:1}),Rr=(0,ue.styled)("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 Dr(s){var p=s,{onFileInput:e,label:o="Upload files",multiple:r,accept:n,useDropzone:i}=p,t=g(p,["onFileInput","label","multiple","accept","useDropzone"]);var f;let[l,u]=(0,ao.useState)(!1),m=(0,O.jsxs)(no.default,x(d({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:c=>{var y;(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),(y=document.getElementById("file-input"))==null||y.click())}},t),{startIcon:(f=t.startIcon)!=null?f:(0,O.jsx)(to.default,{}),children:[o,(0,O.jsx)(Er,{id:"file-input",type:"file",onChange:c=>{var S;let y=c.target;e(Array.from((S=y.files)!=null?S:[])),y.value=""},multiple:r,accept:n==null?void 0:n.join(","),disabled:t.disabled})]}));return i?(0,O.jsx)(Rr,{$dragging:l,onDragOver:c=>{c.preventDefault(),!t.disabled&&u(!0)},onDragLeave:c=>{c.preventDefault(),u(!1)},onDrop:c=>{var S;if(c.preventDefault(),u(!1),t.disabled)return;let y=Array.from((S=c.dataTransfer.files)!=null?S:[]);e(y)},children:m}):m}var j=Dr;var po=a(require("@mui/icons-material/Delete"),1),so=a(require("@mui/material/Box"),1),lo=a(require("@mui/material/IconButton"),1),mo=a(require("@mui/material/List"),1),co=a(require("@mui/material/ListItem"),1),uo=a(require("@mui/material/ListItemText"),1);var I=require("react/jsx-runtime");function Mr(n){var i=n,{files:e,setFiles:o}=i,r=g(i,["files","setFiles"]);function t(p){o(l=>[...l,...p])}let s=x(d({},r),{onFileInput:t});return(s==null?void 0:s.multiple)===void 0&&(s.multiple=!0),(0,I.jsxs)(so.default,{children:[(0,I.jsx)(j,d({},s)),(0,I.jsx)(mo.default,{children:e.map(p=>(0,I.jsx)(co.default,{secondaryAction:(0,I.jsx)(lo.default,{"aria-label":"Delete",edge:"end",onClick:()=>{o(l=>l.filter(u=>u!==p))},children:(0,I.jsx)(po.default,{})}),children:(0,I.jsx)(uo.default,{primary:p.name})},p.name))})]})}var fo=Mr;var xo=a(require("@mui/material/Box"),1),Po=a(require("@mui/material/Popover"),1),ee=require("react");var X=require("react/jsx-runtime");function Or({icon:e,onOpen:o,onClose:r,iconProps:n,children:i}){let[t,s]=(0,ee.useState)(null),p=!!t,l=(0,ee.useId)();function u(f){s(f.currentTarget),o&&o()}function m(){s(null),r&&r()}return(0,X.jsxs)(xo.default,{children:[(0,X.jsx)(e,d({"aria-owns":p?l:void 0,"aria-haspopup":"true",onMouseEnter:u,onMouseLeave:m},n)),(0,X.jsx)(Po.default,{id:l,sx:{pointerEvents:"none"},open:p,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:m,disableRestoreFocus:!0,children:i})]})}var vo=Or;var go=a(require("@mui/material/Link"),1),yo=require("react-router-dom");var ho=require("react/jsx-runtime");function Ar(n){var i=n,{to:e,children:o}=i,r=g(i,["to","children"]);return(0,ho.jsx)(go.default,x(d({component:yo.Link,to:e},r),{children:o}))}var oe=Ar;var Lo=a(require("@mui/material/ListItemButton"),1);var So=require("react/jsx-runtime");function Fr(r){var n=r,{children:e}=n,o=g(n,["children"]);return(0,So.jsx)(Lo.default,x(d({component:oe},o),{children:e}))}var bo=Fr;var wo=a(require("@mui/material/CircularProgress"),1);var A=require("react/jsx-runtime");function Wr(s){var p=s,{children:e,undefinedComponent:o,nullComponent:r,nullableComponent:n,loadingComponent:i=(0,A.jsx)(wo.default,{})}=p,t=g(p,["children","undefinedComponent","nullComponent","nullableComponent","loadingComponent"]);return(0,A.jsxs)(Y,x(d({loadingComponent:i},t),{children:[(0,A.jsx)(Q,{undefinedComponent:o,nullComponent:r,nullableComponent:n}),(0,A.jsx)(q,{children:e})]}))}var Io=Wr;var Co=a(require("@mui/material/BottomNavigation"),1),ko=a(require("@mui/material/BottomNavigationAction"),1),To=a(require("@mui/material/Box"),1),No=a(require("@mui/material/Paper"),1),Bo=require("react"),Eo=require("react-router-dom");var C=require("react/jsx-runtime");function zr({children:e,navItems:o}){let[r,n]=(0,Bo.useState)("");return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(To.default,{sx:{paddingBottom:7},children:e}),(0,C.jsx)(No.default,{sx:{position:"fixed",bottom:0,left:0,right:0},children:(0,C.jsx)(Co.default,{showLabels:!0,value:r,onChange:(i,t)=>{n(t)},children:o.map(i=>(0,C.jsx)(ko.default,x(d({},i),{component:Eo.Link}),i.value))})})]})}var Ro=zr;var fe=require("@alextheman/utility"),Ao=a(require("@mui/icons-material/ChevronLeft"),1),Fo=a(require("@mui/icons-material/ChevronRight"),1),Wo=a(require("@mui/icons-material/Menu"),1),zo=a(require("@mui/material/AppBar"),1),xe=a(require("@mui/material/Box"),1),Uo=a(require("@mui/material/CssBaseline"),1),Pe=a(require("@mui/material/Divider"),1),Ho=a(require("@mui/material/Drawer"),1),ve=a(require("@mui/material/IconButton"),1),Vo=a(require("@mui/material/List"),1),Xo=a(require("@mui/material/ListItem"),1),$o=a(require("@mui/material/ListItemButton"),1),_o=a(require("@mui/material/ListItemIcon"),1),Go=a(require("@mui/material/ListItemText"),1),F=require("@mui/material/styles"),Jo=a(require("@mui/material/Toolbar"),1),re=a(require("@mui/material/Typography"),1),ne=require("react"),ae=require("react-router-dom");var P=require("react/jsx-runtime"),te=240;function Do(e){return{width:te,transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:"hidden"}}function Mo(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 Oo=(0,F.styled)("div")(({theme:e})=>d({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Ur=(0,F.styled)(zo.default,{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:te,width:`calc(100% - ${te}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Hr=(0,F.styled)(Ho.default,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:te,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:x(d({},Do(e)),{"& .MuiDrawer-paper":Do(e)})},{props:({open:o})=>!o,style:x(d({},Mo(e)),{"& .MuiDrawer-paper":Mo(e)})}]}));function Vr({title:e,navItems:o,children:r,headerElements:n}){let i=(0,F.useTheme)(),[t,s]=(0,ne.useState)(!0),p=(0,ae.useLocation)();function l(){s(!0)}function u(){s(!1)}return(0,P.jsxs)(xe.default,{sx:{display:"flex"},children:[(0,P.jsx)(Uo.default,{}),(0,P.jsx)(Ur,{position:"fixed",open:t,children:(0,P.jsxs)(Jo.default,{children:[(0,P.jsx)(ve.default,{color:"inherit","aria-label":"open drawer",onClick:l,edge:"start",sx:[{marginRight:5},t&&{display:"none"}],children:(0,P.jsx)(Wo.default,{})}),(0,P.jsx)(re.default,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),(0,P.jsxs)(Hr,{variant:"permanent",open:t,children:[(0,P.jsx)(Oo,{children:(0,P.jsx)(ve.default,{onClick:u,children:i.direction==="rtl"?(0,P.jsx)(Fo.default,{}):(0,P.jsx)(Ao.default,{})})}),(0,P.jsx)(Pe.default,{}),o.map(m=>(0,P.jsxs)(ne.Fragment,{children:[(0,P.jsxs)(Vo.default,{children:[(0,P.jsx)(re.default,{variant:t?"h5":"h6",paddingLeft:t?2:1,children:t?m.category:(0,fe.truncate)(m.category,4)}),m.options.map(f=>(0,P.jsx)(Xo.default,{disablePadding:!0,sx:{display:"block"},children:(0,P.jsxs)($o.default,{sx:[{minHeight:48,px:2.5},t?{justifyContent:"initial"}:{justifyContent:"center"}],component:ae.Link,to:f.to,selected:p.pathname===f.to,children:[(0,P.jsx)(_o.default,{sx:[{minWidth:0,justifyContent:"center"},t?{mr:3}:{mr:"auto"}],children:f.icon?f.icon:t?null:(0,P.jsx)(re.default,{children:(0,fe.truncate)(f.label,4)})}),(0,P.jsx)(Go.default,{primary:f.label,sx:[t?{opacity:1}:{opacity:0}]})]})},f.to))]}),(0,P.jsx)(Pe.default,{})]},m.category))]}),(0,P.jsxs)(xe.default,{component:"main",sx:{flexGrow:1,p:3},children:[(0,P.jsx)(Oo,{}),r]})]})}var Ko=Vr;var Yo=a(require("@mui/material/Typography"),1);var $=require("react/jsx-runtime");function Xr(n){var i=n,{text:e,sx:o}=i,r=g(i,["text","sx"]);return(0,$.jsx)($.Fragment,{children:e.split(`
|
|
2
|
-
`).map((t,s)=>(0,$.jsx)(Yo.default,x(d({sx:d({margin:1},o)},r),{children:t}),s))})}var qo=
|
|
1
|
+
"use strict";var cr=Object.create;var z=Object.defineProperty,ur=Object.defineProperties,fr=Object.getOwnPropertyDescriptor,xr=Object.getOwnPropertyDescriptors,Pr=Object.getOwnPropertyNames,_=Object.getOwnPropertySymbols,gr=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty,Le=Object.prototype.propertyIsEnumerable;var he=(e,o,r)=>o in e?z(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,d=(e,o)=>{for(var r in o||(o={}))se.call(o,r)&&he(e,r,o[r]);if(_)for(var r of _(o))Le.call(o,r)&&he(e,r,o[r]);return e},x=(e,o)=>ur(e,xr(o));var v=(e,o)=>{var r={};for(var n in e)se.call(e,n)&&o.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&_)for(var n of _(e))o.indexOf(n)<0&&Le.call(e,n)&&(r[n]=e[n]);return r};var vr=(e,o)=>{for(var r in o)z(e,r,{get:o[r],enumerable:!0})},be=(e,o,r,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let a of Pr(o))!se.call(e,a)&&a!==r&&z(e,a,{get:()=>o[a],enumerable:!(n=fr(o,a))||n.enumerable});return e};var i=(e,o,r)=>(r=e!=null?cr(gr(e)):{},be(o||!e||!e.__esModule?z(r,"default",{value:e,enumerable:!0}):r,e)),yr=e=>be(z({},"__esModule",{value:!0}),e);var Se=(e,o,r)=>new Promise((n,a)=>{var t=l=>{try{p(r.next(l))}catch(f){a(f)}},s=l=>{try{p(r.throw(l))}catch(f){a(f)}},p=l=>l.done?n(l.value):Promise.resolve(l.value).then(t,s);p((r=r.apply(e,o)).next())});var Yr={};vr(Yr,{CollapsableItem:()=>Te,DarkModeToggle:()=>Ye,DropdownMenu:()=>je,ExternalLink:()=>oo,FileInput:()=>j,FileInputList:()=>fo,FileType:()=>io,IconWithPopover:()=>go,InternalLink:()=>oe,ListItemInternalLink:()=>bo,Loader:()=>Io,LoaderData:()=>q,LoaderError:()=>Q,LoaderProvider:()=>Y,ModeProvider:()=>Me,NavigationBottom:()=>Ro,NavigationDrawer:()=>Ko,PopoverText:()=>qo,ReactPlayground:()=>Zo,ScreenSizeProvider:()=>We,SkeletonRow:()=>tr,SnackbarProvider:()=>$e,SubmitButton:()=>ir,SwitchWithIcons:()=>lr,useHash:()=>mr,useLoader:()=>R,useMode:()=>D,useScreenSize:()=>Ae,useSnackbar:()=>Xe});module.exports=yr(Yr);var we=i(require("@mui/icons-material/ArrowDropDown"),1),Ie=i(require("@mui/icons-material/ArrowDropUp"),1),Ce=i(require("@mui/material/Box"),1),G=i(require("@mui/material/ButtonBase"),1),ke=i(require("@mui/material/Collapse"),1),J=require("react");var B=require("react/jsx-runtime");function hr({isInitiallyOpen:e,onOpen:o,onClose:r,children:n,buttonStyles:a,buttonContents:t,buttonComponent:s=G.default,collapseProps:p,openIcon:l=(0,B.jsx)(Ie.default,{}),closedIcon:f=(0,B.jsx)(we.default,{}),useDefaultStyling:u=s===G.default}){let[m,c]=(0,J.useState)(!!e);return(0,J.useEffect)(()=>{m&&o?o():!m&&r&&r()},[m]),(0,B.jsxs)(Ce.default,{children:[(0,B.jsxs)(s,{onClick:()=>{c(y=>!y)},sx:u?d({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":s===G.default?{backgroundColor:"action.hover"}:null},a):a,"aria-expanded":m,children:[t,m?l:f]}),(0,B.jsx)(ke.default,x(d({in:m},p),{children:n}))]})}var Te=hr;var _e=i(require("@mui/icons-material/DarkMode"),1),Ge=i(require("@mui/icons-material/LightMode"),1),Je=i(require("@mui/material/IconButton"),1),Ke=i(require("@mui/material/Tooltip"),1);var Ne=i(require("@mui/material/CircularProgress"),1),K=require("react");var de=require("react/jsx-runtime"),Be=(0,K.createContext)(void 0);function R(){let e=(0,K.useContext)(Be);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function Lr(n){var a=n,{children:e,loadingComponent:o=(0,de.jsx)(Ne.default,{})}=a,r=v(a,["children","loadingComponent"]);return(0,de.jsx)(Be.Provider,{value:d({loadingComponent:o},r),children:e})}var Y=Lr;var g=require("react/jsx-runtime");function br({children:e,dataParser:o,loadingComponent:r,onNullable:n,onUndefined:a,onNull:t}){let{isLoading:s,data:p,dataParser:l,loadingComponent:f,error:u}=R(),m=o!=null?o:l;if(s)return(0,g.jsx)(g.Fragment,{children:r!=null?r:f});if(u)return(0,g.jsx)(g.Fragment,{});if(p==null){if(n){let c=n();return c!=null?c:(0,g.jsx)(g.Fragment,{})}if(p===void 0&&a){let c=a();return c!=null?c:(0,g.jsx)(g.Fragment,{})}if(p===null&&t){let c=t();return c!=null?c:(0,g.jsx)(g.Fragment,{})}return(0,g.jsx)(g.Fragment,{})}return m?typeof e=="function"?(0,g.jsx)(g.Fragment,{children:e(m(p))}):(0,g.jsx)(g.Fragment,{children:e}):typeof e=="function"?(0,g.jsx)(g.Fragment,{children:e(p)}):(0,g.jsx)(g.Fragment,{children:e})}var q=br;var le=i(require("@mui/material/Alert"),1),Ee=require("react");var h=require("react/jsx-runtime");function Sr({errorComponent:e,undefinedComponent:o,nullComponent:r,nullableComponent:n,logError:a}){var y;let{isLoading:t,data:s,error:p,errorComponent:l,logError:f}=R(),u=a!=null?a:f,m=(0,Ee.useRef)(!1),c=e!=null?e:l;return p?(u&&!m.current&&(console.error(p),m.current=!0),typeof c=="function"?c(p):c?(0,h.jsx)(h.Fragment,{children:c}):(0,h.jsx)(le.default,{severity:"error",children:(y=p==null?void 0:p.message)!=null?y:"An unknown error has occured. Please try again later."})):!t&&s==null?n?(u&&!m.current&&(console.error("Data is nullable after loading."),m.current=!0),(0,h.jsx)(h.Fragment,{children:n})):s===void 0&&(u&&!m.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."),m.current=!0),o)?(0,h.jsx)(h.Fragment,{children:o}):s===null&&(u&&!m.current&&(console.error("Data is null after loading."),m.current=!0),r)?(0,h.jsx)(h.Fragment,{children:r}):(0,h.jsx)(le.default,{severity:"error",children:"Failed to load data. Please try again later."}):(0,h.jsx)(h.Fragment,{})}var Q=Sr;var Re=i(require("@mui/material/CssBaseline"),1),Z=require("@mui/material/styles"),k=require("react"),U=require("react/jsx-runtime"),De=(0,k.createContext)({toggleMode:()=>{},mode:"dark"});function D(){return(0,k.useContext)(De)}function wr({children:e,mode:o="dark"}){let[r,n]=(0,k.useState)(o),a=(0,k.useMemo)(()=>(0,Z.createTheme)({palette:{mode:r}}),[r]);return(0,U.jsx)(De.Provider,{value:{mode:r,toggleMode:()=>{n(t=>t==="light"?"dark":"light")}},children:(0,U.jsxs)(Z.ThemeProvider,{theme:a,children:[(0,U.jsx)(Re.default,{}),e]})})}var Me=wr;var b=require("react"),Fe=require("react/jsx-runtime"),Oe=(0,b.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ae(){return(0,b.useContext)(Oe)}function Ir({children:e,largeScreenWidth:o,largeScreenHeight:r}){let[n,a]=(0,b.useState)(window.innerWidth),[t,s]=(0,b.useState)(window.innerHeight);function p(u,m,c=669,y=600){return u>c&&m>y}let[l,f]=(0,b.useState)(p(window.innerWidth,window.innerHeight,o,r));return(0,b.useEffect)(()=>{function u(){a(window.innerWidth),s(window.innerHeight)}return u(),window.addEventListener("resize",u),()=>{window.removeEventListener("resize",u)}},[]),(0,b.useEffect)(()=>{f(p(n,t,o,r))},[n,t,o,r]),(0,Fe.jsx)(Oe.Provider,{value:{isLargeScreen:l,windowWidth:n,windowHeight:t},children:e})}var We=Ir;var ze=require("@alextheman/utility"),Ue=i(require("@mui/material/Alert"),1),He=i(require("@mui/material/Snackbar"),1),w=require("react");var H=require("react/jsx-runtime"),Ve=(0,w.createContext)(void 0);function Xe(){let e=(0,w.useContext)(Ve);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function Cr({children:e,autoHideDuration:o=5e3}){let[r,n]=(0,w.useState)(!1),[a,t]=(0,w.useState)(o),[s,p]=(0,w.useState)(""),[l,f]=(0,w.useState)("info");function u(c,y,S){n(!0),t(S!=null?S:o),f(y!=null?y:"info"),p(c)}function m(){return Se(this,null,function*(){n(!1),yield(0,ze.wait)(.2),p("")})}return(0,H.jsxs)(Ve.Provider,{value:{addSnackbar:u},children:[(0,H.jsx)(He.default,{open:r,autoHideDuration:a,onClose:m,children:(0,H.jsx)(Ue.default,{onClose:m,severity:l,children:s})}),e]})}var $e=Cr;var V=require("react/jsx-runtime");function kr(){let{mode:e,toggleMode:o}=D();return(0,V.jsx)(Ke.default,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:(0,V.jsx)(Je.default,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?(0,V.jsx)(Ge.default,{}):(0,V.jsx)(_e.default,{})})})}var Ye=kr;var qe=i(require("@mui/icons-material/ArrowDropDown"),1),Qe=i(require("@mui/icons-material/ArrowDropUp"),1),me=i(require("@mui/material/Box"),1),ce=i(require("@mui/material/Button"),1),Ze=i(require("@mui/material/Menu"),1),M=require("react");var T=require("react/jsx-runtime");function Tr({children:e,button:o=ce.default,buttonChildren:r="Menu",buttonProps:n,isOpenIcon:a=(0,T.jsx)(Qe.default,{}),isClosedIcon:t=(0,T.jsx)(qe.default,{}),onOpen:s,onClose:p}){let[l,f]=(0,M.useState)(null),u=(0,M.useMemo)(()=>!!l,[l]),m=x(d({},n),{onClick:c=>{f(c.currentTarget)},"aria-controls":u?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":u});return o===ce.default&&(m.endIcon=u?a:t),(0,M.useEffect)(()=>{u&&s?s():!u&&p&&p()},[u,s,p]),(0,T.jsxs)(me.default,{children:[(0,T.jsx)(o,x(d({},m),{children:r})),(0,T.jsx)(Ze.default,{id:"dropdown-menu",anchorEl:l,open:u,onClose:()=>{f(null)},children:typeof e=="function"?(0,T.jsx)(me.default,{children:e(()=>{f(null)})}):e})]})}var je=Tr;var eo=i(require("@mui/material/Link"),1);var ro=require("react/jsx-runtime");function Nr(n){var a=n,{href:e,children:o}=a,r=v(a,["href","children"]);return(0,ro.jsx)(eo.default,x(d({component:"a",href:e,target:"_blank",rel:"noopener noreferrer"},r),{children:o}))}var oo=Nr;var to=i(require("@mui/icons-material/CloudUpload"),1),no=i(require("@mui/material/Button"),1),ue=require("@mui/material/styles"),ao=require("react");var O=require("react/jsx-runtime"),io={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"},Br=(0,ue.styled)("input")({clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:1,overflow:"hidden",position:"absolute",bottom:0,left:0,whiteSpace:"nowrap",width:1}),Er=(0,ue.styled)("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 Rr(s){var p=s,{onFileInput:e,label:o="Upload files",multiple:r,accept:n,useDropzone:a}=p,t=v(p,["onFileInput","label","multiple","accept","useDropzone"]);var m;let[l,f]=(0,ao.useState)(!1),u=(0,O.jsxs)(no.default,x(d({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:c=>{var y;(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),(y=document.getElementById("file-input"))==null||y.click())}},t),{startIcon:(m=t.startIcon)!=null?m:(0,O.jsx)(to.default,{}),children:[o,(0,O.jsx)(Br,{id:"file-input",type:"file",onChange:c=>{var S;let y=c.target;e(Array.from((S=y.files)!=null?S:[])),y.value=""},multiple:r,accept:n==null?void 0:n.join(","),disabled:t.disabled})]}));return a?(0,O.jsx)(Er,{$dragging:l,onDragOver:c=>{c.preventDefault(),!t.disabled&&f(!0)},onDragLeave:c=>{c.preventDefault(),f(!1)},onDrop:c=>{var S;if(c.preventDefault(),f(!1),t.disabled)return;let y=Array.from((S=c.dataTransfer.files)!=null?S:[]);e(y)},children:u}):u}var j=Rr;var po=i(require("@mui/icons-material/Delete"),1),so=i(require("@mui/material/Box"),1),lo=i(require("@mui/material/IconButton"),1),mo=i(require("@mui/material/List"),1),co=i(require("@mui/material/ListItem"),1),uo=i(require("@mui/material/ListItemText"),1);var I=require("react/jsx-runtime");function Dr(n){var a=n,{files:e,setFiles:o}=a,r=v(a,["files","setFiles"]);function t(p){o(l=>[...l,...p])}let s=x(d({},r),{onFileInput:t});return(s==null?void 0:s.multiple)===void 0&&(s.multiple=!0),(0,I.jsxs)(so.default,{children:[(0,I.jsx)(j,d({},s)),(0,I.jsx)(mo.default,{children:e.map(p=>(0,I.jsx)(co.default,{secondaryAction:(0,I.jsx)(lo.default,{"aria-label":"Delete",edge:"end",onClick:()=>{o(l=>l.filter(f=>f!==p))},children:(0,I.jsx)(po.default,{})}),children:(0,I.jsx)(uo.default,{primary:p.name})},p.name))})]})}var fo=Dr;var xo=i(require("@mui/material/Box"),1),Po=i(require("@mui/material/Popover"),1),ee=require("react");var X=require("react/jsx-runtime");function Mr({icon:e,onOpen:o,onClose:r,iconProps:n,children:a}){let[t,s]=(0,ee.useState)(null),p=!!t,l=(0,ee.useId)();function f(m){s(m.currentTarget),o&&o()}function u(){s(null),r&&r()}return(0,X.jsxs)(xo.default,{children:[(0,X.jsx)(e,d({"aria-owns":p?l:void 0,"aria-haspopup":"true",onMouseEnter:f,onMouseLeave:u},n)),(0,X.jsx)(Po.default,{id:l,sx:{pointerEvents:"none"},open:p,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:u,disableRestoreFocus:!0,children:a})]})}var go=Mr;var vo=i(require("@mui/material/Link"),1),yo=require("react-router-dom");var ho=require("react/jsx-runtime");function Or(n){var a=n,{to:e,children:o}=a,r=v(a,["to","children"]);return(0,ho.jsx)(vo.default,x(d({component:yo.Link,to:e},r),{children:o}))}var oe=Or;var Lo=i(require("@mui/material/ListItemButton"),1);var So=require("react/jsx-runtime");function Ar(r){var n=r,{children:e}=n,o=v(n,["children"]);return(0,So.jsx)(Lo.default,x(d({component:oe},o),{children:e}))}var bo=Ar;var wo=i(require("@mui/material/CircularProgress"),1);var A=require("react/jsx-runtime");function Wr(p){var l=p,{children:e,errorComponent:o,undefinedComponent:r,nullComponent:n,nullableComponent:a,loadingComponent:t=(0,A.jsx)(wo.default,{})}=l,s=v(l,["children","errorComponent","undefinedComponent","nullComponent","nullableComponent","loadingComponent"]);return(0,A.jsxs)(Y,x(d({loadingComponent:t},s),{children:[(0,A.jsx)(Q,{errorComponent:o,undefinedComponent:r,nullComponent:n,nullableComponent:a}),(0,A.jsx)(q,{children:e})]}))}var Io=Wr;var Co=i(require("@mui/material/BottomNavigation"),1),ko=i(require("@mui/material/BottomNavigationAction"),1),To=i(require("@mui/material/Box"),1),No=i(require("@mui/material/Paper"),1),Bo=require("react"),Eo=require("react-router-dom");var C=require("react/jsx-runtime");function Fr({children:e,navItems:o}){let[r,n]=(0,Bo.useState)("");return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(To.default,{sx:{paddingBottom:7},children:e}),(0,C.jsx)(No.default,{sx:{position:"fixed",bottom:0,left:0,right:0},children:(0,C.jsx)(Co.default,{showLabels:!0,value:r,onChange:(a,t)=>{n(t)},children:o.map(a=>(0,C.jsx)(ko.default,x(d({},a),{component:Eo.Link}),a.value))})})]})}var Ro=Fr;var fe=require("@alextheman/utility"),Ao=i(require("@mui/icons-material/ChevronLeft"),1),Wo=i(require("@mui/icons-material/ChevronRight"),1),Fo=i(require("@mui/icons-material/Menu"),1),zo=i(require("@mui/material/AppBar"),1),xe=i(require("@mui/material/Box"),1),Uo=i(require("@mui/material/CssBaseline"),1),Pe=i(require("@mui/material/Divider"),1),Ho=i(require("@mui/material/Drawer"),1),ge=i(require("@mui/material/IconButton"),1),Vo=i(require("@mui/material/List"),1),Xo=i(require("@mui/material/ListItem"),1),$o=i(require("@mui/material/ListItemButton"),1),_o=i(require("@mui/material/ListItemIcon"),1),Go=i(require("@mui/material/ListItemText"),1),W=require("@mui/material/styles"),Jo=i(require("@mui/material/Toolbar"),1),re=i(require("@mui/material/Typography"),1),ne=require("react"),ae=require("react-router-dom");var P=require("react/jsx-runtime"),te=240;function Do(e){return{width:te,transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:"hidden"}}function Mo(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 Oo=(0,W.styled)("div")(({theme:e})=>d({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),zr=(0,W.styled)(zo.default,{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:te,width:`calc(100% - ${te}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Ur=(0,W.styled)(Ho.default,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:te,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:x(d({},Do(e)),{"& .MuiDrawer-paper":Do(e)})},{props:({open:o})=>!o,style:x(d({},Mo(e)),{"& .MuiDrawer-paper":Mo(e)})}]}));function Hr({title:e,navItems:o,children:r,headerElements:n}){let a=(0,W.useTheme)(),[t,s]=(0,ne.useState)(!0),p=(0,ae.useLocation)();function l(){s(!0)}function f(){s(!1)}return(0,P.jsxs)(xe.default,{sx:{display:"flex"},children:[(0,P.jsx)(Uo.default,{}),(0,P.jsx)(zr,{position:"fixed",open:t,children:(0,P.jsxs)(Jo.default,{children:[(0,P.jsx)(ge.default,{color:"inherit","aria-label":"open drawer",onClick:l,edge:"start",sx:[{marginRight:5},t&&{display:"none"}],children:(0,P.jsx)(Fo.default,{})}),(0,P.jsx)(re.default,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),(0,P.jsxs)(Ur,{variant:"permanent",open:t,children:[(0,P.jsx)(Oo,{children:(0,P.jsx)(ge.default,{onClick:f,children:a.direction==="rtl"?(0,P.jsx)(Wo.default,{}):(0,P.jsx)(Ao.default,{})})}),(0,P.jsx)(Pe.default,{}),o.map(u=>(0,P.jsxs)(ne.Fragment,{children:[(0,P.jsxs)(Vo.default,{children:[(0,P.jsx)(re.default,{variant:t?"h5":"h6",paddingLeft:t?2:1,children:t?u.category:(0,fe.truncate)(u.category,4)}),u.options.map(m=>(0,P.jsx)(Xo.default,{disablePadding:!0,sx:{display:"block"},children:(0,P.jsxs)($o.default,{sx:[{minHeight:48,px:2.5},t?{justifyContent:"initial"}:{justifyContent:"center"}],component:ae.Link,to:m.to,selected:p.pathname===m.to,children:[(0,P.jsx)(_o.default,{sx:[{minWidth:0,justifyContent:"center"},t?{mr:3}:{mr:"auto"}],children:m.icon?m.icon:t?null:(0,P.jsx)(re.default,{children:(0,fe.truncate)(m.label,4)})}),(0,P.jsx)(Go.default,{primary:m.label,sx:[t?{opacity:1}:{opacity:0}]})]})},m.to))]}),(0,P.jsx)(Pe.default,{})]},u.category))]}),(0,P.jsxs)(xe.default,{component:"main",sx:{flexGrow:1,p:3},children:[(0,P.jsx)(Oo,{}),r]})]})}var Ko=Hr;var Yo=i(require("@mui/material/Typography"),1);var $=require("react/jsx-runtime");function Vr(n){var a=n,{text:e,sx:o}=a,r=v(a,["text","sx"]);return(0,$.jsx)($.Fragment,{children:e.split(`
|
|
2
|
+
`).map((t,s)=>(0,$.jsx)(Yo.default,x(d({sx:d({margin:1},o)},r),{children:t}),s))})}var qo=Vr;var ie=i(require("@mui/material/Box"),1),ve=i(require("@mui/material/Typography"),1),Qo=require("common-tags"),N=require("react-live");var L=require("react/jsx-runtime");function Xr({code:e,scope:o,previewStyles:r,noInline:n,enableTypeScript:a,language:t}){let{mode:s}=D(),p={backgroundColor:s==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},l=r?d(d({},p),r):d({},p);return(0,L.jsx)(ie.default,{sx:{borderRadius:1,border:.5,padding:2},children:(0,L.jsxs)(N.LiveProvider,{code:(0,Qo.stripIndent)(e),scope:o,noInline:n,enableTypeScript:a,language:t,children:[(0,L.jsx)(ve.default,{variant:"h5",children:"Code"}),(0,L.jsx)(ie.default,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:(0,L.jsx)(N.LiveEditor,{})}),(0,L.jsx)("br",{}),(0,L.jsx)(ve.default,{variant:"h5",children:"Result"}),(0,L.jsxs)(ie.default,{sx:l,children:[(0,L.jsx)(N.LivePreview,{}),(0,L.jsx)(N.LiveError,{})]})]})})}var Zo=Xr;var jo=require("@alextheman/utility"),er=i(require("@mui/material/Skeleton"),1),or=i(require("@mui/material/TableCell"),1),rr=i(require("@mui/material/TableRow"),1),pe=require("react/jsx-runtime");function $r({columns:e}){return(0,pe.jsx)(rr.default,{children:(0,jo.fillArray)(o=>(0,pe.jsx)(or.default,{children:(0,pe.jsx)(er.default,{})},o),e)})}var tr=$r;var nr=i(require("@mui/material/Button"),1),ar=require("react-hook-form");var pr=require("react/jsx-runtime");function _r(n){var a=n,{disableClean:e,label:o}=a,r=v(a,["disableClean","label"]);let{formState:{disabled:t,isDirty:s,isSubmitting:p}}=(0,ar.useFormContext)();return(0,pr.jsx)(nr.default,x(d({color:"primary",disabled:r.disabled||e&&!s||t,loading:p,type:"submit",variant:"contained"},r),{children:o}))}var ir=_r;var ye=i(require("@mui/material/Box"),1),sr=require("@mui/material/styles"),dr=i(require("@mui/material/Switch"),1);var F=require("react/jsx-runtime"),Gr=(0,sr.styled)(dr.default)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function Jr(t){var s=t,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:r,uncheckedIconStyles:n}=s,a=v(s,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let p={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},l={color:"black",maxWidth:16.5,maxHeight:16.5};return(0,F.jsx)(Gr,d({checkedIcon:(0,F.jsx)(ye.default,{sx:p,children:(0,F.jsx)(e,{style:d(d({},l),o)})}),icon:(0,F.jsx)(ye.default,{sx:p,children:(0,F.jsx)(r,{style:d(d({},l),n)})})},a))}var lr=Jr;var E=require("react");function Kr(e){let[o,r]=(0,E.useState)(()=>{let t=window.location.hash.replace("#","");return e&&t===""?e:t}),n=(0,E.useCallback)(()=>{let t=window.location.hash.replace("#","");r(e&&t===""?e:t)},[r,e]);(0,E.useEffect)(()=>(window.addEventListener("hashchange",n),()=>{window.removeEventListener("hashchange",n)}),[n]);let a=(0,E.useCallback)(t=>{let s=typeof t=="function"?t(o):t;s!==o&&(window.location.hash=s)},[o]);return[o,a]}var mr=Kr;0&&(module.exports={CollapsableItem,DarkModeToggle,DropdownMenu,ExternalLink,FileInput,FileInputList,FileType,IconWithPopover,InternalLink,ListItemInternalLink,Loader,LoaderData,LoaderError,LoaderProvider,ModeProvider,NavigationBottom,NavigationDrawer,PopoverText,ReactPlayground,ScreenSizeProvider,SkeletonRow,SnackbarProvider,SubmitButton,SwitchWithIcons,useHash,useLoader,useMode,useScreenSize,useSnackbar});
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/CollapsableItem.tsx","../src/components/DarkModeToggle.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["export * from \"src/components\";\nexport * from \"src/hooks\";\nexport * from \"src/providers\";\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\n\nimport { useMode } from \"src/providers\";\n\nfunction DarkModeToggle() {\n const { mode, toggleMode } = useMode();\n\n return (\n <Tooltip title={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}>\n <IconButton\n sx={{ marginLeft: \"auto\" }}\n onClick={toggleMode}\n aria-label={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}\n >\n {mode === \"dark\" ? <LightMode /> : <DarkMode />}\n </IconButton>\n </Tooltip>\n );\n}\n\nexport default DarkModeToggle;\n","import type { ReactNode } from \"react\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** 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}\n\nexport interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {\n /** The error given if the request gave an error. */\n error: unknown;\n /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\n/** A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n */\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { 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 /** The component to show if an error has been thrown. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\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 /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\n nullableComponent?: ReactNode;\n}\n\nexport type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;\n\nconst UNDEFINED_MESSAGE =\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/** The component responsible for showing any errors provided by LoaderProvider. */\nfunction LoaderError({\n errorComponent: propsErrorComponent,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n}: LoaderErrorProps) {\n const { isLoading, data, error, errorComponent: contextErrorComponent } = useLoader();\n const warnedOnce = useRef(false);\n\n const errorComponent = propsErrorComponent ?? contextErrorComponent;\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n if (!isLoading && (data === null || data === undefined)) {\n if (nullableComponent) {\n return <>{nullableComponent}</>;\n }\n\n if (data === undefined) {\n if (!warnedOnce.current) {\n console.warn(UNDEFINED_MESSAGE);\n warnedOnce.current = true;\n }\n\n if (undefinedComponent) {\n return <>{undefinedComponent}</>;\n }\n }\n\n if (data === null && nullComponent) {\n return <>{nullComponent}</>;\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 { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component=\"a\" href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { 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\" | \"errorComponent\"> &\n LoaderErrorProps &\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 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 three 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 <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\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["index_exports","__export","CollapsableItem_default","DarkModeToggle_default","DropdownMenu_default","ExternalLink_default","FileInput_default","FileInputList_default","FileType","IconWithPopover_default","InternalLink_default","ListItemInternalLink_default","Loader_default","LoaderData_default","LoaderError_default","LoaderProvider_default","ModeProvider_default","NavigationBottom_default","NavigationDrawer_default","PopoverText_default","ReactPlayground_default","ScreenSizeProvider_default","SkeletonRow_default","SnackbarProvider_default","SubmitButton_default","SwitchWithIcons_default","useHash_default","useLoader","useMode","useScreenSize","useSnackbar","__toCommonJS","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_ButtonBase","import_Collapse","import_react","import_jsx_runtime","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","import_DarkMode","import_LightMode","import_IconButton","import_Tooltip","import_CircularProgress","import_react","import_jsx_runtime","LoaderContext","useLoader","context","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","import_jsx_runtime","LoaderData","children","loaderDataParser","loadingComponent","onNullable","onUndefined","onNull","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","dataParser","result","LoaderData_default","import_Alert","import_react","import_jsx_runtime","UNDEFINED_MESSAGE","LoaderError","propsErrorComponent","undefinedComponent","nullComponent","nullableComponent","_a","isLoading","data","error","contextErrorComponent","useLoader","warnedOnce","errorComponent","Alert","LoaderError_default","import_CssBaseline","import_styles","import_react","import_jsx_runtime","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","CssBaseline","ModeProvider_default","import_react","import_jsx_runtime","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","import_utility","import_Alert","import_Snackbar","import_react","import_jsx_runtime","SnackbarContext","useSnackbar","context","SnackbarProvider","children","autoHideDuration","open","setOpen","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","Snackbar","Alert","SnackbarProvider_default","import_jsx_runtime","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_Button","import_Menu","import_react","import_jsx_runtime","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","isDropdownOpen","buttonProps","__spreadProps","__spreadValues","event","Box","Menu","DropdownMenu_default","import_Link","import_jsx_runtime","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","import_CloudUpload","import_Button","import_styles","import_react","import_jsx_runtime","FileType","VisuallyHiddenInput","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","import_Delete","import_Box","import_IconButton","import_List","import_ListItem","import_ListItemText","import_jsx_runtime","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","import_Box","import_Popover","import_react","import_jsx_runtime","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","isPopoverOpen","popoverId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","import_Link","import_react_router_dom","import_jsx_runtime","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","import_ListItemButton","import_jsx_runtime","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","import_CircularProgress","import_jsx_runtime","Loader","_a","_b","children","undefinedComponent","nullComponent","nullableComponent","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","import_BottomNavigation","import_BottomNavigationAction","import_Box","import_Paper","import_react","import_react_router_dom","import_jsx_runtime","NavigationBottom","children","navItems","value","setValue","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","NavigationBottom_default","import_utility","import_ChevronLeft","import_ChevronRight","import_Menu","import_AppBar","import_Box","import_CssBaseline","import_Divider","import_Drawer","import_IconButton","import_List","import_ListItem","import_ListItemButton","import_ListItemIcon","import_ListItemText","import_styles","import_Toolbar","import_Typography","import_react","import_react_router_dom","import_jsx_runtime","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","setOpen","location","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","List","option","ListItem","ListItemButton","ListItemIcon","ListItemText","NavigationDrawer_default","import_Typography","import_jsx_runtime","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","import_Box","import_Typography","import_common_tags","import_react_live","import_jsx_runtime","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","Typography","ReactPlayground_default","import_utility","import_Skeleton","import_TableCell","import_TableRow","import_jsx_runtime","SkeletonRow","columns","TableRow","index","TableCell","Skeleton","SkeletonRow_default","import_Button","import_react_hook_form","import_jsx_runtime","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","Button","__spreadProps","__spreadValues","SubmitButton_default","import_Box","import_styles","import_Switch","import_jsx_runtime","StyledSwitch","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","import_react","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/CollapsableItem.tsx","../src/components/DarkModeToggle.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["export * from \"src/components\";\nexport * from \"src/hooks\";\nexport * from \"src/providers\";\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\n\nimport { useMode } from \"src/providers\";\n\nfunction DarkModeToggle() {\n const { mode, toggleMode } = useMode();\n\n return (\n <Tooltip title={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}>\n <IconButton\n sx={{ marginLeft: \"auto\" }}\n onClick={toggleMode}\n aria-label={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}\n >\n {mode === \"dark\" ? <LightMode /> : <DarkMode />}\n </IconButton>\n </Tooltip>\n );\n}\n\nexport default DarkModeToggle;\n","import type { ReactNode } from \"react\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** The 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);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\n/** A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n */\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { 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 /** The component to show if an error has been thrown. */\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 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 /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\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 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 = 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 { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component=\"a\" href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { 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 errorComponent={errorComponent}\n undefinedComponent={undefinedComponent}\n nullComponent={nullComponent}\n nullableComponent={nullableComponent}\n />\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\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["index_exports","__export","CollapsableItem_default","DarkModeToggle_default","DropdownMenu_default","ExternalLink_default","FileInput_default","FileInputList_default","FileType","IconWithPopover_default","InternalLink_default","ListItemInternalLink_default","Loader_default","LoaderData_default","LoaderError_default","LoaderProvider_default","ModeProvider_default","NavigationBottom_default","NavigationDrawer_default","PopoverText_default","ReactPlayground_default","ScreenSizeProvider_default","SkeletonRow_default","SnackbarProvider_default","SubmitButton_default","SwitchWithIcons_default","useHash_default","useLoader","useMode","useScreenSize","useSnackbar","__toCommonJS","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_ButtonBase","import_Collapse","import_react","import_jsx_runtime","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","import_DarkMode","import_LightMode","import_IconButton","import_Tooltip","import_CircularProgress","import_react","import_jsx_runtime","LoaderContext","useLoader","context","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","import_jsx_runtime","LoaderData","children","loaderDataParser","loadingComponent","onNullable","onUndefined","onNull","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","dataParser","result","LoaderData_default","import_Alert","import_react","import_jsx_runtime","LoaderError","propsErrorComponent","undefinedComponent","nullComponent","nullableComponent","propsLogError","_a","isLoading","data","error","contextErrorComponent","contextLogError","useLoader","logError","warnedOnce","errorComponent","Alert","LoaderError_default","import_CssBaseline","import_styles","import_react","import_jsx_runtime","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","CssBaseline","ModeProvider_default","import_react","import_jsx_runtime","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","import_utility","import_Alert","import_Snackbar","import_react","import_jsx_runtime","SnackbarContext","useSnackbar","context","SnackbarProvider","children","autoHideDuration","open","setOpen","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","Snackbar","Alert","SnackbarProvider_default","import_jsx_runtime","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_Button","import_Menu","import_react","import_jsx_runtime","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","isDropdownOpen","buttonProps","__spreadProps","__spreadValues","event","Box","Menu","DropdownMenu_default","import_Link","import_jsx_runtime","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","import_CloudUpload","import_Button","import_styles","import_react","import_jsx_runtime","FileType","VisuallyHiddenInput","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","import_Delete","import_Box","import_IconButton","import_List","import_ListItem","import_ListItemText","import_jsx_runtime","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","import_Box","import_Popover","import_react","import_jsx_runtime","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","isPopoverOpen","popoverId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","import_Link","import_react_router_dom","import_jsx_runtime","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","import_ListItemButton","import_jsx_runtime","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","import_CircularProgress","import_jsx_runtime","Loader","_a","_b","children","errorComponent","undefinedComponent","nullComponent","nullableComponent","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","import_BottomNavigation","import_BottomNavigationAction","import_Box","import_Paper","import_react","import_react_router_dom","import_jsx_runtime","NavigationBottom","children","navItems","value","setValue","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","NavigationBottom_default","import_utility","import_ChevronLeft","import_ChevronRight","import_Menu","import_AppBar","import_Box","import_CssBaseline","import_Divider","import_Drawer","import_IconButton","import_List","import_ListItem","import_ListItemButton","import_ListItemIcon","import_ListItemText","import_styles","import_Toolbar","import_Typography","import_react","import_react_router_dom","import_jsx_runtime","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","setOpen","location","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","List","option","ListItem","ListItemButton","ListItemIcon","ListItemText","NavigationDrawer_default","import_Typography","import_jsx_runtime","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","import_Box","import_Typography","import_common_tags","import_react_live","import_jsx_runtime","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","Typography","ReactPlayground_default","import_utility","import_Skeleton","import_TableCell","import_TableRow","import_jsx_runtime","SkeletonRow","columns","TableRow","index","TableCell","Skeleton","SkeletonRow_default","import_Button","import_react_hook_form","import_jsx_runtime","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","Button","__spreadProps","__spreadValues","SubmitButton_default","import_Box","import_styles","import_Switch","import_jsx_runtime","StyledSwitch","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","import_react","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -112,12 +112,15 @@ interface LoaderProviderBaseProps<T> {
|
|
|
112
112
|
interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {
|
|
113
113
|
error?: never;
|
|
114
114
|
errorComponent?: never;
|
|
115
|
+
logError?: never;
|
|
115
116
|
}
|
|
116
117
|
interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {
|
|
117
118
|
/** The error given if the request gave an error. */
|
|
118
119
|
error: unknown;
|
|
119
120
|
/** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */
|
|
120
121
|
errorComponent?: ReactNode | ((error: unknown) => ReactNode);
|
|
122
|
+
/** Whether you want to log the error to the console or not. */
|
|
123
|
+
logError?: boolean;
|
|
121
124
|
}
|
|
122
125
|
type LoaderContextValue<T> = LoaderProviderPropsWithNoError<T> | LoaderProviderPropsWithError<T>;
|
|
123
126
|
type LoaderProviderProps<T> = LoaderContextValue<T> & {
|
|
@@ -162,6 +165,8 @@ declare function LoaderData<T>({ children, dataParser: loaderDataParser, loading
|
|
|
162
165
|
interface LoaderErrorBaseProps {
|
|
163
166
|
/** The component to show if an error has been thrown. */
|
|
164
167
|
errorComponent?: ReactNode | ((error: unknown) => ReactNode);
|
|
168
|
+
/** Whether you want to log the error to the console or not. */
|
|
169
|
+
logError?: boolean;
|
|
165
170
|
}
|
|
166
171
|
interface LoaderErrorPropsWithUndefinedOrNull extends LoaderErrorBaseProps {
|
|
167
172
|
/** The component to show if no error was thrown but data is undefined */
|
|
@@ -178,7 +183,7 @@ interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {
|
|
|
178
183
|
}
|
|
179
184
|
type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;
|
|
180
185
|
/** The component responsible for showing any errors provided by LoaderProvider. */
|
|
181
|
-
declare function LoaderError({ errorComponent: propsErrorComponent, undefinedComponent, nullComponent, nullableComponent, }: LoaderErrorProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
186
|
+
declare function LoaderError({ errorComponent: propsErrorComponent, undefinedComponent, nullComponent, nullableComponent, logError: propsLogError, }: LoaderErrorProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
182
187
|
|
|
183
188
|
declare function useMode(): {
|
|
184
189
|
toggleMode: () => void;
|
|
@@ -214,11 +219,11 @@ interface SnackbarContextValue {
|
|
|
214
219
|
declare function useSnackbar(): SnackbarContextValue;
|
|
215
220
|
declare function SnackbarProvider({ children, autoHideDuration }: SnackbarProviderProps): react_jsx_runtime.JSX.Element;
|
|
216
221
|
|
|
217
|
-
type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"
|
|
222
|
+
type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"> & Omit<LoaderErrorProps, "errorComponent"> & Omit<LoaderDataProps<T>, "showOnError" | "onUndefined" | "onNull" | "onNullable">;
|
|
218
223
|
/** An in-line component that deals with state management when fetching data from an API.
|
|
219
224
|
* This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.
|
|
220
225
|
*/
|
|
221
|
-
declare function Loader<T>({ children, undefinedComponent, nullComponent, nullableComponent, loadingComponent, ...loaderProviderProps }: LoaderProps<T>): react_jsx_runtime.JSX.Element;
|
|
226
|
+
declare function Loader<T>({ children, errorComponent, undefinedComponent, nullComponent, nullableComponent, loadingComponent, ...loaderProviderProps }: LoaderProps<T>): react_jsx_runtime.JSX.Element;
|
|
222
227
|
|
|
223
228
|
interface NavItemBottom {
|
|
224
229
|
value: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -112,12 +112,15 @@ interface LoaderProviderBaseProps<T> {
|
|
|
112
112
|
interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {
|
|
113
113
|
error?: never;
|
|
114
114
|
errorComponent?: never;
|
|
115
|
+
logError?: never;
|
|
115
116
|
}
|
|
116
117
|
interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {
|
|
117
118
|
/** The error given if the request gave an error. */
|
|
118
119
|
error: unknown;
|
|
119
120
|
/** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */
|
|
120
121
|
errorComponent?: ReactNode | ((error: unknown) => ReactNode);
|
|
122
|
+
/** Whether you want to log the error to the console or not. */
|
|
123
|
+
logError?: boolean;
|
|
121
124
|
}
|
|
122
125
|
type LoaderContextValue<T> = LoaderProviderPropsWithNoError<T> | LoaderProviderPropsWithError<T>;
|
|
123
126
|
type LoaderProviderProps<T> = LoaderContextValue<T> & {
|
|
@@ -162,6 +165,8 @@ declare function LoaderData<T>({ children, dataParser: loaderDataParser, loading
|
|
|
162
165
|
interface LoaderErrorBaseProps {
|
|
163
166
|
/** The component to show if an error has been thrown. */
|
|
164
167
|
errorComponent?: ReactNode | ((error: unknown) => ReactNode);
|
|
168
|
+
/** Whether you want to log the error to the console or not. */
|
|
169
|
+
logError?: boolean;
|
|
165
170
|
}
|
|
166
171
|
interface LoaderErrorPropsWithUndefinedOrNull extends LoaderErrorBaseProps {
|
|
167
172
|
/** The component to show if no error was thrown but data is undefined */
|
|
@@ -178,7 +183,7 @@ interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {
|
|
|
178
183
|
}
|
|
179
184
|
type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;
|
|
180
185
|
/** The component responsible for showing any errors provided by LoaderProvider. */
|
|
181
|
-
declare function LoaderError({ errorComponent: propsErrorComponent, undefinedComponent, nullComponent, nullableComponent, }: LoaderErrorProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
186
|
+
declare function LoaderError({ errorComponent: propsErrorComponent, undefinedComponent, nullComponent, nullableComponent, logError: propsLogError, }: LoaderErrorProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
|
|
182
187
|
|
|
183
188
|
declare function useMode(): {
|
|
184
189
|
toggleMode: () => void;
|
|
@@ -214,11 +219,11 @@ interface SnackbarContextValue {
|
|
|
214
219
|
declare function useSnackbar(): SnackbarContextValue;
|
|
215
220
|
declare function SnackbarProvider({ children, autoHideDuration }: SnackbarProviderProps): react_jsx_runtime.JSX.Element;
|
|
216
221
|
|
|
217
|
-
type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"
|
|
222
|
+
type LoaderProps<T> = Omit<LoaderProviderProps<T>, "children"> & Omit<LoaderErrorProps, "errorComponent"> & Omit<LoaderDataProps<T>, "showOnError" | "onUndefined" | "onNull" | "onNullable">;
|
|
218
223
|
/** An in-line component that deals with state management when fetching data from an API.
|
|
219
224
|
* This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.
|
|
220
225
|
*/
|
|
221
|
-
declare function Loader<T>({ children, undefinedComponent, nullComponent, nullableComponent, loadingComponent, ...loaderProviderProps }: LoaderProps<T>): react_jsx_runtime.JSX.Element;
|
|
226
|
+
declare function Loader<T>({ children, errorComponent, undefinedComponent, nullComponent, nullableComponent, loadingComponent, ...loaderProviderProps }: LoaderProps<T>): react_jsx_runtime.JSX.Element;
|
|
222
227
|
|
|
223
228
|
interface NavItemBottom {
|
|
224
229
|
value: string;
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var Ie=Object.defineProperty,Ce=Object.defineProperties;var ke=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,Q=Object.prototype.propertyIsEnumerable;var Y=(e,o,r)=>o in e?Ie(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,s=(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))Q.call(o,r)&&Y(e,r,o[r]);return e},f=(e,o)=>Ce(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&&Q.call(e,n)&&(r[n]=e[n]);return r};var Z=(e,o,r)=>new Promise((n,a)=>{var t=d=>{try{i(r.next(d))}catch(c){a(c)}},p=d=>{try{i(r.throw(d))}catch(c){a(c)}},i=d=>d.done?n(d.value):Promise.resolve(d.value).then(t,p);i((r=r.apply(e,o)).next())});import Te from"@mui/icons-material/ArrowDropDown";import Ne from"@mui/icons-material/ArrowDropUp";import Be from"@mui/material/Box";import O from"@mui/material/ButtonBase";import Ee from"@mui/material/Collapse";import{useEffect as Re,useState as De}from"react";import{jsx as A,jsxs as j}from"react/jsx-runtime";function Me({isInitiallyOpen:e,onOpen:o,onClose:r,children:n,buttonStyles:a,buttonContents:t,buttonComponent:p=O,collapseProps:i,openIcon:d=A(Ne,{}),closedIcon:c=A(Te,{}),useDefaultStyling:l=p===O}){let[u,m]=De(!!e);return Re(()=>{u&&o?o():!u&&r&&r()},[u]),j(Be,{children:[j(p,{onClick:()=>{m(v=>!v)},sx:l?s({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":p===O?{backgroundColor:"action.hover"}:null},a):a,"aria-expanded":u,children:[t,u?d:c]}),A(Ee,f(s({in:u},i),{children:n}))]})}var Oe=Me;import Po from"@mui/icons-material/DarkMode";import vo from"@mui/icons-material/LightMode";import go from"@mui/material/IconButton";import yo 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 I(){let e=We(oe);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function ze(n){var a=n,{children:e,loadingComponent:o=ee(Ae,{})}=a,r=x(a,["children","loadingComponent"]);return ee(oe.Provider,{value:s({loadingComponent:o},r),children:e})}var F=ze;import{Fragment as g,jsx as y}from"react/jsx-runtime";function Ue({children:e,dataParser:o,loadingComponent:r,onNullable:n,onUndefined:a,onNull:t}){let{isLoading:p,data:i,dataParser:d,loadingComponent:c,error:l}=I(),u=o!=null?o:d;if(p)return y(g,{children:r!=null?r:c});if(l)return y(g,{});if(i==null){if(n){let m=n();return m!=null?m:y(g,{})}if(i===void 0&&a){let m=a();return m!=null?m:y(g,{})}if(i===null&&t){let m=t();return m!=null?m:y(g,{})}return y(g,{})}return u?typeof e=="function"?y(g,{children:e(u(i))}):y(g,{children:e}):typeof e=="function"?y(g,{children:e(i)}):y(g,{children:e})}var W=Ue;import re from"@mui/material/Alert";import{useRef as He}from"react";import{Fragment as C,jsx as b}from"react/jsx-runtime";var Ve="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.";function Xe({errorComponent:e,undefinedComponent:o,nullComponent:r,nullableComponent:n}){var l;let{isLoading:a,data:t,error:p,errorComponent:i}=I(),d=He(!1),c=e!=null?e:i;return p?typeof c=="function"?c(p):c?b(C,{children:c}):b(re,{severity:"error",children:(l=p==null?void 0:p.message)!=null?l:"An unknown error has occured. Please try again later."}):!a&&t==null?n?b(C,{children:n}):t===void 0&&(d.current||(console.warn(Ve),d.current=!0),o)?b(C,{children:o}):t===null&&r?b(C,{children:r}):b(re,{severity:"error",children:"Failed to load data. Please try again later."}):b(C,{})}var z=Xe;import $e from"@mui/material/CssBaseline";import{createTheme as _e,ThemeProvider as Ge}from"@mui/material/styles";import{createContext as Je,useContext as Ke,useMemo as Ye,useState as qe}from"react";import{jsx as te,jsxs as je}from"react/jsx-runtime";var ne=Je({toggleMode:()=>{},mode:"dark"});function k(){return Ke(ne)}function Qe({children:e,mode:o="dark"}){let[r,n]=qe(o),a=Ye(()=>_e({palette:{mode:r}}),[r]);return te(ne.Provider,{value:{mode:r,toggleMode:()=>{n(t=>t==="light"?"dark":"light")}},children:je(Ge,{theme:a,children:[te($e,{}),e]})})}var Ze=Qe;import{createContext as eo,useContext as oo,useEffect as ae,useState as U}from"react";import{jsx as ao}from"react/jsx-runtime";var ie=eo({windowWidth:0,windowHeight:0,isLargeScreen:!1});function ro(){return oo(ie)}function to({children:e,largeScreenWidth:o,largeScreenHeight:r}){let[n,a]=U(window.innerWidth),[t,p]=U(window.innerHeight);function i(l,u,m=669,v=600){return l>m&&u>v}let[d,c]=U(i(window.innerWidth,window.innerHeight,o,r));return ae(()=>{function l(){a(window.innerWidth),p(window.innerHeight)}return l(),window.addEventListener("resize",l),()=>{window.removeEventListener("resize",l)}},[]),ae(()=>{c(i(n,t,o,r))},[n,t,o,r]),ao(ie.Provider,{value:{isLargeScreen:d,windowWidth:n,windowHeight:t},children:e})}var no=to;import{wait as io}from"@alextheman/utility";import po from"@mui/material/Alert";import so from"@mui/material/Snackbar";import{createContext as lo,useContext as mo,useState as E}from"react";import{jsx as pe,jsxs as xo}from"react/jsx-runtime";var se=lo(void 0);function co(){let e=mo(se);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function uo({children:e,autoHideDuration:o=5e3}){let[r,n]=E(!1),[a,t]=E(o),[p,i]=E(""),[d,c]=E("info");function l(m,v,h){n(!0),t(h!=null?h:o),c(v!=null?v:"info"),i(m)}function u(){return Z(this,null,function*(){n(!1),yield io(.2),i("")})}return xo(se.Provider,{value:{addSnackbar:l},children:[pe(so,{open:r,autoHideDuration:a,onClose:u,children:pe(po,{onClose:u,severity:d,children:p})}),e]})}var fo=uo;import{jsx as R}from"react/jsx-runtime";function ho(){let{mode:e,toggleMode:o}=k();return R(yo,{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(Po,{})})})}var Lo=ho;import bo from"@mui/icons-material/ArrowDropDown";import So 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 Co,useState as ko}from"react";import{jsx as T,jsxs as Bo}from"react/jsx-runtime";function To({children:e,button:o=le,buttonChildren:r="Menu",buttonProps:n,isOpenIcon:a=T(So,{}),isClosedIcon:t=T(bo,{}),onOpen:p,onClose:i}){let[d,c]=ko(null),l=Co(()=>!!d,[d]),u=f(s({},n),{onClick:m=>{c(m.currentTarget)},"aria-controls":l?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":l});return o===le&&(u.endIcon=l?a:t),Io(()=>{l&&p?p():!l&&i&&i()},[l,p,i]),Bo(de,{children:[T(o,f(s({},u),{children:r})),T(wo,{id:"dropdown-menu",anchorEl:d,open:l,onClose:()=>{c(null)},children:typeof e=="function"?T(de,{children:e(()=>{c(null)})}):e})]})}var No=To;import Eo from"@mui/material/Link";import{jsx as Mo}from"react/jsx-runtime";function Ro(n){var a=n,{href:e,children:o}=a,r=x(a,["href","children"]);return Mo(Eo,f(s({component:"a",href:e,target:"_blank",rel:"noopener noreferrer"},r),{children:o}))}var Do=Ro;import Oo from"@mui/icons-material/CloudUpload";import Ao from"@mui/material/Button";import{styled as me}from"@mui/material/styles";import{useState as Fo}from"react";import{jsx as H,jsxs as Vo}from"react/jsx-runtime";var Wo={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}),Uo=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 Ho(p){var i=p,{onFileInput:e,label:o="Upload files",multiple:r,accept:n,useDropzone:a}=i,t=x(i,["onFileInput","label","multiple","accept","useDropzone"]);var u;let[d,c]=Fo(!1),l=Vo(Ao,f(s({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:m=>{var v;(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),(v=document.getElementById("file-input"))==null||v.click())}},t),{startIcon:(u=t.startIcon)!=null?u:H(Oo,{}),children:[o,H(zo,{id:"file-input",type:"file",onChange:m=>{var h;let v=m.target;e(Array.from((h=v.files)!=null?h:[])),v.value=""},multiple:r,accept:n==null?void 0:n.join(","),disabled:t.disabled})]}));return a?H(Uo,{$dragging:d,onDragOver:m=>{m.preventDefault(),!t.disabled&&c(!0)},onDragLeave:m=>{m.preventDefault(),c(!1)},onDrop:m=>{var h;if(m.preventDefault(),c(!1),t.disabled)return;let v=Array.from((h=m.dataTransfer.files)!=null?h:[]);e(v)},children:l}):l}var V=Ho;import Xo from"@mui/icons-material/Delete";import $o from"@mui/material/Box";import _o from"@mui/material/IconButton";import Go from"@mui/material/List";import Jo from"@mui/material/ListItem";import Ko from"@mui/material/ListItemText";import{jsx as w,jsxs as Qo}from"react/jsx-runtime";function Yo(n){var a=n,{files:e,setFiles:o}=a,r=x(a,["files","setFiles"]);function t(i){o(d=>[...d,...i])}let p=f(s({},r),{onFileInput:t});return(p==null?void 0:p.multiple)===void 0&&(p.multiple=!0),Qo($o,{children:[w(V,s({},p)),w(Go,{children:e.map(i=>w(Jo,{secondaryAction:w(_o,{"aria-label":"Delete",edge:"end",onClick:()=>{o(d=>d.filter(c=>c!==i))},children:w(Xo,{})}),children:w(Ko,{primary:i.name})},i.name))})]})}var qo=Yo;import Zo from"@mui/material/Box";import jo from"@mui/material/Popover";import{useId as er,useState as or}from"react";import{jsx as ce,jsxs as nr}from"react/jsx-runtime";function rr({icon:e,onOpen:o,onClose:r,iconProps:n,children:a}){let[t,p]=or(null),i=!!t,d=er();function c(u){p(u.currentTarget),o&&o()}function l(){p(null),r&&r()}return nr(Zo,{children:[ce(e,s({"aria-owns":i?d:void 0,"aria-haspopup":"true",onMouseEnter:c,onMouseLeave:l},n)),ce(jo,{id:d,sx:{pointerEvents:"none"},open:i,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:l,disableRestoreFocus:!0,children:a})]})}var tr=rr;import ar from"@mui/material/Link";import{Link as ir}from"react-router-dom";import{jsx as sr}from"react/jsx-runtime";function pr(n){var a=n,{to:e,children:o}=a,r=x(a,["to","children"]);return sr(ar,f(s({component:ir,to:e},r),{children:o}))}var X=pr;import dr from"@mui/material/ListItemButton";import{jsx as cr}from"react/jsx-runtime";function lr(r){var n=r,{children:e}=n,o=x(n,["children"]);return cr(dr,f(s({component:X},o),{children:e}))}var mr=lr;import ur from"@mui/material/CircularProgress";import{jsx as $,jsxs as Pr}from"react/jsx-runtime";function fr(p){var i=p,{children:e,undefinedComponent:o,nullComponent:r,nullableComponent:n,loadingComponent:a=$(ur,{})}=i,t=x(i,["children","undefinedComponent","nullComponent","nullableComponent","loadingComponent"]);return Pr(F,f(s({loadingComponent:a},t),{children:[$(z,{undefinedComponent:o,nullComponent:r,nullableComponent:n}),$(W,{children:e})]}))}var xr=fr;import vr from"@mui/material/BottomNavigation";import gr from"@mui/material/BottomNavigationAction";import yr from"@mui/material/Box";import hr from"@mui/material/Paper";import{useState as Lr}from"react";import{Link as br}from"react-router-dom";import{Fragment as Ir,jsx as D,jsxs as Cr}from"react/jsx-runtime";function Sr({children:e,navItems:o}){let[r,n]=Lr("");return Cr(Ir,{children:[D(yr,{sx:{paddingBottom:7},children:e}),D(hr,{sx:{position:"fixed",bottom:0,left:0,right:0},children:D(vr,{showLabels:!0,value:r,onChange:(a,t)=>{n(t)},children:o.map(a=>D(gr,f(s({},a),{component:br}),a.value))})})]})}var wr=Sr;import{truncate as ue}from"@alextheman/utility";import kr from"@mui/icons-material/ChevronLeft";import Tr from"@mui/icons-material/ChevronRight";import Nr from"@mui/icons-material/Menu";import Br from"@mui/material/AppBar";import fe from"@mui/material/Box";import Er from"@mui/material/CssBaseline";import xe from"@mui/material/Divider";import Rr from"@mui/material/Drawer";import Pe from"@mui/material/IconButton";import Dr from"@mui/material/List";import Mr from"@mui/material/ListItem";import Or from"@mui/material/ListItemButton";import Ar from"@mui/material/ListItemIcon";import Fr from"@mui/material/ListItemText";import{styled as G,useTheme as Wr}from"@mui/material/styles";import zr from"@mui/material/Toolbar";import _ from"@mui/material/Typography";import{Fragment as Ur,useState as Hr}from"react";import{Link as Vr,useLocation as Xr}from"react-router-dom";import{jsx as P,jsxs as S}from"react/jsx-runtime";var M=240;function ve(e){return{width:M,transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:"hidden"}}function ge(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 ye=G("div")(({theme:e})=>s({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),$r=G(Br,{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:M,width:`calc(100% - ${M}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),_r=G(Rr,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:M,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:f(s({},ve(e)),{"& .MuiDrawer-paper":ve(e)})},{props:({open:o})=>!o,style:f(s({},ge(e)),{"& .MuiDrawer-paper":ge(e)})}]}));function Gr({title:e,navItems:o,children:r,headerElements:n}){let a=Wr(),[t,p]=Hr(!0),i=Xr();function d(){p(!0)}function c(){p(!1)}return S(fe,{sx:{display:"flex"},children:[P(Er,{}),P($r,{position:"fixed",open:t,children:S(zr,{children:[P(Pe,{color:"inherit","aria-label":"open drawer",onClick:d,edge:"start",sx:[{marginRight:5},t&&{display:"none"}],children:P(Nr,{})}),P(_,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),S(_r,{variant:"permanent",open:t,children:[P(ye,{children:P(Pe,{onClick:c,children:a.direction==="rtl"?P(Tr,{}):P(kr,{})})}),P(xe,{}),o.map(l=>S(Ur,{children:[S(Dr,{children:[P(_,{variant:t?"h5":"h6",paddingLeft:t?2:1,children:t?l.category:ue(l.category,4)}),l.options.map(u=>P(Mr,{disablePadding:!0,sx:{display:"block"},children:S(Or,{sx:[{minHeight:48,px:2.5},t?{justifyContent:"initial"}:{justifyContent:"center"}],component:Vr,to:u.to,selected:i.pathname===u.to,children:[P(Ar,{sx:[{minWidth:0,justifyContent:"center"},t?{mr:3}:{mr:"auto"}],children:u.icon?u.icon:t?null:P(_,{children:ue(u.label,4)})}),P(Fr,{primary:u.label,sx:[t?{opacity:1}:{opacity:0}]})]})},u.to))]}),P(xe,{})]},l.category))]}),S(fe,{component:"main",sx:{flexGrow:1,p:3},children:[P(ye,{}),r]})]})}var Jr=Gr;import Kr from"@mui/material/Typography";import{Fragment as Qr,jsx as he}from"react/jsx-runtime";function Yr(n){var a=n,{text:e,sx:o}=a,r=x(a,["text","sx"]);return he(Qr,{children:e.split(`
|
|
2
|
-
`).map((t,p)=>he(
|
|
1
|
+
var Ie=Object.defineProperty,Ce=Object.defineProperties;var ke=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,Q=Object.prototype.propertyIsEnumerable;var Y=(e,o,r)=>o in e?Ie(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,s=(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))Q.call(o,r)&&Y(e,r,o[r]);return e},f=(e,o)=>Ce(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&&Q.call(e,n)&&(r[n]=e[n]);return r};var Z=(e,o,r)=>new Promise((n,a)=>{var t=d=>{try{i(r.next(d))}catch(u){a(u)}},p=d=>{try{i(r.throw(d))}catch(u){a(u)}},i=d=>d.done?n(d.value):Promise.resolve(d.value).then(t,p);i((r=r.apply(e,o)).next())});import Te from"@mui/icons-material/ArrowDropDown";import Ne from"@mui/icons-material/ArrowDropUp";import Be from"@mui/material/Box";import O from"@mui/material/ButtonBase";import Ee from"@mui/material/Collapse";import{useEffect as Re,useState as De}from"react";import{jsx as A,jsxs as j}from"react/jsx-runtime";function Me({isInitiallyOpen:e,onOpen:o,onClose:r,children:n,buttonStyles:a,buttonContents:t,buttonComponent:p=O,collapseProps:i,openIcon:d=A(Ne,{}),closedIcon:u=A(Te,{}),useDefaultStyling:c=p===O}){let[l,m]=De(!!e);return Re(()=>{l&&o?o():!l&&r&&r()},[l]),j(Be,{children:[j(p,{onClick:()=>{m(P=>!P)},sx:c?s({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":p===O?{backgroundColor:"action.hover"}:null},a):a,"aria-expanded":l,children:[t,l?d:u]}),A(Ee,f(s({in:l},i),{children:n}))]})}var Oe=Me;import xo from"@mui/icons-material/DarkMode";import Po from"@mui/icons-material/LightMode";import go from"@mui/material/IconButton";import vo from"@mui/material/Tooltip";import Ae from"@mui/material/CircularProgress";import{createContext as We,useContext as Fe}from"react";import{jsx as ee}from"react/jsx-runtime";var oe=We(void 0);function I(){let e=Fe(oe);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function ze(n){var a=n,{children:e,loadingComponent:o=ee(Ae,{})}=a,r=x(a,["children","loadingComponent"]);return ee(oe.Provider,{value:s({loadingComponent:o},r),children:e})}var W=ze;import{Fragment as v,jsx as y}from"react/jsx-runtime";function Ue({children:e,dataParser:o,loadingComponent:r,onNullable:n,onUndefined:a,onNull:t}){let{isLoading:p,data:i,dataParser:d,loadingComponent:u,error:c}=I(),l=o!=null?o:d;if(p)return y(v,{children:r!=null?r:u});if(c)return y(v,{});if(i==null){if(n){let m=n();return m!=null?m:y(v,{})}if(i===void 0&&a){let m=a();return m!=null?m:y(v,{})}if(i===null&&t){let m=t();return m!=null?m:y(v,{})}return y(v,{})}return l?typeof e=="function"?y(v,{children:e(l(i))}):y(v,{children:e}):typeof e=="function"?y(v,{children:e(i)}):y(v,{children:e})}var F=Ue;import re from"@mui/material/Alert";import{useRef as He}from"react";import{Fragment as C,jsx as b}from"react/jsx-runtime";function Ve({errorComponent:e,undefinedComponent:o,nullComponent:r,nullableComponent:n,logError:a}){var P;let{isLoading:t,data:p,error:i,errorComponent:d,logError:u}=I(),c=a!=null?a:u,l=He(!1),m=e!=null?e:d;return i?(c&&!l.current&&(console.error(i),l.current=!0),typeof m=="function"?m(i):m?b(C,{children:m}):b(re,{severity:"error",children:(P=i==null?void 0:i.message)!=null?P:"An unknown error has occured. Please try again later."})):!t&&p==null?n?(c&&!l.current&&(console.error("Data is nullable after loading."),l.current=!0),b(C,{children:n})):p===void 0&&(c&&!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),o)?b(C,{children:o}):p===null&&(c&&!l.current&&(console.error("Data is null after loading."),l.current=!0),r)?b(C,{children:r}):b(re,{severity:"error",children:"Failed to load data. Please try again later."}):b(C,{})}var z=Ve;import Xe from"@mui/material/CssBaseline";import{createTheme as $e,ThemeProvider as _e}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 Ze}from"react/jsx-runtime";var ne=Ge({toggleMode:()=>{},mode:"dark"});function k(){return Je(ne)}function qe({children:e,mode:o="dark"}){let[r,n]=Ye(o),a=Ke(()=>$e({palette:{mode:r}}),[r]);return te(ne.Provider,{value:{mode:r,toggleMode:()=>{n(t=>t==="light"?"dark":"light")}},children:Ze(_e,{theme:a,children:[te(Xe,{}),e]})})}var Qe=qe;import{createContext as je,useContext as eo,useEffect as ae,useState as U}from"react";import{jsx as no}from"react/jsx-runtime";var ie=je({windowWidth:0,windowHeight:0,isLargeScreen:!1});function oo(){return eo(ie)}function ro({children:e,largeScreenWidth:o,largeScreenHeight:r}){let[n,a]=U(window.innerWidth),[t,p]=U(window.innerHeight);function i(c,l,m=669,P=600){return c>m&&l>P}let[d,u]=U(i(window.innerWidth,window.innerHeight,o,r));return ae(()=>{function c(){a(window.innerWidth),p(window.innerHeight)}return c(),window.addEventListener("resize",c),()=>{window.removeEventListener("resize",c)}},[]),ae(()=>{u(i(n,t,o,r))},[n,t,o,r]),no(ie.Provider,{value:{isLargeScreen:d,windowWidth:n,windowHeight:t},children:e})}var to=ro;import{wait as ao}from"@alextheman/utility";import io from"@mui/material/Alert";import po from"@mui/material/Snackbar";import{createContext as so,useContext as lo,useState as E}from"react";import{jsx as pe,jsxs as fo}from"react/jsx-runtime";var se=so(void 0);function mo(){let e=lo(se);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function co({children:e,autoHideDuration:o=5e3}){let[r,n]=E(!1),[a,t]=E(o),[p,i]=E(""),[d,u]=E("info");function c(m,P,h){n(!0),t(h!=null?h:o),u(P!=null?P:"info"),i(m)}function l(){return Z(this,null,function*(){n(!1),yield ao(.2),i("")})}return fo(se.Provider,{value:{addSnackbar:c},children:[pe(po,{open:r,autoHideDuration:a,onClose:l,children:pe(io,{onClose:l,severity:d,children:p})}),e]})}var uo=co;import{jsx as R}from"react/jsx-runtime";function yo(){let{mode:e,toggleMode:o}=k();return R(vo,{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(Po,{}):R(xo,{})})})}var ho=yo;import Lo from"@mui/icons-material/ArrowDropDown";import bo from"@mui/icons-material/ArrowDropUp";import de from"@mui/material/Box";import le from"@mui/material/Button";import So from"@mui/material/Menu";import{useEffect as wo,useMemo as Io,useState as Co}from"react";import{jsx as T,jsxs as No}from"react/jsx-runtime";function ko({children:e,button:o=le,buttonChildren:r="Menu",buttonProps:n,isOpenIcon:a=T(bo,{}),isClosedIcon:t=T(Lo,{}),onOpen:p,onClose:i}){let[d,u]=Co(null),c=Io(()=>!!d,[d]),l=f(s({},n),{onClick:m=>{u(m.currentTarget)},"aria-controls":c?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":c});return o===le&&(l.endIcon=c?a:t),wo(()=>{c&&p?p():!c&&i&&i()},[c,p,i]),No(de,{children:[T(o,f(s({},l),{children:r})),T(So,{id:"dropdown-menu",anchorEl:d,open:c,onClose:()=>{u(null)},children:typeof e=="function"?T(de,{children:e(()=>{u(null)})}):e})]})}var To=ko;import Bo from"@mui/material/Link";import{jsx as Do}from"react/jsx-runtime";function Eo(n){var a=n,{href:e,children:o}=a,r=x(a,["href","children"]);return Do(Bo,f(s({component:"a",href:e,target:"_blank",rel:"noopener noreferrer"},r),{children:o}))}var Ro=Eo;import Mo from"@mui/icons-material/CloudUpload";import Oo from"@mui/material/Button";import{styled as me}from"@mui/material/styles";import{useState as Ao}from"react";import{jsx as H,jsxs as Ho}from"react/jsx-runtime";var Wo={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"},Fo=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 i=p,{onFileInput:e,label:o="Upload files",multiple:r,accept:n,useDropzone:a}=i,t=x(i,["onFileInput","label","multiple","accept","useDropzone"]);var l;let[d,u]=Ao(!1),c=Ho(Oo,f(s({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:m=>{var P;(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),(P=document.getElementById("file-input"))==null||P.click())}},t),{startIcon:(l=t.startIcon)!=null?l:H(Mo,{}),children:[o,H(Fo,{id:"file-input",type:"file",onChange:m=>{var h;let P=m.target;e(Array.from((h=P.files)!=null?h:[])),P.value=""},multiple:r,accept:n==null?void 0:n.join(","),disabled:t.disabled})]}));return a?H(zo,{$dragging:d,onDragOver:m=>{m.preventDefault(),!t.disabled&&u(!0)},onDragLeave:m=>{m.preventDefault(),u(!1)},onDrop:m=>{var h;if(m.preventDefault(),u(!1),t.disabled)return;let P=Array.from((h=m.dataTransfer.files)!=null?h:[]);e(P)},children:c}):c}var V=Uo;import Vo from"@mui/icons-material/Delete";import Xo from"@mui/material/Box";import $o from"@mui/material/IconButton";import _o from"@mui/material/List";import Go from"@mui/material/ListItem";import Jo from"@mui/material/ListItemText";import{jsx as w,jsxs as qo}from"react/jsx-runtime";function Ko(n){var a=n,{files:e,setFiles:o}=a,r=x(a,["files","setFiles"]);function t(i){o(d=>[...d,...i])}let p=f(s({},r),{onFileInput:t});return(p==null?void 0:p.multiple)===void 0&&(p.multiple=!0),qo(Xo,{children:[w(V,s({},p)),w(_o,{children:e.map(i=>w(Go,{secondaryAction:w($o,{"aria-label":"Delete",edge:"end",onClick:()=>{o(d=>d.filter(u=>u!==i))},children:w(Vo,{})}),children:w(Jo,{primary:i.name})},i.name))})]})}var Yo=Ko;import Qo from"@mui/material/Box";import Zo from"@mui/material/Popover";import{useId as jo,useState as er}from"react";import{jsx as ce,jsxs as tr}from"react/jsx-runtime";function or({icon:e,onOpen:o,onClose:r,iconProps:n,children:a}){let[t,p]=er(null),i=!!t,d=jo();function u(l){p(l.currentTarget),o&&o()}function c(){p(null),r&&r()}return tr(Qo,{children:[ce(e,s({"aria-owns":i?d:void 0,"aria-haspopup":"true",onMouseEnter:u,onMouseLeave:c},n)),ce(Zo,{id:d,sx:{pointerEvents:"none"},open:i,anchorEl:t,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:c,disableRestoreFocus:!0,children:a})]})}var rr=or;import nr from"@mui/material/Link";import{Link as ar}from"react-router-dom";import{jsx as pr}from"react/jsx-runtime";function ir(n){var a=n,{to:e,children:o}=a,r=x(a,["to","children"]);return pr(nr,f(s({component:ar,to:e},r),{children:o}))}var X=ir;import sr from"@mui/material/ListItemButton";import{jsx as mr}from"react/jsx-runtime";function dr(r){var n=r,{children:e}=n,o=x(n,["children"]);return mr(sr,f(s({component:X},o),{children:e}))}var lr=dr;import cr from"@mui/material/CircularProgress";import{jsx as $,jsxs as xr}from"react/jsx-runtime";function ur(i){var d=i,{children:e,errorComponent:o,undefinedComponent:r,nullComponent:n,nullableComponent:a,loadingComponent:t=$(cr,{})}=d,p=x(d,["children","errorComponent","undefinedComponent","nullComponent","nullableComponent","loadingComponent"]);return xr(W,f(s({loadingComponent:t},p),{children:[$(z,{errorComponent:o,undefinedComponent:r,nullComponent:n,nullableComponent:a}),$(F,{children:e})]}))}var fr=ur;import Pr from"@mui/material/BottomNavigation";import gr from"@mui/material/BottomNavigationAction";import vr from"@mui/material/Box";import yr from"@mui/material/Paper";import{useState as hr}from"react";import{Link as Lr}from"react-router-dom";import{Fragment as wr,jsx as D,jsxs as Ir}from"react/jsx-runtime";function br({children:e,navItems:o}){let[r,n]=hr("");return Ir(wr,{children:[D(vr,{sx:{paddingBottom:7},children:e}),D(yr,{sx:{position:"fixed",bottom:0,left:0,right:0},children:D(Pr,{showLabels:!0,value:r,onChange:(a,t)=>{n(t)},children:o.map(a=>D(gr,f(s({},a),{component:Lr}),a.value))})})]})}var Sr=br;import{truncate as ue}from"@alextheman/utility";import Cr from"@mui/icons-material/ChevronLeft";import kr from"@mui/icons-material/ChevronRight";import Tr from"@mui/icons-material/Menu";import Nr from"@mui/material/AppBar";import fe from"@mui/material/Box";import Br from"@mui/material/CssBaseline";import xe from"@mui/material/Divider";import Er from"@mui/material/Drawer";import Pe from"@mui/material/IconButton";import Rr from"@mui/material/List";import Dr from"@mui/material/ListItem";import Mr from"@mui/material/ListItemButton";import Or from"@mui/material/ListItemIcon";import Ar from"@mui/material/ListItemText";import{styled as G,useTheme as Wr}from"@mui/material/styles";import Fr from"@mui/material/Toolbar";import _ from"@mui/material/Typography";import{Fragment as zr,useState as Ur}from"react";import{Link as Hr,useLocation as Vr}from"react-router-dom";import{jsx as g,jsxs as S}from"react/jsx-runtime";var M=240;function ge(e){return{width:M,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 ye=G("div")(({theme:e})=>s({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Xr=G(Nr,{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:M,width:`calc(100% - ${M}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),$r=G(Er,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:M,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:f(s({},ge(e)),{"& .MuiDrawer-paper":ge(e)})},{props:({open:o})=>!o,style:f(s({},ve(e)),{"& .MuiDrawer-paper":ve(e)})}]}));function _r({title:e,navItems:o,children:r,headerElements:n}){let a=Wr(),[t,p]=Ur(!0),i=Vr();function d(){p(!0)}function u(){p(!1)}return S(fe,{sx:{display:"flex"},children:[g(Br,{}),g(Xr,{position:"fixed",open:t,children:S(Fr,{children:[g(Pe,{color:"inherit","aria-label":"open drawer",onClick:d,edge:"start",sx:[{marginRight:5},t&&{display:"none"}],children:g(Tr,{})}),g(_,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),S($r,{variant:"permanent",open:t,children:[g(ye,{children:g(Pe,{onClick:u,children:a.direction==="rtl"?g(kr,{}):g(Cr,{})})}),g(xe,{}),o.map(c=>S(zr,{children:[S(Rr,{children:[g(_,{variant:t?"h5":"h6",paddingLeft:t?2:1,children:t?c.category:ue(c.category,4)}),c.options.map(l=>g(Dr,{disablePadding:!0,sx:{display:"block"},children:S(Mr,{sx:[{minHeight:48,px:2.5},t?{justifyContent:"initial"}:{justifyContent:"center"}],component:Hr,to:l.to,selected:i.pathname===l.to,children:[g(Or,{sx:[{minWidth:0,justifyContent:"center"},t?{mr:3}:{mr:"auto"}],children:l.icon?l.icon:t?null:g(_,{children:ue(l.label,4)})}),g(Ar,{primary:l.label,sx:[t?{opacity:1}:{opacity:0}]})]})},l.to))]}),g(xe,{})]},c.category))]}),S(fe,{component:"main",sx:{flexGrow:1,p:3},children:[g(ye,{}),r]})]})}var Gr=_r;import Jr from"@mui/material/Typography";import{Fragment as qr,jsx as he}from"react/jsx-runtime";function Kr(n){var a=n,{text:e,sx:o}=a,r=x(a,["text","sx"]);return he(qr,{children:e.split(`
|
|
2
|
+
`).map((t,p)=>he(Jr,f(s({sx:s({margin:1},o)},r),{children:t}),p))})}var Yr=Kr;import J from"@mui/material/Box";import Le from"@mui/material/Typography";import{stripIndent as Qr}from"common-tags";import{LiveEditor as Zr,LiveError as jr,LivePreview as et,LiveProvider as ot}from"react-live";import{jsx as L,jsxs as be}from"react/jsx-runtime";function rt({code:e,scope:o,previewStyles:r,noInline:n,enableTypeScript:a,language:t}){let{mode:p}=k(),i={backgroundColor:p==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},d=r?s(s({},i),r):s({},i);return L(J,{sx:{borderRadius:1,border:.5,padding:2},children:be(ot,{code:Qr(e),scope:o,noInline:n,enableTypeScript:a,language:t,children:[L(Le,{variant:"h5",children:"Code"}),L(J,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:L(Zr,{})}),L("br",{}),L(Le,{variant:"h5",children:"Result"}),be(J,{sx:d,children:[L(et,{}),L(jr,{})]})]})})}var tt=rt;import{fillArray as nt}from"@alextheman/utility";import at from"@mui/material/Skeleton";import it from"@mui/material/TableCell";import pt from"@mui/material/TableRow";import{jsx as K}from"react/jsx-runtime";function st({columns:e}){return K(pt,{children:nt(o=>K(it,{children:K(at,{})},o),e)})}var dt=st;import lt from"@mui/material/Button";import{useFormContext as mt}from"react-hook-form";import{jsx as ft}from"react/jsx-runtime";function ct(n){var a=n,{disableClean:e,label:o}=a,r=x(a,["disableClean","label"]);let{formState:{disabled:t,isDirty:p,isSubmitting:i}}=mt();return ft(lt,f(s({color:"primary",disabled:r.disabled||e&&!p||t,loading:i,type:"submit",variant:"contained"},r),{children:o}))}var ut=ct;import Se from"@mui/material/Box";import{styled as xt}from"@mui/material/styles";import Pt from"@mui/material/Switch";import{jsx as N}from"react/jsx-runtime";var gt=xt(Pt)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function vt(t){var p=t,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:r,uncheckedIconStyles:n}=p,a=x(p,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let i={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},d={color:"black",maxWidth:16.5,maxHeight:16.5};return N(gt,s({checkedIcon:N(Se,{sx:i,children:N(e,{style:s(s({},d),o)})}),icon:N(Se,{sx:i,children:N(r,{style:s(s({},d),n)})})},a))}var yt=vt;import{useCallback as we,useEffect as ht,useState as Lt}from"react";function bt(e){let[o,r]=Lt(()=>{let t=window.location.hash.replace("#","");return e&&t===""?e:t}),n=we(()=>{let t=window.location.hash.replace("#","");r(e&&t===""?e:t)},[r,e]);ht(()=>(window.addEventListener("hashchange",n),()=>{window.removeEventListener("hashchange",n)}),[n]);let a=we(t=>{let p=typeof t=="function"?t(o):t;p!==o&&(window.location.hash=p)},[o]);return[o,a]}var St=bt;export{Oe as CollapsableItem,ho as DarkModeToggle,To as DropdownMenu,Ro as ExternalLink,V as FileInput,Yo as FileInputList,Wo as FileType,rr as IconWithPopover,X as InternalLink,lr as ListItemInternalLink,fr as Loader,F as LoaderData,z as LoaderError,W as LoaderProvider,Qe as ModeProvider,Sr as NavigationBottom,Gr as NavigationDrawer,Yr as PopoverText,tt as ReactPlayground,to as ScreenSizeProvider,dt as SkeletonRow,uo as SnackbarProvider,ut as SubmitButton,yt as SwitchWithIcons,St as useHash,I as useLoader,k as useMode,oo as useScreenSize,mo 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 { ReactNode } from \"react\";\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}\n\nexport interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {\n /** The error given if the request gave an error. */\n error: unknown;\n /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\n/** A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n */\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { 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 /** The component to show if an error has been thrown. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\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 /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\n nullableComponent?: ReactNode;\n}\n\nexport type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;\n\nconst UNDEFINED_MESSAGE =\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/** The component responsible for showing any errors provided by LoaderProvider. */\nfunction LoaderError({\n errorComponent: propsErrorComponent,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n}: LoaderErrorProps) {\n const { isLoading, data, error, errorComponent: contextErrorComponent } = useLoader();\n const warnedOnce = useRef(false);\n\n const errorComponent = propsErrorComponent ?? contextErrorComponent;\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n if (!isLoading && (data === null || data === undefined)) {\n if (nullableComponent) {\n return <>{nullableComponent}</>;\n }\n\n if (data === undefined) {\n if (!warnedOnce.current) {\n console.warn(UNDEFINED_MESSAGE);\n warnedOnce.current = true;\n }\n\n if (undefinedComponent) {\n return <>{undefinedComponent}</>;\n }\n }\n\n if (data === null && nullComponent) {\n return <>{nullComponent}</>;\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 { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component=\"a\" href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { 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\" | \"errorComponent\"> &\n LoaderErrorProps &\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 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 three 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 <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\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["ArrowDropDown","ArrowDropUp","Box","ButtonBase","Collapse","useEffect","useState","jsx","jsxs","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","useState","useEffect","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","DarkMode","LightMode","IconButton","Tooltip","CircularProgress","createContext","useContext","jsx","LoaderContext","createContext","useLoader","context","useContext","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","Fragment","jsx","LoaderData","children","loaderDataParser","loadingComponent","onNullable","onUndefined","onNull","isLoading","data","contextDataParser","contextLoadingComponent","error","useLoader","dataParser","result","LoaderData_default","Alert","useRef","Fragment","jsx","UNDEFINED_MESSAGE","LoaderError","propsErrorComponent","undefinedComponent","nullComponent","nullableComponent","_a","isLoading","data","error","contextErrorComponent","useLoader","warnedOnce","useRef","errorComponent","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useState","jsx","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","context","useContext","SnackbarProvider","children","autoHideDuration","open","setOpen","useState","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","wait","Snackbar","Alert","SnackbarProvider_default","jsx","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","ArrowDropDown","ArrowDropUp","Box","MUIButton","Menu","useEffect","useMemo","useState","jsx","jsxs","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","useState","isDropdownOpen","useMemo","buttonProps","__spreadProps","__spreadValues","event","useEffect","Box","Menu","DropdownMenu_default","MUILink","jsx","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","CloudUploadIcon","Button","styled","useState","jsx","jsxs","FileType","VisuallyHiddenInput","styled","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","useState","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","DeleteIcon","Box","IconButton","List","ListItem","ListItemText","jsx","jsxs","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","Box","Popover","useId","useState","jsx","jsxs","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","useState","isPopoverOpen","popoverId","useId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","MUILink","ReactDOMLink","jsx","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","ListItemButton","jsx","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","CircularProgress","jsx","jsxs","Loader","_a","_b","children","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","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","stripIndent","Typography","LiveEditor","LivePreview","LiveError","ReactPlayground_default","fillArray","Skeleton","TableCell","TableRow","jsx","SkeletonRow","columns","index","SkeletonRow_default","Button","useFormContext","jsx","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","useFormContext","Button","__spreadProps","__spreadValues","SubmitButton_default","Box","styled","Switch","jsx","StyledSwitch","styled","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","useCallback","useEffect","useState","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/CollapsableItem.tsx","../src/components/DarkModeToggle.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\n\nimport { useMode } from \"src/providers\";\n\nfunction DarkModeToggle() {\n const { mode, toggleMode } = useMode();\n\n return (\n <Tooltip title={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}>\n <IconButton\n sx={{ marginLeft: \"auto\" }}\n onClick={toggleMode}\n aria-label={`Enable ${mode === \"dark\" ? \"light\" : \"dark\"} mode`}\n >\n {mode === \"dark\" ? <LightMode /> : <DarkMode />}\n </IconButton>\n </Tooltip>\n );\n}\n\nexport default DarkModeToggle;\n","import type { ReactNode } from \"react\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** The 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);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\n/** A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n */\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { 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 /** The component to show if an error has been thrown. */\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 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 /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\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 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 = 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 { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component=\"a\" href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { 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 errorComponent={errorComponent}\n undefinedComponent={undefinedComponent}\n nullComponent={nullComponent}\n nullableComponent={nullableComponent}\n />\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\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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","names":["ArrowDropDown","ArrowDropUp","Box","ButtonBase","Collapse","useEffect","useState","jsx","jsxs","CollapsableItem","isInitiallyOpen","onOpen","onClose","children","buttonStyles","buttonContents","ButtonComponent","ButtonBase","collapseProps","openIcon","ArrowDropUp","closedIcon","ArrowDropDown","useDefaultStyling","isItemOpen","setIsItemOpen","useState","useEffect","Box","previouslyOpen","__spreadValues","Collapse","__spreadProps","CollapsableItem_default","DarkMode","LightMode","IconButton","Tooltip","CircularProgress","createContext","useContext","jsx","LoaderContext","createContext","useLoader","context","useContext","LoaderProvider","_a","_b","children","loadingComponent","CircularProgress","contextProps","__objRest","__spreadValues","LoaderProvider_default","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","undefinedComponent","nullComponent","nullableComponent","propsLogError","_a","isLoading","data","error","contextErrorComponent","contextLogError","useLoader","logError","warnedOnce","useRef","errorComponent","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useState","jsx","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","context","useContext","SnackbarProvider","children","autoHideDuration","open","setOpen","useState","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","wait","Snackbar","Alert","SnackbarProvider_default","jsx","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","ArrowDropDown","ArrowDropUp","Box","MUIButton","Menu","useEffect","useMemo","useState","jsx","jsxs","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","useState","isDropdownOpen","useMemo","buttonProps","__spreadProps","__spreadValues","event","useEffect","Box","Menu","DropdownMenu_default","MUILink","jsx","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","CloudUploadIcon","Button","styled","useState","jsx","jsxs","FileType","VisuallyHiddenInput","styled","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","useState","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","DeleteIcon","Box","IconButton","List","ListItem","ListItemText","jsx","jsxs","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","Box","Popover","useId","useState","jsx","jsxs","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","useState","isPopoverOpen","popoverId","useId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","MUILink","ReactDOMLink","jsx","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","ListItemButton","jsx","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","CircularProgress","jsx","jsxs","Loader","_a","_b","children","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","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","stripIndent","Typography","LiveEditor","LivePreview","LiveError","ReactPlayground_default","fillArray","Skeleton","TableCell","TableRow","jsx","SkeletonRow","columns","index","SkeletonRow_default","Button","useFormContext","jsx","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","useFormContext","Button","__spreadProps","__spreadValues","SubmitButton_default","Box","styled","Switch","jsx","StyledSwitch","styled","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","useCallback","useEffect","useState","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
|