@alextheman/components 6.6.0 → 6.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});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/material/Box`);c=s(c);let l=require(`@mui/material/Card`);l=s(l);let u=require(`@mui/material/CardContent`);u=s(u);let d=require(`@mui/material/CardHeader`);d=s(d);let f=require(`@mui/material/Chip`);f=s(f);let p=require(`@mui/material/Divider`);p=s(p);let m=require(`@mui/material/Stack`);m=s(m);let h=require(`@mui/material/Typography`);h=s(h);let g=require(`react/jsx-runtime`),_=require(`@mui/material/ButtonBase`);_=s(_);let v=require(`@mui/material/Collapse`);v=s(v);let y=require(`react`),b=require(`react-icons/md`),x=require(`@mui/material/Button`);x=s(x);let S=require(`@mui/material/Menu`);S=s(S);let C=require(`@mui/material/Link`);C=s(C);let w=require(`@mui/material/styles`),T=require(`@mui/material/IconButton`);T=s(T);let E=require(`@mui/material/List`);E=s(E);let D=require(`@mui/material/ListItem`);D=s(D);let O=require(`@mui/material/ListItemText`);O=s(O);let k=require(`@mui/material/Popover`);k=s(k);let A=require(`react-router-dom`),j=require(`@mui/material/ListItemButton`);j=s(j);let M=require(`@mui/material/CircularProgress`);M=s(M);let N=require(`@mui/material/MenuItem`);N=s(N);let P=require(`@mui/material/Alert`);P=s(P);let F=require(`@mui/material/CssBaseline`);F=s(F);let I=require(`@alextheman/utility`),L=require(`@mui/material/Snackbar`);L=s(L);let R=require(`@mui/material/Tooltip`);R=s(R);let z=require(`@mui/material/Switch`);z=s(z);let B=require(`@mui/material/BottomNavigation`);B=s(B);let V=require(`@mui/material/BottomNavigationAction`);V=s(V);let H=require(`@mui/material/Paper`);H=s(H);let U=require(`@mui/material/AppBar`);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 ee=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 te=require(`react-hook-form`);function ne({containerLabel:e,chipLabels:t}){return(0,g.jsx)(l.default,{sx:{width:320,height:420,backgroundColor:`rgba(255,255,255,0.07)`,backdropFilter:`blur(8px)`,border:`1px solid rgba(255,255,255,0.06)`,boxShadow:`0 10px 40px rgba(0,0,0,0.35)`},children:(0,g.jsxs)(u.default,{children:[(0,g.jsx)(h.default,{variant:`h6`,gutterBottom:!0,sx:{color:`#f8fafc`},children:e}),(0,g.jsx)(m.default,{spacing:1,children:t.map(e=>(0,g.jsx)(f.default,{label:e,sx:{backgroundColor:`rgba(255,255,255,0.11)`,color:`rgba(255,255,255,0.88)`,border:`1px solid rgba(255,255,255,0.06)`}},e))})]})})}function re(){return(0,g.jsx)(c.default,{sx:{width:120,height:6,borderRadius:3,background:`linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)`,boxShadow:`0 0 24px rgba(167,139,250,0.55)`}})}function ie(){return(0,g.jsxs)(l.default,{sx:{width:1e3,height:1e3,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,p:4,background:`radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)`,color:`white`},elevation:0,children:[(0,g.jsx)(d.default,{title:`An Interface For You And I`,sx:{color:`#f8fafc`,textAlign:`center`,"& .MuiCardHeader-title":{fontSize:40,fontWeight:600,letterSpacing:2}}}),(0,g.jsx)(p.default,{sx:{borderColor:`rgba(255,255,255,0.2)`}}),(0,g.jsx)(u.default,{sx:{flex:1,display:`flex`,alignItems:`center`},children:(0,g.jsxs)(m.default,{direction:`row`,spacing:4,sx:{width:`100%`,justifyContent:`center`,alignItems:`center`},children:[(0,g.jsx)(ne,{containerLabel:`You`,chipLabels:[`state`,`context`,`input`,`event`,`focus`,`value`,`history`]}),(0,g.jsx)(re,{}),(0,g.jsx)(ne,{containerLabel:`I`,chipLabels:[`render`,`effect`,`response`,`update`,`history`,`layout`,`provider`]})]})})]})}function ae({isInitiallyOpen:e,onOpen:t,onClose:n,children:r,buttonStyles:i,buttonContents:a,buttonComponent:o=_.default,collapseProps:s,openIcon:l=(0,g.jsx)(b.MdArrowDropUp,{}),closedIcon:u=(0,g.jsx)(b.MdArrowDropDown,{}),useDefaultStyling:d=o===_.default}){let[f,p]=(0,y.useState)(!!e);return(0,y.useEffect)(()=>{f&&t?t():!f&&n&&n()},[f]),(0,g.jsxs)(c.default,{children:[(0,g.jsxs)(o,{onClick:()=>{p(e=>!e)},sx:d?{width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,paddingY:1.5,paddingX:2,textAlign:`center`,"&:hover":o===_.default?{backgroundColor:`action.hover`}:null,...i}:i,"aria-expanded":f,children:[a,f?l:u]}),(0,g.jsx)(v.default,{in:f,...s,children:r})]})}function oe({children:e,button:t=x.default,buttonChildren:n=`Menu`,buttonProps:r,isOpenIcon:i=(0,g.jsx)(b.MdArrowDropUp,{}),isClosedIcon:a=(0,g.jsx)(b.MdArrowDropDown,{}),onOpen:o,onClose:s}){let[l,u]=(0,y.useState)(null),d=(0,y.useMemo)(()=>!!l,[l]),f={...r,onClick:e=>{u(e.currentTarget)},"aria-controls":d?`dropdown-menu`:void 0,"aria-haspopup":`true`,"aria-expanded":d};return t===x.default&&(f.endIcon=d?i:a),(0,y.useEffect)(()=>{d&&o?o():!d&&s&&s()},[d,o,s]),(0,g.jsxs)(c.default,{children:[(0,g.jsx)(t,{...f,children:n}),(0,g.jsx)(S.default,{id:`dropdown-menu`,anchorEl:l,open:d,onClose:()=>{u(null)},children:typeof e==`function`?(0,g.jsx)(c.default,{children:e(()=>{u(null)})}):e})]})}function se({href:e,children:t,ref:n,...r}){return(0,g.jsx)(C.default,{component:`a`,href:e,ref:n,target:`_blank`,rel:`noopener noreferrer`,...r,children:t})}const ce={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`},le=(0,w.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}),ue=(0,w.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 de({onFileInput:e,label:t=`Upload files`,multiple:n,accept:r,useDropzone:i,...a}){let[o,s]=(0,y.useState)(!1),c=(0,g.jsxs)(x.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,g.jsx)(b.MdCloudUpload,{}),children:[t,(0,g.jsx)(le,{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,g.jsx)(ue,{$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}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,g.jsxs)(c.default,{children:[(0,g.jsx)(de,{...i}),(0,g.jsx)(E.default,{children:e.map(e=>(0,g.jsx)(D.default,{secondaryAction:(0,g.jsx)(T.default,{"aria-label":`Delete`,edge:`end`,onClick:()=>{t(t=>t.filter(t=>t!==e))},children:(0,g.jsx)(b.MdDelete,{})}),children:(0,g.jsx)(O.default,{primary:e.name})},e.name))})]})}function pe({icon:e,onOpen:t,onClose:n,iconProps:r,children:i}){let[a,o]=(0,y.useState)(null),s=!!a,l=(0,y.useId)();function u(e){o(e.currentTarget),t&&t()}function d(){o(null),n&&n()}return(0,g.jsxs)(c.default,{children:[(0,g.jsx)(e,{"aria-owns":s?l:void 0,"aria-haspopup":`true`,onMouseEnter:u,onMouseLeave:d,...r}),(0,g.jsx)(k.default,{id:l,sx:{pointerEvents:`none`},open:s,anchorEl:a,anchorOrigin:{vertical:`bottom`,horizontal:`left`},transformOrigin:{vertical:`top`,horizontal:`left`},onClose:d,disableRestoreFocus:!0,children:i})]})}function Z({to:e,component:t=A.Link,children:n,ref:r,...i}){return(0,g.jsx)(C.default,{component:t,to:e,ref:r,...i,children:n})}function me({children:e,...t}){return(0,g.jsx)(j.default,{component:Z,...t,children:e})}const he=(0,y.createContext)(void 0);function Q({strict:e=!0}={}){let t=(0,y.useContext)(he);if(e&&!t)throw Error(`DROPDOWN_MENU_NOT_FOUND`);return t}function ge({children:e,button:t=x.default,buttonProps:n,openIcon:r=(0,g.jsx)(b.MdArrowDropUp,{}),closedIcon:i=(0,g.jsx)(b.MdArrowDropDown,{})}){let[a,o]=(0,y.useState)(null),s=(0,y.useMemo)(()=>!!a,[a]);function c(){o(null)}return(0,g.jsxs)(he.Provider,{value:{closeMenu:c,isDropdownOpen:s},children:[(0,g.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,g.jsx)(S.default,{anchorEl:a,open:s,onClose:c,children:e})]})}function _e({ref:e,href:t,children:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,g.jsx)(N.default,{component:se,href:t,ref:e,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function ve({to:e,ref:t,children:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,g.jsx)(N.default,{component:Z,to:e,ref:t,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function ye({component:e,children:t,ref:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,g.jsx)(N.default,{component:e??x.default,ref:n,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:t})}var be=ge;const xe=(0,y.createContext)(void 0);function Se({strict:e=!0}={}){let t=(0,y.useContext)(xe);if(e&&!t)throw Error(`LOADER_PROVIDER_NOT_FOUND`);return t}function Ce({children:e,loadingComponent:t=(0,g.jsx)(M.default,{}),...n}){return(0,g.jsx)(xe.Provider,{value:{loadingComponent:t,...n},children:e})}function we({children:e,dataParser:t,loadingComponent:n}){let{isLoading:r,data:i,dataParser:a,loadingComponent:o,error:s}=Se(),c=t??a;return r?(0,g.jsx)(g.Fragment,{children:n??o}):s||i==null?(0,g.jsx)(g.Fragment,{}):c?typeof e==`function`?(0,g.jsx)(g.Fragment,{children:e(c(i))}):(0,g.jsx)(g.Fragment,{children:e}):typeof e==`function`?(0,g.jsx)(g.Fragment,{children:e(i)}):(0,g.jsx)(g.Fragment,{children:e})}function Te({children:e,undefinedComponent:t,nullComponent:n,nullableComponent:r,logError:i}){let{isLoading:a,data:o,error:s,errorComponent:c,logError:l}=Se(),u=i??l,d=(0,y.useRef)(!1),f=e??c;return s?(u&&!d.current&&(console.error(s),d.current=!0),typeof f==`function`?f(s):f?(0,g.jsx)(g.Fragment,{children:f}):(0,g.jsx)(P.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,g.jsx)(g.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,g.jsx)(g.Fragment,{children:t}):o===null&&(u&&!d.current&&(console.error(`Data is null after loading.`),d.current=!0),n)?(0,g.jsx)(g.Fragment,{children:n}):(0,g.jsx)(P.default,{severity:`error`,children:`Failed to load data. Please try again later.`}):(0,g.jsx)(g.Fragment,{})}var Ee=Ce;const De=(0,y.createContext)({toggleMode:()=>{},mode:`dark`});function $({strict:e=!0}={}){let t=(0,y.useContext)(De);if(e&&!t)throw Error(`MODE_PROVIDER_NOT_FOUND`);return t}function Oe({children:e,mode:t=`dark`}){let[n,r]=(0,y.useState)(t),i=(0,y.useMemo)(()=>(0,w.createTheme)({palette:{mode:n}}),[n]);return(0,g.jsx)(De.Provider,{value:{mode:n,toggleMode:()=>{r(e=>e===`light`?`dark`:`light`)}},children:(0,g.jsxs)(w.ThemeProvider,{theme:i,children:[(0,g.jsx)(F.default,{}),e]})})}const ke=(0,y.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ae({strict:e=!0}={}){let t=(0,y.useContext)(ke);if(e&&!t)throw Error(`SCREEN_SIZE_PROVIDER_NOT_FOUND`);return t}function je({children:e,largeScreenWidth:t=669,largeScreenHeight:n=660}){let[r,i]=(0,y.useState)(window.innerWidth),[a,o]=(0,y.useState)(window.innerHeight);(0,y.useEffect)(()=>{function e(){i(window.innerWidth),o(window.innerHeight)}return e(),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`resize`,e)}},[]);let s=(0,y.useMemo)(()=>r>t&&a>n,[r,a,t,n]);return(0,g.jsx)(ke.Provider,{value:{isLargeScreen:s,windowWidth:r,windowHeight:a},children:e})}const Me=(0,y.createContext)(void 0);function Ne({strict:e=!0}={}){let t=(0,y.useContext)(Me);if(e&&!t)throw Error(`SNACKBAR_PROVIDER_NOT_FOUND`);return t}function Pe({children:e,autoHideDuration:t=5e3}){let[n,r]=(0,y.useState)(!1),[i,a]=(0,y.useState)(t),[o,s]=(0,y.useState)(``),[c,l]=(0,y.useState)(`info`);function u(e,n,i){r(!0),a(i??t),l(n??`info`),s(e)}async function d(){r(!1),await(0,I.wait)(.2),s(``)}return(0,g.jsxs)(Me.Provider,{value:{addSnackbar:u},children:[(0,g.jsx)(L.default,{open:n,autoHideDuration:i,onClose:d,children:(0,g.jsx)(P.default,{onClose:d,severity:c,children:o})}),e]})}function Fe({children:e,errorComponent:t,undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,loadingComponent:o=(0,g.jsx)(M.default,{}),...s}){return(0,g.jsxs)(Ee,{loadingComponent:o,...s,children:[(0,g.jsx)(Te,{undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,children:t}),(0,g.jsx)(we,{children:e})]})}const Ie=(0,w.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 Le({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,g.jsx)(Ie,{checkedIcon:(0,g.jsx)(c.default,{sx:a,children:(0,g.jsx)(e,{style:{...o,...t}})}),icon:(0,g.jsx)(c.default,{sx:a,children:(0,g.jsx)(n,{style:{...o,...r}})}),...i})}function Re(){let{mode:e,toggleMode:t}=$(),n=e===`dark`,r=`Enable ${n?`light`:`dark`} mode`;return(0,g.jsx)(R.default,{title:r,children:(0,g.jsx)(Le,{uncheckedIcon:b.MdOutlineLightMode,checkedIcon:b.MdOutlineDarkMode,checked:n,onChange:t,"aria-label":r})})}function ze({children:e,navItems:t}){let[n,r]=(0,y.useState)(``);return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(c.default,{sx:{paddingBottom:7},children:e}),(0,g.jsx)(H.default,{sx:{position:`fixed`,bottom:0,left:0,right:0},children:(0,g.jsx)(B.default,{showLabels:!0,value:n,onChange:(e,t)=>{r(t)},children:t.map(e=>(0,g.jsx)(V.default,{...e,component:A.Link},e.value))})})]})}function Be(e){return{width:240,transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:`hidden`}}function Ve(e){return{transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.leavingScreen}),overflowX:`hidden`,width:`calc(${e.spacing(7)} + 1px)`,[e.breakpoints.up(`sm`)]:{width:`calc(${e.spacing(8)} + 1px)`}}}const He=(0,w.styled)(`div`)(({theme:e})=>({display:`flex`,alignItems:`center`,justifyContent:`flex-end`,padding:e.spacing(0,1),...e.mixins.toolbar})),Ue=(0,w.styled)(U.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})}}]})),We=(0,w.styled)(W.default,{shouldForwardProp:e=>e!==`open`})(({theme:e})=>({width:240,flexShrink:0,whiteSpace:`nowrap`,boxSizing:`border-box`,variants:[{props:({open:e})=>e,style:{...Be(e),"& .MuiDrawer-paper":Be(e)}},{props:({open:e})=>!e,style:{...Ve(e),"& .MuiDrawer-paper":Ve(e)}}]}));function Ge({title:e,navItems:t,children:n,headerElements:r}){let i=(0,w.useTheme)(),[a,o]=(0,y.useState)(!0),s=(0,A.useLocation)();function l(){o(!0)}function u(){o(!1)}return(0,g.jsxs)(c.default,{sx:{display:`flex`},children:[(0,g.jsx)(F.default,{}),(0,g.jsx)(Ue,{position:`fixed`,open:a,children:(0,g.jsxs)(K.default,{children:[(0,g.jsx)(T.default,{color:`inherit`,"aria-label":`open drawer`,onClick:l,edge:`start`,sx:[{marginRight:5},a&&{display:`none`}],children:(0,g.jsx)(b.MdMenu,{})}),(0,g.jsx)(h.default,{variant:`h6`,noWrap:!0,component:`div`,children:e}),r]})}),(0,g.jsxs)(We,{variant:`permanent`,open:a,children:[(0,g.jsx)(He,{children:(0,g.jsx)(T.default,{onClick:u,children:i.direction===`rtl`?(0,g.jsx)(b.MdChevronRight,{}):(0,g.jsx)(b.MdChevronLeft,{})})}),(0,g.jsx)(p.default,{}),t.map(e=>(0,g.jsxs)(y.Fragment,{children:[(0,g.jsxs)(E.default,{children:[(0,g.jsx)(h.default,{variant:a?`h5`:`h6`,paddingLeft:a?2:1,children:a?e.category:(0,I.truncate)(e.category,4)}),e.options.map(e=>(0,g.jsx)(D.default,{disablePadding:!0,sx:{display:`block`},children:(0,g.jsxs)(j.default,{sx:[{minHeight:48,px:2.5},a?{justifyContent:`initial`}:{justifyContent:`center`}],component:A.Link,to:e.to,selected:s.pathname===e.to,children:[(0,g.jsx)(G.default,{sx:[{minWidth:0,justifyContent:`center`},a?{mr:3}:{mr:`auto`}],children:e.icon?e.icon:a?null:(0,g.jsx)(h.default,{children:(0,I.truncate)(e.label,4)})}),(0,g.jsx)(O.default,{primary:e.label,sx:[a?{opacity:1}:{opacity:0}]})]})},e.to))]}),(0,g.jsx)(p.default,{})]},e.category))]}),(0,g.jsxs)(c.default,{component:`main`,sx:{flexGrow:1,p:3},children:[(0,g.jsx)(He,{}),n]})]})}function Ke({title:e,subtitle:t,action:n,children:r}){return(0,g.jsxs)(l.default,{children:[(0,g.jsx)(d.default,{title:(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(h.default,{variant:`h6`,children:e}),t?(0,g.jsx)(h.default,{variant:`body2`,color:`text.secondary`,children:t}):null]}),action:n}),(0,g.jsx)(p.default,{}),(0,g.jsx)(u.default,{children:r})]})}function qe({text:e,sx:t,...n}){return(0,g.jsx)(g.Fragment,{children:e.split(`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});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/material/Box`);c=s(c);let l=require(`@mui/material/Card`);l=s(l);let u=require(`@mui/material/CardContent`);u=s(u);let d=require(`@mui/material/CardHeader`);d=s(d);let f=require(`@mui/material/Chip`);f=s(f);let p=require(`@mui/material/Divider`);p=s(p);let m=require(`@mui/material/Stack`);m=s(m);let h=require(`@mui/material/Typography`);h=s(h);let g=require(`react/jsx-runtime`),_=require(`@mui/material/ButtonBase`);_=s(_);let v=require(`@mui/material/Collapse`);v=s(v);let y=require(`react`),b=require(`react-icons/md`),x=require(`@mui/material/Button`);x=s(x);let S=require(`@mui/material/Menu`);S=s(S);let C=require(`@mui/material/Link`);C=s(C);let w=require(`@mui/material/styles`),T=require(`@mui/material/IconButton`);T=s(T);let E=require(`@mui/material/List`);E=s(E);let D=require(`@mui/material/ListItem`);D=s(D);let O=require(`@mui/material/ListItemText`);O=s(O);let k=require(`@mui/material/Popover`);k=s(k);let A=require(`react-router-dom`),j=require(`@mui/material/ListItemButton`);j=s(j);let M=require(`@mui/material/CircularProgress`);M=s(M);let N=require(`@mui/material/MenuItem`);N=s(N);let P=require(`@mui/material/Alert`);P=s(P);let F=require(`@mui/material/CssBaseline`);F=s(F);let I=require(`@alextheman/utility`),L=require(`@mui/material/Snackbar`);L=s(L);let R=require(`@mui/material/Tooltip`);R=s(R);let z=require(`@mui/material/Switch`);z=s(z);let B=require(`@mui/material/BottomNavigation`);B=s(B);let V=require(`@mui/material/BottomNavigationAction`);V=s(V);let H=require(`@mui/material/Paper`);H=s(H);let U=require(`@mui/material/AppBar`);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 ee=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 te=require(`react-hook-form`);function ne({containerLabel:e,chipLabels:t}){return(0,g.jsx)(l.default,{sx:{width:320,height:420,backgroundColor:`rgba(255,255,255,0.07)`,backdropFilter:`blur(8px)`,border:`1px solid rgba(255,255,255,0.06)`,boxShadow:`0 10px 40px rgba(0,0,0,0.35)`},children:(0,g.jsxs)(u.default,{children:[(0,g.jsx)(h.default,{variant:`h6`,gutterBottom:!0,sx:{color:`#f8fafc`},children:e}),(0,g.jsx)(m.default,{spacing:1,children:t.map(e=>(0,g.jsx)(f.default,{label:e,sx:{backgroundColor:`rgba(255,255,255,0.11)`,color:`rgba(255,255,255,0.88)`,border:`1px solid rgba(255,255,255,0.06)`}},e))})]})})}function re(){return(0,g.jsx)(c.default,{sx:{width:120,height:6,borderRadius:3,background:`linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)`,boxShadow:`0 0 24px rgba(167,139,250,0.55)`}})}function ie(){return(0,g.jsxs)(l.default,{sx:{width:1e3,height:1e3,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,p:4,background:`radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)`,color:`white`},elevation:0,children:[(0,g.jsx)(d.default,{title:`An Interface For You And I`,sx:{color:`#f8fafc`,textAlign:`center`,"& .MuiCardHeader-title":{fontSize:40,fontWeight:600,letterSpacing:2}}}),(0,g.jsx)(p.default,{sx:{borderColor:`rgba(255,255,255,0.2)`}}),(0,g.jsx)(u.default,{sx:{flex:1,display:`flex`,alignItems:`center`},children:(0,g.jsxs)(m.default,{direction:`row`,spacing:4,sx:{width:`100%`,justifyContent:`center`,alignItems:`center`},children:[(0,g.jsx)(ne,{containerLabel:`You`,chipLabels:[`state`,`context`,`input`,`event`,`focus`,`value`,`history`]}),(0,g.jsx)(re,{}),(0,g.jsx)(ne,{containerLabel:`I`,chipLabels:[`render`,`effect`,`response`,`update`,`history`,`layout`,`provider`]})]})})]})}function ae({isInitiallyOpen:e,onOpen:t,onClose:n,children:r,buttonStyles:i,buttonContents:a,buttonComponent:o=_.default,collapseProps:s,openIcon:l=(0,g.jsx)(b.MdArrowDropUp,{}),closedIcon:u=(0,g.jsx)(b.MdArrowDropDown,{}),useDefaultStyling:d=o===_.default}){let[f,p]=(0,y.useState)(!!e);return(0,y.useEffect)(()=>{f&&t?t():!f&&n&&n()},[f]),(0,g.jsxs)(c.default,{children:[(0,g.jsxs)(o,{onClick:()=>{p(e=>!e)},sx:d?{width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,paddingY:1.5,paddingX:2,textAlign:`center`,"&:hover":o===_.default?{backgroundColor:`action.hover`}:null,...i}:i,"aria-expanded":f,children:[a,f?l:u]}),(0,g.jsx)(v.default,{in:f,...s,children:r})]})}function oe({children:e,button:t=x.default,buttonChildren:n=`Menu`,buttonProps:r,isOpenIcon:i=(0,g.jsx)(b.MdArrowDropUp,{}),isClosedIcon:a=(0,g.jsx)(b.MdArrowDropDown,{}),onOpen:o,onClose:s}){let[l,u]=(0,y.useState)(null),d=(0,y.useMemo)(()=>!!l,[l]),f={...r,onClick:e=>{u(e.currentTarget)},"aria-controls":d?`dropdown-menu`:void 0,"aria-haspopup":`true`,"aria-expanded":d};return t===x.default&&(f.endIcon=d?i:a),(0,y.useEffect)(()=>{d&&o?o():!d&&s&&s()},[d,o,s]),(0,g.jsxs)(c.default,{children:[(0,g.jsx)(t,{...f,children:n}),(0,g.jsx)(S.default,{id:`dropdown-menu`,anchorEl:l,open:d,onClose:()=>{u(null)},children:typeof e==`function`?(0,g.jsx)(c.default,{children:e(()=>{u(null)})}):e})]})}function se({href:e,children:t,ref:n,...r}){return(0,g.jsx)(C.default,{component:`a`,href:e,ref:n,target:`_blank`,rel:`noopener noreferrer`,...r,children:t})}const ce={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`},le=(0,w.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}),ue=(0,w.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 de({onFileInput:e,label:t=`Upload files`,multiple:n,accept:r,useDropzone:i,...a}){let[o,s]=(0,y.useState)(!1),c=(0,y.useId)(),l=(0,g.jsxs)(x.default,{variant:`contained`,component:`label`,"aria-label":`File input button`,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),document.getElementById(c)?.click())},...a,startIcon:a.startIcon??(0,g.jsx)(b.MdCloudUpload,{}),children:[t,(0,g.jsx)(le,{id:c,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,g.jsx)(ue,{$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:l}):l}function fe({files:e,setFiles:t,multiple:n=!0,...r}){function i(e){t(t=>[...t,...e])}return(0,g.jsxs)(c.default,{children:[(0,g.jsx)(de,{...r,multiple:n,onFileInput:i}),(0,g.jsx)(E.default,{children:e.map(e=>(0,g.jsx)(D.default,{secondaryAction:(0,g.jsx)(T.default,{"aria-label":`Delete`,edge:`end`,onClick:()=>{t(t=>t.filter(t=>t!==e))},children:(0,g.jsx)(b.MdDelete,{})}),children:(0,g.jsx)(O.default,{primary:e.name})},`${e.name}-${e.lastModified}`))})]})}function pe({icon:e,onOpen:t,onClose:n,iconProps:r,children:i}){let[a,o]=(0,y.useState)(null),s=!!a,l=(0,y.useId)();function u(e){o(e.currentTarget),t&&t()}function d(){o(null),n&&n()}return(0,g.jsxs)(c.default,{children:[(0,g.jsx)(e,{"aria-owns":s?l:void 0,"aria-haspopup":`true`,onMouseEnter:u,onMouseLeave:d,...r}),(0,g.jsx)(k.default,{id:l,sx:{pointerEvents:`none`},open:s,anchorEl:a,anchorOrigin:{vertical:`bottom`,horizontal:`left`},transformOrigin:{vertical:`top`,horizontal:`left`},onClose:d,disableRestoreFocus:!0,children:i})]})}function Z({to:e,component:t=A.Link,children:n,ref:r,...i}){return(0,g.jsx)(C.default,{component:t,to:e,ref:r,...i,children:n})}function me({children:e,...t}){return(0,g.jsx)(j.default,{component:Z,...t,children:e})}const he=(0,y.createContext)(void 0);function Q({strict:e=!0}={}){let t=(0,y.useContext)(he);if(e&&!t)throw Error(`DROPDOWN_MENU_NOT_FOUND`);return t}function ge({children:e,button:t=x.default,buttonProps:n,openIcon:r=(0,g.jsx)(b.MdArrowDropUp,{}),closedIcon:i=(0,g.jsx)(b.MdArrowDropDown,{})}){let[a,o]=(0,y.useState)(null),s=(0,y.useMemo)(()=>!!a,[a]);function c(){o(null)}return(0,g.jsxs)(he.Provider,{value:{closeMenu:c,isDropdownOpen:s},children:[(0,g.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,g.jsx)(S.default,{anchorEl:a,open:s,onClose:c,children:e})]})}function _e({ref:e,href:t,children:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,g.jsx)(N.default,{component:se,href:t,ref:e,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function ve({to:e,ref:t,children:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,g.jsx)(N.default,{component:Z,to:e,ref:t,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function ye({component:e,children:t,ref:n,onClick:r,...i}){let{closeMenu:a}=Q();return(0,g.jsx)(N.default,{component:e??x.default,ref:n,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:t})}var be=ge;const xe=(0,y.createContext)(void 0);function Se({strict:e=!0}={}){let t=(0,y.useContext)(xe);if(e&&!t)throw Error(`LOADER_PROVIDER_NOT_FOUND`);return t}function Ce({children:e,loadingComponent:t=(0,g.jsx)(M.default,{}),...n}){return(0,g.jsx)(xe.Provider,{value:{loadingComponent:t,...n},children:e})}function we({children:e,dataParser:t,loadingComponent:n}){let{isLoading:r,data:i,dataParser:a,loadingComponent:o,error:s}=Se(),c=t??a;return r?(0,g.jsx)(g.Fragment,{children:n??o}):s||i==null?(0,g.jsx)(g.Fragment,{}):c?typeof e==`function`?(0,g.jsx)(g.Fragment,{children:e(c(i))}):(0,g.jsx)(g.Fragment,{children:e}):typeof e==`function`?(0,g.jsx)(g.Fragment,{children:e(i)}):(0,g.jsx)(g.Fragment,{children:e})}function Te({children:e,undefinedComponent:t,nullComponent:n,nullableComponent:r,logError:i}){let{isLoading:a,data:o,error:s,errorComponent:c,logError:l}=Se(),u=i??l,d=(0,y.useRef)(!1),f=e??c;return s?(u&&!d.current&&(console.error(s),d.current=!0),typeof f==`function`?f(s):f?(0,g.jsx)(g.Fragment,{children:f}):(0,g.jsx)(P.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,g.jsx)(g.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,g.jsx)(g.Fragment,{children:t}):o===null&&(u&&!d.current&&(console.error(`Data is null after loading.`),d.current=!0),n)?(0,g.jsx)(g.Fragment,{children:n}):(0,g.jsx)(P.default,{severity:`error`,children:`Failed to load data. Please try again later.`}):(0,g.jsx)(g.Fragment,{})}var Ee=Ce;const De=(0,y.createContext)({toggleMode:()=>{},mode:`dark`});function $({strict:e=!0}={}){let t=(0,y.useContext)(De);if(e&&!t)throw Error(`MODE_PROVIDER_NOT_FOUND`);return t}function Oe({children:e,mode:t=`dark`}){let[n,r]=(0,y.useState)(t),i=(0,y.useMemo)(()=>(0,w.createTheme)({palette:{mode:n}}),[n]);return(0,g.jsx)(De.Provider,{value:{mode:n,toggleMode:()=>{r(e=>e===`light`?`dark`:`light`)}},children:(0,g.jsxs)(w.ThemeProvider,{theme:i,children:[(0,g.jsx)(F.default,{}),e]})})}const ke=(0,y.createContext)({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ae({strict:e=!0}={}){let t=(0,y.useContext)(ke);if(e&&!t)throw Error(`SCREEN_SIZE_PROVIDER_NOT_FOUND`);return t}function je({children:e,largeScreenWidth:t=669,largeScreenHeight:n=660}){let[r,i]=(0,y.useState)(window.innerWidth),[a,o]=(0,y.useState)(window.innerHeight);(0,y.useEffect)(()=>{function e(){i(window.innerWidth),o(window.innerHeight)}return e(),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`resize`,e)}},[]);let s=(0,y.useMemo)(()=>r>t&&a>n,[r,a,t,n]);return(0,g.jsx)(ke.Provider,{value:{isLargeScreen:s,windowWidth:r,windowHeight:a},children:e})}const Me=(0,y.createContext)(void 0);function Ne({strict:e=!0}={}){let t=(0,y.useContext)(Me);if(e&&!t)throw Error(`SNACKBAR_PROVIDER_NOT_FOUND`);return t}function Pe({children:e,autoHideDuration:t=5e3}){let[n,r]=(0,y.useState)(!1),[i,a]=(0,y.useState)(t),[o,s]=(0,y.useState)(``),[c,l]=(0,y.useState)(`info`);function u(e,n,i){r(!0),a(i??t),l(n??`info`),s(e)}async function d(){r(!1),await(0,I.wait)(.2),s(``)}return(0,g.jsxs)(Me.Provider,{value:{addSnackbar:u},children:[(0,g.jsx)(L.default,{open:n,autoHideDuration:i,onClose:d,children:(0,g.jsx)(P.default,{onClose:d,severity:c,children:o})}),e]})}function Fe({children:e,errorComponent:t,undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,loadingComponent:o=(0,g.jsx)(M.default,{}),...s}){return(0,g.jsxs)(Ee,{loadingComponent:o,...s,children:[(0,g.jsx)(Te,{undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,children:t}),(0,g.jsx)(we,{children:e})]})}const Ie=(0,w.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 Le({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,g.jsx)(Ie,{checkedIcon:(0,g.jsx)(c.default,{sx:a,children:(0,g.jsx)(e,{style:{...o,...t}})}),icon:(0,g.jsx)(c.default,{sx:a,children:(0,g.jsx)(n,{style:{...o,...r}})}),...i})}function Re(){let{mode:e,toggleMode:t}=$(),n=e===`dark`,r=`Enable ${n?`light`:`dark`} mode`;return(0,g.jsx)(R.default,{title:r,children:(0,g.jsx)(Le,{uncheckedIcon:b.MdOutlineLightMode,checkedIcon:b.MdOutlineDarkMode,checked:n,onChange:t,"aria-label":r})})}function ze({children:e,navItems:t}){let[n,r]=(0,y.useState)(``);return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(c.default,{sx:{paddingBottom:7},children:e}),(0,g.jsx)(H.default,{sx:{position:`fixed`,bottom:0,left:0,right:0},children:(0,g.jsx)(B.default,{showLabels:!0,value:n,onChange:(e,t)=>{r(t)},children:t.map(e=>(0,g.jsx)(V.default,{...e,component:A.Link},e.value))})})]})}function Be(e){return{width:240,transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:`hidden`}}function Ve(e){return{transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.leavingScreen}),overflowX:`hidden`,width:`calc(${e.spacing(7)} + 1px)`,[e.breakpoints.up(`sm`)]:{width:`calc(${e.spacing(8)} + 1px)`}}}const He=(0,w.styled)(`div`)(({theme:e})=>({display:`flex`,alignItems:`center`,justifyContent:`flex-end`,padding:e.spacing(0,1),...e.mixins.toolbar})),Ue=(0,w.styled)(U.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})}}]})),We=(0,w.styled)(W.default,{shouldForwardProp:e=>e!==`open`})(({theme:e})=>({width:240,flexShrink:0,whiteSpace:`nowrap`,boxSizing:`border-box`,variants:[{props:({open:e})=>e,style:{...Be(e),"& .MuiDrawer-paper":Be(e)}},{props:({open:e})=>!e,style:{...Ve(e),"& .MuiDrawer-paper":Ve(e)}}]}));function Ge({title:e,navItems:t,children:n,headerElements:r}){let i=(0,w.useTheme)(),[a,o]=(0,y.useState)(!0),s=(0,A.useLocation)();function l(){o(!0)}function u(){o(!1)}return(0,g.jsxs)(c.default,{sx:{display:`flex`},children:[(0,g.jsx)(F.default,{}),(0,g.jsx)(Ue,{position:`fixed`,open:a,children:(0,g.jsxs)(K.default,{children:[(0,g.jsx)(T.default,{color:`inherit`,"aria-label":`open drawer`,onClick:l,edge:`start`,sx:[{marginRight:5},a&&{display:`none`}],children:(0,g.jsx)(b.MdMenu,{})}),(0,g.jsx)(h.default,{variant:`h6`,noWrap:!0,component:`div`,children:e}),r]})}),(0,g.jsxs)(We,{variant:`permanent`,open:a,children:[(0,g.jsx)(He,{children:(0,g.jsx)(T.default,{onClick:u,children:i.direction===`rtl`?(0,g.jsx)(b.MdChevronRight,{}):(0,g.jsx)(b.MdChevronLeft,{})})}),(0,g.jsx)(p.default,{}),t.map(e=>(0,g.jsxs)(y.Fragment,{children:[(0,g.jsxs)(E.default,{children:[(0,g.jsx)(h.default,{variant:a?`h5`:`h6`,paddingLeft:a?2:1,children:a?e.category:(0,I.truncate)(e.category,4)}),e.options.map(e=>(0,g.jsx)(D.default,{disablePadding:!0,sx:{display:`block`},children:(0,g.jsxs)(j.default,{sx:[{minHeight:48,px:2.5},a?{justifyContent:`initial`}:{justifyContent:`center`}],component:A.Link,to:e.to,selected:s.pathname===e.to,children:[(0,g.jsx)(G.default,{sx:[{minWidth:0,justifyContent:`center`},a?{mr:3}:{mr:`auto`}],children:e.icon?e.icon:a?null:(0,g.jsx)(h.default,{children:(0,I.truncate)(e.label,4)})}),(0,g.jsx)(O.default,{primary:e.label,sx:[a?{opacity:1}:{opacity:0}]})]})},e.to))]}),(0,g.jsx)(p.default,{})]},e.category))]}),(0,g.jsxs)(c.default,{component:`main`,sx:{flexGrow:1,p:3},children:[(0,g.jsx)(He,{}),n]})]})}function Ke({title:e,subtitle:t,action:n,children:r}){return(0,g.jsxs)(l.default,{children:[(0,g.jsx)(d.default,{title:(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(h.default,{variant:`h6`,children:e}),t?(0,g.jsx)(h.default,{variant:`body2`,color:`text.secondary`,children:t}):null]}),action:n}),(0,g.jsx)(p.default,{}),(0,g.jsx)(u.default,{children:r})]})}function qe({text:e,sx:t,...n}){return(0,g.jsx)(g.Fragment,{children:e.split(`
2
2
  `).map((e,r)=>(0,g.jsx)(h.default,{sx:{margin:1,...t},...n,children:e},r))})}function Je({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,g.jsx)(c.default,{sx:{borderRadius:1,border:.5,padding:2},children:(0,g.jsxs)(q.LiveProvider,{...n,code:(0,ee.stripIndent)(e??``),children:[(0,g.jsx)(h.default,{variant:`h5`,children:`Code`}),(0,g.jsx)(c.default,{sx:{border:.3,borderRadius:.3,borderColor:`darkgray`},children:(0,g.jsx)(q.LiveEditor,{})}),(0,g.jsx)(`br`,{}),(0,g.jsx)(h.default,{variant:`h5`,children:`Result`}),(0,g.jsxs)(c.default,{sx:a,children:[(0,g.jsx)(q.LivePreview,{}),(0,g.jsx)(q.LiveError,{})]})]})})}function Ye({columns:e}){return(0,g.jsx)(X.default,{children:(0,I.fillArray)(e=>(0,g.jsx)(Y.default,{children:(0,g.jsx)(J.default,{})},e),e)})}function Xe({disableClean:e,label:t,...n}){let{formState:{disabled:r,isDirty:i,isSubmitting:a}}=(0,te.useFormContext)();return(0,g.jsx)(x.default,{color:`primary`,disabled:n.disabled||e&&!i||r,loading:a,type:`submit`,variant:`contained`,...n,children:t})}function Ze(e){let[t,n]=(0,y.useState)(()=>{let t=window.location.hash.replace(`#`,``);return e&&t===``?e:t}),r=(0,y.useCallback)(()=>{let t=window.location.hash.replace(`#`,``);n(e&&t===``?e:t)},[n,e]);return(0,y.useEffect)(()=>(window.addEventListener(`hashchange`,r),()=>{window.removeEventListener(`hashchange`,r)}),[r]),[t,(0,y.useCallback)(e=>{let n=typeof e==`function`?e(t):e;n!==t&&(window.location.hash=n)},[t])]}exports.Artwork=ie,exports.CollapsableItem=ae,exports.DropdownMenu=oe,exports.DropdownMenu2=be,exports.DropdownMenuExternalLink=_e,exports.DropdownMenuInternalLink=ve,exports.DropdownMenuItem=ye,exports.ExternalLink=se,exports.FileInput=de,exports.FileInputList=fe,exports.FileType=ce,exports.IconWithPopover=pe,exports.InternalLink=Z,exports.ListItemInternalLink=me,exports.Loader=Fe,exports.LoaderData=we,exports.LoaderError=Te,exports.LoaderProvider=Ee,exports.ModeProvider=Oe,exports.ModeToggle=Re,exports.NavigationBottom=ze,exports.NavigationDrawer=Ge,exports.Page=Ke,exports.PopoverText=qe,exports.ReactPlayground=Je,exports.ScreenSizeProvider=je,exports.SkeletonRow=Ye,exports.SnackbarProvider=Pe,exports.SubmitButton=Xe,exports.SwitchWithIcons=Le,exports.useDropdownMenu=Q,exports.useHash=Ze,exports.useMode=$,exports.useScreenSize=Ae,exports.useSnackbar=Ne;
