@alextheman/components 6.1.2 → 6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +141 -26
- package/dist/index.d.ts +141 -26
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +41 -41
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`@mui/icons-material/ArrowDropDown`);c=s(c);let l=require(`@mui/icons-material/ArrowDropUp`);l=s(l);let u=require(`@mui/material/Box`);u=s(u);let d=require(`@mui/material/ButtonBase`);d=s(d);let f=require(`@mui/material/Collapse`);f=s(f);let p=require(`react`),m=require(`react/jsx-runtime`),h=require(`@mui/icons-material/DarkMode`);h=s(h);let g=require(`@mui/icons-material/LightMode`);g=s(g);let _=require(`@mui/material/IconButton`);_=s(_);let v=require(`@mui/material/Tooltip`);v=s(v);let y=require(`@mui/material/CircularProgress`);y=s(y);let b=require(`@mui/material/Alert`);b=s(b);let x=require(`@mui/material/CssBaseline`);x=s(x);let S=require(`@mui/material/styles`),C=require(`@alextheman/utility`),w=require(`@mui/material/Snackbar`);w=s(w);let T=require(`@mui/material/Button`);T=s(T);let E=require(`@mui/material/Menu`);E=s(E);let D=require(`@mui/material/Link`);D=s(D);let O=require(`@mui/icons-material/CloudUpload`);O=s(O);let k=require(`@mui/icons-material/Delete`);k=s(k);let A=require(`@mui/material/List`);A=s(A);let j=require(`@mui/material/ListItem`);j=s(j);let M=require(`@mui/material/ListItemText`);M=s(M);let N=require(`@mui/material/Popover`);N=s(N);let P=require(`react-router-dom`),F=require(`@mui/material/ListItemButton`);F=s(F);let I=require(`@mui/material/BottomNavigation`);I=s(I);let L=require(`@mui/material/BottomNavigationAction`);L=s(L);let R=require(`@mui/material/Paper`);R=s(R);let z=require(`@mui/icons-material/ChevronLeft`);z=s(z);let B=require(`@mui/icons-material/ChevronRight`);B=s(B);let V=require(`@mui/icons-material/Menu`);V=s(V);let H=require(`@mui/material/AppBar`);H=s(H);let U=require(`@mui/material/Divider`);U=s(U);let W=require(`@mui/material/Drawer`);W=s(W);let G=require(`@mui/material/ListItemIcon`);G=s(G);let K=require(`@mui/material/Toolbar`);K=s(K);let q=require(`@mui/material/Typography`);q=s(q);let ee=require(`common-tags`),J=require(`react-live`),Y=require(`@mui/material/Skeleton`);Y=s(Y);let X=require(`@mui/material/TableCell`);X=s(X);let Z=require(`@mui/material/TableRow`);Z=s(Z);let te=require(`react-hook-form`),Q=require(`@mui/material/Switch`);Q=s(Q);function ne({isInitiallyOpen:e,onOpen:t,onClose:n,children:r,buttonStyles:i,buttonContents:a,buttonComponent:o=d.default,collapseProps:s,openIcon:h=(0,m.jsx)(l.default,{}),closedIcon:g=(0,m.jsx)(c.default,{}),useDefaultStyling:_=o===d.default}){let[v,y]=(0,p.useState)(!!e);return(0,p.useEffect)(()=>{v&&t?t():!v&&n&&n()},[v]),(0,m.jsxs)(u.default,{children:[(0,m.jsxs)(o,{onClick:()=>{y(e=>!e)},sx:_?{width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,paddingY:1.5,paddingX:2,textAlign:`center`,"&:hover":o===d.default?{backgroundColor:`action.hover`}:null,...i}:i,"aria-expanded":v,children:[a,v?h:g]}),(0,m.jsx)(f.default,{in:v,...s,children:r})]})}var re=ne;const ie=(0,p.createContext)(void 0);function ae({strict:e=!0}={}){let t=(0,p.useContext)(ie);if(e&&!t)throw Error(`LOADER_PROVIDER_NOT_FOUND`);return t}function oe({children:e,loadingComponent:t=(0,m.jsx)(y.default,{}),...n}){return(0,m.jsx)(ie.Provider,{value:{loadingComponent:t,...n},children:e})}var se=oe;function ce({children:e,dataParser:t,loadingComponent:n}){let{isLoading:r,data:i,dataParser:a,loadingComponent:o,error:s}=ae(),c=t??a;return r?(0,m.jsx)(m.Fragment,{children:n??o}):s||i==null?(0,m.jsx)(m.Fragment,{}):c?typeof e==`function`?(0,m.jsx)(m.Fragment,{children:e(c(i))}):(0,m.jsx)(m.Fragment,{children:e}):typeof e==`function`?(0,m.jsx)(m.Fragment,{children:e(i)}):(0,m.jsx)(m.Fragment,{children:e})}var le=ce;function ue({children:e,undefinedComponent:t,nullComponent:n,nullableComponent:r,logError:i}){let{isLoading:a,data:o,error:s,errorComponent:c,logError:l}=ae(),u=i??l,d=(0,p.useRef)(!1),f=e??c;return s?(u&&!d.current&&(console.error(s),d.current=!0),typeof f==`function`?f(s):f?(0,m.jsx)(m.Fragment,{children:f}):(0,m.jsx)(b.default,{severity:`error`,children:s?.message??`An unknown error has occured. Please try again later.`})):!a&&o==null?r?(u&&!d.current&&(console.error(`Data is nullable after loading.`),d.current=!0),(0,m.jsx)(m.Fragment,{children:r})):o===void 0&&(u&&!d.current&&(console.error(`Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.`),d.current=!0),t)?(0,m.jsx)(m.Fragment,{children:t}):o===null&&(u&&!d.current&&(console.error(`Data is null after loading.`),d.current=!0),n)?(0,m.jsx)(m.Fragment,{children:n}):(0,m.jsx)(b.default,{severity:`error`,children:`Failed to load data. Please try again later.`}):(0,m.jsx)(m.Fragment,{})}var de=ue,fe=se;const pe=(0,p.createContext)({toggleMode:()=>{},mode:`dark`});function $({strict:e=!0}={}){let t=(0,p.useContext)(pe);if(e&&!t)throw Error(`MODE_PROVIDER_NOT_FOUND`);return t}function me({children:e,mode:t=`dark`}){let[n,r]=(0,p.useState)(t),i=(0,p.useMemo)(()=>(0,S.createTheme)({palette:{mode:n}}),[n]);return(0,m.jsx)(pe.Provider,{value:{mode:n,toggleMode:()=>{r(e=>e===`light`?`dark`:`light`)}},children:(0,m.jsxs)(S.ThemeProvider,{theme:i,children:[(0,m.jsx)(x.default,{}),e]})})}var he=me;const ge=(0,p.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function _e({strict:e=!0}={}){let t=(0,p.useContext)(ge);if(e&&!t)throw Error(`SCREEN_SIZE_PROVIDER_NOT_FOUND`);return t}function ve({children:e,largeScreenWidth:t=669,largeScreenHeight:n=660}){let[r,i]=(0,p.useState)(window.innerWidth),[a,o]=(0,p.useState)(window.innerHeight);(0,p.useEffect)(()=>{function e(){i(window.innerWidth),o(window.innerHeight)}return e(),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`resize`,e)}},[]);let s=(0,p.useMemo)(()=>r>t&&a>n,[r,a,t,n]);return(0,m.jsx)(ge.Provider,{value:{isLargeScreen:s,windowWidth:r,windowHeight:a},children:e})}var ye=ve;const be=(0,p.createContext)(void 0);function xe({strict:e=!0}={}){let t=(0,p.useContext)(be);if(e&&!t)throw Error(`SNACKBAR_PROVIDER_NOT_FOUND`);return t}function Se({children:e,autoHideDuration:t=5e3}){let[n,r]=(0,p.useState)(!1),[i,a]=(0,p.useState)(t),[o,s]=(0,p.useState)(``),[c,l]=(0,p.useState)(`info`);function u(e,n,i){r(!0),a(i??t),l(n??`info`),s(e)}async function d(){r(!1),await(0,C.wait)(.2),s(``)}return(0,m.jsxs)(be.Provider,{value:{addSnackbar:u},children:[(0,m.jsx)(w.default,{open:n,autoHideDuration:i,onClose:d,children:(0,m.jsx)(b.default,{onClose:d,severity:c,children:o})}),e]})}var Ce=Se;function we(){let{mode:e,toggleMode:t}=$();return(0,m.jsx)(v.default,{title:`Enable ${e===`dark`?`light`:`dark`} mode`,children:(0,m.jsx)(_.default,{sx:{marginLeft:`auto`},onClick:t,"aria-label":`Enable ${e===`dark`?`light`:`dark`} mode`,children:e===`dark`?(0,m.jsx)(g.default,{}):(0,m.jsx)(h.default,{})})})}var Te=we;function Ee({children:e,button:t=T.default,buttonChildren:n=`Menu`,buttonProps:r,isOpenIcon:i=(0,m.jsx)(l.default,{}),isClosedIcon:a=(0,m.jsx)(c.default,{}),onOpen:o,onClose:s}){let[d,f]=(0,p.useState)(null),h=(0,p.useMemo)(()=>!!d,[d]),g={...r,onClick:e=>{f(e.currentTarget)},"aria-controls":h?`dropdown-menu`:void 0,"aria-haspopup":`true`,"aria-expanded":h};return t===T.default&&(g.endIcon=h?i:a),(0,p.useEffect)(()=>{h&&o?o():!h&&s&&s()},[h,o,s]),(0,m.jsxs)(u.default,{children:[(0,m.jsx)(t,{...g,children:n}),(0,m.jsx)(E.default,{id:`dropdown-menu`,anchorEl:d,open:h,onClose:()=>{f(null)},children:typeof e==`function`?(0,m.jsx)(u.default,{children:e(()=>{f(null)})}):e})]})}var De=Ee;function Oe({href:e,children:t,ref:n,...r}){return(0,m.jsx)(D.default,{component:`a`,href:e,ref:n,target:`_blank`,rel:`noopener noreferrer`,...r,children:t})}var ke=Oe;const Ae={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`},je=(0,S.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}),Me=(0,S.styled)(`div`)(({theme:e,$dragging:t})=>({border:`2px dashed`,borderColor:t?e.palette.primary.main:`#ccc`,backgroundColor:t?e.palette.action.hover:`transparent`,borderRadius:8,padding:`1.5rem`,textAlign:`center`,transition:`border-color 0.2s`,cursor:`pointer`}));function Ne({onFileInput:e,label:t=`Upload files`,multiple:n,accept:r,useDropzone:i,...a}){let[o,s]=(0,p.useState)(!1),c=(0,m.jsxs)(T.default,{variant:`contained`,component:`label`,"aria-label":`File upload button`,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),document.getElementById(`file-input`)?.click())},...a,startIcon:a.startIcon??(0,m.jsx)(O.default,{}),children:[t,(0,m.jsx)(je,{id:`file-input`,type:`file`,onChange:t=>{let n=t.target;e(Array.from(n.files??[])),n.value=``},multiple:n,accept:r?.join(`,`),disabled:a.disabled})]});return i?(0,m.jsx)(Me,{$dragging:o,onDragOver:e=>{e.preventDefault(),!a.disabled&&s(!0)},onDragLeave:e=>{e.preventDefault(),s(!1)},onDrop:t=>{t.preventDefault(),s(!1),!a.disabled&&e(Array.from(t.dataTransfer.files??[]))},children:c}):c}var Pe=Ne;function Fe({files:e,setFiles:t,...n}){function r(e){t(t=>[...t,...e])}let i={...n,onFileInput:r};return i?.multiple===void 0&&(i.multiple=!0),(0,m.jsxs)(u.default,{children:[(0,m.jsx)(Pe,{...i}),(0,m.jsx)(A.default,{children:e.map(e=>(0,m.jsx)(j.default,{secondaryAction:(0,m.jsx)(_.default,{"aria-label":`Delete`,edge:`end`,onClick:()=>{t(t=>t.filter(t=>t!==e))},children:(0,m.jsx)(k.default,{})}),children:(0,m.jsx)(M.default,{primary:e.name})},e.name))})]})}var Ie=Fe;function Le({icon:e,onOpen:t,onClose:n,iconProps:r,children:i}){let[a,o]=(0,p.useState)(null),s=!!a,c=(0,p.useId)();function l(e){o(e.currentTarget),t&&t()}function d(){o(null),n&&n()}return(0,m.jsxs)(u.default,{children:[(0,m.jsx)(e,{"aria-owns":s?c:void 0,"aria-haspopup":`true`,onMouseEnter:l,onMouseLeave:d,...r}),(0,m.jsx)(N.default,{id:c,sx:{pointerEvents:`none`},open:s,anchorEl:a,anchorOrigin:{vertical:`bottom`,horizontal:`left`},transformOrigin:{vertical:`top`,horizontal:`left`},onClose:d,disableRestoreFocus:!0,children:i})]})}var Re=Le;function ze({to:e,children:t,ref:n,...r}){return(0,m.jsx)(D.default,{component:P.Link,to:e,ref:n,...r,children:t})}var Be=ze;function Ve({children:e,...t}){return(0,m.jsx)(F.default,{component:Be,...t,children:e})}var He=Ve;function Ue({children:e,errorComponent:t,undefinedComponent:n,nullComponent:r,nullableComponent:i,loadingComponent:a=(0,m.jsx)(y.default,{}),...o}){return(0,m.jsxs)(fe,{loadingComponent:a,...o,children:[(0,m.jsx)(de,{undefinedComponent:n,nullComponent:r,nullableComponent:i,children:t}),(0,m.jsx)(le,{children:e})]})}var We=Ue;function Ge({children:e,navItems:t}){let[n,r]=(0,p.useState)(``);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(u.default,{sx:{paddingBottom:7},children:e}),(0,m.jsx)(R.default,{sx:{position:`fixed`,bottom:0,left:0,right:0},children:(0,m.jsx)(I.default,{showLabels:!0,value:n,onChange:(e,t)=>{r(t)},children:t.map(e=>(0,m.jsx)(L.default,{...e,component:P.Link},e.value))})})]})}var Ke=Ge;const qe=240;function Je(e){return{width:240,transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:`hidden`}}function Ye(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)`}}}const Xe=(0,S.styled)(`div`)(({theme:e})=>({display:`flex`,alignItems:`center`,justifyContent:`flex-end`,padding:e.spacing(0,1),...e.mixins.toolbar})),Ze=(0,S.styled)(H.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:e})=>e,style:{marginLeft:240,width:`calc(100% - 240px)`,transition:e.transitions.create([`width`,`margin`],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),Qe=(0,S.styled)(W.default,{shouldForwardProp:e=>e!==`open`})(({theme:e})=>({width:240,flexShrink:0,whiteSpace:`nowrap`,boxSizing:`border-box`,variants:[{props:({open:e})=>e,style:{...Je(e),"& .MuiDrawer-paper":Je(e)}},{props:({open:e})=>!e,style:{...Ye(e),"& .MuiDrawer-paper":Ye(e)}}]}));function $e({title:e,navItems:t,children:n,headerElements:r}){let i=(0,S.useTheme)(),[a,o]=(0,p.useState)(!0),s=(0,P.useLocation)();function c(){o(!0)}function l(){o(!1)}return(0,m.jsxs)(u.default,{sx:{display:`flex`},children:[(0,m.jsx)(x.default,{}),(0,m.jsx)(Ze,{position:`fixed`,open:a,children:(0,m.jsxs)(K.default,{children:[(0,m.jsx)(_.default,{color:`inherit`,"aria-label":`open drawer`,onClick:c,edge:`start`,sx:[{marginRight:5},a&&{display:`none`}],children:(0,m.jsx)(V.default,{})}),(0,m.jsx)(q.default,{variant:`h6`,noWrap:!0,component:`div`,children:e}),r]})}),(0,m.jsxs)(Qe,{variant:`permanent`,open:a,children:[(0,m.jsx)(Xe,{children:(0,m.jsx)(_.default,{onClick:l,children:i.direction===`rtl`?(0,m.jsx)(B.default,{}):(0,m.jsx)(z.default,{})})}),(0,m.jsx)(U.default,{}),t.map(e=>(0,m.jsxs)(p.Fragment,{children:[(0,m.jsxs)(A.default,{children:[(0,m.jsx)(q.default,{variant:a?`h5`:`h6`,paddingLeft:a?2:1,children:a?e.category:(0,C.truncate)(e.category,4)}),e.options.map(e=>(0,m.jsx)(j.default,{disablePadding:!0,sx:{display:`block`},children:(0,m.jsxs)(F.default,{sx:[{minHeight:48,px:2.5},a?{justifyContent:`initial`}:{justifyContent:`center`}],component:P.Link,to:e.to,selected:s.pathname===e.to,children:[(0,m.jsx)(G.default,{sx:[{minWidth:0,justifyContent:`center`},a?{mr:3}:{mr:`auto`}],children:e.icon?e.icon:a?null:(0,m.jsx)(q.default,{children:(0,C.truncate)(e.label,4)})}),(0,m.jsx)(M.default,{primary:e.label,sx:[a?{opacity:1}:{opacity:0}]})]})},e.to))]}),(0,m.jsx)(U.default,{})]},e.category))]}),(0,m.jsxs)(u.default,{component:`main`,sx:{flexGrow:1,p:3},children:[(0,m.jsx)(Xe,{}),n]})]})}var et=$e;function tt({text:e,sx:t,...n}){return(0,m.jsx)(m.Fragment,{children:e.split(`
|
|
2
|
-
`).map((e,r)=>(0,m.jsx)(
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`@mui/icons-material/ArrowDropDown`);c=s(c);let l=require(`@mui/icons-material/ArrowDropUp`);l=s(l);let u=require(`@mui/material/Box`);u=s(u);let d=require(`@mui/material/ButtonBase`);d=s(d);let f=require(`@mui/material/Collapse`);f=s(f);let p=require(`react`),m=require(`react/jsx-runtime`),h=require(`@mui/icons-material/DarkMode`);h=s(h);let g=require(`@mui/icons-material/LightMode`);g=s(g);let _=require(`@mui/material/IconButton`);_=s(_);let v=require(`@mui/material/Tooltip`);v=s(v);let y=require(`@mui/material/Button`);y=s(y);let b=require(`@mui/material/Menu`);b=s(b);let x=require(`@mui/material/MenuItem`);x=s(x);let S=require(`@mui/material/CircularProgress`);S=s(S);let C=require(`@mui/material/Alert`);C=s(C);let w=require(`@mui/material/CssBaseline`);w=s(w);let T=require(`@mui/material/styles`),E=require(`@alextheman/utility`),D=require(`@mui/material/Snackbar`);D=s(D);let O=require(`@mui/material/Link`);O=s(O);let k=require(`@mui/icons-material/CloudUpload`);k=s(k);let A=require(`@mui/icons-material/Delete`);A=s(A);let j=require(`@mui/material/List`);j=s(j);let M=require(`@mui/material/ListItem`);M=s(M);let N=require(`@mui/material/ListItemText`);N=s(N);let P=require(`@mui/material/Popover`);P=s(P);let F=require(`react-router-dom`),I=require(`@mui/material/ListItemButton`);I=s(I);let ee=require(`@mui/material/BottomNavigation`);ee=s(ee);let te=require(`@mui/material/BottomNavigationAction`);te=s(te);let L=require(`@mui/material/Paper`);L=s(L);let R=require(`@mui/icons-material/ChevronLeft`);R=s(R);let z=require(`@mui/icons-material/ChevronRight`);z=s(z);let B=require(`@mui/icons-material/Menu`);B=s(B);let V=require(`@mui/material/AppBar`);V=s(V);let H=require(`@mui/material/Divider`);H=s(H);let U=require(`@mui/material/Drawer`);U=s(U);let W=require(`@mui/material/ListItemIcon`);W=s(W);let G=require(`@mui/material/Toolbar`);G=s(G);let K=require(`@mui/material/Typography`);K=s(K);let ne=require(`common-tags`),q=require(`react-live`),J=require(`@mui/material/Skeleton`);J=s(J);let Y=require(`@mui/material/TableCell`);Y=s(Y);let X=require(`@mui/material/TableRow`);X=s(X);let re=require(`react-hook-form`),Z=require(`@mui/material/Switch`);Z=s(Z);function ie({isInitiallyOpen:e,onOpen:t,onClose:n,children:r,buttonStyles:i,buttonContents:a,buttonComponent:o=d.default,collapseProps:s,openIcon:h=(0,m.jsx)(l.default,{}),closedIcon:g=(0,m.jsx)(c.default,{}),useDefaultStyling:_=o===d.default}){let[v,y]=(0,p.useState)(!!e);return(0,p.useEffect)(()=>{v&&t?t():!v&&n&&n()},[v]),(0,m.jsxs)(u.default,{children:[(0,m.jsxs)(o,{onClick:()=>{y(e=>!e)},sx:_?{width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,paddingY:1.5,paddingX:2,textAlign:`center`,"&:hover":o===d.default?{backgroundColor:`action.hover`}:null,...i}:i,"aria-expanded":v,children:[a,v?h:g]}),(0,m.jsx)(f.default,{in:v,...s,children:r})]})}var ae=ie;const oe=(0,p.createContext)(void 0);function Q({strict:e=!0}={}){let t=(0,p.useContext)(oe);if(e&&!t)throw Error(`DROPDOWN_MENU_NOT_FOUND`);return t}function se({children:e,button:t=y.default,buttonProps:n,openIcon:r=(0,m.jsx)(l.default,{}),closedIcon:i=(0,m.jsx)(c.default,{})}){let[a,o]=(0,p.useState)(null),s=(0,p.useMemo)(()=>!!a,[a]);function u(){o(null)}return(0,m.jsxs)(oe.Provider,{value:{closeMenu:u,isDropdownOpen:s},children:[(0,m.jsx)(t,{"aria-controls":s?`dropdown-menu`:void 0,"aria-haspopup":`true`,"aria-expanded":s,endIcon:s?r:i,...n,onClick:e=>{e.defaultPrevented||o(e.currentTarget),n?.onClick&&n?.onClick(e)}}),(0,m.jsx)(b.default,{anchorEl:a,open:s,onClose:u,children:e})]})}var ce=se;function le({ref:e,href:t,children:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,m.jsx)(x.default,{component:Ve,href:t,ref:e,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}var ue=le;function de({to:e,ref:t,children:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,m.jsx)(x.default,{component:Qe,to:e,ref:t,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}var fe=de;function pe({component:e,children:t,ref:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,m.jsx)(x.default,{component:e??y.default,ref:n,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:t})}var me=pe,he=ce;const ge=(0,p.createContext)(void 0);function _e({strict:e=!0}={}){let t=(0,p.useContext)(ge);if(e&&!t)throw Error(`LOADER_PROVIDER_NOT_FOUND`);return t}function ve({children:e,loadingComponent:t=(0,m.jsx)(S.default,{}),...n}){return(0,m.jsx)(ge.Provider,{value:{loadingComponent:t,...n},children:e})}var ye=ve;function be({children:e,dataParser:t,loadingComponent:n}){let{isLoading:r,data:i,dataParser:a,loadingComponent:o,error:s}=_e(),c=t??a;return r?(0,m.jsx)(m.Fragment,{children:n??o}):s||i==null?(0,m.jsx)(m.Fragment,{}):c?typeof e==`function`?(0,m.jsx)(m.Fragment,{children:e(c(i))}):(0,m.jsx)(m.Fragment,{children:e}):typeof e==`function`?(0,m.jsx)(m.Fragment,{children:e(i)}):(0,m.jsx)(m.Fragment,{children:e})}var xe=be;function Se({children:e,undefinedComponent:t,nullComponent:n,nullableComponent:r,logError:i}){let{isLoading:a,data:o,error:s,errorComponent:c,logError:l}=_e(),u=i??l,d=(0,p.useRef)(!1),f=e??c;return s?(u&&!d.current&&(console.error(s),d.current=!0),typeof f==`function`?f(s):f?(0,m.jsx)(m.Fragment,{children:f}):(0,m.jsx)(C.default,{severity:`error`,children:s?.message??`An unknown error has occured. Please try again later.`})):!a&&o==null?r?(u&&!d.current&&(console.error(`Data is nullable after loading.`),d.current=!0),(0,m.jsx)(m.Fragment,{children:r})):o===void 0&&(u&&!d.current&&(console.error(`Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.`),d.current=!0),t)?(0,m.jsx)(m.Fragment,{children:t}):o===null&&(u&&!d.current&&(console.error(`Data is null after loading.`),d.current=!0),n)?(0,m.jsx)(m.Fragment,{children:n}):(0,m.jsx)(C.default,{severity:`error`,children:`Failed to load data. Please try again later.`}):(0,m.jsx)(m.Fragment,{})}var Ce=Se,we=ye;const Te=(0,p.createContext)({toggleMode:()=>{},mode:`dark`});function $({strict:e=!0}={}){let t=(0,p.useContext)(Te);if(e&&!t)throw Error(`MODE_PROVIDER_NOT_FOUND`);return t}function Ee({children:e,mode:t=`dark`}){let[n,r]=(0,p.useState)(t),i=(0,p.useMemo)(()=>(0,T.createTheme)({palette:{mode:n}}),[n]);return(0,m.jsx)(Te.Provider,{value:{mode:n,toggleMode:()=>{r(e=>e===`light`?`dark`:`light`)}},children:(0,m.jsxs)(T.ThemeProvider,{theme:i,children:[(0,m.jsx)(w.default,{}),e]})})}var De=Ee;const Oe=(0,p.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function ke({strict:e=!0}={}){let t=(0,p.useContext)(Oe);if(e&&!t)throw Error(`SCREEN_SIZE_PROVIDER_NOT_FOUND`);return t}function Ae({children:e,largeScreenWidth:t=669,largeScreenHeight:n=660}){let[r,i]=(0,p.useState)(window.innerWidth),[a,o]=(0,p.useState)(window.innerHeight);(0,p.useEffect)(()=>{function e(){i(window.innerWidth),o(window.innerHeight)}return e(),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`resize`,e)}},[]);let s=(0,p.useMemo)(()=>r>t&&a>n,[r,a,t,n]);return(0,m.jsx)(Oe.Provider,{value:{isLargeScreen:s,windowWidth:r,windowHeight:a},children:e})}var je=Ae;const Me=(0,p.createContext)(void 0);function Ne({strict:e=!0}={}){let t=(0,p.useContext)(Me);if(e&&!t)throw Error(`SNACKBAR_PROVIDER_NOT_FOUND`);return t}function Pe({children:e,autoHideDuration:t=5e3}){let[n,r]=(0,p.useState)(!1),[i,a]=(0,p.useState)(t),[o,s]=(0,p.useState)(``),[c,l]=(0,p.useState)(`info`);function u(e,n,i){r(!0),a(i??t),l(n??`info`),s(e)}async function d(){r(!1),await(0,E.wait)(.2),s(``)}return(0,m.jsxs)(Me.Provider,{value:{addSnackbar:u},children:[(0,m.jsx)(D.default,{open:n,autoHideDuration:i,onClose:d,children:(0,m.jsx)(C.default,{onClose:d,severity:c,children:o})}),e]})}var Fe=Pe;function Ie(){let{mode:e,toggleMode:t}=$();return(0,m.jsx)(v.default,{title:`Enable ${e===`dark`?`light`:`dark`} mode`,children:(0,m.jsx)(_.default,{sx:{marginLeft:`auto`},onClick:t,"aria-label":`Enable ${e===`dark`?`light`:`dark`} mode`,children:e===`dark`?(0,m.jsx)(g.default,{}):(0,m.jsx)(h.default,{})})})}var Le=Ie;function Re({children:e,button:t=y.default,buttonChildren:n=`Menu`,buttonProps:r,isOpenIcon:i=(0,m.jsx)(l.default,{}),isClosedIcon:a=(0,m.jsx)(c.default,{}),onOpen:o,onClose:s}){let[d,f]=(0,p.useState)(null),h=(0,p.useMemo)(()=>!!d,[d]),g={...r,onClick:e=>{f(e.currentTarget)},"aria-controls":h?`dropdown-menu`:void 0,"aria-haspopup":`true`,"aria-expanded":h};return t===y.default&&(g.endIcon=h?i:a),(0,p.useEffect)(()=>{h&&o?o():!h&&s&&s()},[h,o,s]),(0,m.jsxs)(u.default,{children:[(0,m.jsx)(t,{...g,children:n}),(0,m.jsx)(b.default,{id:`dropdown-menu`,anchorEl:d,open:h,onClose:()=>{f(null)},children:typeof e==`function`?(0,m.jsx)(u.default,{children:e(()=>{f(null)})}):e})]})}var ze=Re;function Be({href:e,children:t,ref:n,...r}){return(0,m.jsx)(O.default,{component:`a`,href:e,ref:n,target:`_blank`,rel:`noopener noreferrer`,...r,children:t})}var Ve=Be;const He={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`},Ue=(0,T.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}),We=(0,T.styled)(`div`)(({theme:e,$dragging:t})=>({border:`2px dashed`,borderColor:t?e.palette.primary.main:`#ccc`,backgroundColor:t?e.palette.action.hover:`transparent`,borderRadius:8,padding:`1.5rem`,textAlign:`center`,transition:`border-color 0.2s`,cursor:`pointer`}));function Ge({onFileInput:e,label:t=`Upload files`,multiple:n,accept:r,useDropzone:i,...a}){let[o,s]=(0,p.useState)(!1),c=(0,m.jsxs)(y.default,{variant:`contained`,component:`label`,"aria-label":`File upload button`,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),document.getElementById(`file-input`)?.click())},...a,startIcon:a.startIcon??(0,m.jsx)(k.default,{}),children:[t,(0,m.jsx)(Ue,{id:`file-input`,type:`file`,onChange:t=>{let n=t.target;e(Array.from(n.files??[])),n.value=``},multiple:n,accept:r?.join(`,`),disabled:a.disabled})]});return i?(0,m.jsx)(We,{$dragging:o,onDragOver:e=>{e.preventDefault(),!a.disabled&&s(!0)},onDragLeave:e=>{e.preventDefault(),s(!1)},onDrop:t=>{t.preventDefault(),s(!1),!a.disabled&&e(Array.from(t.dataTransfer.files??[]))},children:c}):c}var Ke=Ge;function qe({files:e,setFiles:t,...n}){function r(e){t(t=>[...t,...e])}let i={...n,onFileInput:r};return i?.multiple===void 0&&(i.multiple=!0),(0,m.jsxs)(u.default,{children:[(0,m.jsx)(Ke,{...i}),(0,m.jsx)(j.default,{children:e.map(e=>(0,m.jsx)(M.default,{secondaryAction:(0,m.jsx)(_.default,{"aria-label":`Delete`,edge:`end`,onClick:()=>{t(t=>t.filter(t=>t!==e))},children:(0,m.jsx)(A.default,{})}),children:(0,m.jsx)(N.default,{primary:e.name})},e.name))})]})}var Je=qe;function Ye({icon:e,onOpen:t,onClose:n,iconProps:r,children:i}){let[a,o]=(0,p.useState)(null),s=!!a,c=(0,p.useId)();function l(e){o(e.currentTarget),t&&t()}function d(){o(null),n&&n()}return(0,m.jsxs)(u.default,{children:[(0,m.jsx)(e,{"aria-owns":s?c:void 0,"aria-haspopup":`true`,onMouseEnter:l,onMouseLeave:d,...r}),(0,m.jsx)(P.default,{id:c,sx:{pointerEvents:`none`},open:s,anchorEl:a,anchorOrigin:{vertical:`bottom`,horizontal:`left`},transformOrigin:{vertical:`top`,horizontal:`left`},onClose:d,disableRestoreFocus:!0,children:i})]})}var Xe=Ye;function Ze({to:e,children:t,ref:n,...r}){return(0,m.jsx)(O.default,{component:F.Link,to:e,ref:n,...r,children:t})}var Qe=Ze;function $e({children:e,...t}){return(0,m.jsx)(I.default,{component:Qe,...t,children:e})}var et=$e;function tt({children:e,errorComponent:t,undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,loadingComponent:o=(0,m.jsx)(S.default,{}),...s}){return(0,m.jsxs)(we,{loadingComponent:o,...s,children:[(0,m.jsx)(Ce,{undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,children:t}),(0,m.jsx)(xe,{children:e})]})}var nt=tt;function rt({children:e,navItems:t}){let[n,r]=(0,p.useState)(``);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(u.default,{sx:{paddingBottom:7},children:e}),(0,m.jsx)(L.default,{sx:{position:`fixed`,bottom:0,left:0,right:0},children:(0,m.jsx)(ee.default,{showLabels:!0,value:n,onChange:(e,t)=>{r(t)},children:t.map(e=>(0,m.jsx)(te.default,{...e,component:F.Link},e.value))})})]})}var it=rt;const at=240;function ot(e){return{width:240,transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:`hidden`}}function st(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)`}}}const ct=(0,T.styled)(`div`)(({theme:e})=>({display:`flex`,alignItems:`center`,justifyContent:`flex-end`,padding:e.spacing(0,1),...e.mixins.toolbar})),lt=(0,T.styled)(V.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:e})=>e,style:{marginLeft:240,width:`calc(100% - 240px)`,transition:e.transitions.create([`width`,`margin`],{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen})}}]})),ut=(0,T.styled)(U.default,{shouldForwardProp:e=>e!==`open`})(({theme:e})=>({width:240,flexShrink:0,whiteSpace:`nowrap`,boxSizing:`border-box`,variants:[{props:({open:e})=>e,style:{...ot(e),"& .MuiDrawer-paper":ot(e)}},{props:({open:e})=>!e,style:{...st(e),"& .MuiDrawer-paper":st(e)}}]}));function dt({title:e,navItems:t,children:n,headerElements:r}){let i=(0,T.useTheme)(),[a,o]=(0,p.useState)(!0),s=(0,F.useLocation)();function c(){o(!0)}function l(){o(!1)}return(0,m.jsxs)(u.default,{sx:{display:`flex`},children:[(0,m.jsx)(w.default,{}),(0,m.jsx)(lt,{position:`fixed`,open:a,children:(0,m.jsxs)(G.default,{children:[(0,m.jsx)(_.default,{color:`inherit`,"aria-label":`open drawer`,onClick:c,edge:`start`,sx:[{marginRight:5},a&&{display:`none`}],children:(0,m.jsx)(B.default,{})}),(0,m.jsx)(K.default,{variant:`h6`,noWrap:!0,component:`div`,children:e}),r]})}),(0,m.jsxs)(ut,{variant:`permanent`,open:a,children:[(0,m.jsx)(ct,{children:(0,m.jsx)(_.default,{onClick:l,children:i.direction===`rtl`?(0,m.jsx)(z.default,{}):(0,m.jsx)(R.default,{})})}),(0,m.jsx)(H.default,{}),t.map(e=>(0,m.jsxs)(p.Fragment,{children:[(0,m.jsxs)(j.default,{children:[(0,m.jsx)(K.default,{variant:a?`h5`:`h6`,paddingLeft:a?2:1,children:a?e.category:(0,E.truncate)(e.category,4)}),e.options.map(e=>(0,m.jsx)(M.default,{disablePadding:!0,sx:{display:`block`},children:(0,m.jsxs)(I.default,{sx:[{minHeight:48,px:2.5},a?{justifyContent:`initial`}:{justifyContent:`center`}],component:F.Link,to:e.to,selected:s.pathname===e.to,children:[(0,m.jsx)(W.default,{sx:[{minWidth:0,justifyContent:`center`},a?{mr:3}:{mr:`auto`}],children:e.icon?e.icon:a?null:(0,m.jsx)(K.default,{children:(0,E.truncate)(e.label,4)})}),(0,m.jsx)(N.default,{primary:e.label,sx:[a?{opacity:1}:{opacity:0}]})]})},e.to))]}),(0,m.jsx)(H.default,{})]},e.category))]}),(0,m.jsxs)(u.default,{component:`main`,sx:{flexGrow:1,p:3},children:[(0,m.jsx)(ct,{}),n]})]})}var ft=dt;function pt({text:e,sx:t,...n}){return(0,m.jsx)(m.Fragment,{children:e.split(`
|
|
2
|
+
`).map((e,r)=>(0,m.jsx)(K.default,{sx:{margin:1,...t},...n,children:e},r))})}var mt=pt;function ht({code:e,previewStyles:t,...n}){let{mode:r}=$(),i={backgroundColor:r===`dark`?`black`:`white`,border:.3,borderRadius:1,padding:2,borderColor:`darkgray`},a=t?{...i,...t}:{...i};return(0,m.jsx)(u.default,{sx:{borderRadius:1,border:.5,padding:2},children:(0,m.jsxs)(q.LiveProvider,{...n,code:(0,ne.stripIndent)(e??``),children:[(0,m.jsx)(K.default,{variant:`h5`,children:`Code`}),(0,m.jsx)(u.default,{sx:{border:.3,borderRadius:.3,borderColor:`darkgray`},children:(0,m.jsx)(q.LiveEditor,{})}),(0,m.jsx)(`br`,{}),(0,m.jsx)(K.default,{variant:`h5`,children:`Result`}),(0,m.jsxs)(u.default,{sx:a,children:[(0,m.jsx)(q.LivePreview,{}),(0,m.jsx)(q.LiveError,{})]})]})})}var gt=ht;function _t({columns:e}){return(0,m.jsx)(X.default,{children:(0,E.fillArray)(e=>(0,m.jsx)(Y.default,{children:(0,m.jsx)(J.default,{})},e),e)})}var vt=_t;function yt({disableClean:e,label:t,...n}){let{formState:{disabled:r,isDirty:i,isSubmitting:a}}=(0,re.useFormContext)();return(0,m.jsx)(y.default,{color:`primary`,disabled:n.disabled||e&&!i||r,loading:a,type:`submit`,variant:`contained`,...n,children:t})}var bt=yt;const xt=(0,T.styled)(Z.default)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:`""`,position:`absolute`,top:`50%`,transform:`translateY(-50%)`,fontSize:16,width:28,height:28}}}));function St({checkedIcon:e,checkedIconStyles:t,uncheckedIcon:n,uncheckedIconStyles:r,...i}){let a={borderRadius:`50%`,borderColor:`white`,backgroundColor:`white`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:.25},o={color:`black`,maxWidth:16.5,maxHeight:16.5};return(0,m.jsx)(xt,{checkedIcon:(0,m.jsx)(u.default,{sx:a,children:(0,m.jsx)(e,{style:{...o,...t}})}),icon:(0,m.jsx)(u.default,{sx:a,children:(0,m.jsx)(n,{style:{...o,...r}})}),...i})}var Ct=St;function wt(e){let[t,n]=(0,p.useState)(()=>{let t=window.location.hash.replace(`#`,``);return e&&t===``?e:t}),r=(0,p.useCallback)(()=>{let t=window.location.hash.replace(`#`,``);n(e&&t===``?e:t)},[n,e]);return(0,p.useEffect)(()=>(window.addEventListener(`hashchange`,r),()=>{window.removeEventListener(`hashchange`,r)}),[r]),[t,(0,p.useCallback)(e=>{let n=typeof e==`function`?e(t):e;n!==t&&(window.location.hash=n)},[t])]}var Tt=wt;exports.CollapsableItem=ae,exports.DarkModeToggle=Le,exports.DropdownMenu=ze,exports.DropdownMenu2=he,exports.DropdownMenuExternalLink=ue,exports.DropdownMenuInternalLink=fe,exports.DropdownMenuItem=me,exports.ExternalLink=Ve,exports.FileInput=Ke,exports.FileInputList=Je,exports.FileType=He,exports.IconWithPopover=Xe,exports.InternalLink=Qe,exports.ListItemInternalLink=et,exports.Loader=nt,exports.LoaderData=xe,exports.LoaderError=Ce,exports.LoaderProvider=we,exports.ModeProvider=De,exports.NavigationBottom=it,exports.NavigationDrawer=ft,exports.PopoverText=mt,exports.ReactPlayground=gt,exports.ScreenSizeProvider=je,exports.SkeletonRow=vt,exports.SnackbarProvider=Fe,exports.SubmitButton=bt,exports.SwitchWithIcons=Ct,exports.useDropdownMenu=Q,exports.useHash=Tt,exports.useMode=$,exports.useScreenSize=ke,exports.useSnackbar=Ne;
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["ButtonBase","ArrowDropUp","ArrowDropDown","Box","Collapse","CircularProgress","Alert","LoaderProvider","ThemeProvider","CssBaseline","severity","message","Snackbar","Alert","Tooltip","IconButton","LightMode","DarkMode","Button","MUIButton","ArrowDropUp","ArrowDropDown","buttonProps: Record<string, unknown>","Box","Menu","MUILink","Button","CloudUploadIcon","Box","FileInput","List","ListItem","IconButton","DeleteIcon","ListItemText","Box","Popover","MUILink","ReactDOMLink","ListItemButton","InternalLink","CircularProgress","LoaderProvider","LoaderError","LoaderData","Box","Paper","BottomNavigation","value","BottomNavigationAction","Link","MuiAppBar","MuiDrawer","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","Fragment","List","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","Typography","defaultPreviewStyles: SxProps<Theme>","Box","LiveProvider","Typography","LiveEditor","LivePreview","LiveError","TableRow","TableCell","Skeleton","Button","Switch","Box","hash: S","hash"],"sources":["../src/components/CollapsableItem.tsx","../src/providers/LoaderProvider/LoaderProvider.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DarkModeToggle.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<T> {\n /** The current loading status (true if loading, false if not) */\n isLoading: boolean;\n /** The data being loaded. */\n data?: T;\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<T>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<T> extends LoaderProviderBaseProps<T> {\n error?: never;\n errorComponent?: never;\n logError?: never;\n}\n\nexport interface LoaderProviderPropsWithError<T> extends LoaderProviderBaseProps<T> {\n /** The error given if the request gave an error. */\n error: unknown;\n /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n /** Whether you want to log the error to the console or not. */\n logError?: boolean;\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\n\nexport function useLoader<T, Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, LoaderContextValue<T>> {\n const context = useContext(LoaderContext);\n if (strict && !context) {\n throw new Error(\"LOADER_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, LoaderContextValue<T>>;\n}\n\n/** A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n */\nfunction LoaderProvider<T>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<T>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n /** The elements to show after data has been loaded.\n * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.\n */\n children: ReactNode | ((data: NonNullable<T>) => ReactNode);\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<T>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\n/** The component responsible for showing the data provided by LoaderProvider. */\nfunction LoaderData<T>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n}: LoaderDataProps<T>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<T>();\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === null || data === undefined) {\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? <>{children(dataParser(data))}</> : <>{children}</>;\n }\n\n return typeof children === \"function\" ? <>{children(data)}</> : <>{children}</>;\n}\n\nexport default LoaderData;\n","import type { ReactNode } from \"react\";\n\nimport Alert from \"@mui/material/Alert\";\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport interface LoaderErrorBaseProps {\n /**\n * The component to show if an error has been thrown.\n * @deprecated Please pass in the content to show on error as children instead.\n */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n /** The component to show if an error has been thrown. */\n children?: ReactNode | ((error: unknown) => ReactNode);\n /** Whether you want to log the error to the console or not. */\n logError?: boolean;\n}\n\nexport interface LoaderErrorPropsWithUndefinedOrNull extends LoaderErrorBaseProps {\n /** The component to show if no error was thrown but data is undefined */\n undefinedComponent?: ReactNode;\n /** The component to show if no error was thrown but data is null */\n nullComponent?: ReactNode;\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\n /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: ReactNode;\n}\n\nexport type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;\n\n/** The component responsible for showing any errors provided by LoaderProvider. */\nfunction LoaderError({\n children,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n logError: propsLogError,\n}: LoaderErrorProps) {\n const {\n isLoading,\n data,\n error,\n errorComponent: contextErrorComponent,\n logError: contextLogError,\n } = useLoader();\n const logError = propsLogError ?? contextLogError;\n const warnedOnce = useRef(false);\n\n const errorComponent = children ?? contextErrorComponent;\n\n if (error) {\n if (logError && !warnedOnce.current) {\n console.error(error);\n warnedOnce.current = true;\n }\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n if (!isLoading && (data === null || data === undefined)) {\n if (nullableComponent) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is nullable after loading.\");\n warnedOnce.current = true;\n }\n return <>{nullableComponent}</>;\n }\n\n if (data === undefined) {\n if (logError && !warnedOnce.current) {\n console.error(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n warnedOnce.current = true;\n }\n\n if (undefinedComponent) {\n return <>{undefinedComponent}</>;\n }\n }\n\n if (data === null) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is null after loading.\");\n warnedOnce.current = true;\n }\n\n if (nullComponent) {\n return <>{nullComponent}</>;\n }\n }\n\n return <Alert severity=\"error\">Failed to load data. Please try again later.</Alert>;\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import LoaderProvider from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport { default as LoaderData } from \"src/providers/LoaderProvider/LoaderData\";\nexport { default as LoaderError } from \"src/providers/LoaderProvider/LoaderError\";\n\nexport type { LoaderDataProps } from \"src/providers/LoaderProvider/LoaderData\";\nexport type {\n LoaderErrorBaseProps,\n LoaderErrorPropsWithNullable,\n LoaderErrorPropsWithUndefinedOrNull,\n LoaderErrorProps,\n} from \"src/providers/LoaderProvider/LoaderError\";\nexport type {\n LoaderProviderProps,\n LoaderProviderBaseProps,\n LoaderProviderPropsWithError,\n LoaderProviderPropsWithNoError,\n} from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport default LoaderProvider;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { PaletteMode } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nexport interface ModeContextValue {\n toggleMode: () => void;\n mode: PaletteMode;\n}\n\nconst ModeContext = createContext<ModeContextValue>({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ModeContextValue> {\n const context = useContext(ModeContext);\n if (strict && !context) {\n throw new Error(\"MODE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: PaletteMode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<PaletteMode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ScreenSizeContextValue> {\n const context = useContext(ScreenSizeContext);\n if (strict && !context) {\n throw new Error(\"SCREEN_SIZE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nfunction ScreenSizeProvider({\n children,\n largeScreenWidth = 669,\n largeScreenHeight = 660,\n}: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n const isLargeScreen = useMemo(() => {\n return windowWidth > largeScreenWidth && windowHeight > largeScreenHeight;\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import 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 { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuProps {\n children: ReactNode | ((closeMenu: () => void) => ReactNode);\n buttonChildren?: ReactNode;\n button?: ElementType;\n // Omit endIcon because the built-in isOpenIcon and isClosedIcon gives more control.\n // onClick is also omitted because that controls anchorElement, and the onOpen/onClose functions can be used instead.\n buttonProps?: Omit<ButtonOwnProps, \"onClick\" | \"endIcon\">;\n isOpenIcon?: ReactNode;\n isClosedIcon?: ReactNode;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode, Ref } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}` | (string & {});\n to?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\nfunction ExternalLink({ href, children, ref, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink\n component=\"a\"\n href={href}\n ref={ref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...linkProps}\n >\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode, Ref } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}` | (string & {});\n href?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\nfunction InternalLink({ to, children, ref, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} ref={ref} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { LoaderDataProps, LoaderProviderProps } from \"src/providers\";\nimport type { LoaderErrorProps } from \"src/providers/LoaderProvider/LoaderError\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError } from \"src/providers\";\nimport LoaderProvider from \"src/providers/LoaderProvider\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<T> = Omit<LoaderProviderProps<T>, \"children\"> &\n Omit<LoaderErrorProps, \"errorComponent\" | \"children\"> &\n Omit<LoaderDataProps<T>, \"showOnError\" | \"onUndefined\" | \"onNull\" | \"onNullable\">;\n\n/** An in-line component that deals with state management when fetching data from an API.\n * This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.\n */\nfunction Loader<T>({\n children,\n errorComponent,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<T>) {\n return (\n <LoaderProvider<T> loadingComponent={loadingComponent} {...loaderProviderProps}>\n {/* @ts-expect-error: We need to pass all four to LoaderError for the wrapper to work. It is ok as Loader will then do its own checks to enforce mutual exclusivity, and LoaderError knows how to deal with it anyway. */}\n <LoaderError\n undefinedComponent={undefinedComponent}\n nullComponent={nullComponent}\n nullableComponent={nullableComponent}\n >\n {errorComponent}\n </LoaderError>\n <LoaderData<T>>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { ComponentProps } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps extends ComponentProps<typeof LiveProvider> {\n previewStyles?: SxProps<Theme>;\n}\n\nfunction ReactPlayground({ code, previewStyles, ...liveProviderProps }: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider {...liveProviderProps} code={stripIndent(code ?? \"\")}>\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["ButtonBase","ArrowDropUp","ArrowDropDown","Box","Collapse","Button","MUIButton","ArrowDropUp","ArrowDropDown","Menu","MenuItem","ExternalLink","MenuItem","InternalLink","MenuItem","Button","DropdownMenu2","CircularProgress","Alert","LoaderProvider","ThemeProvider","CssBaseline","severity","message","Snackbar","Alert","Tooltip","IconButton","LightMode","DarkMode","Button","MUIButton","ArrowDropUp","ArrowDropDown","buttonProps: Record<string, unknown>","Box","Menu","MUILink","Button","CloudUploadIcon","Box","FileInput","List","ListItem","IconButton","DeleteIcon","ListItemText","Box","Popover","MUILink","ReactDOMLink","ListItemButton","InternalLink","CircularProgress","LoaderProvider","LoaderError","LoaderData","Box","Paper","BottomNavigation","value","BottomNavigationAction","Link","MuiAppBar","MuiDrawer","Box","CssBaseline","Toolbar","IconButton","MenuIcon","Typography","ChevronRightIcon","ChevronLeftIcon","Divider","Fragment","List","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","Typography","defaultPreviewStyles: SxProps<Theme>","Box","LiveProvider","Typography","LiveEditor","LivePreview","LiveError","TableRow","TableCell","Skeleton","Button","Switch","Box","hash: S","hash"],"sources":["../src/components/CollapsableItem.tsx","../src/providers/DropdownMenu2/DropdownMenu2.tsx","../src/providers/DropdownMenu2/DropdownMenuExternalLink.tsx","../src/providers/DropdownMenu2/DropdownMenuInternalLink.tsx","../src/providers/DropdownMenu2/DropdownMenuItem.tsx","../src/providers/DropdownMenu2/index.tsx","../src/providers/LoaderProvider/LoaderProvider.tsx","../src/providers/LoaderProvider/LoaderData.tsx","../src/providers/LoaderProvider/LoaderError.tsx","../src/providers/LoaderProvider/index.tsx","../src/providers/ModeProvider.tsx","../src/providers/ScreenSizeProvider.tsx","../src/providers/SnackbarProvider.tsx","../src/components/DarkModeToggle.tsx","../src/components/DropdownMenu.tsx","../src/components/ExternalLink.tsx","../src/components/FileInput.tsx","../src/components/FileInputList.tsx","../src/components/IconWithPopover.tsx","../src/components/InternalLink.tsx","../src/components/ListItemInternalLink.tsx","../src/components/Loader.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/components/SwitchWithIcons.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\n\nexport interface CollapsableItemProps {\n isInitiallyOpen?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n children: ReactNode;\n buttonStyles?: SxProps;\n buttonContents: ReactNode;\n buttonComponent?: ElementType;\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n collapseProps?: Omit<CollapseProps, \"in\">;\n useDefaultStyling?: boolean;\n}\n\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n useDefaultStyling = ButtonComponent === ButtonBase ? true : false,\n}: CollapsableItemProps) {\n const [isItemOpen, setIsItemOpen] = useState<boolean>(!!isInitiallyOpen);\n\n useEffect(() => {\n if (isItemOpen && onOpen) {\n onOpen();\n } else if (!isItemOpen && onClose) {\n onClose();\n }\n }, [isItemOpen]);\n\n return (\n <Box>\n <ButtonComponent\n onClick={() => {\n setIsItemOpen((previouslyOpen) => {\n return !previouslyOpen;\n });\n }}\n sx={\n useDefaultStyling\n ? {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingY: 1.5,\n paddingX: 2,\n textAlign: \"center\",\n \"&:hover\":\n ButtonComponent === ButtonBase ? { backgroundColor: \"action.hover\" } : null,\n ...buttonStyles,\n }\n : buttonStyles\n }\n aria-expanded={isItemOpen}\n >\n {buttonContents}\n {isItemOpen ? openIcon : closedIcon}\n </ButtonComponent>\n <Collapse in={isItemOpen} {...collapseProps}>\n {children}\n </Collapse>\n </Box>\n );\n}\n\nexport default CollapsableItem;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nexport interface DropdownMenuContextValue {\n closeMenu: () => void;\n isDropdownOpen: boolean;\n}\n\nconst DropdownMenuContext = createContext<DropdownMenuContextValue | undefined>(undefined);\n\nexport function useDropdownMenu<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, DropdownMenuContextValue> {\n const context = useContext(DropdownMenuContext);\n if (strict && !context) {\n throw new Error(\"DROPDOWN_MENU_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, DropdownMenuContextValue>;\n}\n\nexport interface DropdownMenu2Props {\n children: ReactNode;\n button?: ElementType;\n buttonProps?: Omit<ButtonOwnProps, \"endIcon\"> & {\n onClick?: (event: ReactMouseEvent<HTMLElement>) => void;\n };\n openIcon?: ReactNode;\n closedIcon?: ReactNode;\n}\n\nfunction DropdownMenu2({\n children,\n button: Button = MUIButton,\n buttonProps,\n openIcon = <ArrowDropUp />,\n closedIcon = <ArrowDropDown />,\n}: DropdownMenu2Props) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n function closeMenu() {\n setAnchorElement(null);\n }\n\n return (\n <DropdownMenuContext.Provider value={{ closeMenu, isDropdownOpen }}>\n <Button\n aria-controls={isDropdownOpen ? \"dropdown-menu\" : undefined}\n aria-haspopup=\"true\"\n aria-expanded={isDropdownOpen}\n endIcon={isDropdownOpen ? openIcon : closedIcon}\n {...buttonProps}\n onClick={(event: ReactMouseEvent<HTMLElement>) => {\n if (!event.defaultPrevented) {\n setAnchorElement(event.currentTarget);\n }\n if (buttonProps?.onClick) {\n buttonProps?.onClick(event);\n }\n }}\n />\n <Menu anchorEl={anchorElement} open={isDropdownOpen} onClose={closeMenu}>\n {children}\n </Menu>\n </DropdownMenuContext.Provider>\n );\n}\n\nexport default DropdownMenu2;\n","import type { MenuItemOwnProps } from \"@mui/material/MenuItem\";\nimport type { ComponentProps, MouseEventHandler, ReactNode, Ref } from \"react\";\n\nimport MenuItem from \"@mui/material/MenuItem\";\n\nimport { ExternalLink } from \"src/components\";\nimport { useDropdownMenu } from \"src/providers/DropdownMenu2/DropdownMenu2\";\n\nexport interface DropdownMenuExternalLinkProps extends MenuItemOwnProps {\n ref?: Ref<HTMLAnchorElement>;\n href: ComponentProps<typeof ExternalLink>[\"href\"];\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n children: ReactNode;\n}\n\nfunction DropdownMenuExternalLink({\n ref,\n href,\n children,\n onClick,\n ...menuItemProps\n}: DropdownMenuExternalLinkProps) {\n const { closeMenu } = useDropdownMenu();\n\n return (\n <MenuItem\n component={ExternalLink}\n href={href}\n ref={ref}\n {...menuItemProps}\n onClick={(event) => {\n if (!event.defaultPrevented) {\n closeMenu();\n }\n if (onClick) {\n onClick(event);\n }\n }}\n >\n {children}\n </MenuItem>\n );\n}\n\nexport default DropdownMenuExternalLink;\n","import type { MenuItemOwnProps } from \"@mui/material/MenuItem\";\nimport type { ComponentProps, MouseEventHandler, ReactNode, Ref } from \"react\";\n\nimport MenuItem from \"@mui/material/MenuItem\";\n\nimport { InternalLink } from \"src/components\";\nimport { useDropdownMenu } from \"src/providers/DropdownMenu2/DropdownMenu2\";\n\nexport interface DropdownMenuInternalLinkProps extends MenuItemOwnProps {\n ref?: Ref<HTMLAnchorElement>;\n to: ComponentProps<typeof InternalLink>[\"to\"];\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n children: ReactNode;\n}\n\nfunction DropdownMenuInternalLink({\n to,\n ref,\n children,\n onClick,\n ...menuItemProps\n}: DropdownMenuInternalLinkProps) {\n const { closeMenu } = useDropdownMenu();\n\n return (\n <MenuItem\n component={InternalLink}\n to={to}\n ref={ref}\n {...menuItemProps}\n onClick={(event) => {\n if (!event.defaultPrevented) {\n closeMenu();\n }\n if (onClick) {\n onClick(event);\n }\n }}\n >\n {children}\n </MenuItem>\n );\n}\n\nexport default DropdownMenuInternalLink;\n","import type { MenuItemOwnProps } from \"@mui/material/MenuItem\";\nimport type {\n ComponentProps,\n ComponentPropsWithoutRef,\n ComponentPropsWithRef,\n ElementType,\n ReactNode,\n} from \"react\";\n\nimport Button from \"@mui/material/Button\";\nimport MenuItem from \"@mui/material/MenuItem\";\n\nimport { useDropdownMenu } from \"src/providers/DropdownMenu2/DropdownMenu2\";\n\nexport type DropdownMenuItemProps<RootComponent extends ElementType = typeof Button> = {\n component?: RootComponent;\n children?: ReactNode;\n ref?: ComponentPropsWithRef<RootComponent>[\"ref\"];\n onClick?: ComponentProps<RootComponent>[\"onClick\"];\n} & Omit<ComponentPropsWithoutRef<RootComponent>, \"children\" | \"ref\"> &\n MenuItemOwnProps;\n\nfunction DropdownMenuItem<RootComponent extends ElementType>({\n component,\n children,\n ref,\n onClick,\n ...menuItemProps\n}: DropdownMenuItemProps<RootComponent>) {\n const { closeMenu } = useDropdownMenu();\n const itemComponent = component ?? Button;\n\n return (\n <MenuItem\n component={itemComponent}\n ref={ref}\n {...menuItemProps}\n onClick={(event) => {\n if (!event.defaultPrevented) {\n closeMenu();\n }\n if (onClick) {\n onClick(event);\n }\n }}\n >\n {children}\n </MenuItem>\n );\n}\n\nexport default DropdownMenuItem;\n","import DropdownMenu2 from \"src/providers/DropdownMenu2/DropdownMenu2\";\n\nexport { useDropdownMenu } from \"src/providers/DropdownMenu2/DropdownMenu2\";\nexport { default as DropdownMenuExternalLink } from \"src/providers/DropdownMenu2/DropdownMenuExternalLink\";\nexport { default as DropdownMenuInternalLink } from \"src/providers/DropdownMenu2/DropdownMenuInternalLink\";\nexport { default as DropdownMenuItem } from \"src/providers/DropdownMenu2/DropdownMenuItem\";\n\nexport type { DropdownMenu2Props } from \"src/providers/DropdownMenu2/DropdownMenu2\";\nexport type { DropdownMenuExternalLinkProps } from \"src/providers/DropdownMenu2/DropdownMenuExternalLink\";\nexport type { DropdownMenuInternalLinkProps } from \"src/providers/DropdownMenu2/DropdownMenuInternalLink\";\nexport type { DropdownMenuItemProps } from \"src/providers/DropdownMenu2/DropdownMenuItem\";\n\nexport default DropdownMenu2;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { createContext, useContext } from \"react\";\n\nexport interface LoaderProviderBaseProps<DataType> {\n /** The current loading status (true if loading, false if not) */\n isLoading: boolean;\n /** The data being loaded. */\n data?: DataType;\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<DataType>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\nexport interface LoaderProviderPropsWithNoError<\n DataType,\n> extends LoaderProviderBaseProps<DataType> {\n error?: never;\n errorComponent?: never;\n logError?: never;\n}\n\nexport interface LoaderProviderPropsWithError<DataType> extends LoaderProviderBaseProps<DataType> {\n /** The error given if the request gave an error. */\n error: unknown;\n /** The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided. */\n errorComponent?: ReactNode | ((error: unknown) => ReactNode);\n /** Whether you want to log the error to the console or not. */\n logError?: boolean;\n}\n\nexport type LoaderContextValue<T> =\n | LoaderProviderPropsWithNoError<T>\n | LoaderProviderPropsWithError<T>;\nexport type LoaderProviderProps<T> = LoaderContextValue<T> & { children: ReactNode };\n\nconst LoaderContext = createContext<LoaderContextValue<unknown> | undefined>(undefined);\n\nexport function useLoader<DataType, Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, LoaderContextValue<DataType>> {\n const context = useContext(LoaderContext);\n if (strict && !context) {\n throw new Error(\"LOADER_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, LoaderContextValue<DataType>>;\n}\n\n/**\n * A provider for a context that deals with state management when fetching data from an API.\n * This may be used over Loader if you require more control over the placement of the error message and data display.\n * @template DataType - The type of data being loaded.\n * @param root0 - Props to pass to LoaderProvider.\n * @param root0.children - The components that may receive access to the LoaderContext value.\n * @param root0.loadingComponent - The component to show when the data is being fetched.\n * @param root0.isLoading - The current loading status (true if loading, false if not)\n * @param root0.error - The error given if the request gave an error.\n * @param root0.errorComponent - The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided.\n * @param root0.logError - An option to log the error to the console. Note that this may not be provided unless the error prop has also been provided.\n */\nfunction LoaderProvider<DataType>({\n children,\n loadingComponent = <CircularProgress />,\n ...contextProps\n}: LoaderProviderProps<DataType>) {\n return (\n <LoaderContext.Provider value={{ loadingComponent, ...contextProps }}>\n {children}\n </LoaderContext.Provider>\n );\n}\n\nexport default LoaderProvider;\n","import type { ReactNode } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport interface LoaderDataProps<T> {\n /**\n * The elements to show after data has been loaded.\n * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.\n */\n children: ReactNode | ((data: NonNullable<T>) => ReactNode);\n /** A parser for the data. */\n dataParser?: (data: unknown) => NonNullable<T>;\n /** The component to show when the data is being fetched. */\n loadingComponent?: ReactNode;\n}\n\n/**\n * The component responsible for showing the data provided by LoaderProvider.\n * @template DataType - The type of data being loaded.\n * @param root0 - Props to pass to LoaderData.\n * @param root0.children - The elements to show after data has been loaded.\n * This is best provided as a function with a data argument that guarantees the data will not be undefined by the time you receive it here.\n * @param root0.dataParser - A parser for the data.\n * @param root0.loadingComponent - The component to show when the data is being fetched.\n */\nfunction LoaderData<DataType>({\n children,\n dataParser: loaderDataParser,\n loadingComponent,\n}: LoaderDataProps<DataType>) {\n const {\n isLoading,\n data,\n dataParser: contextDataParser,\n loadingComponent: contextLoadingComponent,\n error,\n } = useLoader<DataType>();\n const dataParser = loaderDataParser ?? contextDataParser;\n\n if (isLoading) {\n return <>{loadingComponent ?? contextLoadingComponent}</>;\n }\n\n if (error) {\n return <></>;\n }\n\n // No need to also check for isLoading === true here, since this was covered earlier\n if (data === null || data === undefined) {\n return <></>;\n }\n\n if (dataParser) {\n return typeof children === \"function\" ? <>{children(dataParser(data))}</> : <>{children}</>;\n }\n\n return typeof children === \"function\" ? <>{children(data)}</> : <>{children}</>;\n}\n\nexport default LoaderData;\n","import type { ReactNode } from \"react\";\n\nimport Alert from \"@mui/material/Alert\";\nimport { useRef } from \"react\";\n\nimport { useLoader } from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport interface LoaderErrorBaseProps {\n /** The component to show if an error has been thrown. */\n children?: ReactNode | ((error: unknown) => ReactNode);\n /** An option to log the error to the console. */\n logError?: boolean;\n}\n\nexport interface LoaderErrorPropsWithUndefinedOrNull extends LoaderErrorBaseProps {\n /** The component to show if no error was thrown but data is undefined */\n undefinedComponent?: ReactNode;\n /** The component to show if no error was thrown but data is null */\n nullComponent?: ReactNode;\n nullableComponent?: never;\n}\n\nexport interface LoaderErrorPropsWithNullable extends LoaderErrorBaseProps {\n undefinedComponent?: never;\n nullComponent?: never;\n /** The component to show if no error was thrown but data is undefined or null */\n nullableComponent?: ReactNode;\n}\n\nexport type LoaderErrorProps = LoaderErrorPropsWithUndefinedOrNull | LoaderErrorPropsWithNullable;\n\n/**\n * The component responsible for showing any errors provided by LoaderProvider.\n * @param root0 - The props to be passed to LoaderError.\n * @param root0.children - The component to show if an error has been thrown.\n * @param root0.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param root0.nullComponent - The component to show if no error was thrown but the data is null.\n * @param root0.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param root0.logError - An option to log the error to the console.\n */\nfunction LoaderError({\n children,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n logError: propsLogError,\n}: LoaderErrorProps) {\n const {\n isLoading,\n data,\n error,\n errorComponent: contextErrorComponent,\n logError: contextLogError,\n } = useLoader();\n const logError = propsLogError ?? contextLogError;\n const warnedOnce = useRef(false);\n\n const errorComponent = children ?? contextErrorComponent;\n\n if (error) {\n if (logError && !warnedOnce.current) {\n console.error(error);\n warnedOnce.current = true;\n }\n if (typeof errorComponent === \"function\") {\n return errorComponent(error);\n }\n if (errorComponent) {\n return <>{errorComponent}</>;\n }\n\n return (\n <Alert severity=\"error\">\n {(error as Error)?.message ?? \"An unknown error has occured. Please try again later.\"}\n </Alert>\n );\n }\n\n if (!isLoading && (data === null || data === undefined)) {\n if (nullableComponent) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is nullable after loading.\");\n warnedOnce.current = true;\n }\n return <>{nullableComponent}</>;\n }\n\n if (data === undefined) {\n if (logError && !warnedOnce.current) {\n console.error(\n \"Data is undefined after loading. This could either be an issue with the query or you have not passed in the data to LoaderProvider. Please double-check that you have provided data.\",\n );\n warnedOnce.current = true;\n }\n\n if (undefinedComponent) {\n return <>{undefinedComponent}</>;\n }\n }\n\n if (data === null) {\n if (logError && !warnedOnce.current) {\n console.error(\"Data is null after loading.\");\n warnedOnce.current = true;\n }\n\n if (nullComponent) {\n return <>{nullComponent}</>;\n }\n }\n\n return <Alert severity=\"error\">Failed to load data. Please try again later.</Alert>;\n }\n\n return <></>;\n}\n\nexport default LoaderError;\n","import LoaderProvider from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport { default as LoaderData } from \"src/providers/LoaderProvider/LoaderData\";\nexport { default as LoaderError } from \"src/providers/LoaderProvider/LoaderError\";\n\nexport type { LoaderDataProps } from \"src/providers/LoaderProvider/LoaderData\";\nexport type {\n LoaderErrorBaseProps,\n LoaderErrorPropsWithNullable,\n LoaderErrorPropsWithUndefinedOrNull,\n LoaderErrorProps,\n} from \"src/providers/LoaderProvider/LoaderError\";\nexport type {\n LoaderProviderProps,\n LoaderProviderBaseProps,\n LoaderProviderPropsWithError,\n LoaderProviderPropsWithNoError,\n} from \"src/providers/LoaderProvider/LoaderProvider\";\n\nexport default LoaderProvider;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { PaletteMode } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nexport interface ModeContextValue {\n toggleMode: () => void;\n mode: PaletteMode;\n}\n\nconst ModeContext = createContext<ModeContextValue>({\n toggleMode: () => {},\n mode: \"dark\",\n});\n\nexport function useMode<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ModeContextValue> {\n const context = useContext(ModeContext);\n if (strict && !context) {\n throw new Error(\"MODE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nexport interface ModeProviderProps {\n children: ReactNode;\n mode?: PaletteMode;\n}\n\nfunction ModeProvider({ children, mode: modeProp = \"dark\" }: ModeProviderProps) {\n const [mode, setMode] = useState<PaletteMode>(modeProp);\n\n const theme = useMemo(() => {\n return createTheme({\n palette: {\n mode,\n },\n });\n }, [mode]);\n\n return (\n <ModeContext.Provider\n value={{\n mode,\n toggleMode: () => {\n setMode((prev) => {\n return prev === \"light\" ? \"dark\" : \"light\";\n });\n },\n }}\n >\n <ThemeProvider theme={theme}>\n <CssBaseline />\n {children}\n </ThemeProvider>\n </ModeContext.Provider>\n );\n}\n\nexport default ModeProvider;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n children: ReactNode;\n largeScreenWidth?: number;\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n isLargeScreen: boolean;\n windowWidth: number;\n windowHeight: number;\n}\n\nconst ScreenSizeContext = createContext<ScreenSizeContextValue>({\n windowWidth: 0,\n windowHeight: 0,\n isLargeScreen: false,\n});\n\nexport function useScreenSize<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, ScreenSizeContextValue> {\n const context = useContext(ScreenSizeContext);\n if (strict && !context) {\n throw new Error(\"SCREEN_SIZE_PROVIDER_NOT_FOUND\");\n }\n return context;\n}\n\nfunction ScreenSizeProvider({\n children,\n largeScreenWidth = 669,\n largeScreenHeight = 660,\n}: ScreenSizeProps) {\n const [windowWidth, setWindowWidth] = useState<number>(window.innerWidth);\n const [windowHeight, setWindowHeight] = useState<number>(window.innerHeight);\n\n useEffect(() => {\n function setDimensions() {\n setWindowWidth(window.innerWidth);\n setWindowHeight(window.innerHeight);\n }\n setDimensions();\n window.addEventListener(\"resize\", setDimensions);\n return () => {\n window.removeEventListener(\"resize\", setDimensions);\n };\n }, []);\n\n const isLargeScreen = useMemo(() => {\n return windowWidth > largeScreenWidth && windowHeight > largeScreenHeight;\n }, [windowWidth, windowHeight, largeScreenWidth, largeScreenHeight]);\n\n return (\n <ScreenSizeContext.Provider\n value={{\n isLargeScreen,\n windowWidth,\n windowHeight,\n }}\n >\n {children}\n </ScreenSizeContext.Provider>\n );\n}\n\nexport default ScreenSizeProvider;\n","import type { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { AlertColor } from \"@mui/material/Alert\";\nimport type { ReactNode } from \"react\";\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import 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","/* eslint-disable */\nimport 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\n/**\n * @param root0\n * @param root0.children\n * @param root0.button\n * @param root0.buttonChildren\n * @param root0.buttonProps\n * @param root0.isOpenIcon\n * @param root0.isClosedIcon\n * @param root0.onOpen\n * @param root0.onClose\n * @deprecated This component does not support the new context-based pattern and individual DropdownMenuItem components. Please use DropdownMenu2 instead.\n */\nfunction DropdownMenu({\n children,\n button: Button = MUIButton,\n buttonChildren = \"Menu\",\n buttonProps: incomingButtonProps,\n isOpenIcon = <ArrowDropUp />,\n isClosedIcon = <ArrowDropDown />,\n onOpen,\n onClose,\n}: DropdownMenuProps) {\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const isDropdownOpen = useMemo(() => {\n return !!anchorElement;\n }, [anchorElement]);\n\n const buttonProps: Record<string, unknown> = {\n ...incomingButtonProps,\n onClick: (event: ReactMouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n },\n \"aria-controls\": isDropdownOpen ? \"dropdown-menu\" : undefined,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isDropdownOpen,\n };\n\n if (Button === MUIButton) {\n buttonProps.endIcon = isDropdownOpen ? isOpenIcon : isClosedIcon;\n }\n\n useEffect(() => {\n if (isDropdownOpen && onOpen) {\n onOpen();\n } else if (!isDropdownOpen && onClose) {\n onClose();\n }\n }, [isDropdownOpen, onOpen, onClose]);\n\n return (\n <Box>\n <Button {...buttonProps}>{buttonChildren}</Button>\n <Menu\n id=\"dropdown-menu\"\n anchorEl={anchorElement}\n open={isDropdownOpen}\n onClose={() => {\n setAnchorElement(null);\n }}\n >\n {typeof children === \"function\" ? (\n <Box>\n {children(() => {\n setAnchorElement(null);\n })}\n </Box>\n ) : (\n children\n )}\n </Menu>\n </Box>\n );\n}\n\nexport default DropdownMenu;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode, Ref } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\n\nexport interface ExternalLinkProps extends Omit<LinkProps, \"to\" | \"target\" | \"rel\"> {\n href: `https://${string}` | `http://${string}` | (string & {});\n to?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\nfunction ExternalLink({ href, children, ref, ...linkProps }: ExternalLinkProps) {\n return (\n <MUILink\n component=\"a\"\n href={href}\n ref={ref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...linkProps}\n >\n {children}\n </MUILink>\n );\n}\n\nexport default ExternalLink;\n","import type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\n\nexport const FileType = {\n PDF: \"application/pdf\",\n PNG: \"image/png\",\n JPEG: \"image/jpeg\",\n JPG: \"image/jpg\",\n XLSX: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n DOCX: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n MP3: \"audio/mp3\",\n MP4: \"video/mp4\",\n WAV: \"audio/wav\",\n} as const;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type FileType = (typeof FileType)[keyof typeof FileType];\n\nconst VisuallyHiddenInput = styled(\"input\")({\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: 1,\n overflow: \"hidden\",\n position: \"absolute\",\n bottom: 0,\n left: 0,\n whiteSpace: \"nowrap\",\n width: 1,\n});\n\nconst Dropzone = styled(\"div\")<{ $dragging: boolean }>(({ theme, $dragging }) => {\n return {\n border: \"2px dashed\",\n borderColor: $dragging ? theme.palette.primary.main : \"#ccc\",\n backgroundColor: $dragging ? theme.palette.action.hover : \"transparent\",\n borderRadius: 8,\n padding: \"1.5rem\",\n textAlign: \"center\",\n transition: \"border-color 0.2s\",\n cursor: \"pointer\",\n };\n});\n\nexport interface FileInputProps extends ButtonOwnProps {\n onFileInput: (allowedFiles: File[]) => void;\n label?: string;\n multiple?: boolean;\n accept?: string[];\n useDropzone?: boolean;\n}\n\nfunction FileInput({\n onFileInput,\n label = \"Upload files\",\n multiple,\n accept,\n useDropzone,\n ...buttonProps\n}: FileInputProps) {\n const [isDragging, setIsDragging] = useState<boolean>(false);\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File upload button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(\"file-input\")?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <CloudUploadIcon />}\n >\n {label}\n <VisuallyHiddenInput\n id=\"file-input\"\n type=\"file\"\n onChange={(event) => {\n const input = event.target;\n onFileInput(Array.from(input.files ?? []));\n input.value = \"\";\n }}\n multiple={multiple}\n accept={accept?.join(\",\")}\n disabled={buttonProps.disabled}\n />\n </Button>\n );\n\n return useDropzone ? (\n <Dropzone\n $dragging={isDragging}\n onDragOver={(event) => {\n event.preventDefault();\n if (buttonProps.disabled) {\n return;\n }\n setIsDragging(true);\n }}\n onDragLeave={(event) => {\n event.preventDefault();\n setIsDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragging(false);\n if (buttonProps.disabled) {\n return;\n }\n const filesArray = Array.from(event.dataTransfer.files ?? []);\n onFileInput(filesArray);\n }}\n >\n {fileInputButton}\n </Dropzone>\n ) : (\n fileInputButton\n );\n}\n\nexport default FileInput;\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type { FileInputProps } from \"src/components/FileInput\";\n\nimport DeleteIcon from \"@mui/icons-material/Delete\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemText from \"@mui/material/ListItemText\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: File[];\n setFiles: Dispatch<SetStateAction<File[]>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: File[]) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n const newFileInputProps = { ...fileInputProps, onFileInput };\n if (newFileInputProps?.multiple === undefined) {\n newFileInputProps.multiple = true;\n }\n\n return (\n <Box>\n <FileInput {...newFileInputProps} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={file.name}\n secondaryAction={\n <IconButton\n aria-label=\"Delete\"\n edge=\"end\"\n onClick={() => {\n setFiles((oldFiles) => {\n return oldFiles.filter((fileToDelete) => {\n return fileToDelete !== file;\n });\n });\n }}\n >\n <DeleteIcon />\n </IconButton>\n }\n >\n <ListItemText primary={file.name} />\n </ListItem>\n );\n })}\n </List>\n </Box>\n );\n}\n\nexport default FileInputList;\n","import type { OverridableComponent } from \"@mui/material/OverridableComponent\";\nimport type { SvgIconTypeMap } from \"@mui/material/SvgIcon\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Popover from \"@mui/material/Popover\";\nimport { useId, useState } from \"react\";\n\nexport interface IconWithPopoverProps {\n icon:\n | (OverridableComponent<SvgIconTypeMap<unknown, \"svg\">> & {\n muiName: string;\n })\n | ElementType;\n onOpen?: () => void;\n onClose?: () => void;\n iconProps?: SvgIconTypeMap<unknown, \"svg\">[\"props\"];\n children: ReactNode;\n}\n\nfunction IconWithPopover({\n icon: Icon,\n onOpen,\n onClose,\n iconProps,\n children,\n}: IconWithPopoverProps) {\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n const isPopoverOpen = !!anchorElement;\n const popoverId = useId();\n\n function handleOpen(event: ReactMouseEvent<SVGSVGElement, MouseEvent>) {\n setAnchorElement(event.currentTarget);\n if (onOpen) {\n onOpen();\n }\n }\n\n function handleClose() {\n setAnchorElement(null);\n if (onClose) {\n onClose();\n }\n }\n\n return (\n <Box>\n <Icon\n aria-owns={isPopoverOpen ? popoverId : undefined}\n aria-haspopup=\"true\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n {...iconProps}\n />\n <Popover\n id={popoverId}\n sx={{ pointerEvents: \"none\" }}\n open={isPopoverOpen}\n anchorEl={anchorElement}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n onClose={handleClose}\n disableRestoreFocus\n >\n {children}\n </Popover>\n </Box>\n );\n}\n\nexport default IconWithPopover;\n","import type { LinkProps } from \"@mui/material/Link\";\nimport type { ReactNode, Ref } from \"react\";\n\nimport MUILink from \"@mui/material/Link\";\nimport { Link as ReactDOMLink } from \"react-router-dom\";\n\nexport interface InternalLinkProps extends Omit<LinkProps, \"href\"> {\n to: `/${string}` | `~/${string}` | (string & {});\n href?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\nfunction InternalLink({ to, children, ref, ...linkProps }: InternalLinkProps) {\n return (\n <MUILink component={ReactDOMLink} to={to} ref={ref} {...linkProps}>\n {children}\n </MUILink>\n );\n}\n\nexport default InternalLink;\n","import type { ListItemButtonProps } from \"@mui/material/ListItemButton\";\nimport type { ReactNode } from \"react\";\n\nimport ListItemButton from \"@mui/material/ListItemButton\";\n\nimport InternalLink from \"src/components/InternalLink\";\n\nexport interface ListItemInternalLinkProps extends Omit<ListItemButtonProps, \"href\"> {\n children: ReactNode;\n to: string;\n}\n\nfunction ListItemInternalLink({ children, ...listItemButtonProps }: ListItemInternalLinkProps) {\n return (\n <ListItemButton component={InternalLink} {...listItemButtonProps}>\n {children}\n </ListItemButton>\n );\n}\n\nexport default ListItemInternalLink;\n","import type { LoaderDataProps, LoaderProviderProps } from \"src/providers\";\nimport type { LoaderErrorProps } from \"src/providers/LoaderProvider/LoaderError\";\n\nimport CircularProgress from \"@mui/material/CircularProgress\";\n\nimport { LoaderError } from \"src/providers\";\nimport LoaderProvider from \"src/providers/LoaderProvider\";\nimport LoaderData from \"src/providers/LoaderProvider/LoaderData\";\n\nexport type LoaderProps<DataType> = Omit<LoaderProviderProps<DataType>, \"children\" | \"logError\"> &\n Omit<LoaderErrorProps, \"errorComponent\" | \"children\"> &\n Omit<LoaderDataProps<DataType>, \"showOnError\" | \"onUndefined\" | \"onNull\" | \"onNullable\">;\n\n/**\n * An in-line component that deals with state management when fetching data from an API.\n * This may be used over LoaderProvider if you don't require as much control over the placement of the error message and data display.\n * @template DataType - The type of data being loaded.\n * @param root0 - Props to pass to Loader.\n * @param root0.children - The elements to show after data has been loaded.\n * @param root0.errorComponent - The component to show if an error has been thrown. Note that this may not be provided unless the error prop has also been provided.\n * @param root0.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param root0.nullComponent - The component to show if no error was thrown but the data is null.\n * @param root0.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param root0.loadingComponent - The component to show when the data is being fetched.\n * @param root0.logError - An option to log the error to the console.\n */\nfunction Loader<DataType>({\n children,\n errorComponent,\n undefinedComponent,\n nullComponent,\n nullableComponent,\n logError,\n loadingComponent = <CircularProgress />,\n ...loaderProviderProps\n}: LoaderProps<DataType>) {\n return (\n <LoaderProvider<DataType> loadingComponent={loadingComponent} {...loaderProviderProps}>\n {/* @ts-expect-error: We need to pass all four to LoaderError for the wrapper to work. It is ok as Loader will then do its own checks to enforce mutual exclusivity, and LoaderError knows how to deal with it anyway. */}\n <LoaderError\n undefinedComponent={undefinedComponent}\n nullComponent={nullComponent}\n nullableComponent={nullableComponent}\n logError={logError}\n >\n {errorComponent}\n </LoaderError>\n <LoaderData<DataType>>{children}</LoaderData>\n </LoaderProvider>\n );\n}\n\nexport default Loader;\n","import type { JSX, ReactNode } from \"react\";\n\nimport BottomNavigation from \"@mui/material/BottomNavigation\";\nimport BottomNavigationAction from \"@mui/material/BottomNavigationAction\";\nimport Box from \"@mui/material/Box\";\nimport Paper from \"@mui/material/Paper\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NavItemBottom {\n value: string;\n label: string;\n icon?: JSX.Element;\n to: string;\n}\n\nexport interface NavigationBottomProps {\n children: ReactNode;\n navItems: NavItemBottom[];\n}\n\nfunction NavigationBottom({ children, navItems }: NavigationBottomProps) {\n const [value, setValue] = useState<string>(\"\");\n return (\n <>\n <Box sx={{ paddingBottom: 7 }}>{children}</Box>\n <Paper sx={{ position: \"fixed\", bottom: 0, left: 0, right: 0 }}>\n <BottomNavigation\n showLabels\n value={value}\n onChange={(_, value) => {\n setValue(value);\n }}\n >\n {navItems.map((item) => {\n return <BottomNavigationAction key={item.value} {...item} component={Link} />;\n })}\n </BottomNavigation>\n </Paper>\n </>\n );\n}\n\nexport default NavigationBottom;\n","import type { AppBarProps as MuiAppBarProps } from \"@mui/material/AppBar\";\nimport type { CSSObject, Theme } from \"@mui/material/styles\";\nimport type { ReactNode } from \"react\";\n\nimport { truncate } from \"@alextheman/utility\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport MenuIcon from \"@mui/icons-material/Menu\";\nimport MuiAppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport { styled, useTheme } from \"@mui/material/styles\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nconst drawerWidth = 240;\n\nfunction openedMixin(theme: Theme): CSSObject {\n return {\n width: drawerWidth,\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: \"hidden\",\n };\n}\n\nfunction closedMixin(theme: Theme): CSSObject {\n return {\n transition: theme.transitions.create(\"width\", {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: \"hidden\",\n width: `calc(${theme.spacing(7)} + 1px)`,\n [theme.breakpoints.up(\"sm\")]: {\n width: `calc(${theme.spacing(8)} + 1px)`,\n },\n };\n}\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => {\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n };\n});\n\ninterface AppBarProps extends MuiAppBarProps {\n open?: boolean;\n}\n\nconst AppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})<AppBarProps>(({ theme }) => {\n return {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`,\n transition: theme.transitions.create([\"width\", \"margin\"], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n },\n ],\n };\n});\n\nconst Drawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => {\n return prop !== \"open\";\n },\n})(({ theme }) => {\n return {\n width: drawerWidth,\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n boxSizing: \"border-box\",\n variants: [\n {\n props: ({ open }) => {\n return open;\n },\n style: {\n ...openedMixin(theme),\n \"& .MuiDrawer-paper\": openedMixin(theme),\n },\n },\n {\n props: ({ open }) => {\n return !open;\n },\n style: {\n ...closedMixin(theme),\n \"& .MuiDrawer-paper\": closedMixin(theme),\n },\n },\n ],\n };\n});\n\nexport interface NavMenuItem {\n category: string;\n options: {\n label: string;\n to: string;\n icon?: ReactNode;\n }[];\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: NavMenuItem[];\n headerElements?: ReactNode;\n children: ReactNode;\n}\n\nfunction NavigationDrawer({ title, navItems, children, headerElements }: NavigationDrawerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(true);\n const location = useLocation();\n\n function handleDrawerOpen() {\n setOpen(true);\n }\n\n function handleDrawerClose() {\n setOpen(false);\n }\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <CssBaseline />\n <AppBar position=\"fixed\" open={open}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n onClick={handleDrawerOpen}\n edge=\"start\"\n sx={[\n {\n marginRight: 5,\n },\n open && { display: \"none\" },\n ]}\n >\n <MenuIcon />\n </IconButton>\n <Typography variant=\"h6\" noWrap component=\"div\">\n {title}\n </Typography>\n {headerElements}\n </Toolbar>\n </AppBar>\n <Drawer variant=\"permanent\" open={open}>\n <DrawerHeader>\n <IconButton onClick={handleDrawerClose}>\n {theme.direction === \"rtl\" ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </IconButton>\n </DrawerHeader>\n <Divider />\n {navItems.map((item) => {\n return (\n <Fragment key={item.category}>\n <List>\n <Typography variant={open ? \"h5\" : \"h6\"} paddingLeft={open ? 2 : 1}>\n {open ? item.category : truncate(item.category, 4)}\n </Typography>\n {item.options.map((option) => {\n return (\n <ListItem key={option.to} disablePadding sx={{ display: \"block\" }}>\n <ListItemButton\n sx={[\n {\n minHeight: 48,\n px: 2.5,\n },\n open\n ? {\n justifyContent: \"initial\",\n }\n : {\n justifyContent: \"center\",\n },\n ]}\n component={Link}\n to={option.to}\n selected={location.pathname === option.to}\n >\n <ListItemIcon\n sx={[\n {\n minWidth: 0,\n justifyContent: \"center\",\n },\n open\n ? {\n mr: 3,\n }\n : {\n mr: \"auto\",\n },\n ]}\n >\n {option.icon ? (\n option.icon\n ) : !open ? (\n <Typography>{truncate(option.label, 4)}</Typography>\n ) : null}\n </ListItemIcon>\n <ListItemText\n primary={option.label}\n sx={[\n open\n ? {\n opacity: 1,\n }\n : {\n opacity: 0,\n },\n ]}\n />\n </ListItemButton>\n </ListItem>\n );\n })}\n </List>\n <Divider />\n </Fragment>\n );\n })}\n </Drawer>\n <Box component=\"main\" sx={{ flexGrow: 1, p: 3 }}>\n <DrawerHeader />\n {children}\n </Box>\n </Box>\n );\n}\n\nexport default NavigationDrawer;\n","import type { TypographyProps } from \"@mui/material/Typography\";\n\nimport Typography from \"@mui/material/Typography\";\n\nexport interface PopoverTextProps extends TypographyProps {\n text: string;\n}\n\nfunction PopoverText({ text, sx, ...typographyProps }: PopoverTextProps) {\n return (\n <>\n {text.split(\"\\n\").map((line, index) => {\n return (\n <Typography key={index} sx={{ margin: 1, ...sx }} {...typographyProps}>\n {line}\n </Typography>\n );\n })}\n </>\n );\n}\n\nexport default PopoverText;\n","import type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { ComponentProps } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { stripIndent } from \"common-tags\";\nimport { LiveEditor, LiveError, LivePreview, LiveProvider } from \"react-live\";\n\nimport { useMode } from \"src/providers\";\n\nexport interface ReactPlaygroundProps extends ComponentProps<typeof LiveProvider> {\n previewStyles?: SxProps<Theme>;\n}\n\nfunction ReactPlayground({ code, previewStyles, ...liveProviderProps }: ReactPlaygroundProps) {\n const { mode } = useMode();\n const defaultPreviewStyles: SxProps<Theme> = {\n backgroundColor: mode === \"dark\" ? \"black\" : \"white\",\n border: 0.3,\n borderRadius: 1,\n padding: 2,\n borderColor: \"darkgray\",\n };\n const allPreviewStyles = previewStyles\n ? { ...defaultPreviewStyles, ...previewStyles }\n : { ...defaultPreviewStyles };\n return (\n <Box sx={{ borderRadius: 1, border: 0.5, padding: 2 }}>\n <LiveProvider {...liveProviderProps} code={stripIndent(code ?? \"\")}>\n <Typography variant=\"h5\">Code</Typography>\n <Box\n sx={{\n border: 0.3,\n borderRadius: 0.3,\n borderColor: \"darkgray\",\n }}\n >\n <LiveEditor />\n </Box>\n <br />\n <Typography variant=\"h5\">Result</Typography>\n <Box sx={allPreviewStyles}>\n <LivePreview />\n <LiveError />\n </Box>\n </LiveProvider>\n </Box>\n );\n}\n\nexport default ReactPlayground;\n","import { fillArray } from \"@alextheman/utility\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableRow from \"@mui/material/TableRow\";\n\nexport interface SkeletonRowProps {\n columns: number;\n}\n\nfunction SkeletonRow({ columns }: SkeletonRowProps) {\n return (\n <TableRow>\n {fillArray((index) => {\n return (\n <TableCell key={index}>\n <Skeleton />\n </TableCell>\n );\n }, columns)}\n </TableRow>\n );\n}\n\nexport default SkeletonRow;\n","import type { ButtonProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { useFormContext } from \"react-hook-form\";\n\nexport interface SubmitButtonProps extends Omit<ButtonProps, \"type\"> {\n disableClean?: boolean;\n label: string;\n}\n\nfunction SubmitButton({ disableClean, label, ...buttonProps }: SubmitButtonProps) {\n const {\n formState: { disabled: formDisabled, isDirty, isSubmitting },\n } = useFormContext();\n\n return (\n <Button\n color=\"primary\"\n disabled={buttonProps.disabled || (disableClean && !isDirty) || formDisabled}\n loading={isSubmitting}\n type=\"submit\"\n variant=\"contained\"\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nexport default SubmitButton;\n","import type { CommonProps } from \"@mui/material/OverridableComponent\";\nimport type { SwitchProps } from \"@mui/material/Switch\";\nimport type { ComponentType, CSSProperties } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport { styled } from \"@mui/material/styles\";\nimport Switch from \"@mui/material/Switch\";\n\nexport interface SwitchWithIconsProps extends Omit<SwitchProps, \"icon\" | \"checkedIcon\"> {\n checkedIcon: ComponentType<{ style?: CSSProperties }>;\n checkedIconStyles?: CommonProps[\"style\"];\n uncheckedIcon: ComponentType<{ style?: CSSProperties }>;\n uncheckedIconStyles?: CommonProps[\"style\"];\n}\n\nconst StyledSwitch = styled(Switch)(() => {\n return {\n padding: 8,\n \"& .MuiSwitch-track\": {\n borderRadius: 11,\n \"&::before, &::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: 16,\n width: 28,\n height: 28,\n },\n },\n };\n});\n\nfunction SwitchWithIcons({\n checkedIcon: CheckedIcon,\n checkedIconStyles,\n uncheckedIcon: UncheckedIcon,\n uncheckedIconStyles,\n ...switchProps\n}: SwitchWithIconsProps) {\n const boxSx = {\n borderRadius: \"50%\",\n borderColor: \"white\",\n backgroundColor: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0.25,\n };\n const defaultIconStyles = { color: \"black\", maxWidth: 16.5, maxHeight: 16.5 };\n return (\n <StyledSwitch\n checkedIcon={\n <Box sx={boxSx}>\n <CheckedIcon style={{ ...defaultIconStyles, ...checkedIconStyles }} />\n </Box>\n }\n icon={\n <Box sx={boxSx}>\n <UncheckedIcon style={{ ...defaultIconStyles, ...uncheckedIconStyles }} />\n </Box>\n }\n {...switchProps}\n />\n );\n}\n\nexport default SwitchWithIcons;\n","import type { Dispatch, SetStateAction } from \"react\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nfunction useHash<S extends string>(initialHash: S | undefined): [S, Dispatch<SetStateAction<S>>] {\n const [hash, setHash] = useState<S>(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n return !initialHash ? hash : hash === \"\" ? initialHash : hash;\n });\n const hashChangeHandler = useCallback(() => {\n const hash: S = window.location.hash.replace(\"#\", \"\") as S;\n setHash(!initialHash ? hash : hash === \"\" ? initialHash : hash);\n }, [setHash, initialHash]);\n\n useEffect(() => {\n window.addEventListener(\"hashchange\", hashChangeHandler);\n return () => {\n window.removeEventListener(\"hashchange\", hashChangeHandler);\n };\n }, [hashChangeHandler]);\n\n const updateHash = useCallback(\n (newHash: S | ((previousState: S) => S)) => {\n const resolvedHash = typeof newHash === \"function\" ? newHash(hash) : newHash;\n if (resolvedHash !== hash) {\n window.location.hash = resolvedHash;\n }\n },\n [hash],\n );\n\n return [hash, updateHash];\n}\n\nexport default useHash;\n"],"mappings":"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"}
|