diff --git a/dist/App-3VkR-ZEZ.js b/dist/App-3VkR-ZEZ.js
new file mode 100644
index 00000000..e128b90b
--- /dev/null
+++ b/dist/App-3VkR-ZEZ.js
@@ -0,0 +1,27 @@
+import { j as r } from "./jsx-runtime-lzYHhGH3.js";
+import { ThemeProvider as i, CssBaseline as t } from "@mui/material";
+import { CacheProvider as p } from "@emotion/react";
+import "react";
+import { Provider as x } from "react-redux";
+const h = ({
+ children: o,
+ emotionCache: e,
+ theme: s,
+ store: m,
+ // @ts-expect-error TODO
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ maxIdleSeconds: a = 3600,
+ // @ts-expect-error TODO
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ maxTotalSeconds: d = 3600
+}) => (
+ // https://mui.com/material-ui/guides/server-rendering/
+ /* @__PURE__ */ r.jsx(p, { value: e, children: /* @__PURE__ */ r.jsxs(i, { theme: s, children: [
+ /* @__PURE__ */ r.jsx(t, {}),
+ /* @__PURE__ */ r.jsx(x, { store: m, children: o })
+ ] }) })
+);
+export {
+ h as A
+};
+//# sourceMappingURL=App-3VkR-ZEZ.js.map
diff --git a/dist/App-3VkR-ZEZ.js.map b/dist/App-3VkR-ZEZ.js.map
new file mode 100644
index 00000000..13e8935a
--- /dev/null
+++ b/dist/App-3VkR-ZEZ.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"App-3VkR-ZEZ.js","sources":["../src/server/App.tsx"],"sourcesContent":["import { CssBaseline, ThemeProvider } from \"@mui/material\"\nimport {\n type EmotionCache,\n CacheProvider as EmotionCacheProvider,\n} from \"@emotion/react\"\nimport { type JSX, type ReactNode } from \"react\"\nimport {\n Provider as StoreProvider,\n type ProviderProps as StoreProviderProps,\n} from \"react-redux\"\nimport { type Action } from \"redux\"\nimport { type ThemeProviderProps } from \"@mui/material\"\n\nimport \"./App.css\"\n// import { InactiveDialog, ScreenTimeDialog } from \"../features\"\n// import { useCountdown, useEventListener } from \"../hooks\"\n// import \"../scripts\"\n// import {\n// configureFreshworksWidget,\n// toggleOneTrustInfoDisplay,\n// } from \"../utils/window\"\n\nexport interface AppProps {\n children: ReactNode\n emotionCache: EmotionCache\n theme: ThemeProviderProps[\"theme\"]\n store: StoreProviderProps[\"store\"]\n maxIdleSeconds?: number\n maxTotalSeconds?: number\n}\n\nconst App = ({\n children,\n emotionCache,\n theme,\n store,\n // @ts-expect-error TODO\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n maxIdleSeconds = 60 * 60,\n // @ts-expect-error TODO\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n maxTotalSeconds = 60 * 60,\n}: AppProps): JSX.Element => {\n // TODO: cannot use document during SSR\n // const root = document.getElementById(\"root\") as HTMLElement\n\n // const [idleSeconds, setIdleSeconds] = useCountdown(maxIdleSeconds)\n // const [totalSeconds, setTotalSeconds] = useCountdown(maxTotalSeconds)\n // const resetIdleSeconds = useCallback(() => {\n // setIdleSeconds(maxIdleSeconds)\n // }, [setIdleSeconds, maxIdleSeconds])\n\n // const isIdle = idleSeconds === 0\n // const tooMuchScreenTime = totalSeconds === 0\n\n // useEventListener(root, \"mousemove\", resetIdleSeconds)\n // useEventListener(root, \"keypress\", resetIdleSeconds)\n\n // React.useEffect(() => {\n // configureFreshworksWidget(\"hide\")\n // }, [])\n\n // if (import.meta.env.PROD) {\n // toggleOneTrustInfoDisplay()\n // }\n\n return (\n // https://mui.com/material-ui/guides/server-rendering/\n \n \n \n \n {/* \n {\n setTotalSeconds(maxTotalSeconds)\n }}\n /> */}\n {children}\n \n \n \n )\n}\n\nexport default App\n\n// TODO: figure out what to do with this\n// function useOneTrustScripts(): void {\n// const oneTrustEventTypes = [\n// useExternalScript({\n// props: {\n// src: \"https://cdn-ukwest.onetrust.com/consent/5da42396-cb12-4493-8d04-5179033cfbad/OtAutoBlock.js\",\n// type: \"text/javascript\",\n// },\n// eventTypes: [\"load\", \"error\"],\n// }),\n// useExternalScript({\n// props: {\n// src: \"https://cdn-ukwest.onetrust.com/scripttemplates/otSDKStub.js\",\n// type: \"text/javascript\",\n// charset: \"UTF-8\",\n// },\n// attrs: {\n// \"data-domain-script\": \"5da42396-cb12-4493-8d04-5179033cfbad\",\n// },\n// eventTypes: [\"load\", \"error\"],\n// }),\n// useExternalScript({\n// props: {\n// src: \"https://cdn-ukwest.onetrust.com/scripttemplates/202302.1.0/otBannerSdk.js\",\n// async: true,\n// type: \"text/javascript\",\n// },\n// eventTypes: [\"load\", \"error\"],\n// }),\n// ]\n// if (oneTrustEventTypes.some(t => t === \"error\")) {\n// alert(\"OneTrust failed to load!\")\n// }\n// }\n"],"names":["App","children","emotionCache","theme","store","maxIdleSeconds","maxTotalSeconds","EmotionCacheProvider","jsxs","ThemeProvider","jsx","CssBaseline","StoreProvider"],"mappings":";;;;;AA+BA,MAAMA,IAAM,CAAyC;AAAA,EACnD,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA;AAAA;AAAA,EAGA,gBAAAC,IAAiB;AAAA;AAAA;AAAA,EAGjB,iBAAAC,IAAkB;AACpB;AAAA;AAAA,wBA0BKC,GAAA,EAAqB,OAAOL,GAC3B,UAAAM,gBAAAA,EAAAA,KAACC,KAAc,OAAAN,GACb,UAAA;AAAA,IAAAO,gBAAAA,EAAAA,IAACC,GAAA,EAAY;AAAA,IACbD,gBAAAA,EAAAA,IAACE,GAAA,EAAc,OAAAR,GAQZ,UAAAH,EAAA,CACH;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAAA;"}
\ No newline at end of file
diff --git a/dist/App-UfeajXtp.cjs b/dist/App-UfeajXtp.cjs
new file mode 100644
index 00000000..1e1c757f
--- /dev/null
+++ b/dist/App-UfeajXtp.cjs
@@ -0,0 +1,2 @@
+"use strict";const e=require("./jsx-runtime-B2pbW5Fp.cjs"),r=require("@mui/material"),x=require("@emotion/react");require("react");const o=require("react-redux"),u=({children:s,emotionCache:t,theme:i,store:n,maxIdleSeconds:c=3600,maxTotalSeconds:a=3600})=>e.jsxRuntimeExports.jsx(x.CacheProvider,{value:t,children:e.jsxRuntimeExports.jsxs(r.ThemeProvider,{theme:i,children:[e.jsxRuntimeExports.jsx(r.CssBaseline,{}),e.jsxRuntimeExports.jsx(o.Provider,{store:n,children:s})]})});exports.App=u;
+//# sourceMappingURL=App-UfeajXtp.cjs.map
diff --git a/dist/App-UfeajXtp.cjs.map b/dist/App-UfeajXtp.cjs.map
new file mode 100644
index 00000000..1c189b78
--- /dev/null
+++ b/dist/App-UfeajXtp.cjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"App-UfeajXtp.cjs","sources":["../src/server/App.tsx"],"sourcesContent":["import { CssBaseline, ThemeProvider } from \"@mui/material\"\nimport {\n type EmotionCache,\n CacheProvider as EmotionCacheProvider,\n} from \"@emotion/react\"\nimport { type JSX, type ReactNode } from \"react\"\nimport {\n Provider as StoreProvider,\n type ProviderProps as StoreProviderProps,\n} from \"react-redux\"\nimport { type Action } from \"redux\"\nimport { type ThemeProviderProps } from \"@mui/material\"\n\nimport \"./App.css\"\n// import { InactiveDialog, ScreenTimeDialog } from \"../features\"\n// import { useCountdown, useEventListener } from \"../hooks\"\n// import \"../scripts\"\n// import {\n// configureFreshworksWidget,\n// toggleOneTrustInfoDisplay,\n// } from \"../utils/window\"\n\nexport interface AppProps {\n children: ReactNode\n emotionCache: EmotionCache\n theme: ThemeProviderProps[\"theme\"]\n store: StoreProviderProps[\"store\"]\n maxIdleSeconds?: number\n maxTotalSeconds?: number\n}\n\nconst App = ({\n children,\n emotionCache,\n theme,\n store,\n // @ts-expect-error TODO\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n maxIdleSeconds = 60 * 60,\n // @ts-expect-error TODO\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n maxTotalSeconds = 60 * 60,\n}: AppProps): JSX.Element => {\n // TODO: cannot use document during SSR\n // const root = document.getElementById(\"root\") as HTMLElement\n\n // const [idleSeconds, setIdleSeconds] = useCountdown(maxIdleSeconds)\n // const [totalSeconds, setTotalSeconds] = useCountdown(maxTotalSeconds)\n // const resetIdleSeconds = useCallback(() => {\n // setIdleSeconds(maxIdleSeconds)\n // }, [setIdleSeconds, maxIdleSeconds])\n\n // const isIdle = idleSeconds === 0\n // const tooMuchScreenTime = totalSeconds === 0\n\n // useEventListener(root, \"mousemove\", resetIdleSeconds)\n // useEventListener(root, \"keypress\", resetIdleSeconds)\n\n // React.useEffect(() => {\n // configureFreshworksWidget(\"hide\")\n // }, [])\n\n // if (import.meta.env.PROD) {\n // toggleOneTrustInfoDisplay()\n // }\n\n return (\n // https://mui.com/material-ui/guides/server-rendering/\n \n \n \n \n {/* \n {\n setTotalSeconds(maxTotalSeconds)\n }}\n /> */}\n {children}\n \n \n \n )\n}\n\nexport default App\n\n// TODO: figure out what to do with this\n// function useOneTrustScripts(): void {\n// const oneTrustEventTypes = [\n// useExternalScript({\n// props: {\n// src: \"https://cdn-ukwest.onetrust.com/consent/5da42396-cb12-4493-8d04-5179033cfbad/OtAutoBlock.js\",\n// type: \"text/javascript\",\n// },\n// eventTypes: [\"load\", \"error\"],\n// }),\n// useExternalScript({\n// props: {\n// src: \"https://cdn-ukwest.onetrust.com/scripttemplates/otSDKStub.js\",\n// type: \"text/javascript\",\n// charset: \"UTF-8\",\n// },\n// attrs: {\n// \"data-domain-script\": \"5da42396-cb12-4493-8d04-5179033cfbad\",\n// },\n// eventTypes: [\"load\", \"error\"],\n// }),\n// useExternalScript({\n// props: {\n// src: \"https://cdn-ukwest.onetrust.com/scripttemplates/202302.1.0/otBannerSdk.js\",\n// async: true,\n// type: \"text/javascript\",\n// },\n// eventTypes: [\"load\", \"error\"],\n// }),\n// ]\n// if (oneTrustEventTypes.some(t => t === \"error\")) {\n// alert(\"OneTrust failed to load!\")\n// }\n// }\n"],"names":["App","children","emotionCache","theme","store","maxIdleSeconds","maxTotalSeconds","EmotionCacheProvider","jsxs","ThemeProvider","jsx","CssBaseline","StoreProvider"],"mappings":"kKA+BMA,EAAM,CAAyC,CACnD,SAAAC,EACA,aAAAC,EACA,MAAAC,EACA,MAAAC,EAGA,eAAAC,EAAiB,KAGjB,gBAAAC,EAAkB,IACpB,4BA0BKC,EAAAA,cAAA,CAAqB,MAAOL,EAC3B,SAAAM,EAAAA,kBAAAA,KAACC,EAAAA,eAAc,MAAAN,EACb,SAAA,CAAAO,EAAAA,kBAAAA,IAACC,EAAAA,YAAA,EAAY,EACbD,EAAAA,kBAAAA,IAACE,EAAAA,SAAA,CAAc,MAAAR,EAQZ,SAAAH,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF"}
\ No newline at end of file
diff --git a/dist/Countdown-BtUbr1J_.cjs b/dist/Countdown-BtUbr1J_.cjs
new file mode 100644
index 00000000..0fc11ed8
--- /dev/null
+++ b/dist/Countdown-BtUbr1J_.cjs
@@ -0,0 +1,2 @@
+"use strict";const u=require("./jsx-runtime-B2pbW5Fp.cjs"),a=require("react"),m=require("@mui/material");require("./auth-BwpsrTko.cjs");const x=require("./general-Bo6JGvKB.cjs");require("react-router");require("yup");require("@mui/icons-material");require("./palette-BnIdHKDE.cjs");const c=({seconds:e,start:n=!0,onEnd:i,...o})=>{e=Math.floor(e);const r=x.useCountdown(e)[0],[s,q]=a.useState(!n);r===0&&!s&&(q(!0),i()),e=Math.floor(r%60);const t=Math.floor(r/60);return u.jsxRuntimeExports.jsx(u.jsxRuntimeExports.Fragment,{children:r>0&&u.jsxRuntimeExports.jsxs(m.Typography,{...o,children:[t>0&&`${t} ${t>1?"mins":"min"} `,e>0&&`${e} ${e>1?"secs":"sec"}`]})})};exports.Countdown=c;
+//# sourceMappingURL=Countdown-BtUbr1J_.cjs.map
diff --git a/dist/Countdown-CyJ-01oU.cjs.map b/dist/Countdown-BtUbr1J_.cjs.map
similarity index 96%
rename from dist/Countdown-CyJ-01oU.cjs.map
rename to dist/Countdown-BtUbr1J_.cjs.map
index c0115b4d..996b03f8 100644
--- a/dist/Countdown-CyJ-01oU.cjs.map
+++ b/dist/Countdown-BtUbr1J_.cjs.map
@@ -1 +1 @@
-{"version":3,"file":"Countdown-CyJ-01oU.cjs","sources":["../src/components/Countdown.tsx"],"sourcesContent":["import { type FC, useState } from \"react\"\nimport { Typography, type TypographyProps } from \"@mui/material\"\n\nimport { useCountdown } from \"../hooks\"\n\nexport interface CountdownProps extends Omit {\n seconds: number\n start?: boolean\n onEnd: () => void\n}\n\nconst Countdown: FC = ({\n seconds,\n start = true,\n onEnd,\n ...typographyProps\n}) => {\n seconds = Math.floor(seconds)\n const _seconds = useCountdown(seconds)[0]\n const [end, setEnd] = useState(!start)\n\n if (_seconds === 0 && !end) {\n setEnd(true)\n onEnd()\n }\n\n seconds = Math.floor(_seconds % 60)\n const minutes = Math.floor(_seconds / 60)\n\n return (\n <>\n {_seconds > 0 && (\n \n {minutes > 0 && `${minutes} ${minutes > 1 ? \"mins\" : \"min\"} `}\n {seconds > 0 && `${seconds} ${seconds > 1 ? \"secs\" : \"sec\"}`}\n \n )}\n >\n )\n}\n\nexport default Countdown\n"],"names":["Countdown","seconds","start","onEnd","typographyProps","_seconds","useCountdown","end","setEnd","useState","minutes","jsxs","Typography"],"mappings":"0RAWA,MAAMA,EAAgC,CAAC,CACrC,QAAAC,EACA,MAAAC,EAAQ,GACR,MAAAC,EACA,GAAGC,CACL,IAAM,CACJH,EAAU,KAAK,MAAMA,CAAO,EAC5B,MAAMI,EAAWC,EAAAA,aAAaL,CAAO,EAAE,CAAC,EAClC,CAACM,EAAKC,CAAM,EAAIC,EAAAA,SAAS,CAACP,CAAK,EAEjCG,IAAa,GAAK,CAACE,IACrBC,EAAO,EAAI,EACXL,EAAA,GAGFF,EAAU,KAAK,MAAMI,EAAW,EAAE,EAClC,MAAMK,EAAU,KAAK,MAAML,EAAW,EAAE,EAExC,6DAEK,SAAAA,EAAW,GACVM,EAAAA,kBAAAA,KAACC,EAAAA,WAAA,CAAY,GAAGR,EACb,SAAA,CAAAM,EAAU,GAAK,GAAGA,CAAO,IAAIA,EAAU,EAAI,OAAS,KAAK,IACzDT,EAAU,GAAK,GAAGA,CAAO,IAAIA,EAAU,EAAI,OAAS,KAAK,EAAA,CAAA,CAC5D,CAAA,CAEJ,CAEJ"}
\ No newline at end of file
+{"version":3,"file":"Countdown-BtUbr1J_.cjs","sources":["../src/components/Countdown.tsx"],"sourcesContent":["import { type FC, useState } from \"react\"\nimport { Typography, type TypographyProps } from \"@mui/material\"\n\nimport { useCountdown } from \"../hooks\"\n\nexport interface CountdownProps extends Omit {\n seconds: number\n start?: boolean\n onEnd: () => void\n}\n\nconst Countdown: FC = ({\n seconds,\n start = true,\n onEnd,\n ...typographyProps\n}) => {\n seconds = Math.floor(seconds)\n const _seconds = useCountdown(seconds)[0]\n const [end, setEnd] = useState(!start)\n\n if (_seconds === 0 && !end) {\n setEnd(true)\n onEnd()\n }\n\n seconds = Math.floor(_seconds % 60)\n const minutes = Math.floor(_seconds / 60)\n\n return (\n <>\n {_seconds > 0 && (\n \n {minutes > 0 && `${minutes} ${minutes > 1 ? \"mins\" : \"min\"} `}\n {seconds > 0 && `${seconds} ${seconds > 1 ? \"secs\" : \"sec\"}`}\n \n )}\n >\n )\n}\n\nexport default Countdown\n"],"names":["Countdown","seconds","start","onEnd","typographyProps","_seconds","useCountdown","end","setEnd","useState","minutes","jsxs","Typography"],"mappings":"0RAWA,MAAMA,EAAgC,CAAC,CACrC,QAAAC,EACA,MAAAC,EAAQ,GACR,MAAAC,EACA,GAAGC,CACL,IAAM,CACJH,EAAU,KAAK,MAAMA,CAAO,EAC5B,MAAMI,EAAWC,EAAAA,aAAaL,CAAO,EAAE,CAAC,EAClC,CAACM,EAAKC,CAAM,EAAIC,EAAAA,SAAS,CAACP,CAAK,EAEjCG,IAAa,GAAK,CAACE,IACrBC,EAAO,EAAI,EACXL,EAAA,GAGFF,EAAU,KAAK,MAAMI,EAAW,EAAE,EAClC,MAAMK,EAAU,KAAK,MAAML,EAAW,EAAE,EAExC,6DAEK,SAAAA,EAAW,GACVM,EAAAA,kBAAAA,KAACC,EAAAA,WAAA,CAAY,GAAGR,EACb,SAAA,CAAAM,EAAU,GAAK,GAAGA,CAAO,IAAIA,EAAU,EAAI,OAAS,KAAK,IACzDT,EAAU,GAAK,GAAGA,CAAO,IAAIA,EAAU,EAAI,OAAS,KAAK,EAAA,CAAA,CAC5D,CAAA,CAEJ,CAEJ"}
\ No newline at end of file
diff --git a/dist/Countdown-CyJ-01oU.cjs b/dist/Countdown-CyJ-01oU.cjs
deleted file mode 100644
index b548c5d5..00000000
--- a/dist/Countdown-CyJ-01oU.cjs
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";const n=require("./jsx-runtime-Dszzpdy0.cjs"),c=require("react"),m=require("@mui/material");require("./auth-B7Vdot4N.cjs");const q=require("./general-BPbbmkeX.cjs");require("react-router");require("yup");require("@mui/icons-material");require("./palette-BnIdHKDE.cjs");const x=({seconds:e,start:u=!0,onEnd:i,...o})=>{e=Math.floor(e);const r=q.useCountdown(e)[0],[s,a]=c.useState(!u);r===0&&!s&&(a(!0),i()),e=Math.floor(r%60);const t=Math.floor(r/60);return n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{children:r>0&&n.jsxRuntimeExports.jsxs(m.Typography,{...o,children:[t>0&&`${t} ${t>1?"mins":"min"} `,e>0&&`${e} ${e>1?"secs":"sec"}`]})})};exports.Countdown=x;
-//# sourceMappingURL=Countdown-CyJ-01oU.cjs.map
diff --git a/dist/Countdown-BTyB1rrK.js b/dist/Countdown-DhjAmB0u.js
similarity index 50%
rename from dist/Countdown-BTyB1rrK.js
rename to dist/Countdown-DhjAmB0u.js
index 5c333e62..bf79e45f 100644
--- a/dist/Countdown-BTyB1rrK.js
+++ b/dist/Countdown-DhjAmB0u.js
@@ -1,8 +1,8 @@
-import { j as m } from "./jsx-runtime-C7wFtzyj.js";
-import { useState as s } from "react";
-import { Typography as u } from "@mui/material";
-import "./auth-CQ1InCxP.js";
-import { a as f } from "./general-CtTJPCJn.js";
+import { j as m } from "./jsx-runtime-lzYHhGH3.js";
+import { useState as u } from "react";
+import { Typography as a } from "@mui/material";
+import "./auth-Bb8WkZGN.js";
+import { u as f } from "./general-D7Hqi3gj.js";
import "react-router";
import "yup";
import "@mui/icons-material";
@@ -14,10 +14,10 @@ const w = ({
...p
}) => {
t = Math.floor(t);
- const r = f(t)[0], [e, a] = s(!i);
- r === 0 && !e && (a(!0), n()), t = Math.floor(r % 60);
+ const r = f(t)[0], [e, s] = u(!i);
+ r === 0 && !e && (s(!0), n()), t = Math.floor(r % 60);
const o = Math.floor(r / 60);
- return /* @__PURE__ */ m.jsx(m.Fragment, { children: r > 0 && /* @__PURE__ */ m.jsxs(u, { ...p, children: [
+ return /* @__PURE__ */ m.jsx(m.Fragment, { children: r > 0 && /* @__PURE__ */ m.jsxs(a, { ...p, children: [
o > 0 && `${o} ${o > 1 ? "mins" : "min"} `,
t > 0 && `${t} ${t > 1 ? "secs" : "sec"}`
] }) });
@@ -25,4 +25,4 @@ const w = ({
export {
w as C
};
-//# sourceMappingURL=Countdown-BTyB1rrK.js.map
+//# sourceMappingURL=Countdown-DhjAmB0u.js.map
diff --git a/dist/Countdown-BTyB1rrK.js.map b/dist/Countdown-DhjAmB0u.js.map
similarity index 96%
rename from dist/Countdown-BTyB1rrK.js.map
rename to dist/Countdown-DhjAmB0u.js.map
index cc6bdab6..79e8ec77 100644
--- a/dist/Countdown-BTyB1rrK.js.map
+++ b/dist/Countdown-DhjAmB0u.js.map
@@ -1 +1 @@
-{"version":3,"file":"Countdown-BTyB1rrK.js","sources":["../src/components/Countdown.tsx"],"sourcesContent":["import { type FC, useState } from \"react\"\nimport { Typography, type TypographyProps } from \"@mui/material\"\n\nimport { useCountdown } from \"../hooks\"\n\nexport interface CountdownProps extends Omit {\n seconds: number\n start?: boolean\n onEnd: () => void\n}\n\nconst Countdown: FC = ({\n seconds,\n start = true,\n onEnd,\n ...typographyProps\n}) => {\n seconds = Math.floor(seconds)\n const _seconds = useCountdown(seconds)[0]\n const [end, setEnd] = useState(!start)\n\n if (_seconds === 0 && !end) {\n setEnd(true)\n onEnd()\n }\n\n seconds = Math.floor(_seconds % 60)\n const minutes = Math.floor(_seconds / 60)\n\n return (\n <>\n {_seconds > 0 && (\n \n {minutes > 0 && `${minutes} ${minutes > 1 ? \"mins\" : \"min\"} `}\n {seconds > 0 && `${seconds} ${seconds > 1 ? \"secs\" : \"sec\"}`}\n \n )}\n >\n )\n}\n\nexport default Countdown\n"],"names":["Countdown","seconds","start","onEnd","typographyProps","_seconds","useCountdown","end","setEnd","useState","minutes","jsxs","Typography"],"mappings":";;;;;;;;;AAWA,MAAMA,IAAgC,CAAC;AAAA,EACrC,SAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,OAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,EAAAH,IAAU,KAAK,MAAMA,CAAO;AAC5B,QAAMI,IAAWC,EAAaL,CAAO,EAAE,CAAC,GAClC,CAACM,GAAKC,CAAM,IAAIC,EAAS,CAACP,CAAK;AAErC,EAAIG,MAAa,KAAK,CAACE,MACrBC,EAAO,EAAI,GACXL,EAAA,IAGFF,IAAU,KAAK,MAAMI,IAAW,EAAE;AAClC,QAAMK,IAAU,KAAK,MAAML,IAAW,EAAE;AAExC,6CAEK,UAAAA,IAAW,KACVM,gBAAAA,EAAAA,KAACC,GAAA,EAAY,GAAGR,GACb,UAAA;AAAA,IAAAM,IAAU,KAAK,GAAGA,CAAO,IAAIA,IAAU,IAAI,SAAS,KAAK;AAAA,IACzDT,IAAU,KAAK,GAAGA,CAAO,IAAIA,IAAU,IAAI,SAAS,KAAK;AAAA,EAAA,EAAA,CAC5D,EAAA,CAEJ;AAEJ;"}
\ No newline at end of file
+{"version":3,"file":"Countdown-DhjAmB0u.js","sources":["../src/components/Countdown.tsx"],"sourcesContent":["import { type FC, useState } from \"react\"\nimport { Typography, type TypographyProps } from \"@mui/material\"\n\nimport { useCountdown } from \"../hooks\"\n\nexport interface CountdownProps extends Omit {\n seconds: number\n start?: boolean\n onEnd: () => void\n}\n\nconst Countdown: FC = ({\n seconds,\n start = true,\n onEnd,\n ...typographyProps\n}) => {\n seconds = Math.floor(seconds)\n const _seconds = useCountdown(seconds)[0]\n const [end, setEnd] = useState(!start)\n\n if (_seconds === 0 && !end) {\n setEnd(true)\n onEnd()\n }\n\n seconds = Math.floor(_seconds % 60)\n const minutes = Math.floor(_seconds / 60)\n\n return (\n <>\n {_seconds > 0 && (\n \n {minutes > 0 && `${minutes} ${minutes > 1 ? \"mins\" : \"min\"} `}\n {seconds > 0 && `${seconds} ${seconds > 1 ? \"secs\" : \"sec\"}`}\n \n )}\n >\n )\n}\n\nexport default Countdown\n"],"names":["Countdown","seconds","start","onEnd","typographyProps","_seconds","useCountdown","end","setEnd","useState","minutes","jsxs","Typography"],"mappings":";;;;;;;;;AAWA,MAAMA,IAAgC,CAAC;AAAA,EACrC,SAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,OAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,EAAAH,IAAU,KAAK,MAAMA,CAAO;AAC5B,QAAMI,IAAWC,EAAaL,CAAO,EAAE,CAAC,GAClC,CAACM,GAAKC,CAAM,IAAIC,EAAS,CAACP,CAAK;AAErC,EAAIG,MAAa,KAAK,CAACE,MACrBC,EAAO,EAAI,GACXL,EAAA,IAGFF,IAAU,KAAK,MAAMI,IAAW,EAAE;AAClC,QAAMK,IAAU,KAAK,MAAML,IAAW,EAAE;AAExC,6CAEK,UAAAA,IAAW,KACVM,gBAAAA,EAAAA,KAACC,GAAA,EAAY,GAAGR,GACb,UAAA;AAAA,IAAAM,IAAU,KAAK,GAAGA,CAAO,IAAIA,IAAU,IAAI,SAAS,KAAK;AAAA,IACzDT,IAAU,KAAK,GAAGA,CAAO,IAAIA,IAAU,IAAI,SAAS,KAAK;AAAA,EAAA,EAAA,CAC5D,EAAA,CAEJ;AAEJ;"}
\ No newline at end of file
diff --git a/dist/Image-CgYjq-tA.cjs b/dist/Image-CgRVUblT.cjs
similarity index 78%
rename from dist/Image-CgYjq-tA.cjs
rename to dist/Image-CgRVUblT.cjs
index 8e07d64f..b912d946 100644
--- a/dist/Image-CgYjq-tA.cjs
+++ b/dist/Image-CgRVUblT.cjs
@@ -1,2 +1,2 @@
-"use strict";const s=require("./jsx-runtime-Dszzpdy0.cjs"),c=require("@mui/material");require("react");const l=require("./utils/general.cjs.js"),u=({href:i,hrefInNewTab:o=!1,...r})=>{let{onClick:t,style:e={},...n}=r;return e.width===void 0&&(e.width="100%"),i!==void 0&&(e={...e,cursor:"pointer"},o?t=()=>{l.openInNewTab(i)}:t=()=>{window.location.replace(i)}),s.jsxRuntimeExports.jsx(c.Box,{component:"img",onClick:t,style:e,...n})};exports.Image=u;
-//# sourceMappingURL=Image-CgYjq-tA.cjs.map
+"use strict";const s=require("./jsx-runtime-B2pbW5Fp.cjs"),c=require("@mui/material");require("react");const l=require("./utils/general.cjs.js"),u=({href:i,hrefInNewTab:o=!1,...r})=>{let{onClick:t,style:e={},...n}=r;return e.width===void 0&&(e.width="100%"),i!==void 0&&(e={...e,cursor:"pointer"},o?t=()=>{l.openInNewTab(i)}:t=()=>{window.location.replace(i)}),s.jsxRuntimeExports.jsx(c.Box,{component:"img",onClick:t,style:e,...n})};exports.Image=u;
+//# sourceMappingURL=Image-CgRVUblT.cjs.map
diff --git a/dist/Image-CgYjq-tA.cjs.map b/dist/Image-CgRVUblT.cjs.map
similarity index 95%
rename from dist/Image-CgYjq-tA.cjs.map
rename to dist/Image-CgRVUblT.cjs.map
index 2c5559b3..e2ca8058 100644
--- a/dist/Image-CgYjq-tA.cjs.map
+++ b/dist/Image-CgRVUblT.cjs.map
@@ -1 +1 @@
-{"version":3,"file":"Image-CgYjq-tA.cjs","sources":["../src/components/Image.tsx"],"sourcesContent":["import { Box, type BoxProps } from \"@mui/material\"\nimport { type FC } from \"react\"\n\nimport { openInNewTab } from \"../utils/general\"\n\nexport interface ImageProps extends Omit {\n alt: string\n src: string\n href?: string\n hrefInNewTab?: boolean\n}\n\nconst Image: FC = ({ href, hrefInNewTab = false, ...props }) => {\n let {\n onClick,\n style = {},\n ...otherProps // eslint-disable-line prefer-const\n } = props\n\n if (style.width === undefined) {\n style.width = \"100%\"\n }\n\n // Override onClick if href provided.\n if (href !== undefined) {\n style = { ...style, cursor: \"pointer\" }\n if (hrefInNewTab) {\n onClick = () => {\n openInNewTab(href)\n }\n } else {\n onClick = () => {\n window.location.replace(href)\n }\n }\n }\n\n return \n}\n\nexport default Image\n"],"names":["Image","href","hrefInNewTab","props","onClick","style","otherProps","openInNewTab","Box"],"mappings":"iJAYMA,EAAwB,CAAC,CAAE,KAAAC,EAAM,aAAAC,EAAe,GAAO,GAAGC,KAAY,CAC1E,GAAI,CACF,QAAAC,EACA,MAAAC,EAAQ,CAAA,EACR,GAAGC,CAAA,EACDH,EAEJ,OAAIE,EAAM,QAAU,SAClBA,EAAM,MAAQ,QAIZJ,IAAS,SACXI,EAAQ,CAAE,GAAGA,EAAO,OAAQ,SAAA,EACxBH,EACFE,EAAU,IAAM,CACdG,EAAAA,aAAaN,CAAI,CACnB,EAEAG,EAAU,IAAM,CACd,OAAO,SAAS,QAAQH,CAAI,CAC9B,2BAIIO,EAAAA,IAAA,CAAI,UAAU,MAAM,QAAAJ,EAAkB,MAAAC,EAAe,GAAGC,EAAY,CAC9E"}
\ No newline at end of file
+{"version":3,"file":"Image-CgRVUblT.cjs","sources":["../src/components/Image.tsx"],"sourcesContent":["import { Box, type BoxProps } from \"@mui/material\"\nimport { type FC } from \"react\"\n\nimport { openInNewTab } from \"../utils/general\"\n\nexport interface ImageProps extends Omit {\n alt: string\n src: string\n href?: string\n hrefInNewTab?: boolean\n}\n\nconst Image: FC = ({ href, hrefInNewTab = false, ...props }) => {\n let {\n onClick,\n style = {},\n ...otherProps // eslint-disable-line prefer-const\n } = props\n\n if (style.width === undefined) {\n style.width = \"100%\"\n }\n\n // Override onClick if href provided.\n if (href !== undefined) {\n style = { ...style, cursor: \"pointer\" }\n if (hrefInNewTab) {\n onClick = () => {\n openInNewTab(href)\n }\n } else {\n onClick = () => {\n window.location.replace(href)\n }\n }\n }\n\n return \n}\n\nexport default Image\n"],"names":["Image","href","hrefInNewTab","props","onClick","style","otherProps","openInNewTab","Box"],"mappings":"iJAYMA,EAAwB,CAAC,CAAE,KAAAC,EAAM,aAAAC,EAAe,GAAO,GAAGC,KAAY,CAC1E,GAAI,CACF,QAAAC,EACA,MAAAC,EAAQ,CAAA,EACR,GAAGC,CAAA,EACDH,EAEJ,OAAIE,EAAM,QAAU,SAClBA,EAAM,MAAQ,QAIZJ,IAAS,SACXI,EAAQ,CAAE,GAAGA,EAAO,OAAQ,SAAA,EACxBH,EACFE,EAAU,IAAM,CACdG,EAAAA,aAAaN,CAAI,CACnB,EAEAG,EAAU,IAAM,CACd,OAAO,SAAS,QAAQH,CAAI,CAC9B,2BAIIO,EAAAA,IAAA,CAAI,UAAU,MAAM,QAAAJ,EAAkB,MAAAC,EAAe,GAAGC,EAAY,CAC9E"}
\ No newline at end of file
diff --git a/dist/Image-C-f2ChBh.js b/dist/Image-DTOu0h-V.js
similarity index 85%
rename from dist/Image-C-f2ChBh.js
rename to dist/Image-DTOu0h-V.js
index b239fae9..0af1758a 100644
--- a/dist/Image-C-f2ChBh.js
+++ b/dist/Image-DTOu0h-V.js
@@ -1,4 +1,4 @@
-import { j as n } from "./jsx-runtime-C7wFtzyj.js";
+import { j as n } from "./jsx-runtime-lzYHhGH3.js";
import { Box as p } from "@mui/material";
import "react";
import { openInNewTab as s } from "./utils/general.es.js";
@@ -18,4 +18,4 @@ const f = ({ href: i, hrefInNewTab: r = !1, ...e }) => {
export {
f as I
};
-//# sourceMappingURL=Image-C-f2ChBh.js.map
+//# sourceMappingURL=Image-DTOu0h-V.js.map
diff --git a/dist/Image-C-f2ChBh.js.map b/dist/Image-DTOu0h-V.js.map
similarity index 96%
rename from dist/Image-C-f2ChBh.js.map
rename to dist/Image-DTOu0h-V.js.map
index 70b5a020..1fe29cb6 100644
--- a/dist/Image-C-f2ChBh.js.map
+++ b/dist/Image-DTOu0h-V.js.map
@@ -1 +1 @@
-{"version":3,"file":"Image-C-f2ChBh.js","sources":["../src/components/Image.tsx"],"sourcesContent":["import { Box, type BoxProps } from \"@mui/material\"\nimport { type FC } from \"react\"\n\nimport { openInNewTab } from \"../utils/general\"\n\nexport interface ImageProps extends Omit {\n alt: string\n src: string\n href?: string\n hrefInNewTab?: boolean\n}\n\nconst Image: FC = ({ href, hrefInNewTab = false, ...props }) => {\n let {\n onClick,\n style = {},\n ...otherProps // eslint-disable-line prefer-const\n } = props\n\n if (style.width === undefined) {\n style.width = \"100%\"\n }\n\n // Override onClick if href provided.\n if (href !== undefined) {\n style = { ...style, cursor: \"pointer\" }\n if (hrefInNewTab) {\n onClick = () => {\n openInNewTab(href)\n }\n } else {\n onClick = () => {\n window.location.replace(href)\n }\n }\n }\n\n return \n}\n\nexport default Image\n"],"names":["Image","href","hrefInNewTab","props","onClick","style","otherProps","openInNewTab","Box"],"mappings":";;;;AAYA,MAAMA,IAAwB,CAAC,EAAE,MAAAC,GAAM,cAAAC,IAAe,IAAO,GAAGC,QAAY;AAC1E,MAAI;AAAA,IACF,SAAAC;AAAA,IACA,OAAAC,IAAQ,CAAA;AAAA,IACR,GAAGC;AAAA;AAAA,EAAA,IACDH;AAEJ,SAAIE,EAAM,UAAU,WAClBA,EAAM,QAAQ,SAIZJ,MAAS,WACXI,IAAQ,EAAE,GAAGA,GAAO,QAAQ,UAAA,GACxBH,IACFE,IAAU,MAAM;AACd,IAAAG,EAAaN,CAAI;AAAA,EACnB,IAEAG,IAAU,MAAM;AACd,WAAO,SAAS,QAAQH,CAAI;AAAA,EAC9B,0BAIIO,GAAA,EAAI,WAAU,OAAM,SAAAJ,GAAkB,OAAAC,GAAe,GAAGC,GAAY;AAC9E;"}
\ No newline at end of file
+{"version":3,"file":"Image-DTOu0h-V.js","sources":["../src/components/Image.tsx"],"sourcesContent":["import { Box, type BoxProps } from \"@mui/material\"\nimport { type FC } from \"react\"\n\nimport { openInNewTab } from \"../utils/general\"\n\nexport interface ImageProps extends Omit {\n alt: string\n src: string\n href?: string\n hrefInNewTab?: boolean\n}\n\nconst Image: FC = ({ href, hrefInNewTab = false, ...props }) => {\n let {\n onClick,\n style = {},\n ...otherProps // eslint-disable-line prefer-const\n } = props\n\n if (style.width === undefined) {\n style.width = \"100%\"\n }\n\n // Override onClick if href provided.\n if (href !== undefined) {\n style = { ...style, cursor: \"pointer\" }\n if (hrefInNewTab) {\n onClick = () => {\n openInNewTab(href)\n }\n } else {\n onClick = () => {\n window.location.replace(href)\n }\n }\n }\n\n return \n}\n\nexport default Image\n"],"names":["Image","href","hrefInNewTab","props","onClick","style","otherProps","openInNewTab","Box"],"mappings":";;;;AAYA,MAAMA,IAAwB,CAAC,EAAE,MAAAC,GAAM,cAAAC,IAAe,IAAO,GAAGC,QAAY;AAC1E,MAAI;AAAA,IACF,SAAAC;AAAA,IACA,OAAAC,IAAQ,CAAA;AAAA,IACR,GAAGC;AAAA;AAAA,EAAA,IACDH;AAEJ,SAAIE,EAAM,UAAU,WAClBA,EAAM,QAAQ,SAIZJ,MAAS,WACXI,IAAQ,EAAE,GAAGA,GAAO,QAAQ,UAAA,GACxBH,IACFE,IAAU,MAAM;AACd,IAAAG,EAAaN,CAAI;AAAA,EACnB,IAEAG,IAAU,MAAM;AACd,WAAO,SAAS,QAAQH,CAAI;AAAA,EAC9B,0BAIIO,GAAA,EAAI,WAAU,OAAM,SAAAJ,GAAkB,OAAAC,GAAe,GAAGC,GAAY;AAC9E;"}
\ No newline at end of file
diff --git a/dist/LinkButton-BOPjG7_2.cjs b/dist/LinkButton-Kw2brLTK.cjs
similarity index 52%
rename from dist/LinkButton-BOPjG7_2.cjs
rename to dist/LinkButton-Kw2brLTK.cjs
index 9da0bfcc..3bad4f69 100644
--- a/dist/LinkButton-BOPjG7_2.cjs
+++ b/dist/LinkButton-Kw2brLTK.cjs
@@ -1,2 +1,2 @@
-"use strict";const r=require("./jsx-runtime-Dszzpdy0.cjs"),t=require("@mui/material");require("react");const n=require("react-router");require("@mui/icons-material");require("./palette-BnIdHKDE.cjs");require("./auth-B7Vdot4N.cjs");const u=e=>r.jsxRuntimeExports.jsx(t.Button,{...e,component:n.Link});exports.LinkButton=u;
-//# sourceMappingURL=LinkButton-BOPjG7_2.cjs.map
+"use strict";const r=require("./jsx-runtime-B2pbW5Fp.cjs"),t=require("@mui/material");require("react");const n=require("react-router");require("@mui/icons-material");require("./palette-BnIdHKDE.cjs");require("./auth-BwpsrTko.cjs");const u=e=>r.jsxRuntimeExports.jsx(t.Button,{...e,component:n.Link});exports.LinkButton=u;
+//# sourceMappingURL=LinkButton-Kw2brLTK.cjs.map
diff --git a/dist/LinkButton-BOPjG7_2.cjs.map b/dist/LinkButton-Kw2brLTK.cjs.map
similarity index 94%
rename from dist/LinkButton-BOPjG7_2.cjs.map
rename to dist/LinkButton-Kw2brLTK.cjs.map
index e0b509c8..fe504ebf 100644
--- a/dist/LinkButton-BOPjG7_2.cjs.map
+++ b/dist/LinkButton-Kw2brLTK.cjs.map
@@ -1 +1 @@
-{"version":3,"file":"LinkButton-BOPjG7_2.cjs","sources":["../src/components/router/LinkButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkButton: {\n (props: LinkButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkButtonProps<\"delta\"> | LinkButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkButton\n"],"names":["LinkButton","props","jsx","Button","Link"],"mappings":"uOAYA,MAAMA,EAKDC,GACIC,EAAAA,kBAAAA,IAACC,EAAAA,QAAa,GAAGF,EAAO,UAAWG,EAAAA,KAAQ"}
\ No newline at end of file
+{"version":3,"file":"LinkButton-Kw2brLTK.cjs","sources":["../src/components/router/LinkButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkButton: {\n (props: LinkButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkButtonProps<\"delta\"> | LinkButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkButton\n"],"names":["LinkButton","props","jsx","Button","Link"],"mappings":"uOAYA,MAAMA,EAKDC,GACIC,EAAAA,kBAAAA,IAACC,EAAAA,QAAa,GAAGF,EAAO,UAAWG,EAAAA,KAAQ"}
\ No newline at end of file
diff --git a/dist/LinkButton-Bk50AHHg.js b/dist/LinkButton-sQ5jgHnX.js
similarity index 66%
rename from dist/LinkButton-Bk50AHHg.js
rename to dist/LinkButton-sQ5jgHnX.js
index bfc14a57..97567519 100644
--- a/dist/LinkButton-Bk50AHHg.js
+++ b/dist/LinkButton-sQ5jgHnX.js
@@ -1,12 +1,12 @@
-import { j as t } from "./jsx-runtime-C7wFtzyj.js";
+import { j as t } from "./jsx-runtime-lzYHhGH3.js";
import { Button as r } from "@mui/material";
import "react";
import { Link as m } from "react-router";
import "@mui/icons-material";
import "./palette-CYwuLBW7.js";
-import "./auth-CQ1InCxP.js";
+import "./auth-Bb8WkZGN.js";
const f = (o) => /* @__PURE__ */ t.jsx(r, { ...o, component: m });
export {
f as L
};
-//# sourceMappingURL=LinkButton-Bk50AHHg.js.map
+//# sourceMappingURL=LinkButton-sQ5jgHnX.js.map
diff --git a/dist/LinkButton-Bk50AHHg.js.map b/dist/LinkButton-sQ5jgHnX.js.map
similarity index 94%
rename from dist/LinkButton-Bk50AHHg.js.map
rename to dist/LinkButton-sQ5jgHnX.js.map
index eaab8758..83920659 100644
--- a/dist/LinkButton-Bk50AHHg.js.map
+++ b/dist/LinkButton-sQ5jgHnX.js.map
@@ -1 +1 @@
-{"version":3,"file":"LinkButton-Bk50AHHg.js","sources":["../src/components/router/LinkButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkButton: {\n (props: LinkButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkButtonProps<\"delta\"> | LinkButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkButton\n"],"names":["LinkButton","props","jsx","Button","Link"],"mappings":";;;;;;;AAYA,MAAMA,IAKF,CAACC,MACIC,gBAAAA,EAAAA,IAACC,KAAa,GAAGF,GAAO,WAAWG,GAAQ;"}
\ No newline at end of file
+{"version":3,"file":"LinkButton-sQ5jgHnX.js","sources":["../src/components/router/LinkButton.tsx"],"sourcesContent":["import { Button, type ButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkButton: {\n (props: LinkButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkButtonProps<\"delta\"> | LinkButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkButton\n"],"names":["LinkButton","props","jsx","Button","Link"],"mappings":";;;;;;;AAYA,MAAMA,IAKF,CAACC,MACIC,gBAAAA,EAAAA,IAACC,KAAa,GAAGF,GAAO,WAAWG,GAAQ;"}
\ No newline at end of file
diff --git a/dist/Navigate-C_sgy8Xs.cjs b/dist/Navigate-C_sgy8Xs.cjs
deleted file mode 100644
index 8c6dc9ad..00000000
--- a/dist/Navigate-C_sgy8Xs.cjs
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";const n=require("./jsx-runtime-Dszzpdy0.cjs"),e=require("@mui/material"),u=require("react"),i=require("react-router");require("@mui/icons-material");require("./palette-BnIdHKDE.cjs");const c=require("./auth-B7Vdot4N.cjs"),x=t=>n.jsxRuntimeExports.jsx(e.Link,{component:i.Link,...t}),m=t=>n.jsxRuntimeExports.jsx(e.IconButton,{...t,component:i.Link}),L=t=>n.jsxRuntimeExports.jsx(e.ListItem,{...t,component:i.Link}),a=t=>n.jsxRuntimeExports.jsx(e.Tab,{...t,component:i.Link}),k=({delta:t,to:s,...o})=>{const r=c.useNavigate();return u.useEffect(()=>{typeof t=="number"?r(t):r(s,o)},[r,t,s,o]),n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{})};exports.Link=x;exports.LinkIconButton=m;exports.LinkListItem=L;exports.LinkTab=a;exports.Navigate=k;
-//# sourceMappingURL=Navigate-C_sgy8Xs.cjs.map
diff --git a/dist/Navigate-SL_oMjPc.js b/dist/Navigate-ClPcw87e.js
similarity index 83%
rename from dist/Navigate-SL_oMjPc.js
rename to dist/Navigate-ClPcw87e.js
index 918b3a73..bcf90549 100644
--- a/dist/Navigate-SL_oMjPc.js
+++ b/dist/Navigate-ClPcw87e.js
@@ -1,10 +1,10 @@
-import { j as n } from "./jsx-runtime-C7wFtzyj.js";
+import { j as n } from "./jsx-runtime-lzYHhGH3.js";
import { Link as i, IconButton as m, ListItem as a, Tab as c } from "@mui/material";
import { useEffect as p } from "react";
import { Link as o } from "react-router";
import "@mui/icons-material";
import "./palette-CYwuLBW7.js";
-import { e as u } from "./auth-CQ1InCxP.js";
+import { e as u } from "./auth-Bb8WkZGN.js";
const I = (t) => /* @__PURE__ */ n.jsx(i, { component: o, ...t }), v = (t) => /* @__PURE__ */ n.jsx(m, { ...t, component: o }), N = (t) => /* @__PURE__ */ n.jsx(a, { ...t, component: o }), B = (t) => /* @__PURE__ */ n.jsx(c, { ...t, component: o }), E = ({
delta: t,
to: s,
@@ -22,4 +22,4 @@ export {
N as b,
B as c
};
-//# sourceMappingURL=Navigate-SL_oMjPc.js.map
+//# sourceMappingURL=Navigate-ClPcw87e.js.map
diff --git a/dist/Navigate-SL_oMjPc.js.map b/dist/Navigate-ClPcw87e.js.map
similarity index 98%
rename from dist/Navigate-SL_oMjPc.js.map
rename to dist/Navigate-ClPcw87e.js.map
index 98fdfee6..df751f78 100644
--- a/dist/Navigate-SL_oMjPc.js.map
+++ b/dist/Navigate-ClPcw87e.js.map
@@ -1 +1 @@
-{"version":3,"file":"Navigate-SL_oMjPc.js","sources":["../src/components/router/Link.tsx","../src/components/router/LinkIconButton.tsx","../src/components/router/LinkListItem.tsx","../src/components/router/LinkTab.tsx","../src/components/router/Navigate.tsx"],"sourcesContent":["import { Link as MuiLink, type LinkProps as MuiLinkProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link as RouterLink } from \"react-router\"\n\nimport { type LinkProps as RouterLinkProps } from \"../../utils/router\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & RouterLinkProps\n\n// https://mui.com/material-ui/integrations/routing/#link\nconst Link: {\n (props: LinkProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkProps<\"delta\"> | LinkProps<\"to\">) => {\n // @ts-expect-error props are assignable\n return \n}\n\nexport default Link\n","import { IconButton, type IconButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkIconButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkIconButton: {\n (props: LinkIconButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkIconButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkIconButtonProps<\"delta\"> | LinkIconButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkIconButton\n","import { ListItem, type ListItemProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkListItemProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#list\nconst LinkListItem: {\n (props: LinkListItemProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkListItemProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkListItemProps<\"delta\"> | LinkListItemProps<\"to\">) => {\n return \n}\n\nexport default LinkListItem\n","import { Tab, type TabProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkTabProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#tabs\nconst LinkTab: {\n (props: LinkTabProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkTabProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkTabProps<\"delta\"> | LinkTabProps<\"to\">) => {\n return \n}\n\nexport default LinkTab\n","import { type JSX, useEffect } from \"react\"\nimport { type To } from \"react-router\"\n\nimport { type NavigateOptions, useNavigate } from \"../../hooks\"\n\nexport type NavigateProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Override extends \"delta\"\n ? { delta: number; to?: undefined }\n : { delta?: undefined; to: To } & NavigateOptions\n\nconst Navigate: {\n (props: NavigateProps<\"delta\">): JSX.Element\n = Record>(\n props: NavigateProps<\"to\", State>,\n ): JSX.Element\n} = ({\n delta,\n to,\n ...options\n}: NavigateProps<\"delta\"> | NavigateProps<\"to\">) => {\n const navigate = useNavigate()\n\n useEffect(() => {\n if (typeof delta === \"number\") navigate(delta)\n else navigate(to, options)\n }, [navigate, delta, to, options])\n\n return <>>\n}\n\nexport default Navigate\n"],"names":["Link","props","jsx","MuiLink","RouterLink","LinkIconButton","IconButton","LinkListItem","ListItem","LinkTab","Tab","Navigate","delta","to","options","navigate","useNavigate","useEffect","Fragment"],"mappings":";;;;;;;AAYA,MAAMA,IAKF,CAACC,MAEIC,gBAAAA,EAAAA,IAACC,GAAA,EAAQ,WAAWC,GAAa,GAAGH,GAAO,GCP9CI,IAKF,CAACJ,MACIC,gBAAAA,EAAAA,IAACI,KAAiB,GAAGL,GAAO,WAAWD,GAAQ,GCNlDO,IAKF,CAACN,MACIC,gBAAAA,EAAAA,IAACM,KAAe,GAAGP,GAAO,WAAWD,GAAQ,GCNhDS,IAKF,CAACR,MACIC,gBAAAA,EAAAA,IAACQ,KAAU,GAAGT,GAAO,WAAWD,GAAQ,GCN3CW,IAKF,CAAC;AAAA,EACH,OAAAC;AAAA,EACA,IAAAC;AAAA,EACA,GAAGC;AACL,MAAoD;AAClD,QAAMC,IAAWC,EAAA;AAEjB,SAAAC,EAAU,MAAM;AACd,IAAI,OAAOL,KAAU,WAAUG,EAASH,CAAK,IACxCG,EAASF,GAAIC,CAAO;AAAA,EAC3B,GAAG,CAACC,GAAUH,GAAOC,GAAIC,CAAO,CAAC,GAE1BZ,gBAAAA,EAAAA,IAAAgB,EAAAA,UAAA,EAAE;AACX;"}
\ No newline at end of file
+{"version":3,"file":"Navigate-ClPcw87e.js","sources":["../src/components/router/Link.tsx","../src/components/router/LinkIconButton.tsx","../src/components/router/LinkListItem.tsx","../src/components/router/LinkTab.tsx","../src/components/router/Navigate.tsx"],"sourcesContent":["import { Link as MuiLink, type LinkProps as MuiLinkProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link as RouterLink } from \"react-router\"\n\nimport { type LinkProps as RouterLinkProps } from \"../../utils/router\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & RouterLinkProps\n\n// https://mui.com/material-ui/integrations/routing/#link\nconst Link: {\n (props: LinkProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkProps<\"delta\"> | LinkProps<\"to\">) => {\n // @ts-expect-error props are assignable\n return \n}\n\nexport default Link\n","import { IconButton, type IconButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkIconButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkIconButton: {\n (props: LinkIconButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkIconButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkIconButtonProps<\"delta\"> | LinkIconButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkIconButton\n","import { ListItem, type ListItemProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkListItemProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#list\nconst LinkListItem: {\n (props: LinkListItemProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkListItemProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkListItemProps<\"delta\"> | LinkListItemProps<\"to\">) => {\n return \n}\n\nexport default LinkListItem\n","import { Tab, type TabProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkTabProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#tabs\nconst LinkTab: {\n (props: LinkTabProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkTabProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkTabProps<\"delta\"> | LinkTabProps<\"to\">) => {\n return \n}\n\nexport default LinkTab\n","import { type JSX, useEffect } from \"react\"\nimport { type To } from \"react-router\"\n\nimport { type NavigateOptions, useNavigate } from \"../../hooks\"\n\nexport type NavigateProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Override extends \"delta\"\n ? { delta: number; to?: undefined }\n : { delta?: undefined; to: To } & NavigateOptions\n\nconst Navigate: {\n (props: NavigateProps<\"delta\">): JSX.Element\n = Record>(\n props: NavigateProps<\"to\", State>,\n ): JSX.Element\n} = ({\n delta,\n to,\n ...options\n}: NavigateProps<\"delta\"> | NavigateProps<\"to\">) => {\n const navigate = useNavigate()\n\n useEffect(() => {\n if (typeof delta === \"number\") navigate(delta)\n else navigate(to, options)\n }, [navigate, delta, to, options])\n\n return <>>\n}\n\nexport default Navigate\n"],"names":["Link","props","jsx","MuiLink","RouterLink","LinkIconButton","IconButton","LinkListItem","ListItem","LinkTab","Tab","Navigate","delta","to","options","navigate","useNavigate","useEffect","Fragment"],"mappings":";;;;;;;AAYA,MAAMA,IAKF,CAACC,MAEIC,gBAAAA,EAAAA,IAACC,GAAA,EAAQ,WAAWC,GAAa,GAAGH,GAAO,GCP9CI,IAKF,CAACJ,MACIC,gBAAAA,EAAAA,IAACI,KAAiB,GAAGL,GAAO,WAAWD,GAAQ,GCNlDO,IAKF,CAACN,MACIC,gBAAAA,EAAAA,IAACM,KAAe,GAAGP,GAAO,WAAWD,GAAQ,GCNhDS,IAKF,CAACR,MACIC,gBAAAA,EAAAA,IAACQ,KAAU,GAAGT,GAAO,WAAWD,GAAQ,GCN3CW,IAKF,CAAC;AAAA,EACH,OAAAC;AAAA,EACA,IAAAC;AAAA,EACA,GAAGC;AACL,MAAoD;AAClD,QAAMC,IAAWC,EAAA;AAEjB,SAAAC,EAAU,MAAM;AACd,IAAI,OAAOL,KAAU,WAAUG,EAASH,CAAK,IACxCG,EAASF,GAAIC,CAAO;AAAA,EAC3B,GAAG,CAACC,GAAUH,GAAOC,GAAIC,CAAO,CAAC,GAE1BZ,gBAAAA,EAAAA,IAAAgB,EAAAA,UAAA,EAAE;AACX;"}
\ No newline at end of file
diff --git a/dist/Navigate-CrMwdIBB.cjs b/dist/Navigate-CrMwdIBB.cjs
new file mode 100644
index 00000000..bf055956
--- /dev/null
+++ b/dist/Navigate-CrMwdIBB.cjs
@@ -0,0 +1,2 @@
+"use strict";const n=require("./jsx-runtime-B2pbW5Fp.cjs"),e=require("@mui/material"),u=require("react"),r=require("react-router");require("@mui/icons-material");require("./palette-BnIdHKDE.cjs");const c=require("./auth-BwpsrTko.cjs"),x=t=>n.jsxRuntimeExports.jsx(e.Link,{component:r.Link,...t}),m=t=>n.jsxRuntimeExports.jsx(e.IconButton,{...t,component:r.Link}),L=t=>n.jsxRuntimeExports.jsx(e.ListItem,{...t,component:r.Link}),a=t=>n.jsxRuntimeExports.jsx(e.Tab,{...t,component:r.Link}),k=({delta:t,to:s,...o})=>{const i=c.useNavigate();return u.useEffect(()=>{typeof t=="number"?i(t):i(s,o)},[i,t,s,o]),n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{})};exports.Link=x;exports.LinkIconButton=m;exports.LinkListItem=L;exports.LinkTab=a;exports.Navigate=k;
+//# sourceMappingURL=Navigate-CrMwdIBB.cjs.map
diff --git a/dist/Navigate-C_sgy8Xs.cjs.map b/dist/Navigate-CrMwdIBB.cjs.map
similarity index 98%
rename from dist/Navigate-C_sgy8Xs.cjs.map
rename to dist/Navigate-CrMwdIBB.cjs.map
index a8a1a4ac..03fdd168 100644
--- a/dist/Navigate-C_sgy8Xs.cjs.map
+++ b/dist/Navigate-CrMwdIBB.cjs.map
@@ -1 +1 @@
-{"version":3,"file":"Navigate-C_sgy8Xs.cjs","sources":["../src/components/router/Link.tsx","../src/components/router/LinkIconButton.tsx","../src/components/router/LinkListItem.tsx","../src/components/router/LinkTab.tsx","../src/components/router/Navigate.tsx"],"sourcesContent":["import { Link as MuiLink, type LinkProps as MuiLinkProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link as RouterLink } from \"react-router\"\n\nimport { type LinkProps as RouterLinkProps } from \"../../utils/router\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & RouterLinkProps\n\n// https://mui.com/material-ui/integrations/routing/#link\nconst Link: {\n (props: LinkProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkProps<\"delta\"> | LinkProps<\"to\">) => {\n // @ts-expect-error props are assignable\n return \n}\n\nexport default Link\n","import { IconButton, type IconButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkIconButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkIconButton: {\n (props: LinkIconButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkIconButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkIconButtonProps<\"delta\"> | LinkIconButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkIconButton\n","import { ListItem, type ListItemProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkListItemProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#list\nconst LinkListItem: {\n (props: LinkListItemProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkListItemProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkListItemProps<\"delta\"> | LinkListItemProps<\"to\">) => {\n return \n}\n\nexport default LinkListItem\n","import { Tab, type TabProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkTabProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#tabs\nconst LinkTab: {\n (props: LinkTabProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkTabProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkTabProps<\"delta\"> | LinkTabProps<\"to\">) => {\n return \n}\n\nexport default LinkTab\n","import { type JSX, useEffect } from \"react\"\nimport { type To } from \"react-router\"\n\nimport { type NavigateOptions, useNavigate } from \"../../hooks\"\n\nexport type NavigateProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Override extends \"delta\"\n ? { delta: number; to?: undefined }\n : { delta?: undefined; to: To } & NavigateOptions\n\nconst Navigate: {\n (props: NavigateProps<\"delta\">): JSX.Element\n = Record>(\n props: NavigateProps<\"to\", State>,\n ): JSX.Element\n} = ({\n delta,\n to,\n ...options\n}: NavigateProps<\"delta\"> | NavigateProps<\"to\">) => {\n const navigate = useNavigate()\n\n useEffect(() => {\n if (typeof delta === \"number\") navigate(delta)\n else navigate(to, options)\n }, [navigate, delta, to, options])\n\n return <>>\n}\n\nexport default Navigate\n"],"names":["Link","props","jsx","MuiLink","RouterLink","LinkIconButton","IconButton","LinkListItem","ListItem","LinkTab","Tab","Navigate","delta","to","options","navigate","useNavigate","useEffect","Fragment"],"mappings":"2OAYMA,EAKDC,GAEIC,EAAAA,kBAAAA,IAACC,EAAAA,KAAA,CAAQ,UAAWC,EAAAA,KAAa,GAAGH,EAAO,ECP9CI,EAKDJ,GACIC,EAAAA,kBAAAA,IAACI,EAAAA,YAAiB,GAAGL,EAAO,UAAWD,EAAAA,KAAQ,ECNlDO,EAKDN,GACIC,EAAAA,kBAAAA,IAACM,EAAAA,UAAe,GAAGP,EAAO,UAAWD,EAAAA,KAAQ,ECNhDS,EAKDR,GACIC,EAAAA,kBAAAA,IAACQ,EAAAA,KAAU,GAAGT,EAAO,UAAWD,EAAAA,KAAQ,ECN3CW,EAKF,CAAC,CACH,MAAAC,EACA,GAAAC,EACA,GAAGC,CACL,IAAoD,CAClD,MAAMC,EAAWC,EAAAA,YAAA,EAEjBC,OAAAA,EAAAA,UAAU,IAAM,CACV,OAAOL,GAAU,SAAUG,EAASH,CAAK,EACxCG,EAASF,EAAIC,CAAO,CAC3B,EAAG,CAACC,EAAUH,EAAOC,EAAIC,CAAO,CAAC,EAE1BZ,EAAAA,kBAAAA,IAAAgB,EAAAA,kBAAAA,SAAA,EAAE,CACX"}
\ No newline at end of file
+{"version":3,"file":"Navigate-CrMwdIBB.cjs","sources":["../src/components/router/Link.tsx","../src/components/router/LinkIconButton.tsx","../src/components/router/LinkListItem.tsx","../src/components/router/LinkTab.tsx","../src/components/router/Navigate.tsx"],"sourcesContent":["import { Link as MuiLink, type LinkProps as MuiLinkProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link as RouterLink } from \"react-router\"\n\nimport { type LinkProps as RouterLinkProps } from \"../../utils/router\"\n\nexport type LinkProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & RouterLinkProps\n\n// https://mui.com/material-ui/integrations/routing/#link\nconst Link: {\n (props: LinkProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkProps<\"delta\"> | LinkProps<\"to\">) => {\n // @ts-expect-error props are assignable\n return \n}\n\nexport default Link\n","import { IconButton, type IconButtonProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkIconButtonProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#button\nconst LinkIconButton: {\n (props: LinkIconButtonProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkIconButtonProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkIconButtonProps<\"delta\"> | LinkIconButtonProps<\"to\">) => {\n return \n}\n\nexport default LinkIconButton\n","import { ListItem, type ListItemProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkListItemProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#list\nconst LinkListItem: {\n (props: LinkListItemProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkListItemProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkListItemProps<\"delta\"> | LinkListItemProps<\"to\">) => {\n return \n}\n\nexport default LinkListItem\n","import { Tab, type TabProps } from \"@mui/material\"\nimport { type JSX } from \"react\"\nimport { Link } from \"react-router\"\n\nimport { type LinkProps } from \"../../utils/router\"\n\nexport type LinkTabProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Omit & LinkProps\n\n// https://mui.com/material-ui/integrations/routing/#tabs\nconst LinkTab: {\n (props: LinkTabProps<\"delta\">): JSX.Element\n = Record>(\n props: LinkTabProps<\"to\", State>,\n ): JSX.Element\n} = (props: LinkTabProps<\"delta\"> | LinkTabProps<\"to\">) => {\n return \n}\n\nexport default LinkTab\n","import { type JSX, useEffect } from \"react\"\nimport { type To } from \"react-router\"\n\nimport { type NavigateOptions, useNavigate } from \"../../hooks\"\n\nexport type NavigateProps<\n Override extends \"delta\" | \"to\",\n State extends Record = Record,\n> = Override extends \"delta\"\n ? { delta: number; to?: undefined }\n : { delta?: undefined; to: To } & NavigateOptions\n\nconst Navigate: {\n (props: NavigateProps<\"delta\">): JSX.Element\n = Record>(\n props: NavigateProps<\"to\", State>,\n ): JSX.Element\n} = ({\n delta,\n to,\n ...options\n}: NavigateProps<\"delta\"> | NavigateProps<\"to\">) => {\n const navigate = useNavigate()\n\n useEffect(() => {\n if (typeof delta === \"number\") navigate(delta)\n else navigate(to, options)\n }, [navigate, delta, to, options])\n\n return <>>\n}\n\nexport default Navigate\n"],"names":["Link","props","jsx","MuiLink","RouterLink","LinkIconButton","IconButton","LinkListItem","ListItem","LinkTab","Tab","Navigate","delta","to","options","navigate","useNavigate","useEffect","Fragment"],"mappings":"2OAYMA,EAKDC,GAEIC,EAAAA,kBAAAA,IAACC,EAAAA,KAAA,CAAQ,UAAWC,EAAAA,KAAa,GAAGH,EAAO,ECP9CI,EAKDJ,GACIC,EAAAA,kBAAAA,IAACI,EAAAA,YAAiB,GAAGL,EAAO,UAAWD,EAAAA,KAAQ,ECNlDO,EAKDN,GACIC,EAAAA,kBAAAA,IAACM,EAAAA,UAAe,GAAGP,EAAO,UAAWD,EAAAA,KAAQ,ECNhDS,EAKDR,GACIC,EAAAA,kBAAAA,IAACQ,EAAAA,KAAU,GAAGT,EAAO,UAAWD,EAAAA,KAAQ,ECN3CW,EAKF,CAAC,CACH,MAAAC,EACA,GAAAC,EACA,GAAGC,CACL,IAAoD,CAClD,MAAMC,EAAWC,EAAAA,YAAA,EAEjBC,OAAAA,EAAAA,UAAU,IAAM,CACV,OAAOL,GAAU,SAAUG,EAASH,CAAK,EACxCG,EAASF,EAAIC,CAAO,CAC3B,EAAG,CAACC,EAAUH,EAAOC,EAAIC,CAAO,CAAC,EAE1BZ,EAAAA,kBAAAA,IAAAgB,EAAAA,kBAAAA,SAAA,EAAE,CACX"}
\ No newline at end of file
diff --git a/dist/_commonjsHelpers-DKOUU3wS.cjs b/dist/_commonjsHelpers-DKOUU3wS.cjs
new file mode 100644
index 00000000..7206ebbf
--- /dev/null
+++ b/dist/_commonjsHelpers-DKOUU3wS.cjs
@@ -0,0 +1,2 @@
+"use strict";var o=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function l(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}exports.commonjsGlobal=o;exports.getDefaultExportFromCjs=l;
+//# sourceMappingURL=_commonjsHelpers-DKOUU3wS.cjs.map
diff --git a/dist/_commonjsHelpers-DKOUU3wS.cjs.map b/dist/_commonjsHelpers-DKOUU3wS.cjs.map
new file mode 100644
index 00000000..aa49cfdc
--- /dev/null
+++ b/dist/_commonjsHelpers-DKOUU3wS.cjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"_commonjsHelpers-DKOUU3wS.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/dist/_commonjsHelpers-DaMA6jEr.js b/dist/_commonjsHelpers-DaMA6jEr.js
new file mode 100644
index 00000000..c0a5fcc6
--- /dev/null
+++ b/dist/_commonjsHelpers-DaMA6jEr.js
@@ -0,0 +1,9 @@
+var o = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
+function l(e) {
+ return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
+}
+export {
+ o as c,
+ l as g
+};
+//# sourceMappingURL=_commonjsHelpers-DaMA6jEr.js.map
diff --git a/dist/_commonjsHelpers-DaMA6jEr.js.map b/dist/_commonjsHelpers-DaMA6jEr.js.map
new file mode 100644
index 00000000..d691b660
--- /dev/null
+++ b/dist/_commonjsHelpers-DaMA6jEr.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"_commonjsHelpers-DaMA6jEr.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
\ No newline at end of file
diff --git a/dist/api-9cnyvZj7.cjs b/dist/api-9cnyvZj7.cjs
new file mode 100644
index 00000000..dea8027a
--- /dev/null
+++ b/dist/api-9cnyvZj7.cjs
@@ -0,0 +1,2 @@
+"use strict";const r=require("react");function u(g){const{page:e=0,limit:a=150}=g||{},[c,f]=r.useState({page:e,limit:a,offset:e*a});return[c,t=>{f(({page:p,limit:o})=>{const s=typeof t=="function"?t({page:p,limit:o}):t;let i=s.page;const n=s.limit;return n!==o&&(i=0),{page:i,limit:n,offset:i*n}})}]}exports.usePagination=u;
+//# sourceMappingURL=api-9cnyvZj7.cjs.map
diff --git a/dist/api-DIgp_6Vr.cjs.map b/dist/api-9cnyvZj7.cjs.map
similarity index 96%
rename from dist/api-DIgp_6Vr.cjs.map
rename to dist/api-9cnyvZj7.cjs.map
index 640ea1b1..3d3107ac 100644
--- a/dist/api-DIgp_6Vr.cjs.map
+++ b/dist/api-9cnyvZj7.cjs.map
@@ -1 +1 @@
-{"version":3,"file":"api-DIgp_6Vr.cjs","sources":["../src/hooks/api.tsx"],"sourcesContent":["import { type Dispatch, type SetStateAction, useState } from \"react\"\n\nexport type Pagination = { page: number; limit: number; offset: number }\nexport type SetPagination = Dispatch<\n SetStateAction<{ page: number; limit: number }>\n>\nexport type UsePaginationOptions = Partial<{\n page: number\n limit: number\n}>\n\nexport function usePagination(\n options?: UsePaginationOptions,\n): [Pagination, SetPagination] {\n const { page = 0, limit = 150 } = options || {}\n\n const [pagination, _setPagination] = useState({\n page,\n limit,\n offset: page * limit,\n })\n\n const setPagination: SetPagination = value => {\n _setPagination(({ page: previousPage, limit: previousLimit }) => {\n const pagination =\n typeof value === \"function\"\n ? value({ page: previousPage, limit: previousLimit })\n : value\n let page = pagination.page\n const limit = pagination.limit\n\n if (limit !== previousLimit) page = 0\n\n return { page, limit, offset: page * limit }\n })\n }\n\n return [pagination, setPagination]\n}\n"],"names":["usePagination","options","page","limit","pagination","_setPagination","useState","value","previousPage","previousLimit"],"mappings":"sCAWO,SAASA,EACdC,EAC6B,CAC7B,KAAM,CAAE,KAAAC,EAAO,EAAG,MAAAC,EAAQ,GAAA,EAAQF,GAAW,CAAA,EAEvC,CAACG,EAAYC,CAAc,EAAIC,WAAqB,CACxD,KAAAJ,EACA,MAAAC,EACA,OAAQD,EAAOC,CAAA,CAChB,EAiBD,MAAO,CAACC,EAf6BG,GAAS,CAC5CF,EAAe,CAAC,CAAE,KAAMG,EAAc,MAAOC,KAAoB,CAC/D,MAAML,EACJ,OAAOG,GAAU,WACbA,EAAM,CAAE,KAAMC,EAAc,MAAOC,CAAA,CAAe,EAClDF,EACN,IAAIL,EAAOE,EAAW,KACtB,MAAMD,EAAQC,EAAW,MAEzB,OAAID,IAAUM,IAAeP,EAAO,GAE7B,CAAE,KAAAA,EAAM,MAAAC,EAAO,OAAQD,EAAOC,CAAAA,CACvC,CAAC,CACH,CAEiC,CACnC"}
\ No newline at end of file
+{"version":3,"file":"api-9cnyvZj7.cjs","sources":["../src/hooks/api.tsx"],"sourcesContent":["import { type Dispatch, type SetStateAction, useState } from \"react\"\n\nexport type Pagination = { page: number; limit: number; offset: number }\nexport type SetPagination = Dispatch<\n SetStateAction<{ page: number; limit: number }>\n>\nexport type UsePaginationOptions = Partial<{\n page: number\n limit: number\n}>\n\nexport function usePagination(\n options?: UsePaginationOptions,\n): [Pagination, SetPagination] {\n const { page = 0, limit = 150 } = options || {}\n\n const [pagination, _setPagination] = useState({\n page,\n limit,\n offset: page * limit,\n })\n\n const setPagination: SetPagination = value => {\n _setPagination(({ page: previousPage, limit: previousLimit }) => {\n const pagination =\n typeof value === \"function\"\n ? value({ page: previousPage, limit: previousLimit })\n : value\n let page = pagination.page\n const limit = pagination.limit\n\n if (limit !== previousLimit) page = 0\n\n return { page, limit, offset: page * limit }\n })\n }\n\n return [pagination, setPagination]\n}\n"],"names":["usePagination","options","page","limit","pagination","_setPagination","useState","value","previousPage","previousLimit"],"mappings":"sCAWO,SAASA,EACdC,EAC6B,CAC7B,KAAM,CAAE,KAAAC,EAAO,EAAG,MAAAC,EAAQ,GAAA,EAAQF,GAAW,CAAA,EAEvC,CAACG,EAAYC,CAAc,EAAIC,WAAqB,CACxD,KAAAJ,EACA,MAAAC,EACA,OAAQD,EAAOC,CAAA,CAChB,EAiBD,MAAO,CAACC,EAf6BG,GAAS,CAC5CF,EAAe,CAAC,CAAE,KAAMG,EAAc,MAAOC,KAAoB,CAC/D,MAAML,EACJ,OAAOG,GAAU,WACbA,EAAM,CAAE,KAAMC,EAAc,MAAOC,CAAA,CAAe,EAClDF,EACN,IAAIL,EAAOE,EAAW,KACtB,MAAMD,EAAQC,EAAW,MAEzB,OAAID,IAAUM,IAAeP,EAAO,GAE7B,CAAE,KAAAA,EAAM,MAAAC,EAAO,OAAQD,EAAOC,CAAAA,CACvC,CAAC,CACH,CAEiC,CACnC"}
\ No newline at end of file
diff --git a/dist/api-BvUiTeR7.js b/dist/api-BFYu8ZvQ.js
similarity index 96%
rename from dist/api-BvUiTeR7.js
rename to dist/api-BFYu8ZvQ.js
index 99e3ba3a..ae9b0b53 100644
--- a/dist/api-BvUiTeR7.js
+++ b/dist/api-BFYu8ZvQ.js
@@ -1,4 +1,4 @@
-import { j as u } from "./jsx-runtime-C7wFtzyj.js";
+import { j as u } from "./jsx-runtime-lzYHhGH3.js";
import { Stack as h, Typography as m, CircularProgress as p } from "@mui/material";
import "react";
import { getNestedProperty as g } from "./utils/general.es.js";
@@ -89,4 +89,4 @@ export {
C as m,
L as t
};
-//# sourceMappingURL=api-BvUiTeR7.js.map
+//# sourceMappingURL=api-BFYu8ZvQ.js.map
diff --git a/dist/api-BvUiTeR7.js.map b/dist/api-BFYu8ZvQ.js.map
similarity index 99%
rename from dist/api-BvUiTeR7.js.map
rename to dist/api-BFYu8ZvQ.js.map
index 4e9abafc..5377856a 100644
--- a/dist/api-BvUiTeR7.js.map
+++ b/dist/api-BFYu8ZvQ.js.map
@@ -1 +1 @@
-{"version":3,"file":"api-BvUiTeR7.js","sources":["../src/components/SyncError.tsx","../src/utils/api.tsx"],"sourcesContent":["import { Stack, Typography } from \"@mui/material\"\nimport { type FC } from \"react\"\nimport { SyncProblem as SyncProblemIcon } from \"@mui/icons-material\"\n\nexport interface SyncErrorProps {}\n\nconst SyncError: FC = () => (\n \n \n Failed to sync data\n \n)\n\nexport default SyncError\n","import type {\n FetchBaseQueryError,\n TypedUseMutationResult,\n TypedUseQueryHookResult,\n TypedUseQueryStateResult,\n} from \"@reduxjs/toolkit/query/react\"\nimport { CircularProgress } from \"@mui/material\"\nimport { type ReactNode } from \"react\"\n\nimport { type Optional, type Required, getNestedProperty } from \"./general\"\nimport { type SchemaMap } from \"./schema\"\nimport SyncError from \"../components/SyncError\"\n\n// -----------------------------------------------------------------------------\n// Model Types\n// -----------------------------------------------------------------------------\n\n// The fields of a model.\nexport type Fields = Record\n\nexport interface Tag {\n type: Type\n id: string\n}\n\nexport type ModelId = string | number\n\n/**\n * A data model.\n * Id: The type of Id.\n * Data: The data fields.\n */\nexport type Model = {\n id: Id\n} & Omit\n\nexport type Schemas> = {\n [K in keyof M]-?: SchemaMap\n}\n\nexport type Result<\n M extends Model,\n MFields extends keyof Omit = never,\n> = Pick\n\nexport type Arg<\n M extends Model,\n RequiredFields extends keyof Omit,\n OptionalFields extends keyof Omit = never,\n> = Required & Optional\n\n// -----------------------------------------------------------------------------\n// CRUD Types\n// https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions\n// -----------------------------------------------------------------------------\n\n// Create\n\nexport type CreateResult<\n M extends Model,\n MFields extends keyof Omit = never,\n> = Result\n\nexport type CreateArg<\n M extends Model,\n RequiredFields extends keyof Omit,\n OptionalFields extends keyof Omit = never,\n> = Arg\n\nexport type BulkCreateResult<\n M extends Model,\n MFields extends keyof Omit = never,\n ExtraFields extends Fields = Fields,\n> = Array & ExtraFields>\n\nexport type BulkCreateArg<\n M extends Model,\n RequiredFields extends keyof Omit,\n OptionalFields extends keyof Omit = never,\n ExtraFields extends Fields = Fields,\n> = Array & ExtraFields>\n\n// Read\n\nexport type RetrieveResult<\n M extends Model,\n MFields extends keyof Omit = never,\n> = Result\n\nexport type RetrieveArg> = M[\"id\"]\n\nexport interface ListResult<\n M extends Model,\n MFields extends keyof Omit = never,\n ExtraFields extends Fields = Fields,\n> {\n count: number\n offset: number\n limit: number\n max_limit: number\n data: Array & ExtraFields>\n}\n\nexport type ListArg = {\n limit: number\n offset: number\n} & Partial>\n\n// Update\n\nexport type UpdateResult<\n M extends Model,\n MFields extends keyof Omit = never,\n> = Result\n\ntype UpdateWithBody<\n M extends Model,\n RequiredFields extends keyof Omit,\n OptionalFields extends keyof Omit,\n> = Pick & Arg\n\n// NOTE: Sometimes update does not require a body. For example, if calling the\n// \"refresh\" action on an invitation object updates the expiry date to be 24\n// hours from now. In this case, you only need to pass the ID of the object.\nexport type UpdateArg<\n M extends Model,\n RequiredFields extends keyof Omit = never,\n OptionalFields extends keyof Omit = never,\n> = [RequiredFields] extends [never]\n ? [OptionalFields] extends [never]\n ? M[\"id\"]\n : UpdateWithBody\n : UpdateWithBody\n\nexport type BulkUpdateResult<\n M extends Model,\n MFields extends keyof Omit = never,\n ExtraFields extends Fields = Fields,\n> = Array & ExtraFields>\n\nexport type BulkUpdateArg<\n M extends Model,\n RequiredFields extends keyof Omit,\n OptionalFields extends keyof Omit = never,\n ExtraFields extends Fields = Fields,\n> = Record & ExtraFields>\n\n// Delete\n\nexport type DestroyResult = null\n\nexport type DestroyArg> = M[\"id\"]\n\nexport type BulkDestroyResult = null\n\nexport type BulkDestroyArg> = Array\n\n// -----------------------------------------------------------------------------\n// Functions\n// -----------------------------------------------------------------------------\n\nexport function buildUrl(\n url: string,\n params: {\n search?: Fields\n url?: Fields\n },\n): string {\n if (params.url) {\n Object.entries(params.url).forEach(([key, value]) => {\n url = url.replace(`<${key}>`, String(value))\n })\n }\n\n if (params.search) {\n const searchParams: string[][] = []\n for (const key in params.search) {\n const values = params.search[key]\n if (values === undefined) continue\n\n if (Array.isArray(values)) {\n for (const value of values) searchParams.push([key, String(value)])\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n searchParams.push([key, String(values)])\n }\n }\n\n if (searchParams.length !== 0) {\n url += `?${new URLSearchParams(searchParams).toString()}`\n }\n }\n\n return url\n}\n\nexport function isModelId(value: unknown): boolean {\n return typeof value === \"number\" || typeof value === \"string\"\n}\n\nexport function listTag(type: Type): Tag {\n return { type, id: \"LIST\" }\n}\n\nexport type TagDataOptions = Partial<{\n includeListTag: boolean\n argKeysAreIds: boolean\n id: string\n}>\n\nexport function tagData>(\n type: Type,\n options?: TagDataOptions,\n): (\n result:\n | Result\n | Array>\n | ListResult\n | null\n | undefined,\n error: FetchBaseQueryError | undefined,\n arg:\n | Arg\n | Array>\n | Record>\n | ListArg\n | Array\n | string\n | number\n | undefined,\n) => Array> {\n const {\n includeListTag = false,\n argKeysAreIds = false,\n id = \"id\",\n } = options || {}\n\n function tags(\n ids: ModelId[],\n list: boolean = includeListTag,\n ): Array> {\n const tags = ids.map(id => ({ type, id: String(id) }))\n if (list) tags.push(listTag(type))\n return tags\n }\n\n function getModelId(result: Result) {\n return getNestedProperty(result, id) as ModelId\n }\n\n return (result, error, arg) => {\n if (!error) {\n if (arg) {\n // The argument is an ID.\n if (isModelId(arg)) return tags([arg as ModelId])\n\n // The argument is an array of IDs.\n if (Array.isArray(arg)) {\n if (arg.length && isModelId(arg[0])) {\n return tags(arg as Array)\n }\n }\n // The argument is an object that contains the id field.\n else if (typeof arg === \"object\" && argKeysAreIds) {\n return tags(Object.keys(arg as Record))\n }\n }\n\n if (result) {\n // The result is an array of models that contain the id field.\n if (Array.isArray(result)) {\n return tags(result.map(getModelId))\n }\n\n // The result is a model that contains the id field.\n if (getModelId(result as Result) !== undefined) {\n return tags([getModelId(result as Result)])\n }\n\n // The result is a list that contains an array of models that contain\n // the id field.\n return tags((result as ListResult).data.map(getModelId), true)\n }\n }\n\n return tags([])\n }\n}\n\nexport function modelUrls(list: string, detail: string) {\n if (list === detail) throw Error(\"List and detail are the same.\")\n\n return { list, detail }\n}\n\nexport type HandleQueryStateOptions = Partial<{\n loading: ReactNode\n error: ReactNode\n}>\n\nexport function handleResultState(\n result:\n | TypedUseQueryHookResult\n | TypedUseQueryStateResult\n | TypedUseMutationResult,\n children: (data: NonNullable) => ReactNode,\n options?: HandleQueryStateOptions,\n): ReactNode {\n const { data, isLoading, isSuccess } = result\n const error = result.error as string | undefined\n\n const {\n loading: loadingNode = ,\n error: errorNode = ,\n } = options || {}\n\n // An error occurred.\n if (error) {\n console.error(error)\n return errorNode\n }\n\n // Busy calling the API.\n if (isLoading) return loadingNode\n\n // Called the API and got data.\n if (data) return children(data)\n\n // Called the API and did not get data.\n if (isSuccess) throw Error(\"Expected to get data from API but got nothing.\")\n\n // Have yet to call the API.\n return loadingNode\n}\n\nexport function isSafeHttpMethod(method: string) {\n // https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.2.1\n return [\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"].includes(method.toUpperCase())\n}\n"],"names":["SyncError","jsxs","Stack","jsx","SyncProblemIcon","Typography","buildUrl","url","params","key","value","searchParams","values","isModelId","listTag","type","tagData","options","includeListTag","argKeysAreIds","id","tags","ids","list","getModelId","result","getNestedProperty","error","arg","modelUrls","detail","handleResultState","children","data","isLoading","isSuccess","loadingNode","CircularProgress","errorNode","isSafeHttpMethod","method"],"mappings":";;;;;;AAMA,MAAMA,IAAgC,MACpCC,gBAAAA,EAAAA,KAACC,KAAM,YAAW,UAAS,cAAa,UACtC,UAAA;AAAA,EAAAC,gBAAAA,EAAAA,IAACC,GAAA,EAAgB,OAAM,QAAA,CAAQ;AAAA,EAC/BD,gBAAAA,EAAAA,IAACE,GAAA,EAAW,OAAM,cAAa,UAAA,sBAAA,CAAmB;AAAA,EAAA,CACpD;ACuJK,SAASC,EACdC,GACAC,GAIQ;AAOR,MANIA,EAAO,OACT,OAAO,QAAQA,EAAO,GAAG,EAAE,QAAQ,CAAC,CAACC,GAAKC,CAAK,MAAM;AACnD,IAAAH,IAAMA,EAAI,QAAQ,IAAIE,CAAG,KAAK,OAAOC,CAAK,CAAC;AAAA,EAC7C,CAAC,GAGCF,EAAO,QAAQ;AACjB,UAAMG,IAA2B,CAAA;AACjC,eAAWF,KAAOD,EAAO,QAAQ;AAC/B,YAAMI,IAASJ,EAAO,OAAOC,CAAG;AAChC,UAAIG,MAAW;AAEf,YAAI,MAAM,QAAQA,CAAM;AACtB,qBAAWF,KAASE,EAAQ,CAAAD,EAAa,KAAK,CAACF,GAAK,OAAOC,CAAK,CAAC,CAAC;AAAA;AAGlE,UAAAC,EAAa,KAAK,CAACF,GAAK,OAAOG,CAAM,CAAC,CAAC;AAAA,IAE3C;AAEA,IAAID,EAAa,WAAW,MAC1BJ,KAAO,IAAI,IAAI,gBAAgBI,CAAY,EAAE,UAAU;AAAA,EAE3D;AAEA,SAAOJ;AACT;AAEO,SAASM,EAAUH,GAAyB;AACjD,SAAO,OAAOA,KAAU,YAAY,OAAOA,KAAU;AACvD;AAEO,SAASI,EAA6BC,GAAuB;AAClE,SAAO,EAAE,MAAAA,GAAM,IAAI,OAAA;AACrB;AAQO,SAASC,EACdD,GACAE,GAkBoB;AACpB,QAAM;AAAA,IACJ,gBAAAC,IAAiB;AAAA,IACjB,eAAAC,IAAgB;AAAA,IAChB,IAAAC,IAAK;AAAA,EAAA,IACHH,KAAW,CAAA;AAEf,WAASI,EACPC,GACAC,IAAgBL,GACE;AAClB,UAAMG,IAAOC,EAAI,IAAI,CAAAF,OAAO,EAAE,MAAAL,GAAM,IAAI,OAAOK,CAAE,EAAA,EAAI;AACrD,WAAIG,KAAMF,EAAK,KAAKP,EAAQC,CAAI,CAAC,GAC1BM;AAAAA,EACT;AAEA,WAASG,EAAWC,GAAwB;AAC1C,WAAOC,EAAkBD,GAAQL,CAAE;AAAA,EACrC;AAEA,SAAO,CAACK,GAAQE,GAAOC,MAAQ;AAC7B,QAAI,CAACD,GAAO;AACV,UAAIC,GAAK;AAEP,YAAIf,EAAUe,CAAG,UAAUP,EAAK,CAACO,CAAc,CAAC;AAGhD,YAAI,MAAM,QAAQA,CAAG;AACnB,cAAIA,EAAI,UAAUf,EAAUe,EAAI,CAAC,CAAC;AAChC,mBAAOP,EAAKO,CAAqB;AAAA,mBAI5B,OAAOA,KAAQ,YAAYT;AAClC,iBAAOE,EAAK,OAAO,KAAKO,CAA2B,CAAC;AAAA,MAExD;AAEA,UAAIH;AAEF,eAAI,MAAM,QAAQA,CAAM,IACfJ,EAAKI,EAAO,IAAID,CAAU,CAAC,IAIhCA,EAAWC,CAAwB,MAAM,SACpCJ,EAAK,CAACG,EAAWC,CAAwB,CAAC,CAAC,IAK7CJ,EAAMI,EAA8B,KAAK,IAAID,CAAU,GAAG,EAAI;AAAA,IAEzE;AAEA,WAAOH,EAAK,CAAA,CAAE;AAAA,EAChB;AACF;AAEO,SAASQ,EAAUN,GAAcO,GAAgB;AACtD,MAAIP,MAASO,EAAQ,OAAM,MAAM,+BAA+B;AAEhE,SAAO,EAAE,MAAAP,GAAM,QAAAO,EAAA;AACjB;AAOO,SAASC,EACdN,GAIAO,GACAf,GACW;AACX,QAAM,EAAE,MAAAgB,GAAM,WAAAC,GAAW,WAAAC,EAAA,IAAcV,GACjCE,IAAQF,EAAO,OAEf;AAAA,IACJ,SAASW,IAAcjC,gBAAAA,MAACkC,GAAA,CAAA,CAAiB;AAAA,IACzC,OAAOC,IAAYnC,gBAAAA,MAACH,GAAA,CAAA,CAAU;AAAA,EAAA,IAC5BiB,KAAW,CAAA;AAGf,MAAIU;AACF,mBAAQ,MAAMA,CAAK,GACZW;AAIT,MAAIJ,EAAW,QAAOE;AAGtB,MAAIH,EAAM,QAAOD,EAASC,CAAI;AAG9B,MAAIE,EAAW,OAAM,MAAM,gDAAgD;AAG3E,SAAOC;AACT;AAEO,SAASG,EAAiBC,GAAgB;AAE/C,SAAO,CAAC,OAAO,QAAQ,WAAW,OAAO,EAAE,SAASA,EAAO,aAAa;AAC1E;"}
\ No newline at end of file
+{"version":3,"file":"api-BFYu8ZvQ.js","sources":["../src/components/SyncError.tsx","../src/utils/api.tsx"],"sourcesContent":["import { Stack, Typography } from \"@mui/material\"\nimport { type FC } from \"react\"\nimport { SyncProblem as SyncProblemIcon } from \"@mui/icons-material\"\n\nexport interface SyncErrorProps {}\n\nconst SyncError: FC = () => (\n \n \n Failed to sync data\n \n)\n\nexport default SyncError\n","import type {\n FetchBaseQueryError,\n TypedUseMutationResult,\n TypedUseQueryHookResult,\n TypedUseQueryStateResult,\n} from \"@reduxjs/toolkit/query/react\"\nimport { CircularProgress } from \"@mui/material\"\nimport { type ReactNode } from \"react\"\n\nimport { type Optional, type Required, getNestedProperty } from \"./general\"\nimport { type SchemaMap } from \"./schema\"\nimport SyncError from \"../components/SyncError\"\n\n// -----------------------------------------------------------------------------\n// Model Types\n// -----------------------------------------------------------------------------\n\n// The fields of a model.\nexport type Fields = Record\n\nexport interface Tag {\n type: Type\n id: string\n}\n\nexport type ModelId = string | number\n\n/**\n * A data model.\n * Id: The type of Id.\n * Data: The data fields.\n */\nexport type Model = {\n id: Id\n} & Omit\n\nexport type Schemas> = {\n [K in keyof M]-?: SchemaMap\n}\n\nexport type Result<\n M extends Model,\n MFields extends keyof Omit = never,\n> = Pick\n\nexport type Arg<\n M extends Model