3
3
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Card","CardContent","Typography","Stack","Chip","Box","CardHeader","Divider","ButtonBase","MdArrowDropUp","MdArrowDropDown","Box","Collapse","MUIButton","MdArrowDropUp","MdArrowDropDown","Box","Menu","MUILink","Button","MdCloudUpload","Box","List","ListItem","IconButton","MdDelete","ListItemText","Box","Popover","ReactDOMLink","MUILink","ListItemButton","MUIButton","MdArrowDropUp","MdArrowDropDown","Menu","MenuItem","MenuItem","MenuItem","Button","CircularProgress","Alert","ThemeProvider","CssBaseline","Snackbar","Alert","CircularProgress","LoaderProvider","Switch","Box","Tooltip","MdOutlineLightMode","MdOutlineDarkMode","Box","Paper","BottomNavigation","BottomNavigationAction","Link","MuiAppBar","MuiDrawer","Box","CssBaseline","Toolbar","IconButton","MdMenu","Typography","MdChevronRight","MdChevronLeft","Divider","Fragment","List","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","Card","CardHeader","Typography","Divider","CardContent","Typography","Box","LiveProvider","Typography","LiveEditor","LivePreview","LiveError","TableRow","TableCell","Skeleton","Button"],"sources":["../src/components/Artwork.tsx","../src/components/CollapsableItem.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/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/Loader.tsx","../src/components/SwitchWithIcons.tsx","../src/components/ModeToggle.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/Page.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import Box from \"@mui/material/Box\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Chip from \"@mui/material/Chip\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface ContainerProps {\n containerLabel: string;\n chipLabels: Array<string>;\n}\n\nfunction Container({ containerLabel, chipLabels }: ContainerProps) {\n return (\n <Card\n sx={{\n width: 320,\n height: 420,\n backgroundColor: \"rgba(255,255,255,0.07)\",\n backdropFilter: \"blur(8px)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n boxShadow: \"0 10px 40px rgba(0,0,0,0.35)\",\n }}\n >\n <CardContent>\n <Typography variant=\"h6\" gutterBottom sx={{ color: \"#f8fafc\" }}>\n {containerLabel}\n </Typography>\n\n <Stack spacing={1}>\n {chipLabels.map((label) => {\n return (\n <Chip\n key={label}\n label={label}\n sx={{\n backgroundColor: \"rgba(255,255,255,0.11)\",\n color: \"rgba(255,255,255,0.88)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n }}\n />\n );\n })}\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nfunction Connector() {\n return (\n <Box\n sx={{\n width: 120,\n height: 6,\n borderRadius: 3,\n background: \"linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)\",\n boxShadow: \"0 0 24px rgba(167,139,250,0.55)\",\n }}\n />\n );\n}\n\n/** The artwork associated with the package's theme song, _An Interface For You And I_. */\nfunction Artwork() {\n return (\n <Card\n sx={{\n width: 1000,\n height: 1000,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n p: 4,\n background:\n \"radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)\",\n color: \"white\",\n }}\n elevation={0}\n >\n <CardHeader\n title=\"An Interface For You And I\"\n sx={{\n color: \"#f8fafc\",\n textAlign: \"center\",\n \"& .MuiCardHeader-title\": {\n fontSize: 40,\n fontWeight: 600,\n letterSpacing: 2,\n },\n }}\n />\n\n <Divider sx={{ borderColor: \"rgba(255,255,255,0.2)\" }} />\n\n <CardContent sx={{ flex: 1, display: \"flex\", alignItems: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={4}\n sx={{ width: \"100%\", justifyContent: \"center\", alignItems: \"center\" }}\n >\n <Container\n containerLabel=\"You\"\n chipLabels={[\"state\", \"context\", \"input\", \"event\", \"focus\", \"value\", \"history\"]}\n />\n <Connector />\n <Container\n containerLabel=\"I\"\n chipLabels={[\"render\", \"effect\", \"response\", \"update\", \"history\", \"layout\", \"provider\"]}\n />\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nexport default Artwork;\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\n\nexport interface CollapsableItemProps {\n /** Whether the item should initially be open or not. */\n isInitiallyOpen?: boolean;\n /** A callback function to execute when the item is open. */\n onOpen?: () => void;\n /** A callback function to execute when the item is closed. */\n onClose?: () => void;\n /** The components to render when the item is open. */\n children: ReactNode;\n /** Styling for the button. */\n buttonStyles?: SxProps;\n /** The children to pass to the button. */\n buttonContents: ReactNode;\n /** The specific button component to use. */\n buttonComponent?: ElementType;\n /** The icon to show next to the button when open. */\n openIcon?: ReactNode;\n /** The icon to show next to the button when closed. */\n closedIcon?: ReactNode;\n /** Props to pass to collapse. */\n collapseProps?: Omit<CollapseProps, \"in\">;\n /**\n * Whether or not to use the default button styling.\n *\n * Defaults to `true` if `buttonComponent` is `ButtonBase`,\n * otherwise defaults to `false`.\n */\n useDefaultStyling?: boolean;\n}\n\n/**\n * Shows a display area that can be opened to show the children components, or hidden away.\n */\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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","/* eslint-disable */\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 * @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 = <MdArrowDropUp />,\n isClosedIcon = <MdArrowDropDown />,\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 /** The URL of the place you want to navigate to. */\n href: `https://${string}` | `http://${string}` | (string & {});\n to?: never;\n /** The readable content to display on the link. */\n children: ReactNode;\n /** An optional ref to allow it to be used with polymorphic components. */\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link that is best used when you want to navigate to a different domain.\n *\n * Opens the destination in a new tab and applies recommended security defaults automatically.\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 { CreateEnumType } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\nimport { MdCloudUpload } from \"react-icons/md\";\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;\nexport type FileType = CreateEnumType<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: Array<File>) => void;\n label?: string;\n multiple?: boolean;\n accept?: Array<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 ?? <MdCloudUpload />}\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\";\n\nimport type { FileInputProps } from \"src/components/FileInput\";\n\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\";\nimport { MdDelete } from \"react-icons/md\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: Array<File>;\n setFiles: Dispatch<SetStateAction<Array<File>>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: Array<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 <MdDelete />\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 { ElementType, 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\" | \"component\"> {\n to: `/${string}` | `~/${string}` | (string & {});\n component?: ElementType;\n href?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link for navigating within your application.\n *\n * Uses the app router for client-side navigation and opens the destination in the same tab.\n *\n * Defaults to a React Router implementation but can be overridden via the `component` prop.\n *\n */\nfunction InternalLink({\n to,\n component = ReactDOMLink,\n children,\n ref,\n ...linkProps\n}: InternalLinkProps) {\n return (\n <MUILink component={component} 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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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\";\n\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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderProvider.\n * @param props.children - The components that may receive access to the LoaderContext value.\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.isLoading - The current loading status (true if loading, false if not)\n * @param props.error - The error given if the request gave an error.\n * @param props.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 props.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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderData.\n * @param props.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 props.dataParser - A parser for the data.\n * @param props.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 *\n * @param props - The props to be passed to LoaderError.\n * @param props.children - The component to show if an error has been thrown.\n * @param props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.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\";\n\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n /** The children that will be receiving the ScreenSizeContext. */\n children: ReactNode;\n /** The minimum screen width in pixels required to be considered a large screen. */\n largeScreenWidth?: number;\n /** The minimum screen height in pixels required to be considered a large screen. */\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n /** Whether the screen is a large screen or not. */\n isLargeScreen: boolean;\n /** The current window width. */\n windowWidth: number;\n /** The current window height. */\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\n/** Provides context about the current screen size. */\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { 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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to Loader.\n * @param props.children - The elements to show after data has been loaded.\n * @param props.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 props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.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 { 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 Tooltip from \"@mui/material/Tooltip\";\nimport { MdOutlineDarkMode, MdOutlineLightMode } from \"react-icons/md\";\n\nimport SwitchWithIcons from \"src/components/SwitchWithIcons\";\nimport { useMode } from \"src/providers\";\n\n/** A toggle to switch between dark mode and light mode. Must be used in a `ModeProvider`. */\nfunction ModeToggle() {\n const { mode, toggleMode } = useMode();\n const isDarkMode = mode === \"dark\";\n const modeText = `Enable ${isDarkMode ? \"light\" : \"dark\"} mode`;\n\n return (\n <Tooltip title={modeText}>\n <SwitchWithIcons\n uncheckedIcon={MdOutlineLightMode}\n checkedIcon={MdOutlineDarkMode}\n checked={isDarkMode}\n onChange={toggleMode}\n aria-label={modeText}\n />\n </Tooltip>\n );\n}\n\nexport default ModeToggle;\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: Array<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 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 { MdChevronLeft, MdChevronRight, MdMenu } from \"react-icons/md\";\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: Array<{\n label: string;\n to: string;\n icon?: ReactNode;\n }>;\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: Array<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 <MdMenu />\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\" ? <MdChevronRight /> : <MdChevronLeft />}\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 { ReactNode } from \"react\";\n\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Divider from \"@mui/material/Divider\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface PageProps {\n /** The Page title to show */\n title: string;\n /** The subtitle to show under the Page title */\n subtitle?: string;\n /** The actions to show in the page header */\n action?: ReactNode;\n /** The actual page contents */\n children: ReactNode;\n}\n\n/** Renders a pre-styled Page that can be used to structure pages throughout your React apps. */\nfunction Page({ title, subtitle, action, children }: PageProps) {\n return (\n <Card>\n <CardHeader\n title={\n <>\n <Typography variant=\"h6\">{title}</Typography>\n {subtitle ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n ) : null}\n </>\n }\n action={action}\n />\n <Divider />\n <CardContent>{children}</CardContent>\n </Card>\n );\n}\n\nexport default Page;\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 { 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":["Card","CardContent","Typography","Stack","Chip","Box","CardHeader","Divider","ButtonBase","MdArrowDropUp","MdArrowDropDown","Box","Collapse","MUIButton","MdArrowDropUp","MdArrowDropDown","Box","Menu","MUILink","Button","MdCloudUpload","Box","List","ListItem","IconButton","MdDelete","ListItemText","Box","Popover","ReactDOMLink","MUILink","ListItemButton","MUIButton","MdArrowDropUp","MdArrowDropDown","Menu","MenuItem","MenuItem","MenuItem","Button","CircularProgress","Alert","ThemeProvider","CssBaseline","Snackbar","Alert","CircularProgress","LoaderProvider","Switch","Box","Tooltip","MdOutlineLightMode","MdOutlineDarkMode","Box","Paper","BottomNavigation","BottomNavigationAction","Link","MuiAppBar","MuiDrawer","Box","CssBaseline","Toolbar","IconButton","MdMenu","Typography","MdChevronRight","MdChevronLeft","Divider","Fragment","List","ListItem","ListItemButton","Link","ListItemIcon","ListItemText","Card","CardHeader","Typography","Divider","CardContent","Typography","Box","LiveProvider","Typography","LiveEditor","LivePreview","LiveError","TableRow","TableCell","Skeleton","Button"],"sources":["../src/components/Artwork.tsx","../src/components/CollapsableItem.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/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/Loader.tsx","../src/components/SwitchWithIcons.tsx","../src/components/ModeToggle.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/Page.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import Box from \"@mui/material/Box\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Chip from \"@mui/material/Chip\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface ContainerProps {\n containerLabel: string;\n chipLabels: Array<string>;\n}\n\nfunction Container({ containerLabel, chipLabels }: ContainerProps) {\n return (\n <Card\n sx={{\n width: 320,\n height: 420,\n backgroundColor: \"rgba(255,255,255,0.07)\",\n backdropFilter: \"blur(8px)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n boxShadow: \"0 10px 40px rgba(0,0,0,0.35)\",\n }}\n >\n <CardContent>\n <Typography variant=\"h6\" gutterBottom sx={{ color: \"#f8fafc\" }}>\n {containerLabel}\n </Typography>\n\n <Stack spacing={1}>\n {chipLabels.map((label) => {\n return (\n <Chip\n key={label}\n label={label}\n sx={{\n backgroundColor: \"rgba(255,255,255,0.11)\",\n color: \"rgba(255,255,255,0.88)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n }}\n />\n );\n })}\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nfunction Connector() {\n return (\n <Box\n sx={{\n width: 120,\n height: 6,\n borderRadius: 3,\n background: \"linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)\",\n boxShadow: \"0 0 24px rgba(167,139,250,0.55)\",\n }}\n />\n );\n}\n\n/** The artwork associated with the package's theme song, _An Interface For You And I_. */\nfunction Artwork() {\n return (\n <Card\n sx={{\n width: 1000,\n height: 1000,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n p: 4,\n background:\n \"radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)\",\n color: \"white\",\n }}\n elevation={0}\n >\n <CardHeader\n title=\"An Interface For You And I\"\n sx={{\n color: \"#f8fafc\",\n textAlign: \"center\",\n \"& .MuiCardHeader-title\": {\n fontSize: 40,\n fontWeight: 600,\n letterSpacing: 2,\n },\n }}\n />\n\n <Divider sx={{ borderColor: \"rgba(255,255,255,0.2)\" }} />\n\n <CardContent sx={{ flex: 1, display: \"flex\", alignItems: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={4}\n sx={{ width: \"100%\", justifyContent: \"center\", alignItems: \"center\" }}\n >\n <Container\n containerLabel=\"You\"\n chipLabels={[\"state\", \"context\", \"input\", \"event\", \"focus\", \"value\", \"history\"]}\n />\n <Connector />\n <Container\n containerLabel=\"I\"\n chipLabels={[\"render\", \"effect\", \"response\", \"update\", \"history\", \"layout\", \"provider\"]}\n />\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nexport default Artwork;\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\n\nexport interface CollapsableItemProps {\n /** Whether the item should initially be open or not. */\n isInitiallyOpen?: boolean;\n /** A callback function to execute when the item is open. */\n onOpen?: () => void;\n /** A callback function to execute when the item is closed. */\n onClose?: () => void;\n /** The components to render when the item is open. */\n children: ReactNode;\n /** Styling for the button. */\n buttonStyles?: SxProps;\n /** The children to pass to the button. */\n buttonContents: ReactNode;\n /** The specific button component to use. */\n buttonComponent?: ElementType;\n /** The icon to show next to the button when open. */\n openIcon?: ReactNode;\n /** The icon to show next to the button when closed. */\n closedIcon?: ReactNode;\n /** Props to pass to collapse. */\n collapseProps?: Omit<CollapseProps, \"in\">;\n /**\n * Whether or not to use the default button styling.\n *\n * Defaults to `true` if `buttonComponent` is `ButtonBase`,\n * otherwise defaults to `false`.\n */\n useDefaultStyling?: boolean;\n}\n\n/**\n * Shows a display area that can be opened to show the children components, or hidden away.\n */\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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","/* eslint-disable */\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 * @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 = <MdArrowDropUp />,\n isClosedIcon = <MdArrowDropDown />,\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 /** The URL of the place you want to navigate to. */\n href: `https://${string}` | `http://${string}` | (string & {});\n to?: never;\n /** The readable content to display on the link. */\n children: ReactNode;\n /** An optional ref to allow it to be used with polymorphic components. */\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link that is best used when you want to navigate to a different domain.\n *\n * Opens the destination in a new tab and applies recommended security defaults automatically.\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 { CreateEnumType } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useId, useState } from \"react\";\nimport { MdCloudUpload } from \"react-icons/md\";\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;\nexport type FileType = CreateEnumType<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 /** A function to run when a file has been uploaded. */\n onFileInput: (allowedFiles: Array<File>) => void;\n /** The label to display on the input button (defaults to \"Upload files\") */\n label?: string;\n /** Whether to accept multiple files or not. */\n multiple?: boolean;\n /** An array of file types to accept. */\n accept?: Array<string>;\n /** Enable the dropzone, allowing users to drag and drop files. */\n useDropzone?: boolean;\n}\n\n/** Handles file inputs. */\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 const id = useId();\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File input button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(id)?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <MdCloudUpload />}\n >\n {label}\n <VisuallyHiddenInput\n id={id}\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\";\n\nimport type { FileInputProps } from \"src/components/FileInput\";\n\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\";\nimport { MdDelete } from \"react-icons/md\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n /** The array of files (must be a React state). */\n files: Array<File>;\n /** The state setter for the array of files. */\n setFiles: Dispatch<SetStateAction<Array<File>>>;\n}\n\n/** Renders the `FileInput` component with a list of uploaded files underneath it. */\nfunction FileInputList({\n files,\n setFiles,\n multiple = true,\n ...fileInputProps\n}: FileInputListProps) {\n function onFileInput(newFiles: Array<File>) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n return (\n <Box>\n <FileInput {...fileInputProps} multiple={multiple} onFileInput={onFileInput} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={`${file.name}-${file.lastModified}`}\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 <MdDelete />\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 { ElementType, 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\" | \"component\"> {\n to: `/${string}` | `~/${string}` | (string & {});\n component?: ElementType;\n href?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link for navigating within your application.\n *\n * Uses the app router for client-side navigation and opens the destination in the same tab.\n *\n * Defaults to a React Router implementation but can be overridden via the `component` prop.\n *\n */\nfunction InternalLink({\n to,\n component = ReactDOMLink,\n children,\n ref,\n ...linkProps\n}: InternalLinkProps) {\n return (\n <MUILink component={component} 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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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\";\n\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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderProvider.\n * @param props.children - The components that may receive access to the LoaderContext value.\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.isLoading - The current loading status (true if loading, false if not)\n * @param props.error - The error given if the request gave an error.\n * @param props.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 props.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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderData.\n * @param props.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 props.dataParser - A parser for the data.\n * @param props.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 *\n * @param props - The props to be passed to LoaderError.\n * @param props.children - The component to show if an error has been thrown.\n * @param props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.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\";\n\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n /** The children that will be receiving the ScreenSizeContext. */\n children: ReactNode;\n /** The minimum screen width in pixels required to be considered a large screen. */\n largeScreenWidth?: number;\n /** The minimum screen height in pixels required to be considered a large screen. */\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n /** Whether the screen is a large screen or not. */\n isLargeScreen: boolean;\n /** The current window width. */\n windowWidth: number;\n /** The current window height. */\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\n/** Provides context about the current screen size. */\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { 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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to Loader.\n * @param props.children - The elements to show after data has been loaded.\n * @param props.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 props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.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 { 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 Tooltip from \"@mui/material/Tooltip\";\nimport { MdOutlineDarkMode, MdOutlineLightMode } from \"react-icons/md\";\n\nimport SwitchWithIcons from \"src/components/SwitchWithIcons\";\nimport { useMode } from \"src/providers\";\n\n/** A toggle to switch between dark mode and light mode. Must be used in a `ModeProvider`. */\nfunction ModeToggle() {\n const { mode, toggleMode } = useMode();\n const isDarkMode = mode === \"dark\";\n const modeText = `Enable ${isDarkMode ? \"light\" : \"dark\"} mode`;\n\n return (\n <Tooltip title={modeText}>\n <SwitchWithIcons\n uncheckedIcon={MdOutlineLightMode}\n checkedIcon={MdOutlineDarkMode}\n checked={isDarkMode}\n onChange={toggleMode}\n aria-label={modeText}\n />\n </Tooltip>\n );\n}\n\nexport default ModeToggle;\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: Array<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 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 { MdChevronLeft, MdChevronRight, MdMenu } from \"react-icons/md\";\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: Array<{\n label: string;\n to: string;\n icon?: ReactNode;\n }>;\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: Array<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 <MdMenu />\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\" ? <MdChevronRight /> : <MdChevronLeft />}\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 { ReactNode } from \"react\";\n\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Divider from \"@mui/material/Divider\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface PageProps {\n /** The Page title to show */\n title: string;\n /** The subtitle to show under the Page title */\n subtitle?: string;\n /** The actions to show in the page header */\n action?: ReactNode;\n /** The actual page contents */\n children: ReactNode;\n}\n\n/** Renders a pre-styled Page that can be used to structure pages throughout your React apps. */\nfunction Page({ title, subtitle, action, children }: PageProps) {\n return (\n <Card>\n <CardHeader\n title={\n <>\n <Typography variant=\"h6\">{title}</Typography>\n {subtitle ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n ) : null}\n </>\n }\n action={action}\n />\n <Divider />\n <CardContent>{children}</CardContent>\n </Card>\n );\n}\n\nexport default Page;\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 { 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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"}
package/dist/index.d.cts CHANGED
@@ -127,12 +127,18 @@ declare const FileType: {
127
127
  };
