svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function AlertDescription({
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function AlertAction({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export { Alert, AlertTitle, AlertDescription, AlertAction }
diff --git a/frontend/src/components/ui/collapsible.tsx b/frontend/src/components/ui/collapsible.tsx
new file mode 100644
index 0000000..63fc8ef
--- /dev/null
+++ b/frontend/src/components/ui/collapsible.tsx
@@ -0,0 +1,31 @@
+import { Collapsible as CollapsiblePrimitive } from "radix-ui"
+
+function Collapsible({
+ ...props
+}: React.ComponentProps
) {
+ return
+}
+
+function CollapsibleTrigger({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function CollapsibleContent({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Collapsible, CollapsibleTrigger, CollapsibleContent }
diff --git a/frontend/src/docs/notifications/qualityBlocking.tsx b/frontend/src/docs/notifications/qualityBlocking.tsx
new file mode 100644
index 0000000..4366db0
--- /dev/null
+++ b/frontend/src/docs/notifications/qualityBlocking.tsx
@@ -0,0 +1,19 @@
+export default function reprints() {
+ return (
+
+
Quality Blocking
+
+
+ When a new blocking order is created a new alert will be sent out to all
+ users subscribed. if there are multiple blocking orders created between
+ checks you can expect to get multiple emails. below you will see an
+ example of a blocking email that is sent out
+
+

+
+ );
+}
diff --git a/frontend/src/lib/docs.ts b/frontend/src/lib/docs.ts
new file mode 100644
index 0000000..8479cff
--- /dev/null
+++ b/frontend/src/lib/docs.ts
@@ -0,0 +1,26 @@
+import type { ComponentType } from "react";
+
+const modules = import.meta.glob("../docs/**/*.tsx", {
+ eager: true,
+});
+
+type DocModule = {
+ default: ComponentType;
+};
+
+const docsMap: Record = {};
+
+for (const path in modules) {
+ const mod = modules[path] as DocModule;
+
+ const slug = path
+ .replace("../docs/", "")
+ .replace(".tsx", "");
+
+ // "notifications/intro"
+ docsMap[slug] = mod.default;
+}
+
+export function getDoc(slug: string) {
+ return docsMap[slug];
+}
\ No newline at end of file
diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts
index 35b7ff1..1412139 100644
--- a/frontend/src/routeTree.gen.ts
+++ b/frontend/src/routeTree.gen.ts
@@ -11,6 +11,8 @@
import { Route as rootRouteImport } from './routes/__root'
import { Route as AboutRouteImport } from './routes/about'
import { Route as IndexRouteImport } from './routes/index'
+import { Route as DocsIndexRouteImport } from './routes/docs/index'
+import { Route as DocsSplatRouteImport } from './routes/docs/$'
import { Route as AdminSettingsRouteImport } from './routes/admin/settings'
import { Route as AdminNotificationsRouteImport } from './routes/admin/notifications'
import { Route as AdminLogsRouteImport } from './routes/admin/logs'
@@ -29,6 +31,16 @@ const IndexRoute = IndexRouteImport.update({
path: '/',
getParentRoute: () => rootRouteImport,
} as any)
+const DocsIndexRoute = DocsIndexRouteImport.update({
+ id: '/docs/',
+ path: '/docs/',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const DocsSplatRoute = DocsSplatRouteImport.update({
+ id: '/docs/$',
+ path: '/docs/$',
+ getParentRoute: () => rootRouteImport,
+} as any)
const AdminSettingsRoute = AdminSettingsRouteImport.update({
id: '/admin/settings',
path: '/admin/settings',
@@ -72,6 +84,8 @@ export interface FileRoutesByFullPath {
'/admin/logs': typeof AdminLogsRoute
'/admin/notifications': typeof AdminNotificationsRoute
'/admin/settings': typeof AdminSettingsRoute
+ '/docs/$': typeof DocsSplatRoute
+ '/docs/': typeof DocsIndexRoute
'/user/profile': typeof authUserProfileRoute
'/user/resetpassword': typeof authUserResetpasswordRoute
'/user/signup': typeof authUserSignupRoute
@@ -83,6 +97,8 @@ export interface FileRoutesByTo {
'/admin/logs': typeof AdminLogsRoute
'/admin/notifications': typeof AdminNotificationsRoute
'/admin/settings': typeof AdminSettingsRoute
+ '/docs/$': typeof DocsSplatRoute
+ '/docs': typeof DocsIndexRoute
'/user/profile': typeof authUserProfileRoute
'/user/resetpassword': typeof authUserResetpasswordRoute
'/user/signup': typeof authUserSignupRoute
@@ -95,6 +111,8 @@ export interface FileRoutesById {
'/admin/logs': typeof AdminLogsRoute
'/admin/notifications': typeof AdminNotificationsRoute
'/admin/settings': typeof AdminSettingsRoute
+ '/docs/$': typeof DocsSplatRoute
+ '/docs/': typeof DocsIndexRoute
'/(auth)/user/profile': typeof authUserProfileRoute
'/(auth)/user/resetpassword': typeof authUserResetpasswordRoute
'/(auth)/user/signup': typeof authUserSignupRoute
@@ -108,6 +126,8 @@ export interface FileRouteTypes {
| '/admin/logs'
| '/admin/notifications'
| '/admin/settings'
+ | '/docs/$'
+ | '/docs/'
| '/user/profile'
| '/user/resetpassword'
| '/user/signup'
@@ -119,6 +139,8 @@ export interface FileRouteTypes {
| '/admin/logs'
| '/admin/notifications'
| '/admin/settings'
+ | '/docs/$'
+ | '/docs'
| '/user/profile'
| '/user/resetpassword'
| '/user/signup'
@@ -130,6 +152,8 @@ export interface FileRouteTypes {
| '/admin/logs'
| '/admin/notifications'
| '/admin/settings'
+ | '/docs/$'
+ | '/docs/'
| '/(auth)/user/profile'
| '/(auth)/user/resetpassword'
| '/(auth)/user/signup'
@@ -142,6 +166,8 @@ export interface RootRouteChildren {
AdminLogsRoute: typeof AdminLogsRoute
AdminNotificationsRoute: typeof AdminNotificationsRoute
AdminSettingsRoute: typeof AdminSettingsRoute
+ DocsSplatRoute: typeof DocsSplatRoute
+ DocsIndexRoute: typeof DocsIndexRoute
authUserProfileRoute: typeof authUserProfileRoute
authUserResetpasswordRoute: typeof authUserResetpasswordRoute
authUserSignupRoute: typeof authUserSignupRoute
@@ -163,6 +189,20 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof IndexRouteImport
parentRoute: typeof rootRouteImport
}
+ '/docs/': {
+ id: '/docs/'
+ path: '/docs'
+ fullPath: '/docs/'
+ preLoaderRoute: typeof DocsIndexRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/docs/$': {
+ id: '/docs/$'
+ path: '/docs/$'
+ fullPath: '/docs/$'
+ preLoaderRoute: typeof DocsSplatRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/admin/settings': {
id: '/admin/settings'
path: '/admin/settings'
@@ -222,6 +262,8 @@ const rootRouteChildren: RootRouteChildren = {
AdminLogsRoute: AdminLogsRoute,
AdminNotificationsRoute: AdminNotificationsRoute,
AdminSettingsRoute: AdminSettingsRoute,
+ DocsSplatRoute: DocsSplatRoute,
+ DocsIndexRoute: DocsIndexRoute,
authUserProfileRoute: authUserProfileRoute,
authUserResetpasswordRoute: authUserResetpasswordRoute,
authUserSignupRoute: authUserSignupRoute,