@alextheman/components 5.0.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var it=Object.create;var z=Object.defineProperty,at=Object.defineProperties,pt=Object.getOwnPropertyDescriptor,st=Object.getOwnPropertyDescriptors,dt=Object.getOwnPropertyNames,G=Object.getOwnPropertySymbols,mt=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable;var he=(e,o,t)=>o in e?z(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t,p=(e,o)=>{for(var t in o||(o={}))pe.call(o,t)&&he(e,t,o[t]);if(G)for(var t of G(o))Pe.call(o,t)&&he(e,t,o[t]);return e},u=(e,o)=>at(e,st(o));var y=(e,o)=>{var t={};for(var n in e)pe.call(e,n)&&o.indexOf(n)<0&&(t[n]=e[n]);if(e!=null&&G)for(var n of G(e))o.indexOf(n)<0&&Pe.call(e,n)&&(t[n]=e[n]);return t};var lt=(e,o)=>{for(var t in o)z(e,t,{get:o[t],enumerable:!0})},ve=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let a of dt(o))!pe.call(e,a)&&a!==t&&z(e,a,{get:()=>o[a],enumerable:!(n=pt(o,a))||n.enumerable});return e};var i=(e,o,t)=>(t=e!=null?it(mt(e)):{},ve(o||!e||!e.__esModule?z(t,"default",{value:e,enumerable:!0}):t,e)),ct=e=>ve(z({},"__esModule",{value:!0}),e);var Se=(e,o,t)=>new Promise((n,a)=>{var r=m=>{try{d(t.next(m))}catch(x){a(x)}},s=m=>{try{d(t.throw(m))}catch(x){a(x)}},d=m=>m.done?n(m.value):Promise.resolve(m.value).then(r,s);d((t=t.apply(e,o)).next())});var Vt={};lt(Vt,{CollapsableItem:()=>Ce,DarkModeToggle:()=>Je,DropdownMenu:()=>Qe,ExternalLink:()=>je,FileInput:()=>j,FileInputList:()=>co,FileType:()=>no,IconWithPopover:()=>xo,InternalLink:()=>oe,ListItemInternalLink:()=>vo,Loader:()=>bo,LoaderData:()=>q,LoaderError:()=>Q,LoaderProvider:()=>Y,ModeProvider:()=>Re,NavigationBottom:()=>Do,NavigationDrawer:()=>$o,PopoverText:()=>Ko,ReactPlayground:()=>qo,ScreenSizeProvider:()=>Ae,SnackbarProvider:()=>Ue,SubmitButton:()=>jo,SwitchWithIcons:()=>rt,useHash:()=>nt,useLoader:()=>R,useMode:()=>M,useScreenSize:()=>Ee,useSnackbar:()=>Ve});module.exports=ct(Vt);var we=i(require("@mui/icons-material/ArrowDropDown"),1),be=i(require("@mui/icons-material/ArrowDropUp"),1),Le=i(require("@mui/material/Box"),1),$=i(require("@mui/material/ButtonBase"),1),Ie=i(require("@mui/material/Collapse"),1),J=require("react");var B=require("react/jsx-runtime");function ut({isInitiallyOpen:e,onOpen:o,onClose:t,children:n,buttonStyles:a,buttonContents:r,buttonComponent:s=$.default,collapseProps:d,openIcon:m=(0,B.jsx)(be.default,{}),closedIcon:x=(0,B.jsx)(we.default,{}),useDefaultStyling:l=s===$.default}){let[c,g]=(0,J.useState)(!!e);return(0,J.useEffect)(()=>{c&&o?o():!c&&t&&t()},[c]),(0,B.jsxs)(Le.default,{children:[(0,B.jsxs)(s,{onClick:()=>{g(h=>!h)},sx:l?p({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":s===$.default?{backgroundColor:"action.hover"}:null},a):a,"aria-expanded":c,children:[r,c?m:x]}),(0,B.jsx)(Ie.default,u(p({in:c},d),{children:n}))]})}var Ce=ut;var Xe=i(require("@mui/icons-material/DarkMode"),1),_e=i(require("@mui/icons-material/LightMode"),1),Ge=i(require("@mui/material/IconButton"),1),$e=i(require("@mui/material/Tooltip"),1);var ke=i(require("@mui/material/CircularProgress"),1),K=require("react");var se=require("react/jsx-runtime"),Te=(0,K.createContext)(void 0);function R(){let e=(0,K.useContext)(Te);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function ft(n){var a=n,{children:e,loadingComponent:o=(0,se.jsx)(ke.default,{})}=a,t=y(a,["children","loadingComponent"]);return(0,se.jsx)(Te.Provider,{value:p({loadingComponent:o},t),children:e})}var Y=ft;var P=require("react/jsx-runtime");function xt({children:e,loadingComponent:o,onUndefined:t,showOnError:n}){let{isLoading:a,data:r,loadingComponent:s,error:d}=R();if(a)return(0,P.jsx)(P.Fragment,{children:o!=null?o:s});if(d&&!n)return(0,P.jsx)(P.Fragment,{});if(r===void 0){if(console.warn("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."),t){let m=t();return m!=null?m:(0,P.jsx)(P.Fragment,{})}return(0,P.jsx)(P.Fragment,{})}return typeof e=="function"?(0,P.jsx)(P.Fragment,{children:e(r)}):(0,P.jsx)(P.Fragment,{children:e})}var q=xt;var Be=i(require("@mui/material/Alert"),1);var D=require("react/jsx-runtime");function gt(){var t;let{error:e,errorComponent:o}=R();return e?typeof o=="function"?o(e):o?(0,D.jsx)(D.Fragment,{children:o}):(0,D.jsx)(Be.default,{severity:"error",children:(t=e==null?void 0:e.message)!=null?t:"An unknown error has occured. Please try again later."}):(0,D.jsx)(D.Fragment,{})}var Q=gt;var De=i(require("@mui/material/CssBaseline"),1),Z=require("@mui/material/styles"),C=require("react"),H=require("react/jsx-runtime"),Ne=(0,C.createContext)({toggleMode:()=>{},mode:"dark"});function M(){return(0,C.useContext)(Ne)}function yt({children:e,mode:o="dark"}){let[t,n]=(0,C.useState)(o),a=(0,C.useMemo)(()=>(0,Z.createTheme)({palette:{mode:t}}),[t]);return(0,H.jsx)(Ne.Provider,{value:{mode:t,toggleMode:()=>{n(r=>r==="light"?"dark":"light")}},children:(0,H.jsxs)(Z.ThemeProvider,{theme:a,children:[(0,H.jsx)(De.default,{}),e]})})}var Re=yt;var S=require("react"),Oe=require("react/jsx-runtime"),Me=(0,S.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ee(){return(0,S.useContext)(Me)}function ht({children:e,largeScreenWidth:o,largeScreenHeight:t}){let[n,a]=(0,S.useState)(window.innerWidth),[r,s]=(0,S.useState)(window.innerHeight);function d(l,c,g=669,h=600){return l>g&&c>h}let[m,x]=(0,S.useState)(d(window.innerWidth,window.innerHeight,o,t));return(0,S.useEffect)(()=>{function l(){a(window.innerWidth),s(window.innerHeight)}return l(),window.addEventListener("resize",l),()=>{window.removeEventListener("resize",l)}},[]),(0,S.useEffect)(()=>{x(d(n,r,o,t))},[n,r,o,t]),(0,Oe.jsx)(Me.Provider,{value:{isLargeScreen:m,windowWidth:n,windowHeight:r},children:e})}var Ae=ht;var Fe=require("@alextheman/utility"),We=i(require("@mui/material/Alert"),1),ze=i(require("@mui/material/Snackbar"),1),b=require("react");var V=require("react/jsx-runtime"),He=(0,b.createContext)(void 0);function Ve(){let e=(0,b.useContext)(He);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function Pt({children:e,autoHideDuration:o=5e3}){let[t,n]=(0,b.useState)(!1),[a,r]=(0,b.useState)(o),[s,d]=(0,b.useState)(""),[m,x]=(0,b.useState)("info");function l(g,h,w){n(!0),r(w!=null?w:o),x(h!=null?h:"info"),d(g)}function c(){return Se(this,null,function*(){n(!1),yield(0,Fe.wait)(.2),d("")})}return(0,V.jsxs)(He.Provider,{value:{addSnackbar:l},children:[(0,V.jsx)(ze.default,{open:t,autoHideDuration:a,onClose:c,children:(0,V.jsx)(We.default,{onClose:c,severity:m,children:s})}),e]})}var Ue=Pt;var U=require("react/jsx-runtime");function vt(){let{mode:e,toggleMode:o}=M();return(0,U.jsx)($e.default,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:(0,U.jsx)(Ge.default,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?(0,U.jsx)(_e.default,{}):(0,U.jsx)(Xe.default,{})})})}var Je=vt;var Ke=i(require("@mui/icons-material/ArrowDropDown"),1),Ye=i(require("@mui/icons-material/ArrowDropUp"),1),de=i(require("@mui/material/Box"),1),me=i(require("@mui/material/Button"),1),qe=i(require("@mui/material/Menu"),1),E=require("react");var k=require("react/jsx-runtime");function St({children:e,button:o=me.default,buttonChildren:t="Menu",buttonProps:n,isOpenIcon:a=(0,k.jsx)(Ye.default,{}),isClosedIcon:r=(0,k.jsx)(Ke.default,{}),onOpen:s,onClose:d}){let[m,x]=(0,E.useState)(null),l=(0,E.useMemo)(()=>!!m,[m]),c=u(p({},n),{onClick:g=>{x(g.currentTarget)},"aria-controls":l?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":l});return o===me.default&&(c.endIcon=l?a:r),(0,E.useEffect)(()=>{l&&s?s():!l&&d&&d()},[l,s,d]),(0,k.jsxs)(de.default,{children:[(0,k.jsx)(o,u(p({},c),{children:t})),(0,k.jsx)(qe.default,{id:"dropdown-menu",anchorEl:m,open:l,onClose:()=>{x(null)},children:typeof e=="function"?(0,k.jsx)(de.default,{children:e(()=>{x(null)})}):e})]})}var Qe=St;var Ze=i(require("@mui/material/Link"),1);var eo=require("react/jsx-runtime");function wt(r){var s=r,{href:e,children:o,target:t="_blank",rel:n="noopener noreferrer"}=s,a=y(s,["href","children","target","rel"]);return(0,eo.jsx)(Ze.default,u(p({component:"a",href:e,target:t,rel:n},a),{children:o}))}var je=wt;var oo=i(require("@mui/icons-material/CloudUpload"),1),to=i(require("@mui/material/Button"),1),le=require("@mui/material/styles"),ro=require("react");var A=require("react/jsx-runtime"),no={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"},bt=(0,le.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}),Lt=(0,le.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 It(s){var d=s,{onFileInput:e,label:o="Upload files",multiple:t,accept:n,useDropzone:a}=d,r=y(d,["onFileInput","label","multiple","accept","useDropzone"]);var c;let[m,x]=(0,ro.useState)(!1),l=(0,A.jsxs)(to.default,u(p({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:g=>{var h;(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),(h=document.getElementById("file-input"))==null||h.click())}},r),{startIcon:(c=r.startIcon)!=null?c:(0,A.jsx)(oo.default,{}),children:[o,(0,A.jsx)(bt,{id:"file-input",type:"file",onChange:g=>{var w;let h=g.target;e(Array.from((w=h.files)!=null?w:[])),h.value=""},multiple:t,accept:n==null?void 0:n.join(","),disabled:r.disabled})]}));return a?(0,A.jsx)(Lt,{$dragging:m,onDragOver:g=>{g.preventDefault(),!r.disabled&&x(!0)},onDragLeave:g=>{g.preventDefault(),x(!1)},onDrop:g=>{var w;if(g.preventDefault(),x(!1),r.disabled)return;let h=Array.from((w=g.dataTransfer.files)!=null?w:[]);e(h)},children:l}):l}var j=It;var io=i(require("@mui/icons-material/Delete"),1),ao=i(require("@mui/material/Box"),1),po=i(require("@mui/material/IconButton"),1),so=i(require("@mui/material/List"),1),mo=i(require("@mui/material/ListItem"),1),lo=i(require("@mui/material/ListItemText"),1);var L=require("react/jsx-runtime");function Ct(n){var a=n,{files:e,setFiles:o}=a,t=y(a,["files","setFiles"]);function r(d){o(m=>[...m,...d])}let s=u(p({},t),{onFileInput:r});return(s==null?void 0:s.multiple)===void 0&&(s.multiple=!0),(0,L.jsxs)(ao.default,{children:[(0,L.jsx)(j,p({},s)),(0,L.jsx)(so.default,{children:e.map(d=>(0,L.jsx)(mo.default,{secondaryAction:(0,L.jsx)(po.default,{"aria-label":"Delete",edge:"end",onClick:()=>{o(m=>m.filter(x=>x!==d))},children:(0,L.jsx)(io.default,{})}),children:(0,L.jsx)(lo.default,{primary:d.name})},d.name))})]})}var co=Ct;var uo=i(require("@mui/material/Box"),1),fo=i(require("@mui/material/Popover"),1),ee=require("react");var X=require("react/jsx-runtime");function kt({icon:e,onOpen:o,onClose:t,iconProps:n,children:a}){let[r,s]=(0,ee.useState)(null),d=!!r,m=(0,ee.useId)();function x(c){s(c.currentTarget),o&&o()}function l(){s(null),t&&t()}return(0,X.jsxs)(uo.default,{children:[(0,X.jsx)(e,p({"aria-owns":d?m:void 0,"aria-haspopup":"true",onMouseEnter:x,onMouseLeave:l},n)),(0,X.jsx)(fo.default,{id:m,sx:{pointerEvents:"none"},open:d,anchorEl:r,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:l,disableRestoreFocus:!0,children:a})]})}var xo=kt;var go=i(require("@mui/material/Link"),1),yo=require("react-router-dom");var ho=require("react/jsx-runtime");function Tt(n){var a=n,{to:e,children:o}=a,t=y(a,["to","children"]);return(0,ho.jsx)(go.default,u(p({component:yo.Link,to:e},t),{children:o}))}var oe=Tt;var Po=i(require("@mui/material/ListItemButton"),1);var So=require("react/jsx-runtime");function Bt(t){var n=t,{children:e}=n,o=y(n,["children"]);return(0,So.jsx)(Po.default,u(p({component:oe},o),{children:e}))}var vo=Bt;var wo=i(require("@mui/material/CircularProgress"),1);var O=require("react/jsx-runtime");function Dt(a){var r=a,{children:e,onUndefined:o,loadingComponent:t=(0,O.jsx)(wo.default,{})}=r,n=y(r,["children","onUndefined","loadingComponent"]);return(0,O.jsxs)(Y,u(p({loadingComponent:t},n),{children:[(0,O.jsx)(Q,{}),(0,O.jsx)(q,{onUndefined:o,children:e})]}))}var bo=Dt;var Lo=i(require("@mui/material/BottomNavigation"),1),Io=i(require("@mui/material/BottomNavigationAction"),1),Co=i(require("@mui/material/Box"),1),ko=i(require("@mui/material/Paper"),1),To=require("react"),Bo=require("react-router-dom");var I=require("react/jsx-runtime");function Nt({children:e,navItems:o}){let[t,n]=(0,To.useState)("");return(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(Co.default,{sx:{paddingBottom:7},children:e}),(0,I.jsx)(ko.default,{sx:{position:"fixed",bottom:0,left:0,right:0},children:(0,I.jsx)(Lo.default,{showLabels:!0,value:t,onChange:(a,r)=>{n(r)},children:o.map(a=>(0,I.jsx)(Io.default,u(p({},a),{component:Bo.Link}),a.value))})})]})}var Do=Nt;var ce=require("@alextheman/utility"),Eo=i(require("@mui/icons-material/ChevronLeft"),1),Ao=i(require("@mui/icons-material/ChevronRight"),1),Oo=i(require("@mui/icons-material/Menu"),1),Fo=i(require("@mui/material/AppBar"),1),ue=i(require("@mui/material/Box"),1),Wo=i(require("@mui/material/CssBaseline"),1),fe=i(require("@mui/material/Divider"),1),zo=i(require("@mui/material/Drawer"),1),xe=i(require("@mui/material/IconButton"),1),Ho=i(require("@mui/material/List"),1),Vo=i(require("@mui/material/ListItem"),1),Uo=i(require("@mui/material/ListItemButton"),1),Xo=i(require("@mui/material/ListItemIcon"),1),_o=i(require("@mui/material/ListItemText"),1),F=require("@mui/material/styles"),Go=i(require("@mui/material/Toolbar"),1),te=i(require("@mui/material/Typography"),1),ne=require("react"),ie=require("react-router-dom");var f=require("react/jsx-runtime"),re=240;function No(e){return{width:re,transition:e.transitions.create("width",{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:"hidden"}}function Ro(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 Mo=(0,F.styled)("div")(({theme:e})=>p({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Rt=(0,F.styled)(Fo.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:re,width:`calc(100% - ${re}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Mt=(0,F.styled)(zo.default,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:re,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:u(p({},No(e)),{"& .MuiDrawer-paper":No(e)})},{props:({open:o})=>!o,style:u(p({},Ro(e)),{"& .MuiDrawer-paper":Ro(e)})}]}));function Et({title:e,navItems:o,children:t,headerElements:n}){let a=(0,F.useTheme)(),[r,s]=(0,ne.useState)(!0),d=(0,ie.useLocation)();function m(){s(!0)}function x(){s(!1)}return(0,f.jsxs)(ue.default,{sx:{display:"flex"},children:[(0,f.jsx)(Wo.default,{}),(0,f.jsx)(Rt,{position:"fixed",open:r,children:(0,f.jsxs)(Go.default,{children:[(0,f.jsx)(xe.default,{color:"inherit","aria-label":"open drawer",onClick:m,edge:"start",sx:[{marginRight:5},r&&{display:"none"}],children:(0,f.jsx)(Oo.default,{})}),(0,f.jsx)(te.default,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),(0,f.jsxs)(Mt,{variant:"permanent",open:r,children:[(0,f.jsx)(Mo,{children:(0,f.jsx)(xe.default,{onClick:x,children:a.direction==="rtl"?(0,f.jsx)(Ao.default,{}):(0,f.jsx)(Eo.default,{})})}),(0,f.jsx)(fe.default,{}),o.map(l=>(0,f.jsxs)(ne.Fragment,{children:[(0,f.jsxs)(Ho.default,{children:[(0,f.jsx)(te.default,{variant:r?"h5":"h6",paddingLeft:r?2:1,children:r?l.category:(0,ce.truncate)(l.category,4)}),l.options.map(c=>(0,f.jsx)(Vo.default,{disablePadding:!0,sx:{display:"block"},children:(0,f.jsxs)(Uo.default,{sx:[{minHeight:48,px:2.5},r?{justifyContent:"initial"}:{justifyContent:"center"}],component:ie.Link,to:c.to,selected:d.pathname===c.to,children:[(0,f.jsx)(Xo.default,{sx:[{minWidth:0,justifyContent:"center"},r?{mr:3}:{mr:"auto"}],children:c.icon?c.icon:r?null:(0,f.jsx)(te.default,{children:(0,ce.truncate)(c.label,4)})}),(0,f.jsx)(_o.default,{primary:c.label,sx:[r?{opacity:1}:{opacity:0}]})]})},c.to))]}),(0,f.jsx)(fe.default,{})]},l.category))]}),(0,f.jsxs)(ue.default,{component:"main",sx:{flexGrow:1,p:3},children:[(0,f.jsx)(Mo,{}),t]})]})}var $o=Et;var Jo=i(require("@mui/material/Typography"),1);var _=require("react/jsx-runtime");function At(n){var a=n,{text:e,sx:o}=a,t=y(a,["text","sx"]);return(0,_.jsx)(_.Fragment,{children:e.split(`
2
- `).map((r,s)=>(0,_.jsx)(Jo.default,u(p({sx:p({margin:1},o)},t),{children:r}),s))})}var Ko=At;var ae=i(require("@mui/material/Box"),1),ge=i(require("@mui/material/Typography"),1),Yo=require("common-tags"),T=require("react-live");var v=require("react/jsx-runtime");function Ot({code:e,scope:o,previewStyles:t,noInline:n,enableTypeScript:a,language:r}){let{mode:s}=M(),d={backgroundColor:s==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},m=t?p(p({},d),t):p({},d);return(0,v.jsx)(ae.default,{sx:{borderRadius:1,border:.5,padding:2},children:(0,v.jsxs)(T.LiveProvider,{code:(0,Yo.stripIndent)(e),scope:o,noInline:n,enableTypeScript:a,language:r,children:[(0,v.jsx)(ge.default,{variant:"h5",children:"Code"}),(0,v.jsx)(ae.default,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:(0,v.jsx)(T.LiveEditor,{})}),(0,v.jsx)("br",{}),(0,v.jsx)(ge.default,{variant:"h5",children:"Result"}),(0,v.jsxs)(ae.default,{sx:m,children:[(0,v.jsx)(T.LivePreview,{}),(0,v.jsx)(T.LiveError,{})]})]})})}var qo=Ot;var Qo=i(require("@mui/material/Button"),1),Zo=require("react-hook-form");var et=require("react/jsx-runtime");function Ft(n){var a=n,{disableClean:e,label:o}=a,t=y(a,["disableClean","label"]);let{formState:{disabled:r,isDirty:s,isSubmitting:d}}=(0,Zo.useFormContext)();return(0,et.jsx)(Qo.default,u(p({color:"primary",disabled:t.disabled||e&&!s||r,loading:d,type:"submit",variant:"contained"},t),{children:o}))}var jo=Ft;var ye=i(require("@mui/material/Box"),1),ot=require("@mui/material/styles"),tt=i(require("@mui/material/Switch"),1);var W=require("react/jsx-runtime"),Wt=(0,ot.styled)(tt.default)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function zt(r){var s=r,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:t,uncheckedIconStyles:n}=s,a=y(s,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let d={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},m={color:"black",maxWidth:16.5,maxHeight:16.5};return(0,W.jsx)(Wt,p({checkedIcon:(0,W.jsx)(ye.default,{sx:d,children:(0,W.jsx)(e,{style:p(p({},m),o)})}),icon:(0,W.jsx)(ye.default,{sx:d,children:(0,W.jsx)(t,{style:p(p({},m),n)})})},a))}var rt=zt;var N=require("react");function Ht(e){let[o,t]=(0,N.useState)(()=>{let r=window.location.hash.replace("#","");return e&&r===""?e:r}),n=(0,N.useCallback)(()=>{let r=window.location.hash.replace("#","");t(e&&r===""?e:r)},[t,e]);(0,N.useEffect)(()=>(window.addEventListener("hashchange",n),()=>{window.removeEventListener("hashchange",n)}),[n]);let a=(0,N.useCallback)(r=>{let s=typeof r=="function"?r(o):r;s!==o&&(window.location.hash=s)},[o]);return[o,a]}var nt=Ht;0&&(module.exports={CollapsableItem,DarkModeToggle,DropdownMenu,ExternalLink,FileInput,FileInputList,FileType,IconWithPopover,InternalLink,ListItemInternalLink,Loader,LoaderData,LoaderError,LoaderProvider,ModeProvider,NavigationBottom,NavigationDrawer,PopoverText,ReactPlayground,ScreenSizeProvider,SnackbarProvider,SubmitButton,SwitchWithIcons,useHash,useLoader,useMode,useScreenSize,useSnackbar});
1
+ "use strict";var it=Object.create;var z=Object.defineProperty,at=Object.defineProperties,pt=Object.getOwnPropertyDescriptor,st=Object.getOwnPropertyDescriptors,dt=Object.getOwnPropertyNames,_=Object.getOwnPropertySymbols,mt=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable;var ye=(e,o,t)=>o in e?z(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t,p=(e,o)=>{for(var t in o||(o={}))pe.call(o,t)&&ye(e,t,o[t]);if(_)for(var t of _(o))Pe.call(o,t)&&ye(e,t,o[t]);return e},u=(e,o)=>at(e,st(o));var h=(e,o)=>{var t={};for(var i in e)pe.call(e,i)&&o.indexOf(i)<0&&(t[i]=e[i]);if(e!=null&&_)for(var i of _(e))o.indexOf(i)<0&&Pe.call(e,i)&&(t[i]=e[i]);return t};var lt=(e,o)=>{for(var t in o)z(e,t,{get:o[t],enumerable:!0})},ve=(e,o,t,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let a of dt(o))!pe.call(e,a)&&a!==t&&z(e,a,{get:()=>o[a],enumerable:!(i=pt(o,a))||i.enumerable});return e};var n=(e,o,t)=>(t=e!=null?it(mt(e)):{},ve(o||!e||!e.__esModule?z(t,"default",{value:e,enumerable:!0}):t,e)),ct=e=>ve(z({},"__esModule",{value:!0}),e);var Se=(e,o,t)=>new Promise((i,a)=>{var r=m=>{try{d(t.next(m))}catch(x){a(x)}},s=m=>{try{d(t.throw(m))}catch(x){a(x)}},d=m=>m.done?i(m.value):Promise.resolve(m.value).then(r,s);d((t=t.apply(e,o)).next())});var Ut={};lt(Ut,{CollapsableItem:()=>Ce,DarkModeToggle:()=>Je,DropdownMenu:()=>Qe,ExternalLink:()=>je,FileInput:()=>j,FileInputList:()=>co,FileType:()=>no,IconWithPopover:()=>xo,InternalLink:()=>oe,ListItemInternalLink:()=>vo,Loader:()=>bo,LoaderData:()=>q,LoaderError:()=>Q,LoaderProvider:()=>Y,ModeProvider:()=>Me,NavigationBottom:()=>Do,NavigationDrawer:()=>Go,PopoverText:()=>Ko,ReactPlayground:()=>qo,ScreenSizeProvider:()=>Ae,SnackbarProvider:()=>Ve,SubmitButton:()=>jo,SwitchWithIcons:()=>rt,useHash:()=>nt,useLoader:()=>M,useMode:()=>R,useScreenSize:()=>Ee,useSnackbar:()=>Ue});module.exports=ct(Ut);var we=n(require("@mui/icons-material/ArrowDropDown"),1),be=n(require("@mui/icons-material/ArrowDropUp"),1),Ie=n(require("@mui/material/Box"),1),G=n(require("@mui/material/ButtonBase"),1),Le=n(require("@mui/material/Collapse"),1),J=require("react");var B=require("react/jsx-runtime");function ut({isInitiallyOpen:e,onOpen:o,onClose:t,children:i,buttonStyles:a,buttonContents:r,buttonComponent:s=G.default,collapseProps:d,openIcon:m=(0,B.jsx)(be.default,{}),closedIcon:x=(0,B.jsx)(we.default,{}),useDefaultStyling:l=s===G.default}){let[c,g]=(0,J.useState)(!!e);return(0,J.useEffect)(()=>{c&&o?o():!c&&t&&t()},[c]),(0,B.jsxs)(Ie.default,{children:[(0,B.jsxs)(s,{onClick:()=>{g(y=>!y)},sx:l?p({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":c,children:[r,c?m:x]}),(0,B.jsx)(Le.default,u(p({in:c},d),{children:i}))]})}var Ce=ut;var Xe=n(require("@mui/icons-material/DarkMode"),1),$e=n(require("@mui/icons-material/LightMode"),1),_e=n(require("@mui/material/IconButton"),1),Ge=n(require("@mui/material/Tooltip"),1);var ke=n(require("@mui/material/CircularProgress"),1),K=require("react");var se=require("react/jsx-runtime"),Te=(0,K.createContext)(void 0);function M(){let e=(0,K.useContext)(Te);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function ft(i){var a=i,{children:e,loadingComponent:o=(0,se.jsx)(ke.default,{})}=a,t=h(a,["children","loadingComponent"]);return(0,se.jsx)(Te.Provider,{value:p({loadingComponent:o},t),children:e})}var Y=ft;var P=require("react/jsx-runtime");function xt({children:e,loadingComponent:o,onUndefined:t,showOnError:i}){let{isLoading:a,data:r,loadingComponent:s,error:d}=M();if(a)return(0,P.jsx)(P.Fragment,{children:o!=null?o:s});if(d&&!i)return(0,P.jsx)(P.Fragment,{});if(r===void 0){if(console.warn("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."),t){let m=t();return m!=null?m:(0,P.jsx)(P.Fragment,{})}return(0,P.jsx)(P.Fragment,{})}return typeof e=="function"?(0,P.jsx)(P.Fragment,{children:e(r)}):(0,P.jsx)(P.Fragment,{children:e})}var q=xt;var Be=n(require("@mui/material/Alert"),1);var D=require("react/jsx-runtime");function gt(){var t;let{error:e,errorComponent:o}=M();return e?typeof o=="function"?o(e):o?(0,D.jsx)(D.Fragment,{children:o}):(0,D.jsx)(Be.default,{severity:"error",children:(t=e==null?void 0:e.message)!=null?t:"An unknown error has occured. Please try again later."}):(0,D.jsx)(D.Fragment,{})}var Q=gt;var De=n(require("@mui/material/CssBaseline"),1),Z=require("@mui/material/styles"),C=require("react"),H=require("react/jsx-runtime"),Ne=(0,C.createContext)({toggleMode:()=>{},mode:"dark"});function R(){return(0,C.useContext)(Ne)}function ht({children:e,mode:o="dark"}){let[t,i]=(0,C.useState)(o),a=(0,C.useMemo)(()=>(0,Z.createTheme)({palette:{mode:t}}),[t]);return(0,H.jsx)(Ne.Provider,{value:{mode:t,toggleMode:()=>{i(r=>r==="light"?"dark":"light")}},children:(0,H.jsxs)(Z.ThemeProvider,{theme:a,children:[(0,H.jsx)(De.default,{}),e]})})}var Me=ht;var S=require("react"),Oe=require("react/jsx-runtime"),Re=(0,S.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ee(){return(0,S.useContext)(Re)}function yt({children:e,largeScreenWidth:o,largeScreenHeight:t}){let[i,a]=(0,S.useState)(window.innerWidth),[r,s]=(0,S.useState)(window.innerHeight);function d(l,c,g=669,y=600){return l>g&&c>y}let[m,x]=(0,S.useState)(d(window.innerWidth,window.innerHeight,o,t));return(0,S.useEffect)(()=>{function l(){a(window.innerWidth),s(window.innerHeight)}return l(),window.addEventListener("resize",l),()=>{window.removeEventListener("resize",l)}},[]),(0,S.useEffect)(()=>{x(d(i,r,o,t))},[i,r,o,t]),(0,Oe.jsx)(Re.Provider,{value:{isLargeScreen:m,windowWidth:i,windowHeight:r},children:e})}var Ae=yt;var Fe=require("@alextheman/utility"),We=n(require("@mui/material/Alert"),1),ze=n(require("@mui/material/Snackbar"),1),b=require("react");var U=require("react/jsx-runtime"),He=(0,b.createContext)(void 0);function Ue(){let e=(0,b.useContext)(He);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function Pt({children:e,autoHideDuration:o=5e3}){let[t,i]=(0,b.useState)(!1),[a,r]=(0,b.useState)(o),[s,d]=(0,b.useState)(""),[m,x]=(0,b.useState)("info");function l(g,y,w){i(!0),r(w!=null?w:o),x(y!=null?y:"info"),d(g)}function c(){return Se(this,null,function*(){i(!1),yield(0,Fe.wait)(.2),d("")})}return(0,U.jsxs)(He.Provider,{value:{addSnackbar:l},children:[(0,U.jsx)(ze.default,{open:t,autoHideDuration:a,onClose:c,children:(0,U.jsx)(We.default,{onClose:c,severity:m,children:s})}),e]})}var Ve=Pt;var V=require("react/jsx-runtime");function vt(){let{mode:e,toggleMode:o}=R();return(0,V.jsx)(Ge.default,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:(0,V.jsx)(_e.default,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?(0,V.jsx)($e.default,{}):(0,V.jsx)(Xe.default,{})})})}var Je=vt;var Ke=n(require("@mui/icons-material/ArrowDropDown"),1),Ye=n(require("@mui/icons-material/ArrowDropUp"),1),de=n(require("@mui/material/Box"),1),me=n(require("@mui/material/Button"),1),qe=n(require("@mui/material/Menu"),1),E=require("react");var k=require("react/jsx-runtime");function St({children:e,button:o=me.default,buttonChildren:t="Menu",buttonProps:i,isOpenIcon:a=(0,k.jsx)(Ye.default,{}),isClosedIcon:r=(0,k.jsx)(Ke.default,{}),onOpen:s,onClose:d}){let[m,x]=(0,E.useState)(null),l=(0,E.useMemo)(()=>!!m,[m]),c=u(p({},i),{onClick:g=>{x(g.currentTarget)},"aria-controls":l?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":l});return o===me.default&&(c.endIcon=l?a:r),(0,E.useEffect)(()=>{l&&s?s():!l&&d&&d()},[l,s,d]),(0,k.jsxs)(de.default,{children:[(0,k.jsx)(o,u(p({},c),{children:t})),(0,k.jsx)(qe.default,{id:"dropdown-menu",anchorEl:m,open:l,onClose:()=>{x(null)},children:typeof e=="function"?(0,k.jsx)(de.default,{children:e(()=>{x(null)})}):e})]})}var Qe=St;var Ze=n(require("@mui/material/Link"),1);var eo=require("react/jsx-runtime");function wt(i){var a=i,{href:e,children:o}=a,t=h(a,["href","children"]);return(0,eo.jsx)(Ze.default,u(p({component:"a",href:e,target:"_blank",rel:"noopener noreferrer"},t),{children:o}))}var je=wt;var oo=n(require("@mui/icons-material/CloudUpload"),1),to=n(require("@mui/material/Button"),1),le=require("@mui/material/styles"),ro=require("react");var A=require("react/jsx-runtime"),no={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"},bt=(0,le.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}),It=(0,le.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 Lt(s){var d=s,{onFileInput:e,label:o="Upload files",multiple:t,accept:i,useDropzone:a}=d,r=h(d,["onFileInput","label","multiple","accept","useDropzone"]);var c;let[m,x]=(0,ro.useState)(!1),l=(0,A.jsxs)(to.default,u(p({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:g=>{var y;(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),(y=document.getElementById("file-input"))==null||y.click())}},r),{startIcon:(c=r.startIcon)!=null?c:(0,A.jsx)(oo.default,{}),children:[o,(0,A.jsx)(bt,{id:"file-input",type:"file",onChange:g=>{var w;let y=g.target;e(Array.from((w=y.files)!=null?w:[])),y.value=""},multiple:t,accept:i==null?void 0:i.join(","),disabled:r.disabled})]}));return a?(0,A.jsx)(It,{$dragging:m,onDragOver:g=>{g.preventDefault(),!r.disabled&&x(!0)},onDragLeave:g=>{g.preventDefault(),x(!1)},onDrop:g=>{var w;if(g.preventDefault(),x(!1),r.disabled)return;let y=Array.from((w=g.dataTransfer.files)!=null?w:[]);e(y)},children:l}):l}var j=Lt;var io=n(require("@mui/icons-material/Delete"),1),ao=n(require("@mui/material/Box"),1),po=n(require("@mui/material/IconButton"),1),so=n(require("@mui/material/List"),1),mo=n(require("@mui/material/ListItem"),1),lo=n(require("@mui/material/ListItemText"),1);var I=require("react/jsx-runtime");function Ct(i){var a=i,{files:e,setFiles:o}=a,t=h(a,["files","setFiles"]);function r(d){o(m=>[...m,...d])}let s=u(p({},t),{onFileInput:r});return(s==null?void 0:s.multiple)===void 0&&(s.multiple=!0),(0,I.jsxs)(ao.default,{children:[(0,I.jsx)(j,p({},s)),(0,I.jsx)(so.default,{children:e.map(d=>(0,I.jsx)(mo.default,{secondaryAction:(0,I.jsx)(po.default,{"aria-label":"Delete",edge:"end",onClick:()=>{o(m=>m.filter(x=>x!==d))},children:(0,I.jsx)(io.default,{})}),children:(0,I.jsx)(lo.default,{primary:d.name})},d.name))})]})}var co=Ct;var uo=n(require("@mui/material/Box"),1),fo=n(require("@mui/material/Popover"),1),ee=require("react");var X=require("react/jsx-runtime");function kt({icon:e,onOpen:o,onClose:t,iconProps:i,children:a}){let[r,s]=(0,ee.useState)(null),d=!!r,m=(0,ee.useId)();function x(c){s(c.currentTarget),o&&o()}function l(){s(null),t&&t()}return(0,X.jsxs)(uo.default,{children:[(0,X.jsx)(e,p({"aria-owns":d?m:void 0,"aria-haspopup":"true",onMouseEnter:x,onMouseLeave:l},i)),(0,X.jsx)(fo.default,{id:m,sx:{pointerEvents:"none"},open:d,anchorEl:r,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:l,disableRestoreFocus:!0,children:a})]})}var xo=kt;var go=n(require("@mui/material/Link"),1),ho=require("react-router-dom");var yo=require("react/jsx-runtime");function Tt(i){var a=i,{to:e,children:o}=a,t=h(a,["to","children"]);return(0,yo.jsx)(go.default,u(p({component:ho.Link,to:e},t),{children:o}))}var oe=Tt;var Po=n(require("@mui/material/ListItemButton"),1);var So=require("react/jsx-runtime");function Bt(t){var i=t,{children:e}=i,o=h(i,["children"]);return(0,So.jsx)(Po.default,u(p({component:oe},o),{children:e}))}var vo=Bt;var wo=n(require("@mui/material/CircularProgress"),1);var O=require("react/jsx-runtime");function Dt(a){var r=a,{children:e,onUndefined:o,loadingComponent:t=(0,O.jsx)(wo.default,{})}=r,i=h(r,["children","onUndefined","loadingComponent"]);return(0,O.jsxs)(Y,u(p({loadingComponent:t},i),{children:[(0,O.jsx)(Q,{}),(0,O.jsx)(q,{onUndefined:o,children:e})]}))}var bo=Dt;var Io=n(require("@mui/material/BottomNavigation"),1),Lo=n(require("@mui/material/BottomNavigationAction"),1),Co=n(require("@mui/material/Box"),1),ko=n(require("@mui/material/Paper"),1),To=require("react"),Bo=require("react-router-dom");var L=require("react/jsx-runtime");function Nt({children:e,navItems:o}){let[t,i]=(0,To.useState)("");return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(Co.default,{sx:{paddingBottom:7},children:e}),(0,L.jsx)(ko.default,{sx:{position:"fixed",bottom:0,left:0,right:0},children:(0,L.jsx)(Io.default,{showLabels:!0,value:t,onChange:(a,r)=>{i(r)},children:o.map(a=>(0,L.jsx)(Lo.default,u(p({},a),{component:Bo.Link}),a.value))})})]})}var Do=Nt;var ce=require("@alextheman/utility"),Eo=n(require("@mui/icons-material/ChevronLeft"),1),Ao=n(require("@mui/icons-material/ChevronRight"),1),Oo=n(require("@mui/icons-material/Menu"),1),Fo=n(require("@mui/material/AppBar"),1),ue=n(require("@mui/material/Box"),1),Wo=n(require("@mui/material/CssBaseline"),1),fe=n(require("@mui/material/Divider"),1),zo=n(require("@mui/material/Drawer"),1),xe=n(require("@mui/material/IconButton"),1),Ho=n(require("@mui/material/List"),1),Uo=n(require("@mui/material/ListItem"),1),Vo=n(require("@mui/material/ListItemButton"),1),Xo=n(require("@mui/material/ListItemIcon"),1),$o=n(require("@mui/material/ListItemText"),1),F=require("@mui/material/styles"),_o=n(require("@mui/material/Toolbar"),1),te=n(require("@mui/material/Typography"),1),ne=require("react"),ie=require("react-router-dom");var f=require("react/jsx-runtime"),re=240;function No(e){return{width:re,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 Ro=(0,F.styled)("div")(({theme:e})=>p({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Mt=(0,F.styled)(Fo.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:re,width:`calc(100% - ${re}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Rt=(0,F.styled)(zo.default,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:re,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:u(p({},No(e)),{"& .MuiDrawer-paper":No(e)})},{props:({open:o})=>!o,style:u(p({},Mo(e)),{"& .MuiDrawer-paper":Mo(e)})}]}));function Et({title:e,navItems:o,children:t,headerElements:i}){let a=(0,F.useTheme)(),[r,s]=(0,ne.useState)(!0),d=(0,ie.useLocation)();function m(){s(!0)}function x(){s(!1)}return(0,f.jsxs)(ue.default,{sx:{display:"flex"},children:[(0,f.jsx)(Wo.default,{}),(0,f.jsx)(Mt,{position:"fixed",open:r,children:(0,f.jsxs)(_o.default,{children:[(0,f.jsx)(xe.default,{color:"inherit","aria-label":"open drawer",onClick:m,edge:"start",sx:[{marginRight:5},r&&{display:"none"}],children:(0,f.jsx)(Oo.default,{})}),(0,f.jsx)(te.default,{variant:"h6",noWrap:!0,component:"div",children:e}),i]})}),(0,f.jsxs)(Rt,{variant:"permanent",open:r,children:[(0,f.jsx)(Ro,{children:(0,f.jsx)(xe.default,{onClick:x,children:a.direction==="rtl"?(0,f.jsx)(Ao.default,{}):(0,f.jsx)(Eo.default,{})})}),(0,f.jsx)(fe.default,{}),o.map(l=>(0,f.jsxs)(ne.Fragment,{children:[(0,f.jsxs)(Ho.default,{children:[(0,f.jsx)(te.default,{variant:r?"h5":"h6",paddingLeft:r?2:1,children:r?l.category:(0,ce.truncate)(l.category,4)}),l.options.map(c=>(0,f.jsx)(Uo.default,{disablePadding:!0,sx:{display:"block"},children:(0,f.jsxs)(Vo.default,{sx:[{minHeight:48,px:2.5},r?{justifyContent:"initial"}:{justifyContent:"center"}],component:ie.Link,to:c.to,selected:d.pathname===c.to,children:[(0,f.jsx)(Xo.default,{sx:[{minWidth:0,justifyContent:"center"},r?{mr:3}:{mr:"auto"}],children:c.icon?c.icon:r?null:(0,f.jsx)(te.default,{children:(0,ce.truncate)(c.label,4)})}),(0,f.jsx)($o.default,{primary:c.label,sx:[r?{opacity:1}:{opacity:0}]})]})},c.to))]}),(0,f.jsx)(fe.default,{})]},l.category))]}),(0,f.jsxs)(ue.default,{component:"main",sx:{flexGrow:1,p:3},children:[(0,f.jsx)(Ro,{}),t]})]})}var Go=Et;var Jo=n(require("@mui/material/Typography"),1);var $=require("react/jsx-runtime");function At(i){var a=i,{text:e,sx:o}=a,t=h(a,["text","sx"]);return(0,$.jsx)($.Fragment,{children:e.split(`
2
+ `).map((r,s)=>(0,$.jsx)(Jo.default,u(p({sx:p({margin:1},o)},t),{children:r}),s))})}var Ko=At;var ae=n(require("@mui/material/Box"),1),ge=n(require("@mui/material/Typography"),1),Yo=require("common-tags"),T=require("react-live");var v=require("react/jsx-runtime");function Ot({code:e,scope:o,previewStyles:t,noInline:i,enableTypeScript:a,language:r}){let{mode:s}=R(),d={backgroundColor:s==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},m=t?p(p({},d),t):p({},d);return(0,v.jsx)(ae.default,{sx:{borderRadius:1,border:.5,padding:2},children:(0,v.jsxs)(T.LiveProvider,{code:(0,Yo.stripIndent)(e),scope:o,noInline:i,enableTypeScript:a,language:r,children:[(0,v.jsx)(ge.default,{variant:"h5",children:"Code"}),(0,v.jsx)(ae.default,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:(0,v.jsx)(T.LiveEditor,{})}),(0,v.jsx)("br",{}),(0,v.jsx)(ge.default,{variant:"h5",children:"Result"}),(0,v.jsxs)(ae.default,{sx:m,children:[(0,v.jsx)(T.LivePreview,{}),(0,v.jsx)(T.LiveError,{})]})]})})}var qo=Ot;var Qo=n(require("@mui/material/Button"),1),Zo=require("react-hook-form");var et=require("react/jsx-runtime");function Ft(i){var a=i,{disableClean:e,label:o}=a,t=h(a,["disableClean","label"]);let{formState:{disabled:r,isDirty:s,isSubmitting:d}}=(0,Zo.useFormContext)();return(0,et.jsx)(Qo.default,u(p({color:"primary",disabled:t.disabled||e&&!s||r,loading:d,type:"submit",variant:"contained"},t),{children:o}))}var jo=Ft;var he=n(require("@mui/material/Box"),1),ot=require("@mui/material/styles"),tt=n(require("@mui/material/Switch"),1);var W=require("react/jsx-runtime"),Wt=(0,ot.styled)(tt.default)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function zt(r){var s=r,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:t,uncheckedIconStyles:i}=s,a=h(s,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let d={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},m={color:"black",maxWidth:16.5,maxHeight:16.5};return(0,W.jsx)(Wt,p({checkedIcon:(0,W.jsx)(he.default,{sx:d,children:(0,W.jsx)(e,{style:p(p({},m),o)})}),icon:(0,W.jsx)(he.default,{sx:d,children:(0,W.jsx)(t,{style:p(p({},m),i)})})},a))}var rt=zt;var N=require("react");function Ht(e){let[o,t]=(0,N.useState)(()=>{let r=window.location.hash.replace("#","");return e&&r===""?e:r}),i=(0,N.useCallback)(()=>{let r=window.location.hash.replace("#","");t(e&&r===""?e:r)},[t,e]);(0,N.useEffect)(()=>(window.addEventListener("hashchange",i),()=>{window.removeEventListener("hashchange",i)}),[i]);let a=(0,N.useCallback)(r=>{let s=typeof r=="function"?r(o):r;s!==o&&(window.location.hash=s)},[o]);return[o,a]}var nt=Ht;0&&(module.exports={CollapsableItem,DarkModeToggle,DropdownMenu,ExternalLink,FileInput,FileInputList,FileType,IconWithPopover,InternalLink,ListItemInternalLink,Loader,LoaderData,LoaderError,LoaderProvider,ModeProvider,NavigationBottom,NavigationDrawer,PopoverText,ReactPlayground,ScreenSizeProvider,SnackbarProvider,SubmitButton,SwitchWithIcons,useHash,useLoader,useMode,useScreenSize,useSnackbar});
3
3
  //# sourceMappingURL=index.cjs.map
@@ -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/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\ninterface BaseProps<T> {\n isLoading: boolean;\n data?: T;\n loadingComponent?: ReactNode;\n}\n\ninterface PropsWithNoError<T> extends BaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\ninterface PropsWithError<T> extends BaseProps<T> {\n error: unknown;\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> = PropsWithNoError<T> | PropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n loadingComponent?: ReactNode;\n onUndefined?: () => ReactNode | void;\n showOnError?: boolean;\n}\n\nfunction LoaderData<T>({\n children,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const { isLoading, data, loadingComponent: defaultLoadingComponent, error } = useLoader<T>();\n\n if (isLoading) {\n return <>{loadingComponent ?? defaultLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport Link from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\"> {\n href: string;\n children: ReactNode;\n}\n\nfunction ExternalLink({\n href,\n children,\n target = \"_blank\",\n rel = \"noopener noreferrer\",\n ...linkProps\n}: ExternalLinkProps) {\n return (\n <Link component={\"a\"} href={href} target={target} rel={rel} {...linkProps}>\n {children}\n </Link>\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 Link from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: string;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <Link component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </Link>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n onUndefined?: () => ReactNode | void;\n};\n\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import 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":"4xCAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,qBAAAE,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,cAAAC,EAAA,kBAAAC,GAAA,aAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,yBAAAC,GAAA,WAAAC,GAAA,eAAAC,EAAA,gBAAAC,EAAA,mBAAAC,EAAA,iBAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,oBAAAC,GAAA,uBAAAC,GAAA,qBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,YAAAC,GAAA,cAAAC,EAAA,YAAAC,EAAA,kBAAAC,GAAA,gBAAAC,KAAA,eAAAC,GAAA9B,ICIA,IAAA+B,GAA0B,kDAC1BC,GAAwB,gDACxBC,GAAgB,kCAChBC,EAAuB,yCACvBC,GAAqB,uCACrBC,EAAoC,iBAyBvB,IAAAC,EAAA,6BATb,SAASC,GAAgB,CACvB,gBAAAC,EACA,OAAAC,EACA,QAAAC,EACA,SAAAC,EACA,aAAAC,EACA,eAAAC,EACA,gBAAiBC,EAAkB,EAAAC,QACnC,cAAAC,EACA,SAAAC,KAAW,OAAC,GAAAC,QAAA,EAAY,EACxB,WAAAC,KAAa,OAAC,GAAAC,QAAA,EAAc,EAC5B,kBAAAC,EAAoBP,IAAoB,EAAAC,OAC1C,EAAyB,CACvB,GAAM,CAACO,EAAYC,CAAa,KAAI,YAAkB,CAAC,CAACf,CAAe,EAEvE,sBAAU,IAAM,CACVc,GAAcb,EAChBA,EAAO,EACE,CAACa,GAAcZ,GACxBA,EAAQ,CAEZ,EAAG,CAACY,CAAU,CAAC,KAGb,QAAC,GAAAE,QAAA,CACC,qBAACV,EAAA,CACC,QAAS,IAAM,CACbS,EAAeE,GACN,CAACA,CACT,CACH,EACA,GACEJ,EACIK,EAAA,CACE,MAAO,OACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,SAAU,IACV,SAAU,EACV,UAAW,SACX,UACEZ,IAAoB,EAAAC,QAAa,CAAE,gBAAiB,cAAe,EAAI,MACtEH,GAELA,EAEN,gBAAeU,EAEd,UAAAT,EACAS,EAAaL,EAAWE,GAC3B,KACA,OAAC,GAAAQ,QAAAC,EAAAF,EAAA,CAAS,GAAIJ,GAAgBN,GAA7B,CACE,SAAAL,GACH,GACF,CAEJ,CAEA,IAAOkB,GAAQtB,GCpFf,IAAAuB,GAAqB,6CACrBC,GAAsB,8CACtBC,GAAuB,yCACvBC,GAAoB,sCCDpB,IAAAC,GAA6B,+CAC7BC,EAA0C,iBAgCrB,IAAAC,GAAA,6BAXfC,MAAgB,iBAAuD,MAAS,EAC/E,SAASC,GAAsC,CACpD,IAAMC,KAAU,cAAWF,EAAa,EACxC,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,wBAAwB,EAE1C,OAAOA,CACT,CAEA,SAASC,GAAkBC,EAIA,CAJA,IAAAC,EAAAD,EACzB,UAAAE,EACA,iBAAAC,KAAmB,QAAC,GAAAC,QAAA,EAAiB,CAnCvC,EAiC2BH,EAGtBI,EAAAC,EAHsBL,EAGtB,CAFH,WACA,qBAGA,SACE,QAACL,GAAc,SAAd,CAAuB,MAAOW,EAAA,CAAE,iBAAAJ,GAAqBE,GACnD,SAAAH,EACH,CAEJ,CAEA,IAAOM,EAAQT,GCxBJ,IAAAU,EAAA,6BATX,SAASC,GAAc,CACrB,SAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,YAAAC,CACF,EAAuB,CACrB,GAAM,CAAE,UAAAC,EAAW,KAAAC,EAAM,iBAAkBC,EAAyB,MAAAC,CAAM,EAAIC,EAAa,EAE3F,GAAIJ,EACF,SAAO,mBAAG,SAAAH,GAAA,KAAAA,EAAoBK,EAAwB,EAGxD,GAAIC,GAAS,CAACJ,EACZ,SAAO,oBAAE,EAIX,GAAIE,IAAS,OAAW,CAItB,GAHA,QAAQ,KACN,sLACF,EACIH,EAAa,CACf,IAAMO,EAASP,EAAY,EAC3B,OAAOO,GAAA,KAAAA,KAAU,oBAAE,CACrB,CACA,SAAO,oBAAE,CACX,CAEA,OAAO,OAAOT,GAAa,cACzB,mBAAG,SAAAA,EAASK,CAA4B,EAAE,KAE1C,mBAAG,SAAAL,EAAS,CAEhB,CAEA,IAAOU,EAAQX,GC/Cf,IAAAY,GAAkB,oCAYL,IAAAC,EAAA,6BARb,SAASC,IAAc,CAJvB,IAAAC,EAKE,GAAM,CAAE,MAAAC,EAAO,eAAAC,CAAe,EAAIC,EAAU,EAE5C,OAAIF,EACE,OAAOC,GAAmB,WACrBA,EAAeD,CAAK,EAEzBC,KACK,mBAAG,SAAAA,EAAe,KAGzB,OAAC,GAAAE,QAAA,CAAM,SAAS,QACZ,UAAAJ,EAAAC,GAAA,YAAAA,EAAiB,UAAjB,KAAAD,EAA4B,wDAChC,KAIG,oBAAE,CACX,CAEA,IAAOK,EAAQN,GCtBf,IAAAO,GAAwB,0CACxBC,EAA2C,gCAC3CC,EAA6D,iBAwCvDC,EAAA,6BAtCAC,MAAc,iBAAc,CAChC,WAAY,IAAM,CAAC,EACnB,KAAM,MACR,CAAC,EAEM,SAASC,GAAU,CACxB,SAAO,cAAWD,EAAW,CAC/B,CASA,SAASE,GAAa,CAAE,SAAAC,EAAU,KAAMC,EAAW,MAAO,EAAsB,CAC9E,GAAM,CAACC,EAAMC,CAAO,KAAI,YAAeF,CAAQ,EAEzCG,KAAQ,WAAQ,OACb,eAAY,CACjB,QAAS,CACP,KAAAF,CACF,CACF,CAAC,EACA,CAACA,CAAI,CAAC,EAET,SACE,OAACL,GAAY,SAAZ,CACC,MAAO,CACL,KAAAK,EACA,WAAY,IAAM,CAChBC,EAASE,GACAA,IAAS,QAAU,OAAS,OACpC,CACH,CACF,EAEA,oBAAC,iBAAc,MAAOD,EACpB,oBAAC,GAAAE,QAAA,EAAY,EACZN,GACH,EACF,CAEJ,CAEA,IAAOO,GAAQR,GClDf,IAAAS,EAA+D,iBAiE3DC,GAAA,6BAnDEC,MAAoB,iBAAsC,CAC9D,YAAa,EACb,aAAc,EACd,cAAe,EACjB,CAAC,EAEM,SAASC,IAAgB,CAC9B,SAAO,cAAWD,EAAiB,CACrC,CAEA,SAASE,GAAmB,CAAE,SAAAC,EAAU,iBAAAC,EAAkB,kBAAAC,CAAkB,EAAoB,CAC9F,GAAM,CAACC,EAAaC,CAAc,KAAI,YAAiB,OAAO,UAAU,EAClE,CAACC,EAAcC,CAAe,KAAI,YAAiB,OAAO,WAAW,EAE3E,SAASC,EACPC,EACAC,EACAR,EAA2B,IAC3BC,EAA4B,IACnB,CACT,OAAOM,EAAQP,GAAoBQ,EAASP,CAC9C,CAEA,GAAM,CAACQ,EAAeC,CAAgB,KAAI,YACxCJ,EACE,OAAO,WACP,OAAO,YACPN,EACAC,CACF,CACF,EAEA,sBAAU,IAAM,CACd,SAASU,GAAgB,CACvBR,EAAe,OAAO,UAAU,EAChCE,EAAgB,OAAO,WAAW,CACpC,CACA,OAAAM,EAAc,EACd,OAAO,iBAAiB,SAAUA,CAAa,EACxC,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAa,CACpD,CACF,EAAG,CAAC,CAAC,KAEL,aAAU,IAAM,CACdD,EACEJ,EAAqBJ,EAAaE,EAAcJ,EAAkBC,CAAiB,CACrF,CACF,EAAG,CAACC,EAAaE,EAAcJ,EAAkBC,CAAiB,CAAC,KAGjE,QAACL,GAAkB,SAAlB,CACC,MAAO,CACL,cAAAa,EACA,YAAAP,EACA,aAAAE,CACF,EAEC,SAAAL,EACH,CAEJ,CAEA,IAAOa,GAAQd,GC5Ef,IAAAe,GAAqB,+BACrBC,GAAkB,oCAClBC,GAAqB,uCACrBC,EAAoD,iBA0ChD,IAAAC,EAAA,6BA/BEC,MAAkB,iBAAgD,MAAS,EAC1E,SAASC,IAAc,CAC5B,IAAMC,KAAU,cAAWF,EAAe,EAC1C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,0BAA0B,EAE5C,OAAOA,CACT,CAEA,SAASC,GAAiB,CAAE,SAAAC,EAAU,iBAAAC,EAAmB,GAAK,EAA0B,CACtF,GAAM,CAACC,EAAMC,CAAO,KAAI,YAAkB,EAAK,EACzC,CAACC,EAAuBC,CAAwB,KAAI,YAAiBJ,CAAgB,EACrF,CAACK,EAASC,CAAU,KAAI,YAAiB,EAAE,EAC3C,CAACC,EAAUC,CAAW,KAAI,YAAqB,MAAM,EAE3D,SAASC,EAAYJ,EAAiBE,EAAuBG,EAAmB,CAC9ER,EAAQ,EAAI,EACZE,EAAyBM,GAAA,KAAAA,EAAYV,CAAgB,EACrDQ,EAAYD,GAAA,KAAAA,EAAY,MAAM,EAC9BD,EAAWD,CAAO,CACpB,CAEA,SAAeM,GAAc,QAAAC,GAAA,sBAC3BV,EAAQ,EAAK,EAGb,QAAM,SAAK,EAAG,EACdI,EAAW,EAAE,CACf,GAEA,SACE,QAACX,GAAgB,SAAhB,CAAyB,MAAO,CAAE,YAAAc,CAAY,EAC7C,oBAAC,GAAAI,QAAA,CAAS,KAAMZ,EAAM,iBAAkBE,EAAuB,QAASQ,EACtE,mBAAC,GAAAG,QAAA,CAAM,QAASH,EAAa,SAAUJ,EACpC,SAAAF,EACH,EACF,EACCN,GACH,CAEJ,CAEA,IAAOgB,GAAQjB,GN1CY,IAAAkB,EAAA,6BAV3B,SAASC,IAAiB,CACxB,GAAM,CAAE,KAAAC,EAAM,WAAAC,CAAW,EAAIC,EAAQ,EAErC,SACE,OAAC,GAAAC,QAAA,CAAQ,MAAO,UAAUH,IAAS,OAAS,QAAU,MAAM,QAC1D,mBAAC,GAAAI,QAAA,CACC,GAAI,CAAE,WAAY,MAAO,EACzB,QAASH,EACT,aAAY,UAAUD,IAAS,OAAS,QAAU,MAAM,QAEvD,SAAAA,IAAS,UAAS,OAAC,GAAAK,QAAA,EAAU,KAAK,OAAC,GAAAC,QAAA,EAAS,EAC/C,EACF,CAEJ,CAEA,IAAOC,GAAQR,GOpBf,IAAAS,GAA0B,kDAC1BC,GAAwB,gDACxBC,GAAgB,kCAChBC,GAAsB,qCACtBC,GAAiB,mCACjBC,EAA6C,iBAoB9B,IAAAC,EAAA,6BALf,SAASC,GAAa,CACpB,SAAAC,EACA,OAAQC,EAAS,GAAAC,QACjB,eAAAC,EAAiB,OACjB,YAAaC,EACb,WAAAC,KAAa,OAAC,GAAAC,QAAA,EAAY,EAC1B,aAAAC,KAAe,OAAC,GAAAC,QAAA,EAAc,EAC9B,OAAAC,EACA,QAAAC,CACF,EAAsB,CACpB,GAAM,CAACC,EAAeC,CAAgB,KAAI,YAA6B,IAAI,EACrEC,KAAiB,WAAQ,IACtB,CAAC,CAACF,EACR,CAACA,CAAa,CAAC,EAEZG,EAAuCC,EAAAC,EAAA,GACxCZ,GADwC,CAE3C,QAAUa,GAAwC,CAChDL,EAAiBK,EAAM,aAAa,CACtC,EACA,gBAAiBJ,EAAiB,gBAAkB,OACpD,gBAAiB,OACjB,gBAAiBA,CACnB,GAEA,OAAIZ,IAAW,GAAAC,UACbY,EAAY,QAAUD,EAAiBR,EAAaE,MAGtD,aAAU,IAAM,CACVM,GAAkBJ,EACpBA,EAAO,EACE,CAACI,GAAkBH,GAC5BA,EAAQ,CAEZ,EAAG,CAACG,EAAgBJ,EAAQC,CAAO,CAAC,KAGlC,QAAC,GAAAQ,QAAA,CACC,oBAACjB,EAAAc,EAAAC,EAAA,GAAWF,GAAX,CAAyB,SAAAX,GAAe,KACzC,OAAC,GAAAgB,QAAA,CACC,GAAG,gBACH,SAAUR,EACV,KAAME,EACN,QAAS,IAAM,CACbD,EAAiB,IAAI,CACvB,EAEC,gBAAOZ,GAAa,cACnB,OAAC,GAAAkB,QAAA,CACE,SAAAlB,EAAS,IAAM,CACdY,EAAiB,IAAI,CACvB,CAAC,EACH,EAEAZ,EAEJ,GACF,CAEJ,CAEA,IAAOoB,GAAQrB,GClFf,IAAAsB,GAAiB,mCAeb,IAAAC,GAAA,6BARJ,SAASC,GAAaC,EAMA,CANA,IAAAC,EAAAD,EACpB,MAAAE,EACA,SAAAC,EACA,OAAAC,EAAS,SACT,IAAAC,EAAM,qBAdR,EAUsBJ,EAKjBK,EAAAC,EALiBN,EAKjB,CAJH,OACA,WACA,SACA,QAGA,SACE,QAAC,GAAAO,QAAAC,EAAAC,EAAA,CAAK,UAAW,IAAK,KAAMR,EAAM,OAAQE,EAAQ,IAAKC,GAASC,GAA/D,CACE,SAAAH,GACH,CAEJ,CAEA,IAAOQ,GAAQZ,GCtBf,IAAAa,GAA4B,gDAC5BC,GAAmB,qCACnBC,GAAuB,gCACvBC,GAAyB,iBA4DrB,IAAAC,EAAA,6BA1DSC,GAAW,CACtB,IAAK,kBACL,IAAK,YACL,KAAM,aACN,IAAK,YACL,KAAM,oEACN,KAAM,0EACN,IAAK,YACL,IAAK,YACL,IAAK,WACP,EAIMC,MAAsB,WAAO,OAAO,EAAE,CAC1C,KAAM,gBACN,SAAU,aACV,OAAQ,EACR,SAAU,SACV,SAAU,WACV,OAAQ,EACR,KAAM,EACN,WAAY,SACZ,MAAO,CACT,CAAC,EAEKC,MAAW,WAAO,KAAK,EAA0B,CAAC,CAAE,MAAAC,EAAO,UAAAC,CAAU,KAClE,CACL,OAAQ,aACR,YAAaA,EAAYD,EAAM,QAAQ,QAAQ,KAAO,OACtD,gBAAiBC,EAAYD,EAAM,QAAQ,OAAO,MAAQ,cAC1D,aAAc,EACd,QAAS,SACT,UAAW,SACX,WAAY,oBACZ,OAAQ,SACV,EACD,EAUD,SAASE,GAAUC,EAOA,CAPA,IAAAC,EAAAD,EACjB,aAAAE,EACA,MAAAC,EAAQ,eACR,SAAAC,EACA,OAAAC,EACA,YAAAC,CA3DF,EAsDmBL,EAMdM,EAAAC,EANcP,EAMd,CALH,cACA,QACA,WACA,SACA,gBA3DF,IAAAD,EA8DE,GAAM,CAACS,EAAYC,CAAa,KAAI,aAAkB,EAAK,EAErDC,KACJ,QAAC,GAAAC,QAAAC,EAAAC,EAAA,CACC,QAAQ,YACR,UAAU,QACV,aAAW,qBACX,UAAYC,GAAU,CArE5B,IAAAf,GAsEYe,EAAM,MAAQ,SAAWA,EAAM,MAAQ,OACzCA,EAAM,eAAe,GACrBf,EAAA,SAAS,eAAe,YAAY,IAApC,MAAAA,EAAuC,QAE3C,GACIO,GAVL,CAWC,WAAWP,EAAAO,EAAY,YAAZ,KAAAP,KAAyB,OAAC,GAAAgB,QAAA,EAAgB,EAEpD,UAAAb,KACD,OAACR,GAAA,CACC,GAAG,aACH,KAAK,OACL,SAAWoB,GAAU,CAlF7B,IAAAf,EAmFU,IAAMiB,EAAQF,EAAM,OACpBb,EAAY,MAAM,MAAKF,EAAAiB,EAAM,QAAN,KAAAjB,EAAe,CAAC,CAAC,CAAC,EACzCiB,EAAM,MAAQ,EAChB,EACA,SAAUb,EACV,OAAQC,GAAA,YAAAA,EAAQ,KAAK,KACrB,SAAUE,EAAY,SACxB,IACF,EAGF,OAAOD,KACL,OAACV,GAAA,CACC,UAAWa,EACX,WAAaM,GAAU,CACrBA,EAAM,eAAe,EACjB,CAAAR,EAAY,UAGhBG,EAAc,EAAI,CACpB,EACA,YAAcK,GAAU,CACtBA,EAAM,eAAe,EACrBL,EAAc,EAAK,CACrB,EACA,OAASK,GAAU,CA5GzB,IAAAf,EA+GQ,GAFAe,EAAM,eAAe,EACrBL,EAAc,EAAK,EACfH,EAAY,SACd,OAEF,IAAMW,EAAa,MAAM,MAAKlB,EAAAe,EAAM,aAAa,QAAnB,KAAAf,EAA4B,CAAC,CAAC,EAC5DE,EAAYgB,CAAU,CACxB,EAEC,SAAAP,EACH,EAEAA,CAEJ,CAEA,IAAOQ,EAAQpB,GC1Hf,IAAAqB,GAAuB,2CACvBC,GAAgB,kCAChBC,GAAuB,yCACvBC,GAAiB,mCACjBC,GAAqB,uCACrBC,GAAyB,2CAsBrB,IAAAC,EAAA,6BAbJ,SAASC,GAAcC,EAA4D,CAA5D,IAAAC,EAAAD,EAAE,OAAAE,EAAO,SAAAC,CAjBhC,EAiBuBF,EAAsBG,EAAAC,EAAtBJ,EAAsB,CAApB,QAAO,aAC9B,SAASK,EAAYC,EAAkB,CACrCJ,EAAUK,GACD,CAAC,GAAGA,EAAU,GAAGD,CAAQ,CACjC,CACH,CAEA,IAAME,EAAoBC,EAAAC,EAAA,GAAKP,GAAL,CAAqB,YAAAE,CAAY,GAC3D,OAAIG,GAAA,YAAAA,EAAmB,YAAa,SAClCA,EAAkB,SAAW,OAI7B,QAAC,GAAAG,QAAA,CACC,oBAACC,EAAAF,EAAA,GAAcF,EAAmB,KAClC,OAAC,GAAAK,QAAA,CACE,SAAAZ,EAAM,IAAKa,MAER,OAAC,GAAAC,QAAA,CAEC,mBACE,OAAC,GAAAC,QAAA,CACC,aAAW,SACX,KAAK,MACL,QAAS,IAAM,CACbd,EAAUK,GACDA,EAAS,OAAQU,GACfA,IAAiBH,CACzB,CACF,CACH,EAEA,mBAAC,GAAAI,QAAA,EAAW,EACd,EAGF,mBAAC,GAAAC,QAAA,CAAa,QAASL,EAAK,KAAM,GAjB7BA,EAAK,IAkBZ,CAEH,EACH,GACF,CAEJ,CAEA,IAAOM,GAAQtB,GC1Df,IAAAuB,GAAgB,kCAChBC,GAAoB,sCACpBC,GAAgC,iBAwC5B,IAAAC,EAAA,6BA1BJ,SAASC,GAAgB,CACvB,KAAMC,EACN,OAAAC,EACA,QAAAC,EACA,UAAAC,EACA,SAAAC,CACF,EAAyB,CACvB,GAAM,CAACC,EAAeC,CAAgB,KAAI,aAAyB,IAAI,EACjEC,EAAgB,CAAC,CAACF,EAClBG,KAAY,UAAM,EAExB,SAASC,EAAWC,EAAmD,CACrEJ,EAAiBI,EAAM,aAAa,EAChCT,GACFA,EAAO,CAEX,CAEA,SAASU,GAAc,CACrBL,EAAiB,IAAI,EACjBJ,GACFA,EAAQ,CAEZ,CAEA,SACE,QAAC,GAAAU,QAAA,CACC,oBAACZ,EAAAa,EAAA,CACC,YAAWN,EAAgBC,EAAY,OACvC,gBAAc,OACd,aAAcC,EACd,aAAcE,GACVR,EACN,KACA,OAAC,GAAAW,QAAA,CACC,GAAIN,EACJ,GAAI,CAAE,cAAe,MAAO,EAC5B,KAAMD,EACN,SAAUF,EACV,aAAc,CACZ,SAAU,SACV,WAAY,MACd,EACA,gBAAiB,CACf,SAAU,MACV,WAAY,MACd,EACA,QAASM,EACT,oBAAmB,GAElB,SAAAP,EACH,GACF,CAEJ,CAEA,IAAOW,GAAQhB,GCzEf,IAAAiB,GAAiB,mCACjBC,GAAqC,4BASjC,IAAAC,GAAA,6BAFJ,SAASC,GAAaC,EAAmD,CAAnD,IAAAC,EAAAD,EAAE,IAAAE,EAAI,SAAAC,CAX5B,EAWsBF,EAAmBG,EAAAC,EAAnBJ,EAAmB,CAAjB,KAAI,aAC1B,SACE,QAAC,GAAAK,QAAAC,EAAAC,EAAA,CAAK,UAAW,GAAAC,KAAc,GAAIP,GAAQE,GAA1C,CACE,SAAAD,GACH,CAEJ,CAEA,IAAOO,GAAQX,GChBf,IAAAY,GAA2B,6CAWvB,IAAAC,GAAA,6BAFJ,SAASC,GAAqBC,EAAiE,CAAjE,IAAAC,EAAAD,EAAE,UAAAE,CAZhC,EAY8BD,EAAeE,EAAAC,EAAfH,EAAe,CAAb,aAC9B,SACE,QAAC,GAAAI,QAAAC,EAAAC,EAAA,CAAe,UAAWC,IAAkBL,GAA5C,CACE,SAAAD,GACH,CAEJ,CAEA,IAAOO,GAAQV,GChBf,IAAAW,GAA6B,+CAaR,IAAAC,EAAA,6BAHrB,SAASC,GAAUC,EAKA,CALA,IAAAC,EAAAD,EACjB,UAAAE,EACA,YAAAC,EACA,iBAAAC,KAAmB,OAAC,GAAAC,QAAA,EAAiB,CAjBvC,EAcmBJ,EAIdK,EAAAC,EAJcN,EAId,CAHH,WACA,cACA,qBAGA,SACE,QAACO,EAAAC,EAAAC,EAAA,CAAkB,iBAAkBN,GAAsBE,GAA1D,CACC,oBAACK,EAAA,EAAY,KACb,OAACC,EAAA,CAAc,YAAaT,EAAc,SAAAD,EAAS,IACrD,CAEJ,CAEA,IAAOW,GAAQd,GC1Bf,IAAAe,GAA6B,+CAC7BC,GAAmC,qDACnCC,GAAgB,kCAChBC,GAAkB,oCAClBC,GAAyB,iBACzBC,GAAqB,4BAiBjB,IAAAC,EAAA,6BAHJ,SAASC,GAAiB,CAAE,SAAAC,EAAU,SAAAC,CAAS,EAA0B,CACvE,GAAM,CAACC,EAAOC,CAAQ,KAAI,aAAiB,EAAE,EAC7C,SACE,oBACE,oBAAC,GAAAC,QAAA,CAAI,GAAI,CAAE,cAAe,CAAE,EAAI,SAAAJ,EAAS,KACzC,OAAC,GAAAK,QAAA,CAAM,GAAI,CAAE,SAAU,QAAS,OAAQ,EAAG,KAAM,EAAG,MAAO,CAAE,EAC3D,mBAAC,GAAAC,QAAA,CACC,WAAU,GACV,MAAOJ,EACP,SAAU,CAACK,EAAGL,IAAU,CACtBC,EAASD,CAAK,CAChB,EAEC,SAAAD,EAAS,IAAKO,MACN,OAAC,GAAAC,QAAAC,EAAAC,EAAA,GAA4CH,GAA5C,CAAkD,UAAW,UAAjCA,EAAK,KAAkC,CAC5E,EACH,EACF,GACF,CAEJ,CAEA,IAAOI,GAAQb,GCvCf,IAAAc,GAAyB,+BACzBC,GAA4B,gDAC5BC,GAA6B,iDAC7BC,GAAqB,yCACrBC,GAAsB,qCACtBC,GAAgB,kCAChBC,GAAwB,0CACxBC,GAAoB,sCACpBC,GAAsB,qCACtBC,GAAuB,yCACvBC,GAAiB,mCACjBC,GAAqB,uCACrBC,GAA2B,6CAC3BC,GAAyB,2CACzBC,GAAyB,2CACzBC,EAAiC,gCACjCC,GAAoB,sCACpBC,GAAuB,yCACvBC,GAAmC,iBACnCC,GAAkC,4BAyI5B,IAAAC,EAAA,6BAvIAC,GAAc,IAEpB,SAASC,GAAYC,EAAyB,CAC5C,MAAO,CACL,MAAOF,GACP,WAAYE,EAAM,YAAY,OAAO,QAAS,CAC5C,OAAQA,EAAM,YAAY,OAAO,MACjC,SAAUA,EAAM,YAAY,SAAS,cACvC,CAAC,EACD,UAAW,QACb,CACF,CAEA,SAASC,GAAYD,EAAyB,CAC5C,MAAO,CACL,WAAYA,EAAM,YAAY,OAAO,QAAS,CAC5C,OAAQA,EAAM,YAAY,OAAO,MACjC,SAAUA,EAAM,YAAY,SAAS,aACvC,CAAC,EACD,UAAW,SACX,MAAO,QAAQA,EAAM,QAAQ,CAAC,CAAC,UAC/B,CAACA,EAAM,YAAY,GAAG,IAAI,CAAC,EAAG,CAC5B,MAAO,QAAQA,EAAM,QAAQ,CAAC,CAAC,SACjC,CACF,CACF,CAEA,IAAME,MAAe,UAAO,KAAK,EAAE,CAAC,CAAE,MAAAF,CAAM,IACnCG,EAAA,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,WAChB,QAASH,EAAM,QAAQ,EAAG,CAAC,GAExBA,EAAM,OAAO,QAEnB,EAMKI,MAAS,UAAO,GAAAC,QAAW,CAC/B,kBAAoBC,GACXA,IAAS,MAEpB,CAAC,EAAe,CAAC,CAAE,MAAAN,CAAM,KAChB,CACL,OAAQA,EAAM,OAAO,OAAS,EAC9B,WAAYA,EAAM,YAAY,OAAO,CAAC,QAAS,QAAQ,EAAG,CACxD,OAAQA,EAAM,YAAY,OAAO,MACjC,SAAUA,EAAM,YAAY,SAAS,aACvC,CAAC,EACD,SAAU,CACR,CACE,MAAO,CAAC,CAAE,KAAAO,CAAK,IACNA,EAET,MAAO,CACL,WAAYT,GACZ,MAAO,eAAeA,EAAW,MACjC,WAAYE,EAAM,YAAY,OAAO,CAAC,QAAS,QAAQ,EAAG,CACxD,OAAQA,EAAM,YAAY,OAAO,MACjC,SAAUA,EAAM,YAAY,SAAS,cACvC,CAAC,CACH,CACF,CACF,CACF,EACD,EAEKQ,MAAS,UAAO,GAAAC,QAAW,CAC/B,kBAAoBH,GACXA,IAAS,MAEpB,CAAC,EAAE,CAAC,CAAE,MAAAN,CAAM,KACH,CACL,MAAOF,GACP,WAAY,EACZ,WAAY,SACZ,UAAW,aACX,SAAU,CACR,CACE,MAAO,CAAC,CAAE,KAAAS,CAAK,IACNA,EAET,MAAOG,EAAAP,EAAA,GACFJ,GAAYC,CAAK,GADf,CAEL,qBAAsBD,GAAYC,CAAK,CACzC,EACF,EACA,CACE,MAAO,CAAC,CAAE,KAAAO,CAAK,IACN,CAACA,EAEV,MAAOG,EAAAP,EAAA,GACFF,GAAYD,CAAK,GADf,CAEL,qBAAsBC,GAAYD,CAAK,CACzC,EACF,CACF,CACF,EACD,EAkBD,SAASW,GAAiB,CAAE,MAAAC,EAAO,SAAAC,EAAU,SAAAC,EAAU,eAAAC,CAAe,EAA0B,CAC9F,IAAMf,KAAQ,YAAS,EACjB,CAACO,EAAMS,CAAO,KAAI,aAAS,EAAI,EAC/BC,KAAW,gBAAY,EAE7B,SAASC,GAAmB,CAC1BF,EAAQ,EAAI,CACd,CAEA,SAASG,GAAoB,CAC3BH,EAAQ,EAAK,CACf,CAEA,SACE,QAAC,GAAAI,QAAA,CAAI,GAAI,CAAE,QAAS,MAAO,EACzB,oBAAC,GAAAC,QAAA,EAAY,KACb,OAACjB,GAAA,CAAO,SAAS,QAAQ,KAAMG,EAC7B,oBAAC,GAAAe,QAAA,CACC,oBAAC,GAAAC,QAAA,CACC,MAAM,UACN,aAAW,cACX,QAASL,EACT,KAAK,QACL,GAAI,CACF,CACE,YAAa,CACf,EACAX,GAAQ,CAAE,QAAS,MAAO,CAC5B,EAEA,mBAAC,GAAAiB,QAAA,EAAS,EACZ,KACA,OAAC,GAAAC,QAAA,CAAW,QAAQ,KAAK,OAAM,GAAC,UAAU,MACvC,SAAAb,EACH,EACCG,GACH,EACF,KACA,QAACP,GAAA,CAAO,QAAQ,YAAY,KAAMD,EAChC,oBAACL,GAAA,CACC,mBAAC,GAAAqB,QAAA,CAAW,QAASJ,EAClB,SAAAnB,EAAM,YAAc,SAAQ,OAAC,GAAA0B,QAAA,EAAiB,KAAK,OAAC,GAAAC,QAAA,EAAgB,EACvE,EACF,KACA,OAAC,GAAAC,QAAA,EAAQ,EACRf,EAAS,IAAKgB,MAEX,QAAC,aACC,qBAAC,GAAAC,QAAA,CACC,oBAAC,GAAAL,QAAA,CAAW,QAASlB,EAAO,KAAO,KAAM,YAAaA,EAAO,EAAI,EAC9D,SAAAA,EAAOsB,EAAK,YAAW,aAASA,EAAK,SAAU,CAAC,EACnD,EACCA,EAAK,QAAQ,IAAKE,MAEf,OAAC,GAAAC,QAAA,CAAyB,eAAc,GAAC,GAAI,CAAE,QAAS,OAAQ,EAC9D,oBAAC,GAAAC,QAAA,CACC,GAAI,CACF,CACE,UAAW,GACX,GAAI,GACN,EACA1B,EACI,CACE,eAAgB,SAClB,EACA,CACE,eAAgB,QAClB,CACN,EACA,UAAW,QACX,GAAIwB,EAAO,GACX,SAAUd,EAAS,WAAac,EAAO,GAEvC,oBAAC,GAAAG,QAAA,CACC,GAAI,CACF,CACE,SAAU,EACV,eAAgB,QAClB,EACA3B,EACI,CACE,GAAI,CACN,EACA,CACE,GAAI,MACN,CACN,EAEC,SAAAwB,EAAO,KACNA,EAAO,KACJxB,EAED,QADF,OAAC,GAAAkB,QAAA,CAAY,yBAASM,EAAO,MAAO,CAAC,EAAE,EAE3C,KACA,OAAC,GAAAI,QAAA,CACC,QAASJ,EAAO,MAChB,GAAI,CACFxB,EACI,CACE,QAAS,CACX,EACA,CACE,QAAS,CACX,CACN,EACF,GACF,GApDawB,EAAO,EAqDtB,CAEH,GACH,KACA,OAAC,GAAAH,QAAA,EAAQ,IAhEIC,EAAK,QAiEpB,CAEH,GACH,KACA,QAAC,GAAAT,QAAA,CAAI,UAAU,OAAO,GAAI,CAAE,SAAU,EAAG,EAAG,CAAE,EAC5C,oBAAClB,GAAA,EAAa,EACbY,GACH,GACF,CAEJ,CAEA,IAAOsB,GAAQzB,GC3Qf,IAAA0B,GAAuB,yCAQnB,IAAAC,EAAA,6BAFJ,SAASC,GAAYC,EAAoD,CAApD,IAAAC,EAAAD,EAAE,MAAAE,EAAM,GAAAC,CAR7B,EAQqBF,EAAeG,EAAAC,EAAfJ,EAAe,CAAb,OAAM,OAC3B,SACE,mBACG,SAAAC,EAAK,MAAM;AAAA,CAAI,EAAE,IAAI,CAACI,EAAMC,OAEzB,OAAC,GAAAC,QAAAC,EAAAC,EAAA,CAAuB,GAAIA,EAAA,CAAE,OAAQ,GAAMP,IAAUC,GAArD,CACE,SAAAE,IADcC,CAEjB,CAEH,EACH,CAEJ,CAEA,IAAOI,GAAQZ,GCpBf,IAAAa,GAAgB,kCAChBC,GAAuB,yCACvBC,GAA4B,uBAC5BC,EAAiE,sBAyCzD,IAAAC,EAAA,6BA5BR,SAASC,GAAgB,CACvB,KAAAC,EACA,MAAAC,EACA,cAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,SAAAC,CACF,EAAyB,CACvB,GAAM,CAAE,KAAAC,CAAK,EAAIC,EAAQ,EACnBC,EAAuC,CAC3C,gBAAiBF,IAAS,OAAS,QAAU,QAC7C,OAAQ,GACR,aAAc,EACd,QAAS,EACT,YAAa,UACf,EACMG,EAAmBP,EACrBQ,IAAA,GAAKF,GAAyBN,GAC9BQ,EAAA,GAAKF,GACT,SACE,OAAC,GAAAG,QAAA,CAAI,GAAI,CAAE,aAAc,EAAG,OAAQ,GAAK,QAAS,CAAE,EAClD,oBAAC,gBACC,QAAM,gBAAYX,CAAI,EACtB,MAAOC,EACP,SAAUE,EACV,iBAAkBC,EAClB,SAAUC,EAEV,oBAAC,GAAAO,QAAA,CAAW,QAAQ,KAAK,gBAAI,KAC7B,OAAC,GAAAD,QAAA,CACC,GAAI,CACF,OAAQ,GACR,aAAc,GACd,YAAa,UACf,EAEA,mBAAC,eAAW,EACd,KACA,OAAC,OAAG,KACJ,OAAC,GAAAC,QAAA,CAAW,QAAQ,KAAK,kBAAM,KAC/B,QAAC,GAAAD,QAAA,CAAI,GAAIF,EACP,oBAAC,gBAAY,KACb,OAAC,cAAU,GACb,GACF,EACF,CAEJ,CAEA,IAAOI,GAAQd,GCjEf,IAAAe,GAAmB,qCACnBC,GAA+B,2BAa3B,IAAAC,GAAA,6BANJ,SAASC,GAAaC,EAA4D,CAA5D,IAAAC,EAAAD,EAAE,cAAAE,EAAc,MAAAC,CAVtC,EAUsBF,EAA0BG,EAAAC,EAA1BJ,EAA0B,CAAxB,eAAc,UACpC,GAAM,CACJ,UAAW,CAAE,SAAUK,EAAc,QAAAC,EAAS,aAAAC,CAAa,CAC7D,KAAI,mBAAe,EAEnB,SACE,QAAC,GAAAC,QAAAC,EAAAC,EAAA,CACC,MAAM,UACN,SAAUP,EAAY,UAAaF,GAAgB,CAACK,GAAYD,EAChE,QAASE,EACT,KAAK,SACL,QAAQ,aACJJ,GANL,CAQE,SAAAD,GACH,CAEJ,CAEA,IAAOS,GAAQb,GCzBf,IAAAc,GAAgB,kCAChBC,GAAuB,gCACvBC,GAAmB,qCAgDT,IAAAC,EAAA,6BAvCJC,MAAe,WAAO,GAAAC,OAAM,EAAE,KAC3B,CACL,QAAS,EACT,qBAAsB,CACpB,aAAc,GACd,sBAAuB,CACrB,QAAS,KACT,SAAU,WACV,IAAK,MACL,UAAW,mBACX,SAAU,GACV,MAAO,GACP,OAAQ,EACV,CACF,CACF,EACD,EAED,SAASC,GAAgBC,EAMA,CANA,IAAAC,EAAAD,EACvB,aAAaE,EACb,kBAAAC,EACA,cAAeC,EACf,oBAAAC,CArCF,EAiCyBJ,EAKpBK,EAAAC,EALoBN,EAKpB,CAJH,cACA,oBACA,gBACA,wBAGA,IAAMO,EAAQ,CACZ,aAAc,MACd,YAAa,QACb,gBAAiB,QACjB,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,QAAS,GACX,EACMC,EAAoB,CAAE,MAAO,QAAS,SAAU,KAAM,UAAW,IAAK,EAC5E,SACE,OAACZ,GAAAa,EAAA,CACC,eACE,OAAC,GAAAC,QAAA,CAAI,GAAIH,EACP,mBAACN,EAAA,CAAY,MAAOQ,IAAA,GAAKD,GAAsBN,GAAqB,EACtE,EAEF,QACE,OAAC,GAAAQ,QAAA,CAAI,GAAIH,EACP,mBAACJ,EAAA,CAAc,MAAOM,IAAA,GAAKD,GAAsBJ,GAAuB,EAC1E,GAEEC,EACN,CAEJ,CAEA,IAAOM,GAAQb,GCjEf,IAAAc,EAAiD,iBAEjD,SAASC,GAA0BC,EAA8D,CAC/F,GAAM,CAACC,EAAMC,CAAO,KAAI,YAAY,IAAM,CACxC,IAAMD,EAAU,OAAO,SAAS,KAAK,QAAQ,IAAK,EAAE,EACpD,OAAQD,GAAqBC,IAAS,GAAKD,EAArBC,CACxB,CAAC,EACKE,KAAoB,eAAY,IAAM,CAC1C,IAAMF,EAAU,OAAO,SAAS,KAAK,QAAQ,IAAK,EAAE,EACpDC,EAASF,GAAqBC,IAAS,GAAKD,EAArBC,CAAuC,CAChE,EAAG,CAACC,EAASF,CAAW,CAAC,KAEzB,aAAU,KACR,OAAO,iBAAiB,aAAcG,CAAiB,EAChD,IAAM,CACX,OAAO,oBAAoB,aAAcA,CAAiB,CAC5D,GACC,CAACA,CAAiB,CAAC,EAEtB,IAAMC,KAAa,eAChBC,GAA2C,CAC1C,IAAMC,EAAe,OAAOD,GAAY,WAAaA,EAAQJ,CAAI,EAAII,EACjEC,IAAiBL,IACnB,OAAO,SAAS,KAAOK,EAE3B,EACA,CAACL,CAAI,CACP,EAEA,MAAO,CAACA,EAAMG,CAAU,CAC1B,CAEA,IAAOG,GAAQR","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","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","loadingComponent","onUndefined","showOnError","isLoading","data","defaultLoadingComponent","error","useLoader","result","LoaderData_default","import_Alert","import_jsx_runtime","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","import_CssBaseline","import_styles","import_react","import_jsx_runtime","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","CssBaseline","ModeProvider_default","import_react","import_jsx_runtime","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","import_utility","import_Alert","import_Snackbar","import_react","import_jsx_runtime","SnackbarContext","useSnackbar","context","SnackbarProvider","children","autoHideDuration","open","setOpen","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","Snackbar","Alert","SnackbarProvider_default","import_jsx_runtime","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_Button","import_Menu","import_react","import_jsx_runtime","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","isDropdownOpen","buttonProps","__spreadProps","__spreadValues","event","Box","Menu","DropdownMenu_default","import_Link","import_jsx_runtime","ExternalLink","_a","_b","href","children","target","rel","linkProps","__objRest","Link","__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","Link","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","import_ListItemButton","import_jsx_runtime","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","import_CircularProgress","import_jsx_runtime","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","import_BottomNavigation","import_BottomNavigationAction","import_Box","import_Paper","import_react","import_react_router_dom","import_jsx_runtime","NavigationBottom","children","navItems","value","setValue","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","NavigationBottom_default","import_utility","import_ChevronLeft","import_ChevronRight","import_Menu","import_AppBar","import_Box","import_CssBaseline","import_Divider","import_Drawer","import_IconButton","import_List","import_ListItem","import_ListItemButton","import_ListItemIcon","import_ListItemText","import_styles","import_Toolbar","import_Typography","import_react","import_react_router_dom","import_jsx_runtime","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","setOpen","location","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","List","option","ListItem","ListItemButton","ListItemIcon","ListItemText","NavigationDrawer_default","import_Typography","import_jsx_runtime","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","import_Box","import_Typography","import_common_tags","import_react_live","import_jsx_runtime","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","Typography","ReactPlayground_default","import_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/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\ninterface BaseProps<T> {\n isLoading: boolean;\n data?: T;\n loadingComponent?: ReactNode;\n}\n\ninterface PropsWithNoError<T> extends BaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\ninterface PropsWithError<T> extends BaseProps<T> {\n error: unknown;\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> = PropsWithNoError<T> | PropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n loadingComponent?: ReactNode;\n onUndefined?: () => ReactNode | void;\n showOnError?: boolean;\n}\n\nfunction LoaderData<T>({\n children,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const { isLoading, data, loadingComponent: defaultLoadingComponent, error } = useLoader<T>();\n\n if (isLoading) {\n return <>{loadingComponent ?? defaultLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component={\"a\"} href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n onUndefined?: () => ReactNode | void;\n};\n\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import 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","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","loadingComponent","onUndefined","showOnError","isLoading","data","defaultLoadingComponent","error","useLoader","result","LoaderData_default","import_Alert","import_jsx_runtime","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","import_CssBaseline","import_styles","import_react","import_jsx_runtime","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","CssBaseline","ModeProvider_default","import_react","import_jsx_runtime","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","import_utility","import_Alert","import_Snackbar","import_react","import_jsx_runtime","SnackbarContext","useSnackbar","context","SnackbarProvider","children","autoHideDuration","open","setOpen","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","Snackbar","Alert","SnackbarProvider_default","import_jsx_runtime","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","import_ArrowDropDown","import_ArrowDropUp","import_Box","import_Button","import_Menu","import_react","import_jsx_runtime","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","isDropdownOpen","buttonProps","__spreadProps","__spreadValues","event","Box","Menu","DropdownMenu_default","import_Link","import_jsx_runtime","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","import_CloudUpload","import_Button","import_styles","import_react","import_jsx_runtime","FileType","VisuallyHiddenInput","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","import_Delete","import_Box","import_IconButton","import_List","import_ListItem","import_ListItemText","import_jsx_runtime","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","import_Box","import_Popover","import_react","import_jsx_runtime","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","isPopoverOpen","popoverId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","import_Link","import_react_router_dom","import_jsx_runtime","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","import_ListItemButton","import_jsx_runtime","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","import_CircularProgress","import_jsx_runtime","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","import_BottomNavigation","import_BottomNavigationAction","import_Box","import_Paper","import_react","import_react_router_dom","import_jsx_runtime","NavigationBottom","children","navItems","value","setValue","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","NavigationBottom_default","import_utility","import_ChevronLeft","import_ChevronRight","import_Menu","import_AppBar","import_Box","import_CssBaseline","import_Divider","import_Drawer","import_IconButton","import_List","import_ListItem","import_ListItemButton","import_ListItemIcon","import_ListItemText","import_styles","import_Toolbar","import_Typography","import_react","import_react_router_dom","import_jsx_runtime","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","setOpen","location","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","List","option","ListItem","ListItemButton","ListItemIcon","ListItemText","NavigationDrawer_default","import_Typography","import_jsx_runtime","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","import_Box","import_Typography","import_common_tags","import_react_live","import_jsx_runtime","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","Typography","ReactPlayground_default","import_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
@@ -42,11 +42,12 @@ interface DropdownMenuProps {
42
42
  }
43
43
  declare function DropdownMenu({ children, button: Button, buttonChildren, buttonProps: incomingButtonProps, isOpenIcon, isClosedIcon, onOpen, onClose, }: DropdownMenuProps): react_jsx_runtime.JSX.Element;
44
44
 
45
- interface ExternalLinkProps extends Omit<LinkProps, "to"> {
46
- href: string;
45
+ interface ExternalLinkProps extends Omit<LinkProps, "to" | "target" | "rel"> {
46
+ href: `https://${string}` | `http://${string}`;
47
+ to?: never;
47
48
  children: ReactNode;
48
49
  }
49
- declare function ExternalLink({ href, children, target, rel, ...linkProps }: ExternalLinkProps): react_jsx_runtime.JSX.Element;
50
+ declare function ExternalLink({ href, children, ...linkProps }: ExternalLinkProps): react_jsx_runtime.JSX.Element;
50
51
 
51
52
  declare const FileType: {
52
53
  readonly PDF: "application/pdf";
@@ -87,7 +88,8 @@ interface IconWithPopoverProps {
87
88
  declare function IconWithPopover({ icon: Icon, onOpen, onClose, iconProps, children, }: IconWithPopoverProps): react_jsx_runtime.JSX.Element;
88
89
 
89
90
  interface InternalLinkProps extends Omit<LinkProps, "href"> {
90
- to: string;
91
+ to: `/${string}` | `~/${string}`;
92
+ href?: never;
91
93
  children: ReactNode;
92
94
  }
93
95
  declare function InternalLink({ to, children, ...linkProps }: InternalLinkProps): react_jsx_runtime.JSX.Element;
package/dist/index.d.ts CHANGED
@@ -42,11 +42,12 @@ interface DropdownMenuProps {
42
42
  }
43
43
  declare function DropdownMenu({ children, button: Button, buttonChildren, buttonProps: incomingButtonProps, isOpenIcon, isClosedIcon, onOpen, onClose, }: DropdownMenuProps): react_jsx_runtime.JSX.Element;
44
44
 
45
- interface ExternalLinkProps extends Omit<LinkProps, "to"> {
46
- href: string;
45
+ interface ExternalLinkProps extends Omit<LinkProps, "to" | "target" | "rel"> {
46
+ href: `https://${string}` | `http://${string}`;
47
+ to?: never;
47
48
  children: ReactNode;
48
49
  }
49
- declare function ExternalLink({ href, children, target, rel, ...linkProps }: ExternalLinkProps): react_jsx_runtime.JSX.Element;
50
+ declare function ExternalLink({ href, children, ...linkProps }: ExternalLinkProps): react_jsx_runtime.JSX.Element;
50
51
 
51
52
  declare const FileType: {
52
53
  readonly PDF: "application/pdf";
@@ -87,7 +88,8 @@ interface IconWithPopoverProps {
87
88
  declare function IconWithPopover({ icon: Icon, onOpen, onClose, iconProps, children, }: IconWithPopoverProps): react_jsx_runtime.JSX.Element;
88
89
 
89
90
  interface InternalLinkProps extends Omit<LinkProps, "href"> {
90
- to: string;
91
+ to: `/${string}` | `~/${string}`;
92
+ href?: never;
91
93
  children: ReactNode;
92
94
  }
93
95
  declare function InternalLink({ to, children, ...linkProps }: InternalLinkProps): react_jsx_runtime.JSX.Element;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- var be=Object.defineProperty,Le=Object.defineProperties;var Ie=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var K=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable;var J=(e,o,t)=>o in e?be(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t,a=(e,o)=>{for(var t in o||(o={}))K.call(o,t)&&J(e,t,o[t]);if(T)for(var t of T(o))Y.call(o,t)&&J(e,t,o[t]);return e},c=(e,o)=>Le(e,Ie(o));var x=(e,o)=>{var t={};for(var n in e)K.call(e,n)&&o.indexOf(n)<0&&(t[n]=e[n]);if(e!=null&&T)for(var n of T(e))o.indexOf(n)<0&&Y.call(e,n)&&(t[n]=e[n]);return t};var q=(e,o,t)=>new Promise((n,i)=>{var r=d=>{try{s(t.next(d))}catch(u){i(u)}},p=d=>{try{s(t.throw(d))}catch(u){i(u)}},s=d=>d.done?n(d.value):Promise.resolve(d.value).then(r,p);s((t=t.apply(e,o)).next())});import Ce from"@mui/icons-material/ArrowDropDown";import ke from"@mui/icons-material/ArrowDropUp";import Te from"@mui/material/Box";import M from"@mui/material/ButtonBase";import Be from"@mui/material/Collapse";import{useEffect as De,useState as Ne}from"react";import{jsx as E,jsxs as Q}from"react/jsx-runtime";function Re({isInitiallyOpen:e,onOpen:o,onClose:t,children:n,buttonStyles:i,buttonContents:r,buttonComponent:p=M,collapseProps:s,openIcon:d=E(ke,{}),closedIcon:u=E(Ce,{}),useDefaultStyling:m=p===M}){let[l,f]=Ne(!!e);return De(()=>{l&&o?o():!l&&t&&t()},[l]),Q(Te,{children:[Q(p,{onClick:()=>{f(y=>!y)},sx:m?a({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":p===M?{backgroundColor:"action.hover"}:null},i):i,"aria-expanded":l,children:[r,l?d:u]}),E(Be,c(a({in:l},s),{children:n}))]})}var Me=Re;import uo from"@mui/icons-material/DarkMode";import fo from"@mui/icons-material/LightMode";import xo from"@mui/material/IconButton";import go from"@mui/material/Tooltip";import Ee from"@mui/material/CircularProgress";import{createContext as Ae,useContext as Oe}from"react";import{jsx as Z}from"react/jsx-runtime";var j=Ae(void 0);function L(){let e=Oe(j);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function Fe(n){var i=n,{children:e,loadingComponent:o=Z(Ee,{})}=i,t=x(i,["children","loadingComponent"]);return Z(j.Provider,{value:a({loadingComponent:o},t),children:e})}var A=Fe;import{Fragment as S,jsx as w}from"react/jsx-runtime";function We({children:e,loadingComponent:o,onUndefined:t,showOnError:n}){let{isLoading:i,data:r,loadingComponent:p,error:s}=L();if(i)return w(S,{children:o!=null?o:p});if(s&&!n)return w(S,{});if(r===void 0){if(console.warn("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."),t){let d=t();return d!=null?d:w(S,{})}return w(S,{})}return typeof e=="function"?w(S,{children:e(r)}):w(S,{children:e})}var O=We;import ze from"@mui/material/Alert";import{Fragment as ee,jsx as F}from"react/jsx-runtime";function He(){var t;let{error:e,errorComponent:o}=L();return e?typeof o=="function"?o(e):o?F(ee,{children:o}):F(ze,{severity:"error",children:(t=e==null?void 0:e.message)!=null?t:"An unknown error has occured. Please try again later."}):F(ee,{})}var W=He;import Ve from"@mui/material/CssBaseline";import{createTheme as Ue,ThemeProvider as Xe}from"@mui/material/styles";import{createContext as _e,useContext as Ge,useMemo as $e,useState as Je}from"react";import{jsx as oe,jsxs as qe}from"react/jsx-runtime";var te=_e({toggleMode:()=>{},mode:"dark"});function I(){return Ge(te)}function Ke({children:e,mode:o="dark"}){let[t,n]=Je(o),i=$e(()=>Ue({palette:{mode:t}}),[t]);return oe(te.Provider,{value:{mode:t,toggleMode:()=>{n(r=>r==="light"?"dark":"light")}},children:qe(Xe,{theme:i,children:[oe(Ve,{}),e]})})}var Ye=Ke;import{createContext as Qe,useContext as Ze,useEffect as re,useState as z}from"react";import{jsx as to}from"react/jsx-runtime";var ne=Qe({windowWidth:0,windowHeight:0,isLargeScreen:!1});function je(){return Ze(ne)}function eo({children:e,largeScreenWidth:o,largeScreenHeight:t}){let[n,i]=z(window.innerWidth),[r,p]=z(window.innerHeight);function s(m,l,f=669,y=600){return m>f&&l>y}let[d,u]=z(s(window.innerWidth,window.innerHeight,o,t));return re(()=>{function m(){i(window.innerWidth),p(window.innerHeight)}return m(),window.addEventListener("resize",m),()=>{window.removeEventListener("resize",m)}},[]),re(()=>{u(s(n,r,o,t))},[n,r,o,t]),to(ne.Provider,{value:{isLargeScreen:d,windowWidth:n,windowHeight:r},children:e})}var oo=eo;import{wait as ro}from"@alextheman/utility";import no from"@mui/material/Alert";import io from"@mui/material/Snackbar";import{createContext as ao,useContext as po,useState as B}from"react";import{jsx as ie,jsxs as co}from"react/jsx-runtime";var ae=ao(void 0);function so(){let e=po(ae);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function mo({children:e,autoHideDuration:o=5e3}){let[t,n]=B(!1),[i,r]=B(o),[p,s]=B(""),[d,u]=B("info");function m(f,y,h){n(!0),r(h!=null?h:o),u(y!=null?y:"info"),s(f)}function l(){return q(this,null,function*(){n(!1),yield ro(.2),s("")})}return co(ae.Provider,{value:{addSnackbar:m},children:[ie(io,{open:t,autoHideDuration:i,onClose:l,children:ie(no,{onClose:l,severity:d,children:p})}),e]})}var lo=mo;import{jsx as D}from"react/jsx-runtime";function yo(){let{mode:e,toggleMode:o}=I();return D(go,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:D(xo,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?D(fo,{}):D(uo,{})})})}var ho=yo;import Po from"@mui/icons-material/ArrowDropDown";import vo from"@mui/icons-material/ArrowDropUp";import pe from"@mui/material/Box";import se from"@mui/material/Button";import So from"@mui/material/Menu";import{useEffect as wo,useMemo as bo,useState as Lo}from"react";import{jsx as C,jsxs as ko}from"react/jsx-runtime";function Io({children:e,button:o=se,buttonChildren:t="Menu",buttonProps:n,isOpenIcon:i=C(vo,{}),isClosedIcon:r=C(Po,{}),onOpen:p,onClose:s}){let[d,u]=Lo(null),m=bo(()=>!!d,[d]),l=c(a({},n),{onClick:f=>{u(f.currentTarget)},"aria-controls":m?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":m});return o===se&&(l.endIcon=m?i:r),wo(()=>{m&&p?p():!m&&s&&s()},[m,p,s]),ko(pe,{children:[C(o,c(a({},l),{children:t})),C(So,{id:"dropdown-menu",anchorEl:d,open:m,onClose:()=>{u(null)},children:typeof e=="function"?C(pe,{children:e(()=>{u(null)})}):e})]})}var Co=Io;import To from"@mui/material/Link";import{jsx as No}from"react/jsx-runtime";function Bo(r){var p=r,{href:e,children:o,target:t="_blank",rel:n="noopener noreferrer"}=p,i=x(p,["href","children","target","rel"]);return No(To,c(a({component:"a",href:e,target:t,rel:n},i),{children:o}))}var Do=Bo;import Ro from"@mui/icons-material/CloudUpload";import Mo from"@mui/material/Button";import{styled as de}from"@mui/material/styles";import{useState as Eo}from"react";import{jsx as H,jsxs as zo}from"react/jsx-runtime";var Ao={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"},Oo=de("input")({clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:1,overflow:"hidden",position:"absolute",bottom:0,left:0,whiteSpace:"nowrap",width:1}),Fo=de("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 Wo(p){var s=p,{onFileInput:e,label:o="Upload files",multiple:t,accept:n,useDropzone:i}=s,r=x(s,["onFileInput","label","multiple","accept","useDropzone"]);var l;let[d,u]=Eo(!1),m=zo(Mo,c(a({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:f=>{var y;(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),(y=document.getElementById("file-input"))==null||y.click())}},r),{startIcon:(l=r.startIcon)!=null?l:H(Ro,{}),children:[o,H(Oo,{id:"file-input",type:"file",onChange:f=>{var h;let y=f.target;e(Array.from((h=y.files)!=null?h:[])),y.value=""},multiple:t,accept:n==null?void 0:n.join(","),disabled:r.disabled})]}));return i?H(Fo,{$dragging:d,onDragOver:f=>{f.preventDefault(),!r.disabled&&u(!0)},onDragLeave:f=>{f.preventDefault(),u(!1)},onDrop:f=>{var h;if(f.preventDefault(),u(!1),r.disabled)return;let y=Array.from((h=f.dataTransfer.files)!=null?h:[]);e(y)},children:m}):m}var V=Wo;import Ho from"@mui/icons-material/Delete";import Vo from"@mui/material/Box";import Uo from"@mui/material/IconButton";import Xo from"@mui/material/List";import _o from"@mui/material/ListItem";import Go from"@mui/material/ListItemText";import{jsx as b,jsxs as Ko}from"react/jsx-runtime";function $o(n){var i=n,{files:e,setFiles:o}=i,t=x(i,["files","setFiles"]);function r(s){o(d=>[...d,...s])}let p=c(a({},t),{onFileInput:r});return(p==null?void 0:p.multiple)===void 0&&(p.multiple=!0),Ko(Vo,{children:[b(V,a({},p)),b(Xo,{children:e.map(s=>b(_o,{secondaryAction:b(Uo,{"aria-label":"Delete",edge:"end",onClick:()=>{o(d=>d.filter(u=>u!==s))},children:b(Ho,{})}),children:b(Go,{primary:s.name})},s.name))})]})}var Jo=$o;import Yo from"@mui/material/Box";import qo from"@mui/material/Popover";import{useId as Qo,useState as Zo}from"react";import{jsx as me,jsxs as ot}from"react/jsx-runtime";function jo({icon:e,onOpen:o,onClose:t,iconProps:n,children:i}){let[r,p]=Zo(null),s=!!r,d=Qo();function u(l){p(l.currentTarget),o&&o()}function m(){p(null),t&&t()}return ot(Yo,{children:[me(e,a({"aria-owns":s?d:void 0,"aria-haspopup":"true",onMouseEnter:u,onMouseLeave:m},n)),me(qo,{id:d,sx:{pointerEvents:"none"},open:s,anchorEl:r,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:m,disableRestoreFocus:!0,children:i})]})}var et=jo;import tt from"@mui/material/Link";import{Link as rt}from"react-router-dom";import{jsx as it}from"react/jsx-runtime";function nt(n){var i=n,{to:e,children:o}=i,t=x(i,["to","children"]);return it(tt,c(a({component:rt,to:e},t),{children:o}))}var U=nt;import at from"@mui/material/ListItemButton";import{jsx as dt}from"react/jsx-runtime";function pt(t){var n=t,{children:e}=n,o=x(n,["children"]);return dt(at,c(a({component:U},o),{children:e}))}var st=pt;import mt from"@mui/material/CircularProgress";import{jsx as X,jsxs as ut}from"react/jsx-runtime";function lt(i){var r=i,{children:e,onUndefined:o,loadingComponent:t=X(mt,{})}=r,n=x(r,["children","onUndefined","loadingComponent"]);return ut(A,c(a({loadingComponent:t},n),{children:[X(W,{}),X(O,{onUndefined:o,children:e})]}))}var ct=lt;import ft from"@mui/material/BottomNavigation";import xt from"@mui/material/BottomNavigationAction";import gt from"@mui/material/Box";import yt from"@mui/material/Paper";import{useState as ht}from"react";import{Link as Pt}from"react-router-dom";import{Fragment as wt,jsx as N,jsxs as bt}from"react/jsx-runtime";function vt({children:e,navItems:o}){let[t,n]=ht("");return bt(wt,{children:[N(gt,{sx:{paddingBottom:7},children:e}),N(yt,{sx:{position:"fixed",bottom:0,left:0,right:0},children:N(ft,{showLabels:!0,value:t,onChange:(i,r)=>{n(r)},children:o.map(i=>N(xt,c(a({},i),{component:Pt}),i.value))})})]})}var St=vt;import{truncate as le}from"@alextheman/utility";import Lt from"@mui/icons-material/ChevronLeft";import It from"@mui/icons-material/ChevronRight";import Ct from"@mui/icons-material/Menu";import kt from"@mui/material/AppBar";import ce from"@mui/material/Box";import Tt from"@mui/material/CssBaseline";import ue from"@mui/material/Divider";import Bt from"@mui/material/Drawer";import fe from"@mui/material/IconButton";import Dt from"@mui/material/List";import Nt from"@mui/material/ListItem";import Rt from"@mui/material/ListItemButton";import Mt from"@mui/material/ListItemIcon";import Et from"@mui/material/ListItemText";import{styled as G,useTheme as At}from"@mui/material/styles";import Ot from"@mui/material/Toolbar";import _ from"@mui/material/Typography";import{Fragment as Ft,useState as Wt}from"react";import{Link as zt,useLocation as Ht}from"react-router-dom";import{jsx as g,jsxs as v}from"react/jsx-runtime";var R=240;function xe(e){return{width:R,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})=>a({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Vt=G(kt,{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:R,width:`calc(100% - ${R}px)`,transition:e.transitions.create(["width","margin"],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Ut=G(Bt,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:R,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:c(a({},xe(e)),{"& .MuiDrawer-paper":xe(e)})},{props:({open:o})=>!o,style:c(a({},ge(e)),{"& .MuiDrawer-paper":ge(e)})}]}));function Xt({title:e,navItems:o,children:t,headerElements:n}){let i=At(),[r,p]=Wt(!0),s=Ht();function d(){p(!0)}function u(){p(!1)}return v(ce,{sx:{display:"flex"},children:[g(Tt,{}),g(Vt,{position:"fixed",open:r,children:v(Ot,{children:[g(fe,{color:"inherit","aria-label":"open drawer",onClick:d,edge:"start",sx:[{marginRight:5},r&&{display:"none"}],children:g(Ct,{})}),g(_,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),v(Ut,{variant:"permanent",open:r,children:[g(ye,{children:g(fe,{onClick:u,children:i.direction==="rtl"?g(It,{}):g(Lt,{})})}),g(ue,{}),o.map(m=>v(Ft,{children:[v(Dt,{children:[g(_,{variant:r?"h5":"h6",paddingLeft:r?2:1,children:r?m.category:le(m.category,4)}),m.options.map(l=>g(Nt,{disablePadding:!0,sx:{display:"block"},children:v(Rt,{sx:[{minHeight:48,px:2.5},r?{justifyContent:"initial"}:{justifyContent:"center"}],component:zt,to:l.to,selected:s.pathname===l.to,children:[g(Mt,{sx:[{minWidth:0,justifyContent:"center"},r?{mr:3}:{mr:"auto"}],children:l.icon?l.icon:r?null:g(_,{children:le(l.label,4)})}),g(Et,{primary:l.label,sx:[r?{opacity:1}:{opacity:0}]})]})},l.to))]}),g(ue,{})]},m.category))]}),v(ce,{component:"main",sx:{flexGrow:1,p:3},children:[g(ye,{}),t]})]})}var _t=Xt;import Gt from"@mui/material/Typography";import{Fragment as Kt,jsx as he}from"react/jsx-runtime";function $t(n){var i=n,{text:e,sx:o}=i,t=x(i,["text","sx"]);return he(Kt,{children:e.split(`
2
- `).map((r,p)=>he(Gt,c(a({sx:a({margin:1},o)},t),{children:r}),p))})}var Jt=$t;import $ from"@mui/material/Box";import Pe from"@mui/material/Typography";import{stripIndent as Yt}from"common-tags";import{LiveEditor as qt,LiveError as Qt,LivePreview as Zt,LiveProvider as jt}from"react-live";import{jsx as P,jsxs as ve}from"react/jsx-runtime";function er({code:e,scope:o,previewStyles:t,noInline:n,enableTypeScript:i,language:r}){let{mode:p}=I(),s={backgroundColor:p==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},d=t?a(a({},s),t):a({},s);return P($,{sx:{borderRadius:1,border:.5,padding:2},children:ve(jt,{code:Yt(e),scope:o,noInline:n,enableTypeScript:i,language:r,children:[P(Pe,{variant:"h5",children:"Code"}),P($,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:P(qt,{})}),P("br",{}),P(Pe,{variant:"h5",children:"Result"}),ve($,{sx:d,children:[P(Zt,{}),P(Qt,{})]})]})})}var or=er;import tr from"@mui/material/Button";import{useFormContext as rr}from"react-hook-form";import{jsx as ar}from"react/jsx-runtime";function nr(n){var i=n,{disableClean:e,label:o}=i,t=x(i,["disableClean","label"]);let{formState:{disabled:r,isDirty:p,isSubmitting:s}}=rr();return ar(tr,c(a({color:"primary",disabled:t.disabled||e&&!p||r,loading:s,type:"submit",variant:"contained"},t),{children:o}))}var ir=nr;import Se from"@mui/material/Box";import{styled as pr}from"@mui/material/styles";import sr from"@mui/material/Switch";import{jsx as k}from"react/jsx-runtime";var dr=pr(sr)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function mr(r){var p=r,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:t,uncheckedIconStyles:n}=p,i=x(p,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let s={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},d={color:"black",maxWidth:16.5,maxHeight:16.5};return k(dr,a({checkedIcon:k(Se,{sx:s,children:k(e,{style:a(a({},d),o)})}),icon:k(Se,{sx:s,children:k(t,{style:a(a({},d),n)})})},i))}var lr=mr;import{useCallback as we,useEffect as cr,useState as ur}from"react";function fr(e){let[o,t]=ur(()=>{let r=window.location.hash.replace("#","");return e&&r===""?e:r}),n=we(()=>{let r=window.location.hash.replace("#","");t(e&&r===""?e:r)},[t,e]);cr(()=>(window.addEventListener("hashchange",n),()=>{window.removeEventListener("hashchange",n)}),[n]);let i=we(r=>{let p=typeof r=="function"?r(o):r;p!==o&&(window.location.hash=p)},[o]);return[o,i]}var xr=fr;export{Me as CollapsableItem,ho as DarkModeToggle,Co as DropdownMenu,Do as ExternalLink,V as FileInput,Jo as FileInputList,Ao as FileType,et as IconWithPopover,U as InternalLink,st as ListItemInternalLink,ct as Loader,O as LoaderData,W as LoaderError,A as LoaderProvider,Ye as ModeProvider,St as NavigationBottom,_t as NavigationDrawer,Jt as PopoverText,or as ReactPlayground,oo as ScreenSizeProvider,lo as SnackbarProvider,ir as SubmitButton,lr as SwitchWithIcons,xr as useHash,L as useLoader,I as useMode,je as useScreenSize,so as useSnackbar};
1
+ var be=Object.defineProperty,Ie=Object.defineProperties;var Le=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var K=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable;var J=(e,o,t)=>o in e?be(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t,a=(e,o)=>{for(var t in o||(o={}))K.call(o,t)&&J(e,t,o[t]);if(T)for(var t of T(o))Y.call(o,t)&&J(e,t,o[t]);return e},c=(e,o)=>Ie(e,Le(o));var x=(e,o)=>{var t={};for(var n in e)K.call(e,n)&&o.indexOf(n)<0&&(t[n]=e[n]);if(e!=null&&T)for(var n of T(e))o.indexOf(n)<0&&Y.call(e,n)&&(t[n]=e[n]);return t};var q=(e,o,t)=>new Promise((n,i)=>{var r=d=>{try{s(t.next(d))}catch(u){i(u)}},p=d=>{try{s(t.throw(d))}catch(u){i(u)}},s=d=>d.done?n(d.value):Promise.resolve(d.value).then(r,p);s((t=t.apply(e,o)).next())});import Ce from"@mui/icons-material/ArrowDropDown";import ke from"@mui/icons-material/ArrowDropUp";import Te from"@mui/material/Box";import R from"@mui/material/ButtonBase";import Be from"@mui/material/Collapse";import{useEffect as De,useState as Ne}from"react";import{jsx as E,jsxs as Q}from"react/jsx-runtime";function Me({isInitiallyOpen:e,onOpen:o,onClose:t,children:n,buttonStyles:i,buttonContents:r,buttonComponent:p=R,collapseProps:s,openIcon:d=E(ke,{}),closedIcon:u=E(Ce,{}),useDefaultStyling:m=p===R}){let[l,f]=Ne(!!e);return De(()=>{l&&o?o():!l&&t&&t()},[l]),Q(Te,{children:[Q(p,{onClick:()=>{f(h=>!h)},sx:m?a({width:"100%",display:"flex",alignItems:"center",justifyContent:"center",paddingY:1.5,paddingX:2,textAlign:"center","&:hover":p===R?{backgroundColor:"action.hover"}:null},i):i,"aria-expanded":l,children:[r,l?d:u]}),E(Be,c(a({in:l},s),{children:n}))]})}var Re=Me;import uo from"@mui/icons-material/DarkMode";import fo from"@mui/icons-material/LightMode";import xo from"@mui/material/IconButton";import go from"@mui/material/Tooltip";import Ee from"@mui/material/CircularProgress";import{createContext as Ae,useContext as Oe}from"react";import{jsx as Z}from"react/jsx-runtime";var j=Ae(void 0);function I(){let e=Oe(j);if(!e)throw new Error("LOADER_CONTEXT_NOT_SET");return e}function Fe(n){var i=n,{children:e,loadingComponent:o=Z(Ee,{})}=i,t=x(i,["children","loadingComponent"]);return Z(j.Provider,{value:a({loadingComponent:o},t),children:e})}var A=Fe;import{Fragment as S,jsx as w}from"react/jsx-runtime";function We({children:e,loadingComponent:o,onUndefined:t,showOnError:n}){let{isLoading:i,data:r,loadingComponent:p,error:s}=I();if(i)return w(S,{children:o!=null?o:p});if(s&&!n)return w(S,{});if(r===void 0){if(console.warn("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."),t){let d=t();return d!=null?d:w(S,{})}return w(S,{})}return typeof e=="function"?w(S,{children:e(r)}):w(S,{children:e})}var O=We;import ze from"@mui/material/Alert";import{Fragment as ee,jsx as F}from"react/jsx-runtime";function He(){var t;let{error:e,errorComponent:o}=I();return e?typeof o=="function"?o(e):o?F(ee,{children:o}):F(ze,{severity:"error",children:(t=e==null?void 0:e.message)!=null?t:"An unknown error has occured. Please try again later."}):F(ee,{})}var W=He;import Ue from"@mui/material/CssBaseline";import{createTheme as Ve,ThemeProvider as Xe}from"@mui/material/styles";import{createContext as $e,useContext as _e,useMemo as Ge,useState as Je}from"react";import{jsx as oe,jsxs as qe}from"react/jsx-runtime";var te=$e({toggleMode:()=>{},mode:"dark"});function L(){return _e(te)}function Ke({children:e,mode:o="dark"}){let[t,n]=Je(o),i=Ge(()=>Ve({palette:{mode:t}}),[t]);return oe(te.Provider,{value:{mode:t,toggleMode:()=>{n(r=>r==="light"?"dark":"light")}},children:qe(Xe,{theme:i,children:[oe(Ue,{}),e]})})}var Ye=Ke;import{createContext as Qe,useContext as Ze,useEffect as re,useState as z}from"react";import{jsx as to}from"react/jsx-runtime";var ne=Qe({windowWidth:0,windowHeight:0,isLargeScreen:!1});function je(){return Ze(ne)}function eo({children:e,largeScreenWidth:o,largeScreenHeight:t}){let[n,i]=z(window.innerWidth),[r,p]=z(window.innerHeight);function s(m,l,f=669,h=600){return m>f&&l>h}let[d,u]=z(s(window.innerWidth,window.innerHeight,o,t));return re(()=>{function m(){i(window.innerWidth),p(window.innerHeight)}return m(),window.addEventListener("resize",m),()=>{window.removeEventListener("resize",m)}},[]),re(()=>{u(s(n,r,o,t))},[n,r,o,t]),to(ne.Provider,{value:{isLargeScreen:d,windowWidth:n,windowHeight:r},children:e})}var oo=eo;import{wait as ro}from"@alextheman/utility";import no from"@mui/material/Alert";import io from"@mui/material/Snackbar";import{createContext as ao,useContext as po,useState as B}from"react";import{jsx as ie,jsxs as co}from"react/jsx-runtime";var ae=ao(void 0);function so(){let e=po(ae);if(!e)throw new Error("SNACKBAR_CONTEXT_NOT_SET");return e}function mo({children:e,autoHideDuration:o=5e3}){let[t,n]=B(!1),[i,r]=B(o),[p,s]=B(""),[d,u]=B("info");function m(f,h,y){n(!0),r(y!=null?y:o),u(h!=null?h:"info"),s(f)}function l(){return q(this,null,function*(){n(!1),yield ro(.2),s("")})}return co(ae.Provider,{value:{addSnackbar:m},children:[ie(io,{open:t,autoHideDuration:i,onClose:l,children:ie(no,{onClose:l,severity:d,children:p})}),e]})}var lo=mo;import{jsx as D}from"react/jsx-runtime";function ho(){let{mode:e,toggleMode:o}=L();return D(go,{title:`Enable ${e==="dark"?"light":"dark"} mode`,children:D(xo,{sx:{marginLeft:"auto"},onClick:o,"aria-label":`Enable ${e==="dark"?"light":"dark"} mode`,children:e==="dark"?D(fo,{}):D(uo,{})})})}var yo=ho;import Po from"@mui/icons-material/ArrowDropDown";import vo from"@mui/icons-material/ArrowDropUp";import pe from"@mui/material/Box";import se from"@mui/material/Button";import So from"@mui/material/Menu";import{useEffect as wo,useMemo as bo,useState as Io}from"react";import{jsx as C,jsxs as ko}from"react/jsx-runtime";function Lo({children:e,button:o=se,buttonChildren:t="Menu",buttonProps:n,isOpenIcon:i=C(vo,{}),isClosedIcon:r=C(Po,{}),onOpen:p,onClose:s}){let[d,u]=Io(null),m=bo(()=>!!d,[d]),l=c(a({},n),{onClick:f=>{u(f.currentTarget)},"aria-controls":m?"dropdown-menu":void 0,"aria-haspopup":"true","aria-expanded":m});return o===se&&(l.endIcon=m?i:r),wo(()=>{m&&p?p():!m&&s&&s()},[m,p,s]),ko(pe,{children:[C(o,c(a({},l),{children:t})),C(So,{id:"dropdown-menu",anchorEl:d,open:m,onClose:()=>{u(null)},children:typeof e=="function"?C(pe,{children:e(()=>{u(null)})}):e})]})}var Co=Lo;import To from"@mui/material/Link";import{jsx as No}from"react/jsx-runtime";function Bo(n){var i=n,{href:e,children:o}=i,t=x(i,["href","children"]);return No(To,c(a({component:"a",href:e,target:"_blank",rel:"noopener noreferrer"},t),{children:o}))}var Do=Bo;import Mo from"@mui/icons-material/CloudUpload";import Ro from"@mui/material/Button";import{styled as de}from"@mui/material/styles";import{useState as Eo}from"react";import{jsx as H,jsxs as zo}from"react/jsx-runtime";var Ao={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"},Oo=de("input")({clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:1,overflow:"hidden",position:"absolute",bottom:0,left:0,whiteSpace:"nowrap",width:1}),Fo=de("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 Wo(p){var s=p,{onFileInput:e,label:o="Upload files",multiple:t,accept:n,useDropzone:i}=s,r=x(s,["onFileInput","label","multiple","accept","useDropzone"]);var l;let[d,u]=Eo(!1),m=zo(Ro,c(a({variant:"contained",component:"label","aria-label":"File upload button",onKeyDown:f=>{var h;(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),(h=document.getElementById("file-input"))==null||h.click())}},r),{startIcon:(l=r.startIcon)!=null?l:H(Mo,{}),children:[o,H(Oo,{id:"file-input",type:"file",onChange:f=>{var y;let h=f.target;e(Array.from((y=h.files)!=null?y:[])),h.value=""},multiple:t,accept:n==null?void 0:n.join(","),disabled:r.disabled})]}));return i?H(Fo,{$dragging:d,onDragOver:f=>{f.preventDefault(),!r.disabled&&u(!0)},onDragLeave:f=>{f.preventDefault(),u(!1)},onDrop:f=>{var y;if(f.preventDefault(),u(!1),r.disabled)return;let h=Array.from((y=f.dataTransfer.files)!=null?y:[]);e(h)},children:m}):m}var U=Wo;import Ho from"@mui/icons-material/Delete";import Uo from"@mui/material/Box";import Vo from"@mui/material/IconButton";import Xo from"@mui/material/List";import $o from"@mui/material/ListItem";import _o from"@mui/material/ListItemText";import{jsx as b,jsxs as Ko}from"react/jsx-runtime";function Go(n){var i=n,{files:e,setFiles:o}=i,t=x(i,["files","setFiles"]);function r(s){o(d=>[...d,...s])}let p=c(a({},t),{onFileInput:r});return(p==null?void 0:p.multiple)===void 0&&(p.multiple=!0),Ko(Uo,{children:[b(U,a({},p)),b(Xo,{children:e.map(s=>b($o,{secondaryAction:b(Vo,{"aria-label":"Delete",edge:"end",onClick:()=>{o(d=>d.filter(u=>u!==s))},children:b(Ho,{})}),children:b(_o,{primary:s.name})},s.name))})]})}var Jo=Go;import Yo from"@mui/material/Box";import qo from"@mui/material/Popover";import{useId as Qo,useState as Zo}from"react";import{jsx as me,jsxs as ot}from"react/jsx-runtime";function jo({icon:e,onOpen:o,onClose:t,iconProps:n,children:i}){let[r,p]=Zo(null),s=!!r,d=Qo();function u(l){p(l.currentTarget),o&&o()}function m(){p(null),t&&t()}return ot(Yo,{children:[me(e,a({"aria-owns":s?d:void 0,"aria-haspopup":"true",onMouseEnter:u,onMouseLeave:m},n)),me(qo,{id:d,sx:{pointerEvents:"none"},open:s,anchorEl:r,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},onClose:m,disableRestoreFocus:!0,children:i})]})}var et=jo;import tt from"@mui/material/Link";import{Link as rt}from"react-router-dom";import{jsx as it}from"react/jsx-runtime";function nt(n){var i=n,{to:e,children:o}=i,t=x(i,["to","children"]);return it(tt,c(a({component:rt,to:e},t),{children:o}))}var V=nt;import at from"@mui/material/ListItemButton";import{jsx as dt}from"react/jsx-runtime";function pt(t){var n=t,{children:e}=n,o=x(n,["children"]);return dt(at,c(a({component:V},o),{children:e}))}var st=pt;import mt from"@mui/material/CircularProgress";import{jsx as X,jsxs as ut}from"react/jsx-runtime";function lt(i){var r=i,{children:e,onUndefined:o,loadingComponent:t=X(mt,{})}=r,n=x(r,["children","onUndefined","loadingComponent"]);return ut(A,c(a({loadingComponent:t},n),{children:[X(W,{}),X(O,{onUndefined:o,children:e})]}))}var ct=lt;import ft from"@mui/material/BottomNavigation";import xt from"@mui/material/BottomNavigationAction";import gt from"@mui/material/Box";import ht from"@mui/material/Paper";import{useState as yt}from"react";import{Link as Pt}from"react-router-dom";import{Fragment as wt,jsx as N,jsxs as bt}from"react/jsx-runtime";function vt({children:e,navItems:o}){let[t,n]=yt("");return bt(wt,{children:[N(gt,{sx:{paddingBottom:7},children:e}),N(ht,{sx:{position:"fixed",bottom:0,left:0,right:0},children:N(ft,{showLabels:!0,value:t,onChange:(i,r)=>{n(r)},children:o.map(i=>N(xt,c(a({},i),{component:Pt}),i.value))})})]})}var St=vt;import{truncate as le}from"@alextheman/utility";import It from"@mui/icons-material/ChevronLeft";import Lt from"@mui/icons-material/ChevronRight";import Ct from"@mui/icons-material/Menu";import kt from"@mui/material/AppBar";import ce from"@mui/material/Box";import Tt from"@mui/material/CssBaseline";import ue from"@mui/material/Divider";import Bt from"@mui/material/Drawer";import fe from"@mui/material/IconButton";import Dt from"@mui/material/List";import Nt from"@mui/material/ListItem";import Mt from"@mui/material/ListItemButton";import Rt from"@mui/material/ListItemIcon";import Et from"@mui/material/ListItemText";import{styled as _,useTheme as At}from"@mui/material/styles";import Ot from"@mui/material/Toolbar";import $ from"@mui/material/Typography";import{Fragment as Ft,useState as Wt}from"react";import{Link as zt,useLocation as Ht}from"react-router-dom";import{jsx as g,jsxs as v}from"react/jsx-runtime";var M=240;function xe(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 he=_("div")(({theme:e})=>a({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:e.spacing(0,1)},e.mixins.toolbar)),Ut=_(kt,{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})}}]})),Vt=_(Bt,{shouldForwardProp:e=>e!=="open"})(({theme:e})=>({width:M,flexShrink:0,whiteSpace:"nowrap",boxSizing:"border-box",variants:[{props:({open:o})=>o,style:c(a({},xe(e)),{"& .MuiDrawer-paper":xe(e)})},{props:({open:o})=>!o,style:c(a({},ge(e)),{"& .MuiDrawer-paper":ge(e)})}]}));function Xt({title:e,navItems:o,children:t,headerElements:n}){let i=At(),[r,p]=Wt(!0),s=Ht();function d(){p(!0)}function u(){p(!1)}return v(ce,{sx:{display:"flex"},children:[g(Tt,{}),g(Ut,{position:"fixed",open:r,children:v(Ot,{children:[g(fe,{color:"inherit","aria-label":"open drawer",onClick:d,edge:"start",sx:[{marginRight:5},r&&{display:"none"}],children:g(Ct,{})}),g($,{variant:"h6",noWrap:!0,component:"div",children:e}),n]})}),v(Vt,{variant:"permanent",open:r,children:[g(he,{children:g(fe,{onClick:u,children:i.direction==="rtl"?g(Lt,{}):g(It,{})})}),g(ue,{}),o.map(m=>v(Ft,{children:[v(Dt,{children:[g($,{variant:r?"h5":"h6",paddingLeft:r?2:1,children:r?m.category:le(m.category,4)}),m.options.map(l=>g(Nt,{disablePadding:!0,sx:{display:"block"},children:v(Mt,{sx:[{minHeight:48,px:2.5},r?{justifyContent:"initial"}:{justifyContent:"center"}],component:zt,to:l.to,selected:s.pathname===l.to,children:[g(Rt,{sx:[{minWidth:0,justifyContent:"center"},r?{mr:3}:{mr:"auto"}],children:l.icon?l.icon:r?null:g($,{children:le(l.label,4)})}),g(Et,{primary:l.label,sx:[r?{opacity:1}:{opacity:0}]})]})},l.to))]}),g(ue,{})]},m.category))]}),v(ce,{component:"main",sx:{flexGrow:1,p:3},children:[g(he,{}),t]})]})}var $t=Xt;import _t from"@mui/material/Typography";import{Fragment as Kt,jsx as ye}from"react/jsx-runtime";function Gt(n){var i=n,{text:e,sx:o}=i,t=x(i,["text","sx"]);return ye(Kt,{children:e.split(`
2
+ `).map((r,p)=>ye(_t,c(a({sx:a({margin:1},o)},t),{children:r}),p))})}var Jt=Gt;import G from"@mui/material/Box";import Pe from"@mui/material/Typography";import{stripIndent as Yt}from"common-tags";import{LiveEditor as qt,LiveError as Qt,LivePreview as Zt,LiveProvider as jt}from"react-live";import{jsx as P,jsxs as ve}from"react/jsx-runtime";function er({code:e,scope:o,previewStyles:t,noInline:n,enableTypeScript:i,language:r}){let{mode:p}=L(),s={backgroundColor:p==="dark"?"black":"white",border:.3,borderRadius:1,padding:2,borderColor:"darkgray"},d=t?a(a({},s),t):a({},s);return P(G,{sx:{borderRadius:1,border:.5,padding:2},children:ve(jt,{code:Yt(e),scope:o,noInline:n,enableTypeScript:i,language:r,children:[P(Pe,{variant:"h5",children:"Code"}),P(G,{sx:{border:.3,borderRadius:.3,borderColor:"darkgray"},children:P(qt,{})}),P("br",{}),P(Pe,{variant:"h5",children:"Result"}),ve(G,{sx:d,children:[P(Zt,{}),P(Qt,{})]})]})})}var or=er;import tr from"@mui/material/Button";import{useFormContext as rr}from"react-hook-form";import{jsx as ar}from"react/jsx-runtime";function nr(n){var i=n,{disableClean:e,label:o}=i,t=x(i,["disableClean","label"]);let{formState:{disabled:r,isDirty:p,isSubmitting:s}}=rr();return ar(tr,c(a({color:"primary",disabled:t.disabled||e&&!p||r,loading:s,type:"submit",variant:"contained"},t),{children:o}))}var ir=nr;import Se from"@mui/material/Box";import{styled as pr}from"@mui/material/styles";import sr from"@mui/material/Switch";import{jsx as k}from"react/jsx-runtime";var dr=pr(sr)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",fontSize:16,width:28,height:28}}}));function mr(r){var p=r,{checkedIcon:e,checkedIconStyles:o,uncheckedIcon:t,uncheckedIconStyles:n}=p,i=x(p,["checkedIcon","checkedIconStyles","uncheckedIcon","uncheckedIconStyles"]);let s={borderRadius:"50%",borderColor:"white",backgroundColor:"white",display:"flex",alignItems:"center",justifyContent:"center",padding:.25},d={color:"black",maxWidth:16.5,maxHeight:16.5};return k(dr,a({checkedIcon:k(Se,{sx:s,children:k(e,{style:a(a({},d),o)})}),icon:k(Se,{sx:s,children:k(t,{style:a(a({},d),n)})})},i))}var lr=mr;import{useCallback as we,useEffect as cr,useState as ur}from"react";function fr(e){let[o,t]=ur(()=>{let r=window.location.hash.replace("#","");return e&&r===""?e:r}),n=we(()=>{let r=window.location.hash.replace("#","");t(e&&r===""?e:r)},[t,e]);cr(()=>(window.addEventListener("hashchange",n),()=>{window.removeEventListener("hashchange",n)}),[n]);let i=we(r=>{let p=typeof r=="function"?r(o):r;p!==o&&(window.location.hash=p)},[o]);return[o,i]}var xr=fr;export{Re as CollapsableItem,yo as DarkModeToggle,Co as DropdownMenu,Do as ExternalLink,U as FileInput,Jo as FileInputList,Ao as FileType,et as IconWithPopover,V as InternalLink,st as ListItemInternalLink,ct as Loader,O as LoaderData,W as LoaderError,A as LoaderProvider,Ye as ModeProvider,St as NavigationBottom,$t as NavigationDrawer,Jt as PopoverText,or as ReactPlayground,oo as ScreenSizeProvider,lo as SnackbarProvider,ir as SubmitButton,lr as SwitchWithIcons,xr as useHash,I as useLoader,L as useMode,je as useScreenSize,so 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/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\ninterface BaseProps<T> {\n isLoading: boolean;\n data?: T;\n loadingComponent?: ReactNode;\n}\n\ninterface PropsWithNoError<T> extends BaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\ninterface PropsWithError<T> extends BaseProps<T> {\n error: unknown;\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> = PropsWithNoError<T> | PropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n loadingComponent?: ReactNode;\n onUndefined?: () => ReactNode | void;\n showOnError?: boolean;\n}\n\nfunction LoaderData<T>({\n children,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const { isLoading, data, loadingComponent: defaultLoadingComponent, error } = useLoader<T>();\n\n if (isLoading) {\n return <>{loadingComponent ?? defaultLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport Link from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\"> {\n href: string;\n children: ReactNode;\n}\n\nfunction ExternalLink({\n href,\n children,\n target = \"_blank\",\n rel = \"noopener noreferrer\",\n ...linkProps\n}: ExternalLinkProps) {\n return (\n <Link component={\"a\"} href={href} target={target} rel={rel} {...linkProps}>\n {children}\n </Link>\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 Link from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: string;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <Link component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </Link>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n onUndefined?: () => ReactNode | void;\n};\n\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import 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","loadingComponent","onUndefined","showOnError","isLoading","data","defaultLoadingComponent","error","useLoader","result","LoaderData_default","Alert","Fragment","jsx","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useState","jsx","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","context","useContext","SnackbarProvider","children","autoHideDuration","open","setOpen","useState","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","wait","Snackbar","Alert","SnackbarProvider_default","jsx","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","ArrowDropDown","ArrowDropUp","Box","MUIButton","Menu","useEffect","useMemo","useState","jsx","jsxs","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","useState","isDropdownOpen","useMemo","buttonProps","__spreadProps","__spreadValues","event","useEffect","Box","Menu","DropdownMenu_default","Link","jsx","ExternalLink","_a","_b","href","children","target","rel","linkProps","__objRest","Link","__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","Link","ReactDOMLink","jsx","InternalLink","_a","_b","to","children","linkProps","__objRest","Link","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","ListItemButton","jsx","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","CircularProgress","jsx","jsxs","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","BottomNavigation","BottomNavigationAction","Box","Paper","useState","Link","Fragment","jsx","jsxs","NavigationBottom","children","navItems","value","setValue","useState","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","Link","NavigationBottom_default","truncate","ChevronLeftIcon","ChevronRightIcon","MenuIcon","MuiAppBar","Box","CssBaseline","Divider","MuiDrawer","IconButton","List","ListItem","ListItemButton","ListItemIcon","ListItemText","styled","useTheme","Toolbar","Typography","Fragment","useState","Link","useLocation","jsx","jsxs","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","styled","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","useTheme","setOpen","useState","location","useLocation","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","Fragment","List","truncate","option","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","NavigationDrawer_default","Typography","Fragment","jsx","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","Box","Typography","stripIndent","LiveEditor","LiveError","LivePreview","LiveProvider","jsx","jsxs","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","stripIndent","Typography","LiveEditor","LivePreview","LiveError","ReactPlayground_default","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/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\ninterface BaseProps<T> {\n isLoading: boolean;\n data?: T;\n loadingComponent?: ReactNode;\n}\n\ninterface PropsWithNoError<T> extends BaseProps<T> {\n error?: never;\n errorComponent?: never;\n}\n\ninterface PropsWithError<T> extends BaseProps<T> {\n error: unknown;\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n}\n\nexport type LoaderContextValue<T> = PropsWithNoError<T> | PropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\nexport function useLoader<T>(): LoaderContextValue<T> {\n const context = useContext(LoaderContext);\n if (!context) {\n throw new Error(\"LOADER_CONTEXT_NOT_SET\");\n }\n return context as LoaderContextValue<T>;\n}\n\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n loadingComponent?: ReactNode;\n onUndefined?: () => ReactNode | void;\n showOnError?: boolean;\n}\n\nfunction LoaderData<T>({\n children,\n loadingComponent,\n onUndefined,\n showOnError,\n}: LoaderDataProps<T>) {\n const { isLoading, data, loadingComponent: defaultLoadingComponent, error } = useLoader<T>();\n\n if (isLoading) {\n return <>{loadingComponent ?? defaultLoadingComponent}</>;\n }\n\n if (error && !showOnError) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === undefined) {\n console.warn(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n if (onUndefined) {\n const result = onUndefined();\n return result ?? <></>;\n }\n return <></>;\n }\n\n return typeof children === \"function\" ? (\n <>{children(data as DisallowUndefined<T>)}</>\n ) : (\n <>{children}</>\n );\n}\n\nexport default LoaderData;\n","import Alert from \"@mui/material/Alert\";\n\nimport { useLoader } from \"src/providers/LoaderProvider\";\n\nfunction LoaderError() {\n const { error, errorComponent } = useLoader();\n\n if (error) {\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import type { ReactNode } from \"react\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst ModeContext = createContext({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode() {\n return useContext(ModeContext);\n}\n\nexport type Mode = \"light\" | \"dark\";\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: Mode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<Mode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { ReactNode } from \"react\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize() {\n return useContext(ScreenSizeContext);\n}\n\nfunction ScreenSizeProvider({ children, largeScreenWidth, largeScreenHeight }: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n function largeScreenCondition(\n width: number,\n height: number,\n largeScreenWidth: number = 669,\n largeScreenHeight: number = 600,\n ): boolean {\n return width > largeScreenWidth && height > largeScreenHeight;\n }\n\n const [isLargeScreen, setIsLargeScreen] = useState<boolean>(\n largeScreenCondition(\n window.innerWidth,\n window.innerHeight,\n largeScreenWidth,\n largeScreenHeight,\n ),\n );\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n useEffect(() => {\n setIsLargeScreen(\n largeScreenCondition(windowWidth, windowHeight, largeScreenWidth, largeScreenHeight),\n );\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\nexport function useSnackbar() {\n const context = useContext(SnackbarContext);\n if (!context) {\n throw new Error(\"SNACKBAR_CONTEXT_NOT_SET\");\n }\n return context;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}`;\n to?: never;\n children: ReactNode;\n}\n\nfunction ExternalLink({ href, children, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink component={\"a\"} href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}`;\n href?: never;\n children: ReactNode;\n}\n\nfunction InternalLink({ to, children, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { DisallowUndefined } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { LoaderProviderProps } from \"src/providers\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError, LoaderProvider } from \"src/providers\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> & {\n children: ReactNode | ((data: DisallowUndefined<T>) => ReactNode);\n onUndefined?: () => ReactNode | void;\n};\n\nfunction Loader<T>({\n children,\n onUndefined,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n <LoaderError />\n <LoaderData<T> onUndefined={onUndefined}>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps {\n code: string;\n scope?: Record<string, unknown>;\n previewStyles?: SxProps<Theme>;\n noInline?: boolean;\n enableTypeScript?: boolean;\n language?: string;\n}\n\nfunction ReactPlayground({\n code,\n scope,\n previewStyles,\n noInline,\n enableTypeScript,\n language,\n}: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider\n code={stripIndent(code)}\n scope={scope}\n noInline={noInline}\n enableTypeScript={enableTypeScript}\n language={language}\n >\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import 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","loadingComponent","onUndefined","showOnError","isLoading","data","defaultLoadingComponent","error","useLoader","result","LoaderData_default","Alert","Fragment","jsx","LoaderError","_a","error","errorComponent","useLoader","Alert","LoaderError_default","CssBaseline","createTheme","ThemeProvider","createContext","useContext","useMemo","useState","jsx","jsxs","ModeContext","useMode","ModeProvider","children","modeProp","mode","setMode","theme","prev","ModeProvider_default","createContext","useContext","useEffect","useState","jsx","ScreenSizeContext","useScreenSize","ScreenSizeProvider","children","largeScreenWidth","largeScreenHeight","windowWidth","setWindowWidth","windowHeight","setWindowHeight","largeScreenCondition","width","height","isLargeScreen","setIsLargeScreen","setDimensions","ScreenSizeProvider_default","wait","Alert","Snackbar","createContext","useContext","useState","jsx","jsxs","SnackbarContext","createContext","useSnackbar","context","useContext","SnackbarProvider","children","autoHideDuration","open","setOpen","useState","autoHideDurationState","setAutoHideDurationState","message","setMessage","severity","setSeverity","addSnackbar","duration","handleClose","__async","wait","Snackbar","Alert","SnackbarProvider_default","jsx","DarkModeToggle","mode","toggleMode","useMode","Tooltip","IconButton","LightMode","DarkMode","DarkModeToggle_default","ArrowDropDown","ArrowDropUp","Box","MUIButton","Menu","useEffect","useMemo","useState","jsx","jsxs","DropdownMenu","children","Button","MUIButton","buttonChildren","incomingButtonProps","isOpenIcon","ArrowDropUp","isClosedIcon","ArrowDropDown","onOpen","onClose","anchorElement","setAnchorElement","useState","isDropdownOpen","useMemo","buttonProps","__spreadProps","__spreadValues","event","useEffect","Box","Menu","DropdownMenu_default","MUILink","jsx","ExternalLink","_a","_b","href","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ExternalLink_default","CloudUploadIcon","Button","styled","useState","jsx","jsxs","FileType","VisuallyHiddenInput","styled","Dropzone","theme","$dragging","FileInput","_a","_b","onFileInput","label","multiple","accept","useDropzone","buttonProps","__objRest","isDragging","setIsDragging","useState","fileInputButton","Button","__spreadProps","__spreadValues","event","CloudUploadIcon","input","filesArray","FileInput_default","DeleteIcon","Box","IconButton","List","ListItem","ListItemText","jsx","jsxs","FileInputList","_a","_b","files","setFiles","fileInputProps","__objRest","onFileInput","newFiles","oldFiles","newFileInputProps","__spreadProps","__spreadValues","Box","FileInput_default","List","file","ListItem","IconButton","fileToDelete","DeleteIcon","ListItemText","FileInputList_default","Box","Popover","useId","useState","jsx","jsxs","IconWithPopover","Icon","onOpen","onClose","iconProps","children","anchorElement","setAnchorElement","useState","isPopoverOpen","popoverId","useId","handleOpen","event","handleClose","Box","__spreadValues","Popover","IconWithPopover_default","MUILink","ReactDOMLink","jsx","InternalLink","_a","_b","to","children","linkProps","__objRest","MUILink","__spreadProps","__spreadValues","ReactDOMLink","InternalLink_default","ListItemButton","jsx","ListItemInternalLink","_a","_b","children","listItemButtonProps","__objRest","ListItemButton","__spreadProps","__spreadValues","InternalLink_default","ListItemInternalLink_default","CircularProgress","jsx","jsxs","Loader","_a","_b","children","onUndefined","loadingComponent","CircularProgress","loaderProviderProps","__objRest","LoaderProvider_default","__spreadProps","__spreadValues","LoaderError_default","LoaderData_default","Loader_default","BottomNavigation","BottomNavigationAction","Box","Paper","useState","Link","Fragment","jsx","jsxs","NavigationBottom","children","navItems","value","setValue","useState","Box","Paper","BottomNavigation","_","item","BottomNavigationAction","__spreadProps","__spreadValues","Link","NavigationBottom_default","truncate","ChevronLeftIcon","ChevronRightIcon","MenuIcon","MuiAppBar","Box","CssBaseline","Divider","MuiDrawer","IconButton","List","ListItem","ListItemButton","ListItemIcon","ListItemText","styled","useTheme","Toolbar","Typography","Fragment","useState","Link","useLocation","jsx","jsxs","drawerWidth","openedMixin","theme","closedMixin","DrawerHeader","styled","__spreadValues","AppBar","MuiAppBar","prop","open","Drawer","MuiDrawer","__spreadProps","NavigationDrawer","title","navItems","children","headerElements","useTheme","setOpen","useState","location","useLocation","handleDrawerOpen","handleDrawerClose","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","item","Fragment","List","truncate","option","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","NavigationDrawer_default","Typography","Fragment","jsx","PopoverText","_a","_b","text","sx","typographyProps","__objRest","line","index","Typography","__spreadProps","__spreadValues","PopoverText_default","Box","Typography","stripIndent","LiveEditor","LiveError","LivePreview","LiveProvider","jsx","jsxs","ReactPlayground","code","scope","previewStyles","noInline","enableTypeScript","language","mode","useMode","defaultPreviewStyles","allPreviewStyles","__spreadValues","Box","LiveProvider","stripIndent","Typography","LiveEditor","LivePreview","LiveError","ReactPlayground_default","Button","useFormContext","jsx","SubmitButton","_a","_b","disableClean","label","buttonProps","__objRest","formDisabled","isDirty","isSubmitting","useFormContext","Button","__spreadProps","__spreadValues","SubmitButton_default","Box","styled","Switch","jsx","StyledSwitch","styled","Switch","SwitchWithIcons","_a","_b","CheckedIcon","checkedIconStyles","UncheckedIcon","uncheckedIconStyles","switchProps","__objRest","boxSx","defaultIconStyles","__spreadValues","Box","SwitchWithIcons_default","useCallback","useEffect","useState","useHash","initialHash","hash","setHash","hashChangeHandler","updateHash","newHash","resolvedHash","useHash_default"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alextheman/components",
3
- "version": "5.0.0",
3
+ "version": "5.0.1",
4
4
  "description": "A package containing common React components used across my projects",
5
5
  "license": "ISC",
6
6
  "author": "alextheman",
@@ -31,7 +31,9 @@
31
31
  "lint-tsc": "tsc --noEmit",
32
32
  "storybook": "storybook dev -p 6006",
33
33
  "test": "echo \"Error: no test specified\" && exit 1",
34
- "update-dependencies": "bash -c 'npx npm-check-updates -u \"$@\" && npm install' --"
34
+ "update-dependencies": "bash -c 'npx npm-check-updates -u \"$@\" && npm install' --",
35
+ "use-live-eslint-plugin": "npm uninstall @alextheman/eslint-plugin && npm install --save-dev @alextheman/eslint-plugin",
36
+ "use-local-eslint-plugin": "npm --prefix ../eslint-plugin run create-local-package && npm uninstall @alextheman/eslint-plugin && npm install --save-dev ../eslint-plugin/alextheman-eslint-plugin-*.tgz"
35
37
  },
36
38
  "dependencies": {
37
39
  "@alextheman/utility": "^1.25.0",
@@ -39,7 +41,7 @@
39
41
  "react-live": "^4.1.8"
40
42
  },
41
43
  "devDependencies": {
42
- "@alextheman/eslint-plugin": "^1.14.2",
44
+ "@alextheman/eslint-plugin": "^2.1.0",
43
45
  "@eslint/compat": "^1.4.0",
44
46
  "@eslint/eslintrc": "^3.3.1",
45
47
  "@eslint/js": "^9.38.0",