128
128
  type FileType = CreateEnumType<typeof FileType>;
129
129
  interface FileInputProps extends ButtonOwnProps {
130
+ /** A function to run when a file has been uploaded. */
130
131
  onFileInput: (allowedFiles: Array<File>) => void;
132
+ /** The label to display on the input button (defaults to "Upload files") */
131
133
  label?: string;
134
+ /** Whether to accept multiple files or not. */
132
135
  multiple?: boolean;
136
+ /** An array of file types to accept. */
133
137
  accept?: Array<string>;
138
+ /** Enable the dropzone, allowing users to drag and drop files. */
134
139
  useDropzone?: boolean;
135
140
  }
141
+ /** Handles file inputs. */
136
142
  declare function FileInput({
137
143
  onFileInput,
138
144
  label,
@@ -144,12 +150,16 @@ declare function FileInput({
144
150
  //#endregion
145
151
  //#region src/components/FileInputList.d.ts
146
152
  interface FileInputListProps extends Omit<FileInputProps, "onFileInput"> {
153
+ /** The array of files (must be a React state). */
147
154
  files: Array<File>;
155
+ /** The state setter for the array of files. */
148
156
  setFiles: Dispatch<SetStateAction<Array<File>>>;
149
157
  }
158
+ /** Renders the `FileInput` component with a list of uploaded files underneath it. */
150
159
  declare function FileInputList({
151
160
  files,
152
161
  setFiles,
162
+ multiple,
153
163
  ...fileInputProps
154
164
  }: FileInputListProps): react_jsx_runtime0.JSX.Element;
155
165
  //#endregion
package/dist/index.d.ts CHANGED
@@ -127,12 +127,18 @@ declare const FileType: {
127
127
  };
128
128
  type FileType = CreateEnumType<typeof FileType>;
129
129
  interface FileInputProps extends ButtonOwnProps {
130
+ /** A function to run when a file has been uploaded. */
130
131
  onFileInput: (allowedFiles: Array<File>) => void;
132
+ /** The label to display on the input button (defaults to "Upload files") */
131
133
  label?: string;
134
+ /** Whether to accept multiple files or not. */
132
135
  multiple?: boolean;
136
+ /** An array of file types to accept. */
133
137
  accept?: Array<string>;
138
+ /** Enable the dropzone, allowing users to drag and drop files. */
134
139
  useDropzone?: boolean;
135
140
  }
141
+ /** Handles file inputs. */
136
142
  declare function FileInput({
137
143
  onFileInput,
138
144
  label,
@@ -144,12 +150,16 @@ declare function FileInput({
144
150
  //#endregion
145
151
  //#region src/components/FileInputList.d.ts
146
152
  interface FileInputListProps extends Omit<FileInputProps, "onFileInput"> {
153
+ /** The array of files (must be a React state). */
147
154
  files: Array<File>;
155
+ /** The state setter for the array of files. */
148
156
  setFiles: Dispatch<SetStateAction<Array<File>>>;
149
157
  }
158
+ /** Renders the `FileInput` component with a list of uploaded files underneath it. */
150
159
  declare function FileInputList({
151
160
  files,
152
161
  setFiles,
162
+ multiple,
153
163
  ...fileInputProps
154
164
  }: FileInputListProps): react_jsx_runtime0.JSX.Element;
155
165
  //#endregion
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import e from"@mui/material/Box";import t from"@mui/material/Card";import n from"@mui/material/CardContent";import r from"@mui/material/CardHeader";import i from"@mui/material/Chip";import a from"@mui/material/Divider";import o from"@mui/material/Stack";import s from"@mui/material/Typography";import{Fragment as c,jsx as l,jsxs as u}from"react/jsx-runtime";import d from"@mui/material/ButtonBase";import f from"@mui/material/Collapse";import{Fragment as p,createContext as m,useCallback as h,useContext as g,useEffect as _,useId as v,useMemo as y,useRef as ee,useState as b}from"react";import{MdArrowDropDown as x,MdArrowDropUp as S,MdChevronLeft as te,MdChevronRight as ne,MdCloudUpload as re,MdDelete as ie,MdMenu as ae,MdOutlineDarkMode as oe,MdOutlineLightMode as se}from"react-icons/md";import C from"@mui/material/Button";import w from"@mui/material/Menu";import T from"@mui/material/Link";import{ThemeProvider as ce,createTheme as le,styled as E,useTheme as ue}from"@mui/material/styles";import D from"@mui/material/IconButton";import O from"@mui/material/List";import k from"@mui/material/ListItem";import A from"@mui/material/ListItemText";import de from"@mui/material/Popover";import{Link as j,useLocation as fe}from"react-router-dom";import M from"@mui/material/ListItemButton";import N from"@mui/material/CircularProgress";import P from"@mui/material/MenuItem";import F from"@mui/material/Alert";import I from"@mui/material/CssBaseline";import{fillArray as pe,truncate as L,wait as me}from"@alextheman/utility";import he from"@mui/material/Snackbar";import ge from"@mui/material/Tooltip";import _e from"@mui/material/Switch";import ve from"@mui/material/BottomNavigation";import ye from"@mui/material/BottomNavigationAction";import be from"@mui/material/Paper";import xe from"@mui/material/AppBar";import Se from"@mui/material/Drawer";import Ce from"@mui/material/ListItemIcon";import we from"@mui/material/Toolbar";import{stripIndent as Te}from"common-tags";import{LiveEditor as Ee,LiveError as De,LivePreview as Oe,LiveProvider as ke}from"react-live";import Ae from"@mui/material/Skeleton";import je from"@mui/material/TableCell";import Me from"@mui/material/TableRow";import{useFormContext as Ne}from"react-hook-form";function R({containerLabel:e,chipLabels:r}){return l(t,{sx:{width:320,height:420,backgroundColor:`rgba(255,255,255,0.07)`,backdropFilter:`blur(8px)`,border:`1px solid rgba(255,255,255,0.06)`,boxShadow:`0 10px 40px rgba(0,0,0,0.35)`},children:u(n,{children:[l(s,{variant:`h6`,gutterBottom:!0,sx:{color:`#f8fafc`},children:e}),l(o,{spacing:1,children:r.map(e=>l(i,{label:e,sx:{backgroundColor:`rgba(255,255,255,0.11)`,color:`rgba(255,255,255,0.88)`,border:`1px solid rgba(255,255,255,0.06)`}},e))})]})})}function Pe(){return l(e,{sx:{width:120,height:6,borderRadius:3,background:`linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)`,boxShadow:`0 0 24px rgba(167,139,250,0.55)`}})}function Fe(){return u(t,{sx:{width:1e3,height:1e3,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,p:4,background:`radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)`,color:`white`},elevation:0,children:[l(r,{title:`An Interface For You And I`,sx:{color:`#f8fafc`,textAlign:`center`,"& .MuiCardHeader-title":{fontSize:40,fontWeight:600,letterSpacing:2}}}),l(a,{sx:{borderColor:`rgba(255,255,255,0.2)`}}),l(n,{sx:{flex:1,display:`flex`,alignItems:`center`},children:u(o,{direction:`row`,spacing:4,sx:{width:`100%`,justifyContent:`center`,alignItems:`center`},children:[l(R,{containerLabel:`You`,chipLabels:[`state`,`context`,`input`,`event`,`focus`,`value`,`history`]}),l(Pe,{}),l(R,{containerLabel:`I`,chipLabels:[`render`,`effect`,`response`,`update`,`history`,`layout`,`provider`]})]})})]})}function Ie({isInitiallyOpen:t,onOpen:n,onClose:r,children:i,buttonStyles:a,buttonContents:o,buttonComponent:s=d,collapseProps:c,openIcon:p=l(S,{}),closedIcon:m=l(x,{}),useDefaultStyling:h=s===d}){let[g,v]=b(!!t);return _(()=>{g&&n?n():!g&&r&&r()},[g]),u(e,{children:[u(s,{onClick:()=>{v(e=>!e)},sx:h?{width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,paddingY:1.5,paddingX:2,textAlign:`center`,"&:hover":s===d?{backgroundColor:`action.hover`}:null,...a}:a,"aria-expanded":g,children:[o,g?p:m]}),l(f,{in:g,...c,children:i})]})}function Le({children:t,button:n=C,buttonChildren:r=`Menu`,buttonProps:i,isOpenIcon:a=l(S,{}),isClosedIcon:o=l(x,{}),onOpen:s,onClose:c}){let[d,f]=b(null),p=y(()=>!!d,[d]),m={...i,onClick:e=>{f(e.currentTarget)},"aria-controls":p?`dropdown-menu`:void 0,"aria-haspopup":`true`,"aria-expanded":p};return n===C&&(m.endIcon=p?a:o),_(()=>{p&&s?s():!p&&c&&c()},[p,s,c]),u(e,{children:[l(n,{...m,children:r}),l(w,{id:`dropdown-menu`,anchorEl:d,open:p,onClose:()=>{f(null)},children:typeof t==`function`?l(e,{children:t(()=>{f(null)})}):t})]})}function z({href:e,children:t,ref:n,...r}){return l(T,{component:`a`,href:e,ref:n,target:`_blank`,rel:`noopener noreferrer`,...r,children:t})}const Re={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`},ze=E(`input`)({clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,height:1,overflow:`hidden`,position:`absolute`,bottom:0,left:0,whiteSpace:`nowrap`,width:1}),Be=E(`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 B({onFileInput:e,label:t=`Upload files`,multiple:n,accept:r,useDropzone:i,...a}){let[o,s]=b(!1),c=u(C,{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??l(re,{}),children:[t,l(ze,{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?l(Be,{$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}function Ve({files:t,setFiles:n,...r}){function i(e){n(t=>[...t,...e])}let a={...r,onFileInput:i};return a?.multiple===void 0&&(a.multiple=!0),u(e,{children:[l(B,{...a}),l(O,{children:t.map(e=>l(k,{secondaryAction:l(D,{"aria-label":`Delete`,edge:`end`,onClick:()=>{n(t=>t.filter(t=>t!==e))},children:l(ie,{})}),children:l(A,{primary:e.name})},e.name))})]})}function He({icon:t,onOpen:n,onClose:r,iconProps:i,children:a}){let[o,s]=b(null),c=!!o,d=v();function f(e){s(e.currentTarget),n&&n()}function p(){s(null),r&&r()}return u(e,{children:[l(t,{"aria-owns":c?d:void 0,"aria-haspopup":`true`,onMouseEnter:f,onMouseLeave:p,...i}),l(de,{id:d,sx:{pointerEvents:`none`},open:c,anchorEl:o,anchorOrigin:{vertical:`bottom`,horizontal:`left`},transformOrigin:{vertical:`top`,horizontal:`left`},onClose:p,disableRestoreFocus:!0,children:a})]})}function V({to:e,component:t=j,children:n,ref:r,...i}){return l(T,{component:t,to:e,ref:r,...i,children:n})}function Ue({children:e,...t}){return l(M,{component:V,...t,children:e})}const H=m(void 0);function U({strict:e=!0}={}){let t=g(H);if(e&&!t)throw Error(`DROPDOWN_MENU_NOT_FOUND`);return t}function We({children:e,button:t=C,buttonProps:n,openIcon:r=l(S,{}),closedIcon:i=l(x,{})}){let[a,o]=b(null),s=y(()=>!!a,[a]);function c(){o(null)}return u(H.Provider,{value:{closeMenu:c,isDropdownOpen:s},children:[l(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)}}),l(w,{anchorEl:a,open:s,onClose:c,children:e})]})}function Ge({ref:e,href:t,children:n,onClick:r,...i}){let{closeMenu:a}=U();return l(P,{component:z,href:t,ref:e,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function Ke({to:e,ref:t,children:n,onClick:r,...i}){let{closeMenu:a}=U();return l(P,{component:V,to:e,ref:t,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function qe({component:e,children:t,ref:n,onClick:r,...i}){let{closeMenu:a}=U();return l(P,{component:e??C,ref:n,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:t})}var Je=We;const W=m(void 0);function G({strict:e=!0}={}){let t=g(W);if(e&&!t)throw Error(`LOADER_PROVIDER_NOT_FOUND`);return t}function Ye({children:e,loadingComponent:t=l(N,{}),...n}){return l(W.Provider,{value:{loadingComponent:t,...n},children:e})}function K({children:e,dataParser:t,loadingComponent:n}){let{isLoading:r,data:i,dataParser:a,loadingComponent:o,error:s}=G(),u=t??a;return r?l(c,{children:n??o}):s||i==null?l(c,{}):u?typeof e==`function`?l(c,{children:e(u(i))}):l(c,{children:e}):typeof e==`function`?l(c,{children:e(i)}):l(c,{children:e})}function q({children:e,undefinedComponent:t,nullComponent:n,nullableComponent:r,logError:i}){let{isLoading:a,data:o,error:s,errorComponent:u,logError:d}=G(),f=i??d,p=ee(!1),m=e??u;return s?(f&&!p.current&&(console.error(s),p.current=!0),typeof m==`function`?m(s):m?l(c,{children:m}):l(F,{severity:`error`,children:s?.message??`An unknown error has occured. Please try again later.`})):!a&&o==null?r?(f&&!p.current&&(console.error(`Data is nullable after loading.`),p.current=!0),l(c,{children:r})):o===void 0&&(f&&!p.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.`),p.current=!0),t)?l(c,{children:t}):o===null&&(f&&!p.current&&(console.error(`Data is null after loading.`),p.current=!0),n)?l(c,{children:n}):l(F,{severity:`error`,children:`Failed to load data. Please try again later.`}):l(c,{})}var J=Ye;const Y=m({toggleMode:()=>{},mode:`dark`});function X({strict:e=!0}={}){let t=g(Y);if(e&&!t)throw Error(`MODE_PROVIDER_NOT_FOUND`);return t}function Xe({children:e,mode:t=`dark`}){let[n,r]=b(t),i=y(()=>le({palette:{mode:n}}),[n]);return l(Y.Provider,{value:{mode:n,toggleMode:()=>{r(e=>e===`light`?`dark`:`light`)}},children:u(ce,{theme:i,children:[l(I,{}),e]})})}const Z=m({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ze({strict:e=!0}={}){let t=g(Z);if(e&&!t)throw Error(`SCREEN_SIZE_PROVIDER_NOT_FOUND`);return t}function Qe({children:e,largeScreenWidth:t=669,largeScreenHeight:n=660}){let[r,i]=b(window.innerWidth),[a,o]=b(window.innerHeight);_(()=>{function e(){i(window.innerWidth),o(window.innerHeight)}return e(),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`resize`,e)}},[]);let s=y(()=>r>t&&a>n,[r,a,t,n]);return l(Z.Provider,{value:{isLargeScreen:s,windowWidth:r,windowHeight:a},children:e})}const Q=m(void 0);function $e({strict:e=!0}={}){let t=g(Q);if(e&&!t)throw Error(`SNACKBAR_PROVIDER_NOT_FOUND`);return t}function et({children:e,autoHideDuration:t=5e3}){let[n,r]=b(!1),[i,a]=b(t),[o,s]=b(``),[c,d]=b(`info`);function f(e,n,i){r(!0),a(i??t),d(n??`info`),s(e)}async function p(){r(!1),await me(.2),s(``)}return u(Q.Provider,{value:{addSnackbar:f},children:[l(he,{open:n,autoHideDuration:i,onClose:p,children:l(F,{onClose:p,severity:c,children:o})}),e]})}function tt({children:e,errorComponent:t,undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,loadingComponent:o=l(N,{}),...s}){return u(J,{loadingComponent:o,...s,children:[l(q,{undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,children:t}),l(K,{children:e})]})}const nt=E(_e)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:`""`,position:`absolute`,top:`50%`,transform:`translateY(-50%)`,fontSize:16,width:28,height:28}}}));function $({checkedIcon:t,checkedIconStyles:n,uncheckedIcon:r,uncheckedIconStyles:i,...a}){let o={borderRadius:`50%`,borderColor:`white`,backgroundColor:`white`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:.25},s={color:`black`,maxWidth:16.5,maxHeight:16.5};return l(nt,{checkedIcon:l(e,{sx:o,children:l(t,{style:{...s,...n}})}),icon:l(e,{sx:o,children:l(r,{style:{...s,...i}})}),...a})}function rt(){let{mode:e,toggleMode:t}=X(),n=e===`dark`,r=`Enable ${n?`light`:`dark`} mode`;return l(ge,{title:r,children:l($,{uncheckedIcon:se,checkedIcon:oe,checked:n,onChange:t,"aria-label":r})})}function it({children:t,navItems:n}){let[r,i]=b(``);return u(c,{children:[l(e,{sx:{paddingBottom:7},children:t}),l(be,{sx:{position:`fixed`,bottom:0,left:0,right:0},children:l(ve,{showLabels:!0,value:r,onChange:(e,t)=>{i(t)},children:n.map(e=>l(ye,{...e,component:j},e.value))})})]})}function at(e){return{width:240,transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:`hidden`}}function ot(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 st=E(`div`)(({theme:e})=>({display:`flex`,alignItems:`center`,justifyContent:`flex-end`,padding:e.spacing(0,1),...e.mixins.toolbar})),ct=E(xe,{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})}}]})),lt=E(Se,{shouldForwardProp:e=>e!==`open`})(({theme:e})=>({width:240,flexShrink:0,whiteSpace:`nowrap`,boxSizing:`border-box`,variants:[{props:({open:e})=>e,style:{...at(e),"& .MuiDrawer-paper":at(e)}},{props:({open:e})=>!e,style:{...ot(e),"& .MuiDrawer-paper":ot(e)}}]}));function ut({title:t,navItems:n,children:r,headerElements:i}){let o=ue(),[c,d]=b(!0),f=fe();function m(){d(!0)}function h(){d(!1)}return u(e,{sx:{display:`flex`},children:[l(I,{}),l(ct,{position:`fixed`,open:c,children:u(we,{children:[l(D,{color:`inherit`,"aria-label":`open drawer`,onClick:m,edge:`start`,sx:[{marginRight:5},c&&{display:`none`}],children:l(ae,{})}),l(s,{variant:`h6`,noWrap:!0,component:`div`,children:t}),i]})}),u(lt,{variant:`permanent`,open:c,children:[l(st,{children:l(D,{onClick:h,children:o.direction===`rtl`?l(ne,{}):l(te,{})})}),l(a,{}),n.map(e=>u(p,{children:[u(O,{children:[l(s,{variant:c?`h5`:`h6`,paddingLeft:c?2:1,children:c?e.category:L(e.category,4)}),e.options.map(e=>l(k,{disablePadding:!0,sx:{display:`block`},children:u(M,{sx:[{minHeight:48,px:2.5},c?{justifyContent:`initial`}:{justifyContent:`center`}],component:j,to:e.to,selected:f.pathname===e.to,children:[l(Ce,{sx:[{minWidth:0,justifyContent:`center`},c?{mr:3}:{mr:`auto`}],children:e.icon?e.icon:c?null:l(s,{children:L(e.label,4)})}),l(A,{primary:e.label,sx:[c?{opacity:1}:{opacity:0}]})]})},e.to))]}),l(a,{})]},e.category))]}),u(e,{component:`main`,sx:{flexGrow:1,p:3},children:[l(st,{}),r]})]})}function dt({title:e,subtitle:i,action:o,children:d}){return u(t,{children:[l(r,{title:u(c,{children:[l(s,{variant:`h6`,children:e}),i?l(s,{variant:`body2`,color:`text.secondary`,children:i}):null]}),action:o}),l(a,{}),l(n,{children:d})]})}function ft({text:e,sx:t,...n}){return l(c,{children:e.split(`
1
+ import e from"@mui/material/Box";import t from"@mui/material/Card";import n from"@mui/material/CardContent";import r from"@mui/material/CardHeader";import i from"@mui/material/Chip";import a from"@mui/material/Divider";import o from"@mui/material/Stack";import s from"@mui/material/Typography";import{Fragment as c,jsx as l,jsxs as u}from"react/jsx-runtime";import d from"@mui/material/ButtonBase";import f from"@mui/material/Collapse";import{Fragment as p,createContext as m,useCallback as h,useContext as g,useEffect as _,useId as v,useMemo as y,useRef as ee,useState as b}from"react";import{MdArrowDropDown as x,MdArrowDropUp as S,MdChevronLeft as te,MdChevronRight as ne,MdCloudUpload as re,MdDelete as ie,MdMenu as ae,MdOutlineDarkMode as oe,MdOutlineLightMode as se}from"react-icons/md";import C from"@mui/material/Button";import w from"@mui/material/Menu";import T from"@mui/material/Link";import{ThemeProvider as ce,createTheme as le,styled as E,useTheme as ue}from"@mui/material/styles";import D from"@mui/material/IconButton";import O from"@mui/material/List";import k from"@mui/material/ListItem";import A from"@mui/material/ListItemText";import de from"@mui/material/Popover";import{Link as j,useLocation as fe}from"react-router-dom";import M from"@mui/material/ListItemButton";import N from"@mui/material/CircularProgress";import P from"@mui/material/MenuItem";import F from"@mui/material/Alert";import I from"@mui/material/CssBaseline";import{fillArray as pe,truncate as L,wait as me}from"@alextheman/utility";import he from"@mui/material/Snackbar";import ge from"@mui/material/Tooltip";import _e from"@mui/material/Switch";import ve from"@mui/material/BottomNavigation";import ye from"@mui/material/BottomNavigationAction";import be from"@mui/material/Paper";import xe from"@mui/material/AppBar";import Se from"@mui/material/Drawer";import Ce from"@mui/material/ListItemIcon";import we from"@mui/material/Toolbar";import{stripIndent as Te}from"common-tags";import{LiveEditor as Ee,LiveError as De,LivePreview as Oe,LiveProvider as ke}from"react-live";import Ae from"@mui/material/Skeleton";import je from"@mui/material/TableCell";import Me from"@mui/material/TableRow";import{useFormContext as Ne}from"react-hook-form";function R({containerLabel:e,chipLabels:r}){return l(t,{sx:{width:320,height:420,backgroundColor:`rgba(255,255,255,0.07)`,backdropFilter:`blur(8px)`,border:`1px solid rgba(255,255,255,0.06)`,boxShadow:`0 10px 40px rgba(0,0,0,0.35)`},children:u(n,{children:[l(s,{variant:`h6`,gutterBottom:!0,sx:{color:`#f8fafc`},children:e}),l(o,{spacing:1,children:r.map(e=>l(i,{label:e,sx:{backgroundColor:`rgba(255,255,255,0.11)`,color:`rgba(255,255,255,0.88)`,border:`1px solid rgba(255,255,255,0.06)`}},e))})]})})}function Pe(){return l(e,{sx:{width:120,height:6,borderRadius:3,background:`linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)`,boxShadow:`0 0 24px rgba(167,139,250,0.55)`}})}function Fe(){return u(t,{sx:{width:1e3,height:1e3,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,p:4,background:`radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)`,color:`white`},elevation:0,children:[l(r,{title:`An Interface For You And I`,sx:{color:`#f8fafc`,textAlign:`center`,"& .MuiCardHeader-title":{fontSize:40,fontWeight:600,letterSpacing:2}}}),l(a,{sx:{borderColor:`rgba(255,255,255,0.2)`}}),l(n,{sx:{flex:1,display:`flex`,alignItems:`center`},children:u(o,{direction:`row`,spacing:4,sx:{width:`100%`,justifyContent:`center`,alignItems:`center`},children:[l(R,{containerLabel:`You`,chipLabels:[`state`,`context`,`input`,`event`,`focus`,`value`,`history`]}),l(Pe,{}),l(R,{containerLabel:`I`,chipLabels:[`render`,`effect`,`response`,`update`,`history`,`layout`,`provider`]})]})})]})}function Ie({isInitiallyOpen:t,onOpen:n,onClose:r,children:i,buttonStyles:a,buttonContents:o,buttonComponent:s=d,collapseProps:c,openIcon:p=l(S,{}),closedIcon:m=l(x,{}),useDefaultStyling:h=s===d}){let[g,v]=b(!!t);return _(()=>{g&&n?n():!g&&r&&r()},[g]),u(e,{children:[u(s,{onClick:()=>{v(e=>!e)},sx:h?{width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,paddingY:1.5,paddingX:2,textAlign:`center`,"&:hover":s===d?{backgroundColor:`action.hover`}:null,...a}:a,"aria-expanded":g,children:[o,g?p:m]}),l(f,{in:g,...c,children:i})]})}function Le({children:t,button:n=C,buttonChildren:r=`Menu`,buttonProps:i,isOpenIcon:a=l(S,{}),isClosedIcon:o=l(x,{}),onOpen:s,onClose:c}){let[d,f]=b(null),p=y(()=>!!d,[d]),m={...i,onClick:e=>{f(e.currentTarget)},"aria-controls":p?`dropdown-menu`:void 0,"aria-haspopup":`true`,"aria-expanded":p};return n===C&&(m.endIcon=p?a:o),_(()=>{p&&s?s():!p&&c&&c()},[p,s,c]),u(e,{children:[l(n,{...m,children:r}),l(w,{id:`dropdown-menu`,anchorEl:d,open:p,onClose:()=>{f(null)},children:typeof t==`function`?l(e,{children:t(()=>{f(null)})}):t})]})}function z({href:e,children:t,ref:n,...r}){return l(T,{component:`a`,href:e,ref:n,target:`_blank`,rel:`noopener noreferrer`,...r,children:t})}const Re={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`},ze=E(`input`)({clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,height:1,overflow:`hidden`,position:`absolute`,bottom:0,left:0,whiteSpace:`nowrap`,width:1}),Be=E(`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 B({onFileInput:e,label:t=`Upload files`,multiple:n,accept:r,useDropzone:i,...a}){let[o,s]=b(!1),c=v(),d=u(C,{variant:`contained`,component:`label`,"aria-label":`File input button`,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),document.getElementById(c)?.click())},...a,startIcon:a.startIcon??l(re,{}),children:[t,l(ze,{id:c,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?l(Be,{$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:d}):d}function Ve({files:t,setFiles:n,multiple:r=!0,...i}){function a(e){n(t=>[...t,...e])}return u(e,{children:[l(B,{...i,multiple:r,onFileInput:a}),l(O,{children:t.map(e=>l(k,{secondaryAction:l(D,{"aria-label":`Delete`,edge:`end`,onClick:()=>{n(t=>t.filter(t=>t!==e))},children:l(ie,{})}),children:l(A,{primary:e.name})},`${e.name}-${e.lastModified}`))})]})}function He({icon:t,onOpen:n,onClose:r,iconProps:i,children:a}){let[o,s]=b(null),c=!!o,d=v();function f(e){s(e.currentTarget),n&&n()}function p(){s(null),r&&r()}return u(e,{children:[l(t,{"aria-owns":c?d:void 0,"aria-haspopup":`true`,onMouseEnter:f,onMouseLeave:p,...i}),l(de,{id:d,sx:{pointerEvents:`none`},open:c,anchorEl:o,anchorOrigin:{vertical:`bottom`,horizontal:`left`},transformOrigin:{vertical:`top`,horizontal:`left`},onClose:p,disableRestoreFocus:!0,children:a})]})}function V({to:e,component:t=j,children:n,ref:r,...i}){return l(T,{component:t,to:e,ref:r,...i,children:n})}function Ue({children:e,...t}){return l(M,{component:V,...t,children:e})}const H=m(void 0);function U({strict:e=!0}={}){let t=g(H);if(e&&!t)throw Error(`DROPDOWN_MENU_NOT_FOUND`);return t}function We({children:e,button:t=C,buttonProps:n,openIcon:r=l(S,{}),closedIcon:i=l(x,{})}){let[a,o]=b(null),s=y(()=>!!a,[a]);function c(){o(null)}return u(H.Provider,{value:{closeMenu:c,isDropdownOpen:s},children:[l(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)}}),l(w,{anchorEl:a,open:s,onClose:c,children:e})]})}function Ge({ref:e,href:t,children:n,onClick:r,...i}){let{closeMenu:a}=U();return l(P,{component:z,href:t,ref:e,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function Ke({to:e,ref:t,children:n,onClick:r,...i}){let{closeMenu:a}=U();return l(P,{component:V,to:e,ref:t,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:n})}function qe({component:e,children:t,ref:n,onClick:r,...i}){let{closeMenu:a}=U();return l(P,{component:e??C,ref:n,...i,onClick:e=>{e.defaultPrevented||a(),r&&r(e)},children:t})}var Je=We;const W=m(void 0);function G({strict:e=!0}={}){let t=g(W);if(e&&!t)throw Error(`LOADER_PROVIDER_NOT_FOUND`);return t}function Ye({children:e,loadingComponent:t=l(N,{}),...n}){return l(W.Provider,{value:{loadingComponent:t,...n},children:e})}function K({children:e,dataParser:t,loadingComponent:n}){let{isLoading:r,data:i,dataParser:a,loadingComponent:o,error:s}=G(),u=t??a;return r?l(c,{children:n??o}):s||i==null?l(c,{}):u?typeof e==`function`?l(c,{children:e(u(i))}):l(c,{children:e}):typeof e==`function`?l(c,{children:e(i)}):l(c,{children:e})}function q({children:e,undefinedComponent:t,nullComponent:n,nullableComponent:r,logError:i}){let{isLoading:a,data:o,error:s,errorComponent:u,logError:d}=G(),f=i??d,p=ee(!1),m=e??u;return s?(f&&!p.current&&(console.error(s),p.current=!0),typeof m==`function`?m(s):m?l(c,{children:m}):l(F,{severity:`error`,children:s?.message??`An unknown error has occured. Please try again later.`})):!a&&o==null?r?(f&&!p.current&&(console.error(`Data is nullable after loading.`),p.current=!0),l(c,{children:r})):o===void 0&&(f&&!p.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.`),p.current=!0),t)?l(c,{children:t}):o===null&&(f&&!p.current&&(console.error(`Data is null after loading.`),p.current=!0),n)?l(c,{children:n}):l(F,{severity:`error`,children:`Failed to load data. Please try again later.`}):l(c,{})}var J=Ye;const Y=m({toggleMode:()=>{},mode:`dark`});function X({strict:e=!0}={}){let t=g(Y);if(e&&!t)throw Error(`MODE_PROVIDER_NOT_FOUND`);return t}function Xe({children:e,mode:t=`dark`}){let[n,r]=b(t),i=y(()=>le({palette:{mode:n}}),[n]);return l(Y.Provider,{value:{mode:n,toggleMode:()=>{r(e=>e===`light`?`dark`:`light`)}},children:u(ce,{theme:i,children:[l(I,{}),e]})})}const Z=m({windowWidth:0,windowHeight:0,isLargeScreen:!1});function Ze({strict:e=!0}={}){let t=g(Z);if(e&&!t)throw Error(`SCREEN_SIZE_PROVIDER_NOT_FOUND`);return t}function Qe({children:e,largeScreenWidth:t=669,largeScreenHeight:n=660}){let[r,i]=b(window.innerWidth),[a,o]=b(window.innerHeight);_(()=>{function e(){i(window.innerWidth),o(window.innerHeight)}return e(),window.addEventListener(`resize`,e),()=>{window.removeEventListener(`resize`,e)}},[]);let s=y(()=>r>t&&a>n,[r,a,t,n]);return l(Z.Provider,{value:{isLargeScreen:s,windowWidth:r,windowHeight:a},children:e})}const Q=m(void 0);function $e({strict:e=!0}={}){let t=g(Q);if(e&&!t)throw Error(`SNACKBAR_PROVIDER_NOT_FOUND`);return t}function et({children:e,autoHideDuration:t=5e3}){let[n,r]=b(!1),[i,a]=b(t),[o,s]=b(``),[c,d]=b(`info`);function f(e,n,i){r(!0),a(i??t),d(n??`info`),s(e)}async function p(){r(!1),await me(.2),s(``)}return u(Q.Provider,{value:{addSnackbar:f},children:[l(he,{open:n,autoHideDuration:i,onClose:p,children:l(F,{onClose:p,severity:c,children:o})}),e]})}function tt({children:e,errorComponent:t,undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,loadingComponent:o=l(N,{}),...s}){return u(J,{loadingComponent:o,...s,children:[l(q,{undefinedComponent:n,nullComponent:r,nullableComponent:i,logError:a,children:t}),l(K,{children:e})]})}const nt=E(_e)(()=>({padding:8,"& .MuiSwitch-track":{borderRadius:11,"&::before, &::after":{content:`""`,position:`absolute`,top:`50%`,transform:`translateY(-50%)`,fontSize:16,width:28,height:28}}}));function $({checkedIcon:t,checkedIconStyles:n,uncheckedIcon:r,uncheckedIconStyles:i,...a}){let o={borderRadius:`50%`,borderColor:`white`,backgroundColor:`white`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:.25},s={color:`black`,maxWidth:16.5,maxHeight:16.5};return l(nt,{checkedIcon:l(e,{sx:o,children:l(t,{style:{...s,...n}})}),icon:l(e,{sx:o,children:l(r,{style:{...s,...i}})}),...a})}function rt(){let{mode:e,toggleMode:t}=X(),n=e===`dark`,r=`Enable ${n?`light`:`dark`} mode`;return l(ge,{title:r,children:l($,{uncheckedIcon:se,checkedIcon:oe,checked:n,onChange:t,"aria-label":r})})}function it({children:t,navItems:n}){let[r,i]=b(``);return u(c,{children:[l(e,{sx:{paddingBottom:7},children:t}),l(be,{sx:{position:`fixed`,bottom:0,left:0,right:0},children:l(ve,{showLabels:!0,value:r,onChange:(e,t)=>{i(t)},children:n.map(e=>l(ye,{...e,component:j},e.value))})})]})}function at(e){return{width:240,transition:e.transitions.create(`width`,{easing:e.transitions.easing.sharp,duration:e.transitions.duration.enteringScreen}),overflowX:`hidden`}}function ot(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 st=E(`div`)(({theme:e})=>({display:`flex`,alignItems:`center`,justifyContent:`flex-end`,padding:e.spacing(0,1),...e.mixins.toolbar})),ct=E(xe,{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})}}]})),lt=E(Se,{shouldForwardProp:e=>e!==`open`})(({theme:e})=>({width:240,flexShrink:0,whiteSpace:`nowrap`,boxSizing:`border-box`,variants:[{props:({open:e})=>e,style:{...at(e),"& .MuiDrawer-paper":at(e)}},{props:({open:e})=>!e,style:{...ot(e),"& .MuiDrawer-paper":ot(e)}}]}));function ut({title:t,navItems:n,children:r,headerElements:i}){let o=ue(),[c,d]=b(!0),f=fe();function m(){d(!0)}function h(){d(!1)}return u(e,{sx:{display:`flex`},children:[l(I,{}),l(ct,{position:`fixed`,open:c,children:u(we,{children:[l(D,{color:`inherit`,"aria-label":`open drawer`,onClick:m,edge:`start`,sx:[{marginRight:5},c&&{display:`none`}],children:l(ae,{})}),l(s,{variant:`h6`,noWrap:!0,component:`div`,children:t}),i]})}),u(lt,{variant:`permanent`,open:c,children:[l(st,{children:l(D,{onClick:h,children:o.direction===`rtl`?l(ne,{}):l(te,{})})}),l(a,{}),n.map(e=>u(p,{children:[u(O,{children:[l(s,{variant:c?`h5`:`h6`,paddingLeft:c?2:1,children:c?e.category:L(e.category,4)}),e.options.map(e=>l(k,{disablePadding:!0,sx:{display:`block`},children:u(M,{sx:[{minHeight:48,px:2.5},c?{justifyContent:`initial`}:{justifyContent:`center`}],component:j,to:e.to,selected:f.pathname===e.to,children:[l(Ce,{sx:[{minWidth:0,justifyContent:`center`},c?{mr:3}:{mr:`auto`}],children:e.icon?e.icon:c?null:l(s,{children:L(e.label,4)})}),l(A,{primary:e.label,sx:[c?{opacity:1}:{opacity:0}]})]})},e.to))]}),l(a,{})]},e.category))]}),u(e,{component:`main`,sx:{flexGrow:1,p:3},children:[l(st,{}),r]})]})}function dt({title:e,subtitle:i,action:o,children:d}){return u(t,{children:[l(r,{title:u(c,{children:[l(s,{variant:`h6`,children:e}),i?l(s,{variant:`body2`,color:`text.secondary`,children:i}):null]}),action:o}),l(a,{}),l(n,{children:d})]})}function ft({text:e,sx:t,...n}){return l(c,{children:e.split(`
2
2
  `).map((e,r)=>l(s,{sx:{margin:1,...t},...n,children:e},r))})}function pt({code:t,previewStyles:n,...r}){let{mode:i}=X(),a={backgroundColor:i===`dark`?`black`:`white`,border:.3,borderRadius:1,padding:2,borderColor:`darkgray`},o=n?{...a,...n}:{...a};return l(e,{sx:{borderRadius:1,border:.5,padding:2},children:u(ke,{...r,code:Te(t??``),children:[l(s,{variant:`h5`,children:`Code`}),l(e,{sx:{border:.3,borderRadius:.3,borderColor:`darkgray`},children:l(Ee,{})}),l(`br`,{}),l(s,{variant:`h5`,children:`Result`}),u(e,{sx:o,children:[l(Oe,{}),l(De,{})]})]})})}function mt({columns:e}){return l(Me,{children:pe(e=>l(je,{children:l(Ae,{})},e),e)})}function ht({disableClean:e,label:t,...n}){let{formState:{disabled:r,isDirty:i,isSubmitting:a}}=Ne();return l(C,{color:`primary`,disabled:n.disabled||e&&!i||r,loading:a,type:`submit`,variant:`contained`,...n,children:t})}function gt(e){let[t,n]=b(()=>{let t=window.location.hash.replace(`#`,``);return e&&t===``?e:t}),r=h(()=>{let t=window.location.hash.replace(`#`,``);n(e&&t===``?e:t)},[n,e]);return _(()=>(window.addEventListener(`hashchange`,r),()=>{window.removeEventListener(`hashchange`,r)}),[r]),[t,h(e=>{let n=typeof e==`function`?e(t):e;n!==t&&(window.location.hash=n)},[t])]}export{Fe as Artwork,Ie as CollapsableItem,Le as DropdownMenu,Je as DropdownMenu2,Ge as DropdownMenuExternalLink,Ke as DropdownMenuInternalLink,qe as DropdownMenuItem,z as ExternalLink,B as FileInput,Ve as FileInputList,Re as FileType,He as IconWithPopover,V as InternalLink,Ue as ListItemInternalLink,tt as Loader,K as LoaderData,q as LoaderError,J as LoaderProvider,Xe as ModeProvider,rt as ModeToggle,it as NavigationBottom,ut as NavigationDrawer,dt as Page,ft as PopoverText,pt as ReactPlayground,Qe as ScreenSizeProvider,mt as SkeletonRow,et as SnackbarProvider,ht as SubmitButton,$ as SwitchWithIcons,U as useDropdownMenu,gt as useHash,X as useMode,Ze as useScreenSize,$e as useSnackbar};
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Button","ReactDOMLink","Button","LoaderProvider","Fragment","Button"],"sources":["../src/components/Artwork.tsx","../src/components/CollapsableItem.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/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/Loader.tsx","../src/components/SwitchWithIcons.tsx","../src/components/ModeToggle.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/Page.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import Box from \"@mui/material/Box\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Chip from \"@mui/material/Chip\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface ContainerProps {\n containerLabel: string;\n chipLabels: Array<string>;\n}\n\nfunction Container({ containerLabel, chipLabels }: ContainerProps) {\n return (\n <Card\n sx={{\n width: 320,\n height: 420,\n backgroundColor: \"rgba(255,255,255,0.07)\",\n backdropFilter: \"blur(8px)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n boxShadow: \"0 10px 40px rgba(0,0,0,0.35)\",\n }}\n >\n <CardContent>\n <Typography variant=\"h6\" gutterBottom sx={{ color: \"#f8fafc\" }}>\n {containerLabel}\n </Typography>\n\n <Stack spacing={1}>\n {chipLabels.map((label) => {\n return (\n <Chip\n key={label}\n label={label}\n sx={{\n backgroundColor: \"rgba(255,255,255,0.11)\",\n color: \"rgba(255,255,255,0.88)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n }}\n />\n );\n })}\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nfunction Connector() {\n return (\n <Box\n sx={{\n width: 120,\n height: 6,\n borderRadius: 3,\n background: \"linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)\",\n boxShadow: \"0 0 24px rgba(167,139,250,0.55)\",\n }}\n />\n );\n}\n\n/** The artwork associated with the package's theme song, _An Interface For You And I_. */\nfunction Artwork() {\n return (\n <Card\n sx={{\n width: 1000,\n height: 1000,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n p: 4,\n background:\n \"radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)\",\n color: \"white\",\n }}\n elevation={0}\n >\n <CardHeader\n title=\"An Interface For You And I\"\n sx={{\n color: \"#f8fafc\",\n textAlign: \"center\",\n \"& .MuiCardHeader-title\": {\n fontSize: 40,\n fontWeight: 600,\n letterSpacing: 2,\n },\n }}\n />\n\n <Divider sx={{ borderColor: \"rgba(255,255,255,0.2)\" }} />\n\n <CardContent sx={{ flex: 1, display: \"flex\", alignItems: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={4}\n sx={{ width: \"100%\", justifyContent: \"center\", alignItems: \"center\" }}\n >\n <Container\n containerLabel=\"You\"\n chipLabels={[\"state\", \"context\", \"input\", \"event\", \"focus\", \"value\", \"history\"]}\n />\n <Connector />\n <Container\n containerLabel=\"I\"\n chipLabels={[\"render\", \"effect\", \"response\", \"update\", \"history\", \"layout\", \"provider\"]}\n />\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nexport default Artwork;\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\n\nexport interface CollapsableItemProps {\n /** Whether the item should initially be open or not. */\n isInitiallyOpen?: boolean;\n /** A callback function to execute when the item is open. */\n onOpen?: () => void;\n /** A callback function to execute when the item is closed. */\n onClose?: () => void;\n /** The components to render when the item is open. */\n children: ReactNode;\n /** Styling for the button. */\n buttonStyles?: SxProps;\n /** The children to pass to the button. */\n buttonContents: ReactNode;\n /** The specific button component to use. */\n buttonComponent?: ElementType;\n /** The icon to show next to the button when open. */\n openIcon?: ReactNode;\n /** The icon to show next to the button when closed. */\n closedIcon?: ReactNode;\n /** Props to pass to collapse. */\n collapseProps?: Omit<CollapseProps, \"in\">;\n /**\n * Whether or not to use the default button styling.\n *\n * Defaults to `true` if `buttonComponent` is `ButtonBase`,\n * otherwise defaults to `false`.\n */\n useDefaultStyling?: boolean;\n}\n\n/**\n * Shows a display area that can be opened to show the children components, or hidden away.\n */\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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","/* eslint-disable */\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 * @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 = <MdArrowDropUp />,\n isClosedIcon = <MdArrowDropDown />,\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 /** The URL of the place you want to navigate to. */\n href: `https://${string}` | `http://${string}` | (string & {});\n to?: never;\n /** The readable content to display on the link. */\n children: ReactNode;\n /** An optional ref to allow it to be used with polymorphic components. */\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link that is best used when you want to navigate to a different domain.\n *\n * Opens the destination in a new tab and applies recommended security defaults automatically.\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 { CreateEnumType } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useState } from \"react\";\nimport { MdCloudUpload } from \"react-icons/md\";\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;\nexport type FileType = CreateEnumType<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: Array<File>) => void;\n label?: string;\n multiple?: boolean;\n accept?: Array<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 ?? <MdCloudUpload />}\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\";\n\nimport type { FileInputProps } from \"src/components/FileInput\";\n\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\";\nimport { MdDelete } from \"react-icons/md\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n files: Array<File>;\n setFiles: Dispatch<SetStateAction<Array<File>>>;\n}\n\nfunction FileInputList({ files, setFiles, ...fileInputProps }: FileInputListProps) {\n function onFileInput(newFiles: Array<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 <MdDelete />\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 { ElementType, 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\" | \"component\"> {\n to: `/${string}` | `~/${string}` | (string & {});\n component?: ElementType;\n href?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link for navigating within your application.\n *\n * Uses the app router for client-side navigation and opens the destination in the same tab.\n *\n * Defaults to a React Router implementation but can be overridden via the `component` prop.\n *\n */\nfunction InternalLink({\n to,\n component = ReactDOMLink,\n children,\n ref,\n ...linkProps\n}: InternalLinkProps) {\n return (\n <MUILink component={component} 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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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\";\n\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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderProvider.\n * @param props.children - The components that may receive access to the LoaderContext value.\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.isLoading - The current loading status (true if loading, false if not)\n * @param props.error - The error given if the request gave an error.\n * @param props.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 props.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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderData.\n * @param props.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 props.dataParser - A parser for the data.\n * @param props.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 *\n * @param props - The props to be passed to LoaderError.\n * @param props.children - The component to show if an error has been thrown.\n * @param props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.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\";\n\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n /** The children that will be receiving the ScreenSizeContext. */\n children: ReactNode;\n /** The minimum screen width in pixels required to be considered a large screen. */\n largeScreenWidth?: number;\n /** The minimum screen height in pixels required to be considered a large screen. */\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n /** Whether the screen is a large screen or not. */\n isLargeScreen: boolean;\n /** The current window width. */\n windowWidth: number;\n /** The current window height. */\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\n/** Provides context about the current screen size. */\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { 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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to Loader.\n * @param props.children - The elements to show after data has been loaded.\n * @param props.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 props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.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 { 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 Tooltip from \"@mui/material/Tooltip\";\nimport { MdOutlineDarkMode, MdOutlineLightMode } from \"react-icons/md\";\n\nimport SwitchWithIcons from \"src/components/SwitchWithIcons\";\nimport { useMode } from \"src/providers\";\n\n/** A toggle to switch between dark mode and light mode. Must be used in a `ModeProvider`. */\nfunction ModeToggle() {\n const { mode, toggleMode } = useMode();\n const isDarkMode = mode === \"dark\";\n const modeText = `Enable ${isDarkMode ? \"light\" : \"dark\"} mode`;\n\n return (\n <Tooltip title={modeText}>\n <SwitchWithIcons\n uncheckedIcon={MdOutlineLightMode}\n checkedIcon={MdOutlineDarkMode}\n checked={isDarkMode}\n onChange={toggleMode}\n aria-label={modeText}\n />\n </Tooltip>\n );\n}\n\nexport default ModeToggle;\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: Array<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 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 { MdChevronLeft, MdChevronRight, MdMenu } from \"react-icons/md\";\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: Array<{\n label: string;\n to: string;\n icon?: ReactNode;\n }>;\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: Array<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 <MdMenu />\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\" ? <MdChevronRight /> : <MdChevronLeft />}\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 { ReactNode } from \"react\";\n\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Divider from \"@mui/material/Divider\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface PageProps {\n /** The Page title to show */\n title: string;\n /** The subtitle to show under the Page title */\n subtitle?: string;\n /** The actions to show in the page header */\n action?: ReactNode;\n /** The actual page contents */\n children: ReactNode;\n}\n\n/** Renders a pre-styled Page that can be used to structure pages throughout your React apps. */\nfunction Page({ title, subtitle, action, children }: PageProps) {\n return (\n <Card>\n <CardHeader\n title={\n <>\n <Typography variant=\"h6\">{title}</Typography>\n {subtitle ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n ) : null}\n </>\n }\n action={action}\n />\n <Divider />\n <CardContent>{children}</CardContent>\n </Card>\n );\n}\n\nexport default Page;\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 { 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":"0rEAcA,SAAS,EAAU,CAAE,iBAAgB,cAA8B,CACjE,OACE,EAAC,EAAD,CACE,GAAI,CACF,MAAO,IACP,OAAQ,IACR,gBAAiB,yBACjB,eAAgB,YAChB,OAAQ,mCACR,UAAW,+BACZ,UAED,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAY,QAAQ,KAAK,aAAA,GAAa,GAAI,CAAE,MAAO,UAAW,UAC3D,EACU,CAAA,CAEb,EAAC,EAAD,CAAO,QAAS,WACb,EAAW,IAAK,GAEb,EAAC,EAAD,CAES,QACP,GAAI,CACF,gBAAiB,yBACjB,MAAO,yBACP,OAAQ,mCACT,CACD,CAPK,EAOL,CAEJ,CACI,CAAA,CACI,CAAA,CAAA,CACT,CAAA,CAIX,SAAS,IAAY,CACnB,OACE,EAAC,EAAD,CACE,GAAI,CACF,MAAO,IACP,OAAQ,EACR,aAAc,EACd,WAAY,oDACZ,UAAW,kCACZ,CACD,CAAA,CAKN,SAAS,IAAU,CACjB,OACE,EAAC,EAAD,CACE,GAAI,CACF,MAAO,IACP,OAAQ,IACR,QAAS,OACT,cAAe,SACf,eAAgB,gBAChB,EAAG,EACH,WACE,+KACF,MAAO,QACR,CACD,UAAW,WAZb,CAcE,EAAC,EAAD,CACE,MAAM,6BACN,GAAI,CACF,MAAO,UACP,UAAW,SACX,yBAA0B,CACxB,SAAU,GACV,WAAY,IACZ,cAAe,EAChB,CACF,CACD,CAAA,CAEF,EAAC,EAAD,CAAS,GAAI,CAAE,YAAa,wBAAyB,CAAI,CAAA,CAEzD,EAAC,EAAD,CAAa,GAAI,CAAE,KAAM,EAAG,QAAS,OAAQ,WAAY,SAAU,UACjE,EAAC,EAAD,CACE,UAAU,MACV,QAAS,EACT,GAAI,CAAE,MAAO,OAAQ,eAAgB,SAAU,WAAY,SAAU,UAHvE,CAKE,EAAC,EAAD,CACE,eAAe,MACf,WAAY,CAAC,QAAS,UAAW,QAAS,QAAS,QAAS,QAAS,UAAU,CAC/E,CAAA,CACF,EAAC,GAAD,EAAa,CAAA,CACb,EAAC,EAAD,CACE,eAAe,IACf,WAAY,CAAC,SAAU,SAAU,WAAY,SAAU,UAAW,SAAU,WAAW,CACvF,CAAA,CACI,GACI,CAAA,CACT,GCvEX,SAAS,GAAgB,CACvB,kBACA,SACA,UACA,WACA,eACA,iBACA,gBAAiB,EAAkB,EACnC,gBACA,WAAW,EAAC,EAAD,EAAiB,CAAA,CAC5B,aAAa,EAAC,EAAD,EAAmB,CAAA,CAChC,oBAAoB,IAAoB,GACjB,CACvB,GAAM,CAAC,EAAY,GAAiB,EAAkB,CAAC,CAAC,EAAgB,CAUxE,OARA,MAAgB,CACV,GAAc,EAChB,GAAQ,CACC,CAAC,GAAc,GACxB,GAAS,EAEV,CAAC,EAAW,CAAC,CAGd,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CACE,YAAe,CACb,EAAe,GACN,CAAC,EACR,EAEJ,GACE,EACI,CACE,MAAO,OACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,SAAU,IACV,SAAU,EACV,UAAW,SACX,UACE,IAAoB,EAAa,CAAE,gBAAiB,eAAgB,CAAG,KACzE,GAAG,EACJ,CACD,EAEN,gBAAe,WAtBjB,CAwBG,EACA,EAAa,EAAW,EACT,GAClB,EAAC,EAAD,CAAU,GAAI,EAAY,GAAI,EAC3B,WACQ,CAAA,CACP,CAAA,CAAA,CCxEV,SAAS,GAAa,CACpB,WACA,OAAQ,EAAS,EACjB,iBAAiB,OACjB,YAAa,EACb,aAAa,EAAC,EAAD,EAAiB,CAAA,CAC9B,eAAe,EAAC,EAAD,EAAmB,CAAA,CAClC,SACA,WACoB,CACpB,GAAM,CAAC,EAAe,GAAoB,EAA6B,KAAK,CACtE,EAAiB,MACd,CAAC,CAAC,EACR,CAAC,EAAc,CAAC,CAEb,EAAuC,CAC3C,GAAG,EACH,QAAU,GAAwC,CAChD,EAAiB,EAAM,cAAc,EAEvC,gBAAiB,EAAiB,gBAAkB,IAAA,GACpD,gBAAiB,OACjB,gBAAiB,EAClB,CAcD,OAZI,IAAW,IACb,EAAY,QAAU,EAAiB,EAAa,GAGtD,MAAgB,CACV,GAAkB,EACpB,GAAQ,CACC,CAAC,GAAkB,GAC5B,GAAS,EAEV,CAAC,EAAgB,EAAQ,EAAQ,CAAC,CAGnC,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAQ,GAAI,WAAc,EAAwB,CAAA,CAClD,EAAC,EAAD,CACE,GAAG,gBACH,SAAU,EACV,KAAM,EACN,YAAe,CACb,EAAiB,KAAK,WAGvB,OAAO,GAAa,WACnB,EAAC,EAAD,CAAA,SACG,MAAe,CACd,EAAiB,KAAK,EACtB,CACE,CAAA,CAEN,EAEG,CAAA,CACH,CAAA,CAAA,CChEV,SAAS,EAAa,CAAE,OAAM,WAAU,MAAK,GAAG,GAAgC,CAC9E,OACE,EAAC,EAAD,CACE,UAAU,IACJ,OACD,MACL,OAAO,SACP,IAAI,sBACJ,GAAI,EAEH,WACO,CAAA,CCvBd,MAAa,GAAW,CACtB,IAAK,kBACL,IAAK,YACL,KAAM,aACN,IAAK,YACL,KAAM,oEACN,KAAM,0EACN,IAAK,YACL,IAAK,YACL,IAAK,YACN,CAGK,GAAsB,EAAO,QAAQ,CAAC,CAC1C,KAAM,gBACN,SAAU,aACV,OAAQ,EACR,SAAU,SACV,SAAU,WACV,OAAQ,EACR,KAAM,EACN,WAAY,SACZ,MAAO,EACR,CAAC,CAEI,GAAW,EAAO,MAAM,EAA0B,CAAE,QAAO,gBACxD,CACL,OAAQ,aACR,YAAa,EAAY,EAAM,QAAQ,QAAQ,KAAO,OACtD,gBAAiB,EAAY,EAAM,QAAQ,OAAO,MAAQ,cAC1D,aAAc,EACd,QAAS,SACT,UAAW,SACX,WAAY,oBACZ,OAAQ,UACT,EACD,CAUF,SAAS,EAAU,CACjB,cACA,QAAQ,eACR,WACA,SACA,cACA,GAAG,GACc,CACjB,GAAM,CAAC,EAAY,GAAiB,EAAkB,GAAM,CAEtD,EACJ,EAACA,EAAD,CACE,QAAQ,YACR,UAAU,QACV,aAAW,qBACX,UAAY,GAAU,EAChB,EAAM,MAAQ,SAAW,EAAM,MAAQ,OACzC,EAAM,gBAAgB,CACtB,SAAS,eAAe,aAAa,EAAE,OAAO,GAGlD,GAAI,EACJ,UAAW,EAAY,WAAa,EAAC,GAAD,EAAiB,CAAA,UAXvD,CAaG,EACD,EAAC,GAAD,CACE,GAAG,aACH,KAAK,OACL,SAAW,GAAU,CACnB,IAAM,EAAQ,EAAM,OACpB,EAAY,MAAM,KAAK,EAAM,OAAS,EAAE,CAAC,CAAC,CAC1C,EAAM,MAAQ,IAEN,WACV,OAAQ,GAAQ,KAAK,IAAI,CACzB,SAAU,EAAY,SACtB,CAAA,CACK,GAGX,OAAO,EACL,EAAC,GAAD,CACE,UAAW,EACX,WAAa,GAAU,CACrB,EAAM,gBAAgB,CAClB,GAAY,UAGhB,EAAc,GAAK,EAErB,YAAc,GAAU,CACtB,EAAM,gBAAgB,CACtB,EAAc,GAAM,EAEtB,OAAS,GAAU,CACjB,EAAM,gBAAgB,CACtB,EAAc,GAAM,CAChB,GAAY,UAIhB,EADmB,MAAM,KAAK,EAAM,aAAa,OAAS,EAAE,CAAC,CACtC,WAGxB,EACQ,CAAA,CAEX,ECvGJ,SAAS,GAAc,CAAE,QAAO,WAAU,GAAG,GAAsC,CACjF,SAAS,EAAY,EAAuB,CAC1C,EAAU,GACD,CAAC,GAAG,EAAU,GAAG,EAAS,CACjC,CAGJ,IAAM,EAAoB,CAAE,GAAG,EAAgB,cAAa,CAK5D,OAJI,GAAmB,WAAa,IAAA,KAClC,EAAkB,SAAW,IAI7B,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAW,GAAI,EAAqB,CAAA,CACpC,EAAC,EAAD,CAAA,SACG,EAAM,IAAK,GAER,EAAC,EAAD,CAEE,gBACE,EAAC,EAAD,CACE,aAAW,SACX,KAAK,MACL,YAAe,CACb,EAAU,GACD,EAAS,OAAQ,GACf,IAAiB,EACxB,CACF,WAGJ,EAAC,GAAD,EAAY,CAAA,CACD,CAAA,UAGf,EAAC,EAAD,CAAc,QAAS,EAAK,KAAQ,CAAA,CAC3B,CAlBJ,EAAK,KAkBD,CAEb,CACG,CAAA,CACH,CAAA,CAAA,CCvCV,SAAS,GAAgB,CACvB,KAAM,EACN,SACA,UACA,YACA,YACuB,CACvB,GAAM,CAAC,EAAe,GAAoB,EAAyB,KAAK,CAClE,EAAgB,CAAC,CAAC,EAClB,EAAY,GAAO,CAEzB,SAAS,EAAW,EAAmD,CACrE,EAAiB,EAAM,cAAc,CACjC,GACF,GAAQ,CAIZ,SAAS,GAAc,CACrB,EAAiB,KAAK,CAClB,GACF,GAAS,CAIb,OACE,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CACE,YAAW,EAAgB,EAAY,IAAA,GACvC,gBAAc,OACd,aAAc,EACd,aAAc,EACd,GAAI,EACJ,CAAA,CACF,EAAC,GAAD,CACE,GAAI,EACJ,GAAI,CAAE,cAAe,OAAQ,CAC7B,KAAM,EACN,SAAU,EACV,aAAc,CACZ,SAAU,SACV,WAAY,OACb,CACD,gBAAiB,CACf,SAAU,MACV,WAAY,OACb,CACD,QAAS,EACT,oBAAA,GAEC,WACO,CAAA,CACN,CAAA,CAAA,CClDV,SAAS,EAAa,CACpB,KACA,YAAYC,EACZ,WACA,MACA,GAAG,GACiB,CACpB,OACE,EAAC,EAAD,CAAoB,YAAe,KAAS,MAAK,GAAI,EAClD,WACO,CAAA,CCpBd,SAAS,GAAqB,CAAE,WAAU,GAAG,GAAkD,CAC7F,OACE,EAAC,EAAD,CAAgB,UAAW,EAAc,GAAI,EAC1C,WACc,CAAA,CCArB,MAAM,EAAsB,EAAoD,IAAA,GAAU,CAE1F,SAAgB,EAA+C,CAC7D,SAAS,IACqB,EAAE,CAAyD,CACzF,IAAM,EAAU,EAAW,EAAoB,CAC/C,GAAI,GAAU,CAAC,EACb,MAAU,MAAM,0BAA0B,CAE5C,OAAO,EAaT,SAAS,GAAc,CACrB,WACA,OAAQ,EAAS,EACjB,cACA,WAAW,EAAC,EAAD,EAAiB,CAAA,CAC5B,aAAa,EAAC,EAAD,EAAmB,CAAA,EACX,CACrB,GAAM,CAAC,EAAe,GAAoB,EAA6B,KAAK,CAEtE,EAAiB,MACd,CAAC,CAAC,EACR,CAAC,EAAc,CAAC,CAEnB,SAAS,GAAY,CACnB,EAAiB,KAAK,CAGxB,OACE,EAAC,EAAoB,SAArB,CAA8B,MAAO,CAAE,YAAW,iBAAgB,UAAlE,CACE,EAAC,EAAD,CACE,gBAAe,EAAiB,gBAAkB,IAAA,GAClD,gBAAc,OACd,gBAAe,EACf,QAAS,EAAiB,EAAW,EACrC,GAAI,EACJ,QAAU,GAAwC,CAC3C,EAAM,kBACT,EAAiB,EAAM,cAAc,CAEnC,GAAa,SACf,GAAa,QAAQ,EAAM,EAG/B,CAAA,CACF,EAAC,EAAD,CAAM,SAAU,EAAe,KAAM,EAAgB,QAAS,EAC3D,WACI,CAAA,CACsB,GC5DnC,SAAS,GAAyB,CAChC,MACA,OACA,WACA,UACA,GAAG,GAC6B,CAChC,GAAM,CAAE,aAAc,GAAiB,CAEvC,OACE,EAAC,EAAD,CACE,UAAW,EACL,OACD,MACL,GAAI,EACJ,QAAU,GAAU,CACb,EAAM,kBACT,GAAW,CAET,GACF,EAAQ,EAAM,EAIjB,WACQ,CAAA,CCzBf,SAAS,GAAyB,CAChC,KACA,MACA,WACA,UACA,GAAG,GAC6B,CAChC,GAAM,CAAE,aAAc,GAAiB,CAEvC,OACE,EAAC,EAAD,CACE,UAAW,EACP,KACC,MACL,GAAI,EACJ,QAAU,GAAU,CACb,EAAM,kBACT,GAAW,CAET,GACF,EAAQ,EAAM,EAIjB,WACQ,CAAA,CClBf,SAAS,GAAoD,CAC3D,YACA,WACA,MACA,UACA,GAAG,GACoC,CACvC,GAAM,CAAE,aAAc,GAAiB,CAGvC,OACE,EAAC,EAAD,CACE,UAJkB,GAAaC,EAK1B,MACL,GAAI,EACJ,QAAU,GAAU,CACb,EAAM,kBACT,GAAW,CAET,GACF,EAAQ,EAAM,EAIjB,WACQ,CAAA,CCnCf,IAAA,GAAe,GC6Bf,MAAM,EAAgB,EAAuD,IAAA,GAAU,CAEvF,SAAgB,EAAmD,CACjE,SAAS,IACqB,EAAE,CAA6D,CAC7F,IAAM,EAAU,EAAW,EAAc,CACzC,GAAI,GAAU,CAAC,EACb,MAAU,MAAM,4BAA4B,CAE9C,OAAO,EAiBT,SAAS,GAAyB,CAChC,WACA,mBAAmB,EAAC,EAAD,EAAoB,CAAA,CACvC,GAAG,GAC6B,CAChC,OACE,EAAC,EAAc,SAAf,CAAwB,MAAO,CAAE,mBAAkB,GAAG,EAAc,CACjE,WACsB,CAAA,CChD7B,SAAS,EAAqB,CAC5B,WACA,WAAY,EACZ,oBAC4B,CAC5B,GAAM,CACJ,YACA,OACA,WAAY,EACZ,iBAAkB,EAClB,SACE,GAAqB,CACnB,EAAa,GAAoB,EAmBvC,OAjBI,EACK,EAAA,EAAA,CAAA,SAAG,GAAoB,EAA2B,CAAA,CAGvD,GAKA,GAAS,KACJ,EAAA,EAAA,EAAK,CAAA,CAGV,EACK,OAAO,GAAa,WAAa,EAAA,EAAA,CAAA,SAAG,EAAS,EAAW,EAAK,CAAC,CAAI,CAAA,CAAG,EAAA,EAAA,CAAG,WAAY,CAAA,CAGtF,OAAO,GAAa,WAAa,EAAA,EAAA,CAAA,SAAG,EAAS,EAAK,CAAI,CAAA,CAAG,EAAA,EAAA,CAAG,WAAY,CAAA,CCjBjF,SAAS,EAAY,CACnB,WACA,qBACA,gBACA,oBACA,SAAU,GACS,CACnB,GAAM,CACJ,YACA,OACA,QACA,eAAgB,EAChB,SAAU,GACR,GAAW,CACT,EAAW,GAAiB,EAC5B,EAAa,GAAO,GAAM,CAE1B,EAAiB,GAAY,EAyDnC,OAvDI,GACE,GAAY,CAAC,EAAW,UAC1B,QAAQ,MAAM,EAAM,CACpB,EAAW,QAAU,IAEnB,OAAO,GAAmB,WACrB,EAAe,EAAM,CAE1B,EACK,EAAA,EAAA,CAAA,SAAG,EAAkB,CAAA,CAI5B,EAAC,EAAD,CAAO,SAAS,iBACZ,GAAiB,SAAW,wDACxB,CAAA,EAIR,CAAC,GAAc,GAAS,KACtB,GACE,GAAY,CAAC,EAAW,UAC1B,QAAQ,MAAM,kCAAkC,CAChD,EAAW,QAAU,IAEhB,EAAA,EAAA,CAAA,SAAG,EAAqB,CAAA,EAG7B,IAAS,IAAA,KACP,GAAY,CAAC,EAAW,UAC1B,QAAQ,MACN,uLACD,CACD,EAAW,QAAU,IAGnB,GACK,EAAA,EAAA,CAAA,SAAG,EAAsB,CAAA,CAIhC,IAAS,OACP,GAAY,CAAC,EAAW,UAC1B,QAAQ,MAAM,8BAA8B,CAC5C,EAAW,QAAU,IAGnB,GACK,EAAA,EAAA,CAAA,SAAG,EAAiB,CAAA,CAIxB,EAAC,EAAD,CAAO,SAAS,iBAAQ,+CAAoD,CAAA,CAG9E,EAAA,EAAA,EAAK,CAAA,CChGd,IAAA,EAAe,GCJf,MAAM,EAAc,EAAgC,CAClD,eAAkB,GAClB,KAAM,OACP,CAAC,CAEF,SAAgB,EAAuC,CACrD,SAAS,IACqB,EAAE,CAAiD,CACjF,IAAM,EAAU,EAAW,EAAY,CACvC,GAAI,GAAU,CAAC,EACb,MAAU,MAAM,0BAA0B,CAE5C,OAAO,EAQT,SAAS,GAAa,CAAE,WAAU,KAAM,EAAW,QAA6B,CAC9E,GAAM,CAAC,EAAM,GAAW,EAAsB,EAAS,CAEjD,EAAQ,MACL,GAAY,CACjB,QAAS,CACP,OACD,CACF,CAAC,CACD,CAAC,EAAK,CAAC,CAEV,OACE,EAAC,EAAY,SAAb,CACE,MAAO,CACL,OACA,eAAkB,CAChB,EAAS,GACA,IAAS,QAAU,OAAS,QACnC,EAEL,UAED,EAAC,GAAD,CAAsB,iBAAtB,CACE,EAAC,EAAD,EAAe,CAAA,CACd,EACa,GACK,CAAA,CCpC3B,MAAM,EAAoB,EAAsC,CAC9D,YAAa,EACb,aAAc,EACd,cAAe,GAChB,CAAC,CAEF,SAAgB,GAA6C,CAC3D,SAAS,IACqB,EAAE,CAAuD,CACvF,IAAM,EAAU,EAAW,EAAkB,CAC7C,GAAI,GAAU,CAAC,EACb,MAAU,MAAM,iCAAiC,CAEnD,OAAO,EAIT,SAAS,GAAmB,CAC1B,WACA,mBAAmB,IACnB,oBAAoB,KACF,CAClB,GAAM,CAAC,EAAa,GAAkB,EAAiB,OAAO,WAAW,CACnE,CAAC,EAAc,GAAmB,EAAiB,OAAO,YAAY,CAE5E,MAAgB,CACd,SAAS,GAAgB,CACvB,EAAe,OAAO,WAAW,CACjC,EAAgB,OAAO,YAAY,CAIrC,OAFA,GAAe,CACf,OAAO,iBAAiB,SAAU,EAAc,KACnC,CACX,OAAO,oBAAoB,SAAU,EAAc,GAEpD,EAAE,CAAC,CAEN,IAAM,EAAgB,MACb,EAAc,GAAoB,EAAe,EACvD,CAAC,EAAa,EAAc,EAAkB,EAAkB,CAAC,CAEpE,OACE,EAAC,EAAkB,SAAnB,CACE,MAAO,CACL,gBACA,cACA,eACD,CAEA,WAC0B,CAAA,CCvDjC,MAAM,EAAkB,EAAgD,IAAA,GAAU,CAElF,SAAgB,GAA2C,CACzD,SAAS,IACqB,EAAE,CAAqD,CACrF,IAAM,EAAU,EAAW,EAAgB,CAC3C,GAAI,GAAU,CAAC,EACb,MAAU,MAAM,8BAA8B,CAEhD,OAAO,EAGT,SAAS,GAAiB,CAAE,WAAU,mBAAmB,KAA+B,CACtF,GAAM,CAAC,EAAM,GAAW,EAAkB,GAAM,CAC1C,CAAC,EAAuB,GAA4B,EAAiB,EAAiB,CACtF,CAAC,EAAS,GAAc,EAAiB,GAAG,CAC5C,CAAC,EAAU,GAAe,EAAqB,OAAO,CAE5D,SAAS,EAAY,EAAiB,EAAuB,EAAmB,CAC9E,EAAQ,GAAK,CACb,EAAyB,GAAY,EAAiB,CACtD,EAAY,GAAY,OAAO,CAC/B,EAAW,EAAQ,CAGrB,eAAe,GAAc,CAC3B,EAAQ,GAAM,CAGd,MAAM,GAAK,GAAI,CACf,EAAW,GAAG,CAGhB,OACE,EAAC,EAAgB,SAAjB,CAA0B,MAAO,CAAE,cAAa,UAAhD,CACE,EAAC,GAAD,CAAgB,OAAM,iBAAkB,EAAuB,QAAS,WACtE,EAAC,EAAD,CAAO,QAAS,EAAuB,oBACpC,EACK,CAAA,CACC,CAAA,CACV,EACwB,GCjC/B,SAAS,GAAiB,CACxB,WACA,iBACA,qBACA,gBACA,oBACA,WACA,mBAAmB,EAAC,EAAD,EAAoB,CAAA,CACvC,GAAG,GACqB,CACxB,OACE,EAACC,EAAD,CAA4C,mBAAkB,GAAI,WAAlE,CAEE,EAAC,EAAD,CACsB,qBACL,gBACI,oBACT,oBAET,EACW,CAAA,CACd,EAAC,EAAD,CAAuB,WAAsB,CAAA,CAC9B,GCnCrB,MAAM,GAAe,EAAO,GAAO,MAC1B,CACL,QAAS,EACT,qBAAsB,CACpB,aAAc,GACd,sBAAuB,CACrB,QAAS,KACT,SAAU,WACV,IAAK,MACL,UAAW,mBACX,SAAU,GACV,MAAO,GACP,OAAQ,GACT,CACF,CACF,EACD,CAEF,SAAS,EAAgB,CACvB,YAAa,EACb,oBACA,cAAe,EACf,sBACA,GAAG,GACoB,CACvB,IAAM,EAAQ,CACZ,aAAc,MACd,YAAa,QACb,gBAAiB,QACjB,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,QAAS,IACV,CACK,EAAoB,CAAE,MAAO,QAAS,SAAU,KAAM,UAAW,KAAM,CAC7E,OACE,EAAC,GAAD,CACE,YACE,EAAC,EAAD,CAAK,GAAI,WACP,EAAC,EAAD,CAAa,MAAO,CAAE,GAAG,EAAmB,GAAG,EAAmB,CAAI,CAAA,CAClE,CAAA,CAER,KACE,EAAC,EAAD,CAAK,GAAI,WACP,EAAC,EAAD,CAAe,MAAO,CAAE,GAAG,EAAmB,GAAG,EAAqB,CAAI,CAAA,CACtE,CAAA,CAER,GAAI,EACJ,CAAA,CCxDN,SAAS,IAAa,CACpB,GAAM,CAAE,OAAM,cAAe,GAAS,CAChC,EAAa,IAAS,OACtB,EAAW,UAAU,EAAa,QAAU,OAAO,OAEzD,OACE,EAAC,GAAD,CAAS,MAAO,WACd,EAAC,EAAD,CACE,cAAe,GACf,YAAa,GACb,QAAS,EACT,SAAU,EACV,aAAY,EACZ,CAAA,CACM,CAAA,CCAd,SAAS,GAAiB,CAAE,WAAU,YAAmC,CACvE,GAAM,CAAC,EAAO,GAAY,EAAiB,GAAG,CAC9C,OACE,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,EAAD,CAAK,GAAI,CAAE,cAAe,EAAG,CAAG,WAAe,CAAA,CAC/C,EAAC,GAAD,CAAO,GAAI,CAAE,SAAU,QAAS,OAAQ,EAAG,KAAM,EAAG,MAAO,EAAG,UAC5D,EAAC,GAAD,CACE,WAAA,GACO,QACP,UAAW,EAAG,IAAU,CACtB,EAAS,EAAM,WAGhB,EAAS,IAAK,GACN,EAAC,GAAD,CAAyC,GAAI,EAAM,UAAW,EAAQ,CAAzC,EAAK,MAAoC,CAC7E,CACe,CAAA,CACb,CAAA,CACP,CAAA,CAAA,CCdP,SAAS,GAAY,EAAyB,CAC5C,MAAO,CACL,MAAO,IACP,WAAY,EAAM,YAAY,OAAO,QAAS,CAC5C,OAAQ,EAAM,YAAY,OAAO,MACjC,SAAU,EAAM,YAAY,SAAS,eACtC,CAAC,CACF,UAAW,SACZ,CAGH,SAAS,GAAY,EAAyB,CAC5C,MAAO,CACL,WAAY,EAAM,YAAY,OAAO,QAAS,CAC5C,OAAQ,EAAM,YAAY,OAAO,MACjC,SAAU,EAAM,YAAY,SAAS,cACtC,CAAC,CACF,UAAW,SACX,MAAO,QAAQ,EAAM,QAAQ,EAAE,CAAC,UAC/B,EAAM,YAAY,GAAG,KAAK,EAAG,CAC5B,MAAO,QAAQ,EAAM,QAAQ,EAAE,CAAC,SACjC,CACF,CAGH,MAAM,GAAe,EAAO,MAAM,EAAE,CAAE,YAC7B,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,WAChB,QAAS,EAAM,QAAQ,EAAG,EAAE,CAE5B,GAAG,EAAM,OAAO,QACjB,EACD,CAMI,GAAS,EAAO,GAAW,CAC/B,kBAAoB,GACX,IAAS,OAEnB,CAAC,EAAe,CAAE,YACV,CACL,OAAQ,EAAM,OAAO,OAAS,EAC9B,WAAY,EAAM,YAAY,OAAO,CAAC,QAAS,SAAS,CAAE,CACxD,OAAQ,EAAM,YAAY,OAAO,MACjC,SAAU,EAAM,YAAY,SAAS,cACtC,CAAC,CACF,SAAU,CACR,CACE,OAAQ,CAAE,UACD,EAET,MAAO,CACL,WAAY,IACZ,MAAO,qBACP,WAAY,EAAM,YAAY,OAAO,CAAC,QAAS,SAAS,CAAE,CACxD,OAAQ,EAAM,YAAY,OAAO,MACjC,SAAU,EAAM,YAAY,SAAS,eACtC,CAAC,CACH,CACF,CACF,CACF,EACD,CAEI,GAAS,EAAO,GAAW,CAC/B,kBAAoB,GACX,IAAS,OAEnB,CAAC,EAAE,CAAE,YACG,CACL,MAAO,IACP,WAAY,EACZ,WAAY,SACZ,UAAW,aACX,SAAU,CACR,CACE,OAAQ,CAAE,UACD,EAET,MAAO,CACL,GAAG,GAAY,EAAM,CACrB,qBAAsB,GAAY,EAAM,CACzC,CACF,CACD,CACE,OAAQ,CAAE,UACD,CAAC,EAEV,MAAO,CACL,GAAG,GAAY,EAAM,CACrB,qBAAsB,GAAY,EAAM,CACzC,CACF,CACF,CACF,EACD,CAkBF,SAAS,GAAiB,CAAE,QAAO,WAAU,WAAU,kBAAyC,CAC9F,IAAM,EAAQ,IAAU,CAClB,CAAC,EAAM,GAAW,EAAS,GAAK,CAChC,EAAW,IAAa,CAE9B,SAAS,GAAmB,CAC1B,EAAQ,GAAK,CAGf,SAAS,GAAoB,CAC3B,EAAQ,GAAM,CAGhB,OACE,EAAC,EAAD,CAAK,GAAI,CAAE,QAAS,OAAQ,UAA5B,CACE,EAAC,EAAD,EAAe,CAAA,CACf,EAAC,GAAD,CAAQ,SAAS,QAAc,gBAC7B,EAAC,GAAD,CAAA,SAAA,CACE,EAAC,EAAD,CACE,MAAM,UACN,aAAW,cACX,QAAS,EACT,KAAK,QACL,GAAI,CACF,CACE,YAAa,EACd,CACD,GAAQ,CAAE,QAAS,OAAQ,CAC5B,UAED,EAAC,GAAD,EAAU,CAAA,CACC,CAAA,CACb,EAAC,EAAD,CAAY,QAAQ,KAAK,OAAA,GAAO,UAAU,eACvC,EACU,CAAA,CACZ,EACO,CAAA,CAAA,CACH,CAAA,CACT,EAAC,GAAD,CAAQ,QAAQ,YAAkB,gBAAlC,CACE,EAAC,GAAD,CAAA,SACE,EAAC,EAAD,CAAY,QAAS,WAClB,EAAM,YAAc,MAAQ,EAAC,GAAD,EAAkB,CAAA,CAAG,EAAC,GAAD,EAAiB,CAAA,CACxD,CAAA,CACA,CAAA,CACf,EAAC,EAAD,EAAW,CAAA,CACV,EAAS,IAAK,GAEX,EAACC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAY,QAAS,EAAO,KAAO,KAAM,YAAa,EAAO,EAAI,WAC9D,EAAO,EAAK,SAAW,EAAS,EAAK,SAAU,EAAE,CACvC,CAAA,CACZ,EAAK,QAAQ,IAAK,GAEf,EAAC,EAAD,CAA0B,eAAA,GAAe,GAAI,CAAE,QAAS,QAAS,UAC/D,EAAC,EAAD,CACE,GAAI,CACF,CACE,UAAW,GACX,GAAI,IACL,CACD,EACI,CACE,eAAgB,UACjB,CACD,CACE,eAAgB,SACjB,CACN,CACD,UAAW,EACX,GAAI,EAAO,GACX,SAAU,EAAS,WAAa,EAAO,YAhBzC,CAkBE,EAAC,GAAD,CACE,GAAI,CACF,CACE,SAAU,EACV,eAAgB,SACjB,CACD,EACI,CACE,GAAI,EACL,CACD,CACE,GAAI,OACL,CACN,UAEA,EAAO,KACN,EAAO,KACJ,EAED,KADF,EAAC,EAAD,CAAA,SAAa,EAAS,EAAO,MAAO,EAAE,CAAc,CAAA,CAEzC,CAAA,CACf,EAAC,EAAD,CACE,QAAS,EAAO,MAChB,GAAI,CACF,EACI,CACE,QAAS,EACV,CACD,CACE,QAAS,EACV,CACN,CACD,CAAA,CACa,GACR,CArDI,EAAO,GAqDX,CAEb,CACG,CAAA,CAAA,CACP,EAAC,EAAD,EAAW,CAAA,CACF,CAAA,CAjEI,EAAK,SAiET,CAEb,CACK,GACT,EAAC,EAAD,CAAK,UAAU,OAAO,GAAI,CAAE,SAAU,EAAG,EAAG,EAAG,UAA/C,CACE,EAAC,GAAD,EAAgB,CAAA,CACf,EACG,GACF,GCnPV,SAAS,GAAK,CAAE,QAAO,WAAU,SAAQ,YAAuB,CAC9D,OACE,EAAC,EAAD,CAAA,SAAA,CACE,EAAC,EAAD,CACE,MACE,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,EAAD,CAAY,QAAQ,cAAM,EAAmB,CAAA,CAC5C,EACC,EAAC,EAAD,CAAY,QAAQ,QAAQ,MAAM,0BAC/B,EACU,CAAA,CACX,KACH,CAAA,CAAA,CAEG,SACR,CAAA,CACF,EAAC,EAAD,EAAW,CAAA,CACX,EAAC,EAAD,CAAc,WAAuB,CAAA,CAChC,CAAA,CAAA,CC9BX,SAAS,GAAY,CAAE,OAAM,KAAI,GAAG,GAAqC,CACvE,OACE,EAAA,EAAA,CAAA,SACG,EAAK,MAAM;EAAK,CAAC,KAAK,EAAM,IAEzB,EAAC,EAAD,CAAwB,GAAI,CAAE,OAAQ,EAAG,GAAG,EAAI,CAAE,GAAI,WACnD,EACU,CAFI,EAEJ,CAEf,CACD,CAAA,CCJP,SAAS,GAAgB,CAAE,OAAM,gBAAe,GAAG,GAA2C,CAC5F,GAAM,CAAE,QAAS,GAAS,CACpB,EAAuC,CAC3C,gBAAiB,IAAS,OAAS,QAAU,QAC7C,OAAQ,GACR,aAAc,EACd,QAAS,EACT,YAAa,WACd,CACK,EAAmB,EACrB,CAAE,GAAG,EAAsB,GAAG,EAAe,CAC7C,CAAE,GAAG,EAAsB,CAC/B,OACE,EAAC,EAAD,CAAK,GAAI,CAAE,aAAc,EAAG,OAAQ,GAAK,QAAS,EAAG,UACnD,EAAC,GAAD,CAAc,GAAI,EAAmB,KAAM,GAAY,GAAQ,GAAG,UAAlE,CACE,EAAC,EAAD,CAAY,QAAQ,cAAK,OAAiB,CAAA,CAC1C,EAAC,EAAD,CACE,GAAI,CACF,OAAQ,GACR,aAAc,GACd,YAAa,WACd,UAED,EAAC,GAAD,EAAc,CAAA,CACV,CAAA,CACN,EAAC,KAAD,EAAM,CAAA,CACN,EAAC,EAAD,CAAY,QAAQ,cAAK,SAAmB,CAAA,CAC5C,EAAC,EAAD,CAAK,GAAI,WAAT,CACE,EAAC,GAAD,EAAe,CAAA,CACf,EAAC,GAAD,EAAa,CAAA,CACT,GACO,GACX,CAAA,CCrCV,SAAS,GAAY,CAAE,WAA6B,CAClD,OACE,EAAC,GAAD,CAAA,SACG,GAAW,GAER,EAAC,GAAD,CAAA,SACE,EAAC,GAAD,EAAY,CAAA,CACF,CAFI,EAEJ,CAEb,EAAQ,CACF,CAAA,CCTf,SAAS,GAAa,CAAE,eAAc,QAAO,GAAG,GAAkC,CAChF,GAAM,CACJ,UAAW,CAAE,SAAU,EAAc,UAAS,iBAC5C,IAAgB,CAEpB,OACE,EAACC,EAAD,CACE,MAAM,UACN,SAAU,EAAY,UAAa,GAAgB,CAAC,GAAY,EAChE,QAAS,EACT,KAAK,SACL,QAAQ,YACR,GAAI,WAEH,EACM,CAAA,CCrBb,SAAS,GAA0B,EAA8D,CAC/F,GAAM,CAAC,EAAM,GAAW,MAAkB,CACxC,IAAM,EAAU,OAAO,SAAS,KAAK,QAAQ,IAAK,GAAG,CACrD,OAAQ,GAAqB,IAAS,GAAK,EAAc,GACzD,CACI,EAAoB,MAAkB,CAC1C,IAAM,EAAU,OAAO,SAAS,KAAK,QAAQ,IAAK,GAAG,CACrD,EAAS,GAAqB,IAAS,GAAK,EAAc,EAAK,EAC9D,CAAC,EAAS,EAAY,CAAC,CAmB1B,OAjBA,OACE,OAAO,iBAAiB,aAAc,EAAkB,KAC3C,CACX,OAAO,oBAAoB,aAAc,EAAkB,GAE5D,CAAC,EAAkB,CAAC,CAYhB,CAAC,EAVW,EAChB,GAA2C,CAC1C,IAAM,EAAe,OAAO,GAAY,WAAa,EAAQ,EAAK,CAAG,EACjE,IAAiB,IACnB,OAAO,SAAS,KAAO,IAG3B,CAAC,EAAK,CACP,CAEwB"}
1
+ {"version":3,"file":"index.js","names":["Button","ReactDOMLink","Button","LoaderProvider","Fragment","Button"],"sources":["../src/components/Artwork.tsx","../src/components/CollapsableItem.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/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/Loader.tsx","../src/components/SwitchWithIcons.tsx","../src/components/ModeToggle.tsx","../src/components/NavigationBottom.tsx","../src/components/NavigationDrawer.tsx","../src/components/Page.tsx","../src/components/PopoverText.tsx","../src/components/ReactPlayground.tsx","../src/components/SkeletonRow.tsx","../src/components/SubmitButton.tsx","../src/hooks/useHash.ts"],"sourcesContent":["import Box from \"@mui/material/Box\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Chip from \"@mui/material/Chip\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface ContainerProps {\n containerLabel: string;\n chipLabels: Array<string>;\n}\n\nfunction Container({ containerLabel, chipLabels }: ContainerProps) {\n return (\n <Card\n sx={{\n width: 320,\n height: 420,\n backgroundColor: \"rgba(255,255,255,0.07)\",\n backdropFilter: \"blur(8px)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n boxShadow: \"0 10px 40px rgba(0,0,0,0.35)\",\n }}\n >\n <CardContent>\n <Typography variant=\"h6\" gutterBottom sx={{ color: \"#f8fafc\" }}>\n {containerLabel}\n </Typography>\n\n <Stack spacing={1}>\n {chipLabels.map((label) => {\n return (\n <Chip\n key={label}\n label={label}\n sx={{\n backgroundColor: \"rgba(255,255,255,0.11)\",\n color: \"rgba(255,255,255,0.88)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n }}\n />\n );\n })}\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nfunction Connector() {\n return (\n <Box\n sx={{\n width: 120,\n height: 6,\n borderRadius: 3,\n background: \"linear-gradient(90deg, #f43f5e, #a78bfa, #22d3ee)\",\n boxShadow: \"0 0 24px rgba(167,139,250,0.55)\",\n }}\n />\n );\n}\n\n/** The artwork associated with the package's theme song, _An Interface For You And I_. */\nfunction Artwork() {\n return (\n <Card\n sx={{\n width: 1000,\n height: 1000,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n p: 4,\n background:\n \"radial-gradient(circle at 20% 10%, rgba(167,139,250,0.35) 0%, rgba(167,139,250,0.12) 35%, rgba(0,0,0,0) 55%), linear-gradient(135deg, #3a3380 0%, #1d2e5f 40%, #2d3f55 100%)\",\n color: \"white\",\n }}\n elevation={0}\n >\n <CardHeader\n title=\"An Interface For You And I\"\n sx={{\n color: \"#f8fafc\",\n textAlign: \"center\",\n \"& .MuiCardHeader-title\": {\n fontSize: 40,\n fontWeight: 600,\n letterSpacing: 2,\n },\n }}\n />\n\n <Divider sx={{ borderColor: \"rgba(255,255,255,0.2)\" }} />\n\n <CardContent sx={{ flex: 1, display: \"flex\", alignItems: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={4}\n sx={{ width: \"100%\", justifyContent: \"center\", alignItems: \"center\" }}\n >\n <Container\n containerLabel=\"You\"\n chipLabels={[\"state\", \"context\", \"input\", \"event\", \"focus\", \"value\", \"history\"]}\n />\n <Connector />\n <Container\n containerLabel=\"I\"\n chipLabels={[\"render\", \"effect\", \"response\", \"update\", \"history\", \"layout\", \"provider\"]}\n />\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nexport default Artwork;\n","import type { CollapseProps } from \"@mui/material/Collapse\";\nimport type { SxProps } from \"@mui/material/styles\";\nimport type { ElementType, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { useEffect, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\n\nexport interface CollapsableItemProps {\n /** Whether the item should initially be open or not. */\n isInitiallyOpen?: boolean;\n /** A callback function to execute when the item is open. */\n onOpen?: () => void;\n /** A callback function to execute when the item is closed. */\n onClose?: () => void;\n /** The components to render when the item is open. */\n children: ReactNode;\n /** Styling for the button. */\n buttonStyles?: SxProps;\n /** The children to pass to the button. */\n buttonContents: ReactNode;\n /** The specific button component to use. */\n buttonComponent?: ElementType;\n /** The icon to show next to the button when open. */\n openIcon?: ReactNode;\n /** The icon to show next to the button when closed. */\n closedIcon?: ReactNode;\n /** Props to pass to collapse. */\n collapseProps?: Omit<CollapseProps, \"in\">;\n /**\n * Whether or not to use the default button styling.\n *\n * Defaults to `true` if `buttonComponent` is `ButtonBase`,\n * otherwise defaults to `false`.\n */\n useDefaultStyling?: boolean;\n}\n\n/**\n * Shows a display area that can be opened to show the children components, or hidden away.\n */\nfunction CollapsableItem({\n isInitiallyOpen,\n onOpen,\n onClose,\n children,\n buttonStyles,\n buttonContents,\n buttonComponent: ButtonComponent = ButtonBase,\n collapseProps,\n openIcon = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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","/* eslint-disable */\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport Box from \"@mui/material/Box\";\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 * @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 = <MdArrowDropUp />,\n isClosedIcon = <MdArrowDropDown />,\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 /** The URL of the place you want to navigate to. */\n href: `https://${string}` | `http://${string}` | (string & {});\n to?: never;\n /** The readable content to display on the link. */\n children: ReactNode;\n /** An optional ref to allow it to be used with polymorphic components. */\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link that is best used when you want to navigate to a different domain.\n *\n * Opens the destination in a new tab and applies recommended security defaults automatically.\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 { CreateEnumType } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\n\nimport Button from \"@mui/material/Button\";\nimport { styled } from \"@mui/material/styles\";\nimport { useId, useState } from \"react\";\nimport { MdCloudUpload } from \"react-icons/md\";\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;\nexport type FileType = CreateEnumType<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 /** A function to run when a file has been uploaded. */\n onFileInput: (allowedFiles: Array<File>) => void;\n /** The label to display on the input button (defaults to \"Upload files\") */\n label?: string;\n /** Whether to accept multiple files or not. */\n multiple?: boolean;\n /** An array of file types to accept. */\n accept?: Array<string>;\n /** Enable the dropzone, allowing users to drag and drop files. */\n useDropzone?: boolean;\n}\n\n/** Handles file inputs. */\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 const id = useId();\n\n const fileInputButton = (\n <Button\n variant=\"contained\"\n component=\"label\"\n aria-label=\"File input button\"\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n document.getElementById(id)?.click();\n }\n }}\n {...buttonProps}\n startIcon={buttonProps.startIcon ?? <MdCloudUpload />}\n >\n {label}\n <VisuallyHiddenInput\n id={id}\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\";\n\nimport type { FileInputProps } from \"src/components/FileInput\";\n\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\";\nimport { MdDelete } from \"react-icons/md\";\n\nimport FileInput from \"src/components/FileInput\";\n\nexport interface FileInputListProps extends Omit<FileInputProps, \"onFileInput\"> {\n /** The array of files (must be a React state). */\n files: Array<File>;\n /** The state setter for the array of files. */\n setFiles: Dispatch<SetStateAction<Array<File>>>;\n}\n\n/** Renders the `FileInput` component with a list of uploaded files underneath it. */\nfunction FileInputList({\n files,\n setFiles,\n multiple = true,\n ...fileInputProps\n}: FileInputListProps) {\n function onFileInput(newFiles: Array<File>) {\n setFiles((oldFiles) => {\n return [...oldFiles, ...newFiles];\n });\n }\n\n return (\n <Box>\n <FileInput {...fileInputProps} multiple={multiple} onFileInput={onFileInput} />\n <List>\n {files.map((file) => {\n return (\n <ListItem\n key={`${file.name}-${file.lastModified}`}\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 <MdDelete />\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 { ElementType, 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\" | \"component\"> {\n to: `/${string}` | `~/${string}` | (string & {});\n component?: ElementType;\n href?: never;\n children: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * A stylised link for navigating within your application.\n *\n * Uses the app router for client-side navigation and opens the destination in the same tab.\n *\n * Defaults to a React Router implementation but can be overridden via the `component` prop.\n *\n */\nfunction InternalLink({\n to,\n component = ReactDOMLink,\n children,\n ref,\n ...linkProps\n}: InternalLinkProps) {\n return (\n <MUILink component={component} 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 { OptionalOnCondition } from \"@alextheman/utility\";\nimport type { ButtonOwnProps } from \"@mui/material/Button\";\nimport type { ElementType, MouseEvent as ReactMouseEvent, ReactNode } from \"react\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport MUIButton from \"@mui/material/Button\";\nimport Menu from \"@mui/material/Menu\";\nimport { createContext, useContext, useMemo, useState } from \"react\";\nimport { MdArrowDropDown, MdArrowDropUp } from \"react-icons/md\";\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 = <MdArrowDropUp />,\n closedIcon = <MdArrowDropDown />,\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\";\n\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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderProvider.\n * @param props.children - The components that may receive access to the LoaderContext value.\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.isLoading - The current loading status (true if loading, false if not)\n * @param props.error - The error given if the request gave an error.\n * @param props.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 props.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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to LoaderData.\n * @param props.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 props.dataParser - A parser for the data.\n * @param props.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 *\n * @param props - The props to be passed to LoaderError.\n * @param props.children - The component to show if an error has been thrown.\n * @param props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.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\";\n\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\";\n\nexport interface ScreenSizeProps {\n /** The children that will be receiving the ScreenSizeContext. */\n children: ReactNode;\n /** The minimum screen width in pixels required to be considered a large screen. */\n largeScreenWidth?: number;\n /** The minimum screen height in pixels required to be considered a large screen. */\n largeScreenHeight?: number;\n}\n\nexport interface ScreenSizeContextValue {\n /** Whether the screen is a large screen or not. */\n isLargeScreen: boolean;\n /** The current window width. */\n windowWidth: number;\n /** The current window height. */\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\n/** Provides context about the current screen size. */\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\";\n\nimport type { ContextHookOptions } from \"src/types\";\n\nimport { wait } from \"@alextheman/utility\";\nimport Alert from \"@mui/material/Alert\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport { createContext, useContext, useState } from \"react\";\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n autoHideDuration?: number;\n}\n\nexport interface SnackbarContextValue {\n addSnackbar: (message: string, severity?: AlertColor, duration?: number) => void;\n}\n\nconst SnackbarContext = createContext<SnackbarContextValue | undefined>(undefined);\n\nexport function useSnackbar<Strict extends boolean = true>({\n strict = true as Strict,\n}: ContextHookOptions<Strict> = {}): OptionalOnCondition<Strict, SnackbarContextValue> {\n const context = useContext(SnackbarContext);\n if (strict && !context) {\n throw new Error(\"SNACKBAR_PROVIDER_NOT_FOUND\");\n }\n return context as OptionalOnCondition<Strict, SnackbarContextValue>;\n}\n\nfunction SnackbarProvider({ children, autoHideDuration = 5000 }: SnackbarProviderProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [autoHideDurationState, setAutoHideDurationState] = useState<number>(autoHideDuration);\n const [message, setMessage] = useState<string>(\"\");\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\n\n function addSnackbar(message: string, severity?: AlertColor, duration?: number) {\n setOpen(true);\n setAutoHideDurationState(duration ?? autoHideDuration);\n setSeverity(severity ?? \"info\");\n setMessage(message);\n }\n\n async function handleClose() {\n setOpen(false);\n // Wait for 0.2 seconds to ensure that the message is only cleared after the snackbar is fully closed.\n // This prevents potential weird flickering that may occur if they happen synchronously.\n await wait(0.2);\n setMessage(\"\");\n }\n\n return (\n <SnackbarContext.Provider value={{ addSnackbar }}>\n <Snackbar open={open} autoHideDuration={autoHideDurationState} onClose={handleClose}>\n <Alert onClose={handleClose} severity={severity}>\n {message}\n </Alert>\n </Snackbar>\n {children}\n </SnackbarContext.Provider>\n );\n}\n\nexport default SnackbarProvider;\n","import type { 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 *\n * @template DataType - The type of data being loaded.\n *\n * @param props - Props to pass to Loader.\n * @param props.children - The elements to show after data has been loaded.\n * @param props.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 props.undefinedComponent - The component to show if no error was thrown but the data is undefined.\n * @param props.nullComponent - The component to show if no error was thrown but the data is null.\n * @param props.nullableComponent - The component to show if no error was thrown but the data is nullable (undefined or null).\n * @param props.loadingComponent - The component to show when the data is being fetched.\n * @param props.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 { 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 Tooltip from \"@mui/material/Tooltip\";\nimport { MdOutlineDarkMode, MdOutlineLightMode } from \"react-icons/md\";\n\nimport SwitchWithIcons from \"src/components/SwitchWithIcons\";\nimport { useMode } from \"src/providers\";\n\n/** A toggle to switch between dark mode and light mode. Must be used in a `ModeProvider`. */\nfunction ModeToggle() {\n const { mode, toggleMode } = useMode();\n const isDarkMode = mode === \"dark\";\n const modeText = `Enable ${isDarkMode ? \"light\" : \"dark\"} mode`;\n\n return (\n <Tooltip title={modeText}>\n <SwitchWithIcons\n uncheckedIcon={MdOutlineLightMode}\n checkedIcon={MdOutlineDarkMode}\n checked={isDarkMode}\n onChange={toggleMode}\n aria-label={modeText}\n />\n </Tooltip>\n );\n}\n\nexport default ModeToggle;\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: Array<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 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 { MdChevronLeft, MdChevronRight, MdMenu } from \"react-icons/md\";\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: Array<{\n label: string;\n to: string;\n icon?: ReactNode;\n }>;\n}\n\nexport interface NavigationDrawerProps {\n title: string;\n navItems: Array<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 <MdMenu />\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\" ? <MdChevronRight /> : <MdChevronLeft />}\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 { ReactNode } from \"react\";\n\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Divider from \"@mui/material/Divider\";\nimport Typography from \"@mui/material/Typography\";\n\ninterface PageProps {\n /** The Page title to show */\n title: string;\n /** The subtitle to show under the Page title */\n subtitle?: string;\n /** The actions to show in the page header */\n action?: ReactNode;\n /** The actual page contents */\n children: ReactNode;\n}\n\n/** Renders a pre-styled Page that can be used to structure pages throughout your React apps. */\nfunction Page({ title, subtitle, action, children }: PageProps) {\n return (\n <Card>\n <CardHeader\n title={\n <>\n <Typography variant=\"h6\">{title}</Typography>\n {subtitle ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n ) : null}\n </>\n }\n action={action}\n />\n <Divider />\n <CardContent>{children}</CardContent>\n </Card>\n );\n}\n\nexport default Page;\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 { 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alextheman/components",
3
- "version": "6.6.0",
3
+ "version": "6.6.1",
4
4
  "description": "A package containing common React components used across my projects.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -85,14 +85,14 @@
85
85
  "format": "pnpm run format-prettier && pnpm run format-eslint",
86
86
  "format-eslint": "eslint --fix --suppress-all \"{src,stories,tests}/**/*.{ts,tsx}\" \"package.json\" && rm -f eslint-suppressions.json",
87
87
  "format-prettier": "pnpm run format-prettier-typescript && pnpm run format-prettier-javascript && pnpm run format-prettier-yml",
88
- "format-prettier-javascript": "prettier --write \"./**/*.js\"",
88
+ "format-prettier-javascript": "prettier --write \"./**/*.{js,json}\"",
89
89
  "format-prettier-typescript": "prettier --write --parser typescript \"./**/*.{ts,tsx}\"",
90
90
  "format-prettier-yml": "prettier --write \"./**/*.{yml,yaml}\"",
91
91
  "lint": "pnpm run lint-tsc && pnpm run lint-eslint && pnpm run lint-prettier && pnpm run lint-pre-release",
92
92
  "lint-eslint": "eslint \"{src,stories,tests}/**/*.{ts,tsx}\" \"package.json\"",
93
93
  "lint-pre-release": "alex-c-line package-json check --rules no-pre-release-dependencies",
94
94
  "lint-prettier": "pnpm run lint-prettier-typescript && pnpm run lint-prettier-javascript && pnpm run lint-prettier-yml",
95
- "lint-prettier-javascript": "prettier --check \"./**/*.js\"",
95
+ "lint-prettier-javascript": "prettier --check \"./**/*.{js,json}\"",
96
96
  "lint-prettier-typescript": "prettier --check --parser typescript \"./**/*.{ts,tsx}\"",
97
97
  "lint-prettier-yml": "prettier --check \"./**/*.{yml,yaml}\"",
98
98
  "lint-tsc": "tsc --noEmit",