sachnun commited on
Commit
101713e
·
1 Parent(s): 7c78153

Add public uptime monitoring with shareable links

Browse files

- Create public uptime page (/u/:username) accessible without authentication
- Add share button with copy link functionality to dashboard
- Implement getUserMonitorStatsByUsername() for username-based queries
- Public page shows overall stats and individual monitor status
- Include share and home buttons on public page
- Responsive recent checks visualization with horizontal scroll
- Clean UI with glow effects and proper error handling

Files changed (33) hide show
  1. .env +2 -0
  2. .playwright-mcp/page-2025-10-17T17-23-03-432Z.png +0 -0
  3. .playwright-mcp/page-2025-10-17T17-23-48-820Z.png +0 -0
  4. .playwright-mcp/page-2025-10-17T17-24-34-080Z.png +0 -0
  5. .playwright-mcp/page-2025-10-17T17-25-18-041Z.png +0 -0
  6. .playwright-mcp/page-2025-10-17T17-28-10-684Z.png +0 -0
  7. .playwright-mcp/page-2025-10-17T17-33-26-845Z.png +0 -0
  8. .react-router/types/+future.ts +9 -0
  9. .react-router/types/+routes.ts +65 -0
  10. .react-router/types/+server-build.d.ts +17 -0
  11. .react-router/types/app/+types/root.ts +59 -0
  12. .react-router/types/app/routes/+types/home.ts +62 -0
  13. .react-router/types/app/routes/+types/login.ts +62 -0
  14. .react-router/types/app/routes/+types/logout.ts +62 -0
  15. .react-router/types/app/routes/+types/register.ts +62 -0
  16. .react-router/types/app/routes/+types/uptime.ts +62 -0
  17. build/client/assets/button-1YLPPCtt.js +1 -0
  18. build/client/assets/card-nZ_hrmF6.js +1 -0
  19. build/client/assets/chunk-OIYGIGL5-O35CAIo3.js +0 -0
  20. build/client/assets/entry.client-BqCLKtvt.js +0 -0
  21. build/client/assets/home-CCZyLKHc.js +1 -0
  22. build/client/assets/login-CtRm5tfE.js +1 -0
  23. build/client/assets/logout-l0sNRNKZ.js +1 -0
  24. build/client/assets/manifest-ceec8a43.js +1 -0
  25. build/client/assets/register-BLpbiVIx.js +1 -0
  26. build/client/assets/root-C5Mnt1V9.js +1 -0
  27. build/client/assets/root-DePtEpHZ.css +1 -0
  28. build/client/assets/server-build-DePtEpHZ.css +1 -0
  29. build/client/assets/uptime-BYui58Ub.js +1 -0
  30. build/client/favicon.ico +0 -0
  31. build/server/assets/cron.server-BkSBgtlB.js +45 -0
  32. build/server/assets/server-build-BAW0Iiqy.js +990 -0
  33. build/server/index.js +31 -0
.env ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ TURSO_DATABASE_URL=libsql://always-uptime-sachnun.aws-ap-south-1.turso.io
2
+ TURSO_AUTH_TOKEN=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjA2Nzc3MzgsImlkIjoiMWFhMjUwZjEtM2RlZS00Y2ZkLWE0Y2MtMGY2N2Y4ODE5NzJhIiwicmlkIjoiZTg0ZTkxMzctNmIyMy00YmJlLTgzZDQtNjJmNjRiYmQ3MjVkIn0._G24rVvgdaAXezHqs2IdoHJNG_z-kRY6HBg8BoQqU-wNuzBraiKLSkHOLPHKpMzRyW9EokTmuxL_x6HqHk0qDQ
.playwright-mcp/page-2025-10-17T17-23-03-432Z.png ADDED
.playwright-mcp/page-2025-10-17T17-23-48-820Z.png ADDED
.playwright-mcp/page-2025-10-17T17-24-34-080Z.png ADDED
.playwright-mcp/page-2025-10-17T17-25-18-041Z.png ADDED
.playwright-mcp/page-2025-10-17T17-28-10-684Z.png ADDED
.playwright-mcp/page-2025-10-17T17-33-26-845Z.png ADDED
.react-router/types/+future.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import "react-router";
4
+
5
+ declare module "react-router" {
6
+ interface Future {
7
+ v8_middleware: false
8
+ }
9
+ }
.react-router/types/+routes.ts ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import "react-router"
4
+
5
+ declare module "react-router" {
6
+ interface Register {
7
+ pages: Pages
8
+ routeFiles: RouteFiles
9
+ routeModules: RouteModules
10
+ }
11
+ }
12
+
13
+ type Pages = {
14
+ "/": {
15
+ params: {};
16
+ };
17
+ "/login": {
18
+ params: {};
19
+ };
20
+ "/register": {
21
+ params: {};
22
+ };
23
+ "/logout": {
24
+ params: {};
25
+ };
26
+ "/uptime": {
27
+ params: {};
28
+ };
29
+ };
30
+
31
+ type RouteFiles = {
32
+ "root.tsx": {
33
+ id: "root";
34
+ page: "/" | "/login" | "/register" | "/logout" | "/uptime";
35
+ };
36
+ "routes/home.tsx": {
37
+ id: "routes/home";
38
+ page: "/";
39
+ };
40
+ "routes/login.tsx": {
41
+ id: "routes/login";
42
+ page: "/login";
43
+ };
44
+ "routes/register.tsx": {
45
+ id: "routes/register";
46
+ page: "/register";
47
+ };
48
+ "routes/logout.tsx": {
49
+ id: "routes/logout";
50
+ page: "/logout";
51
+ };
52
+ "routes/uptime.tsx": {
53
+ id: "routes/uptime";
54
+ page: "/uptime";
55
+ };
56
+ };
57
+
58
+ type RouteModules = {
59
+ "root": typeof import("./app/root.tsx");
60
+ "routes/home": typeof import("./app/routes/home.tsx");
61
+ "routes/login": typeof import("./app/routes/login.tsx");
62
+ "routes/register": typeof import("./app/routes/register.tsx");
63
+ "routes/logout": typeof import("./app/routes/logout.tsx");
64
+ "routes/uptime": typeof import("./app/routes/uptime.tsx");
65
+ };
.react-router/types/+server-build.d.ts ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ declare module "virtual:react-router/server-build" {
4
+ import { ServerBuild } from "react-router";
5
+ export const assets: ServerBuild["assets"];
6
+ export const assetsBuildDirectory: ServerBuild["assetsBuildDirectory"];
7
+ export const basename: ServerBuild["basename"];
8
+ export const entry: ServerBuild["entry"];
9
+ export const future: ServerBuild["future"];
10
+ export const isSpaMode: ServerBuild["isSpaMode"];
11
+ export const prerender: ServerBuild["prerender"];
12
+ export const publicPath: ServerBuild["publicPath"];
13
+ export const routeDiscovery: ServerBuild["routeDiscovery"];
14
+ export const routes: ServerBuild["routes"];
15
+ export const ssr: ServerBuild["ssr"];
16
+ export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"];
17
+ }
.react-router/types/app/+types/root.ts ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../root.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "root.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../root.js");
15
+ }];
16
+
17
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
18
+
19
+ export namespace Route {
20
+ // links
21
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
22
+ export type LinksFunction = Annotations["LinksFunction"];
23
+
24
+ // meta
25
+ export type MetaArgs = Annotations["MetaArgs"];
26
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
27
+ export type MetaFunction = Annotations["MetaFunction"];
28
+
29
+ // headers
30
+ export type HeadersArgs = Annotations["HeadersArgs"];
31
+ export type HeadersFunction = Annotations["HeadersFunction"];
32
+
33
+ // middleware
34
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
35
+
36
+ // clientMiddleware
37
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
38
+
39
+ // loader
40
+ export type LoaderArgs = Annotations["LoaderArgs"];
41
+
42
+ // clientLoader
43
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
44
+
45
+ // action
46
+ export type ActionArgs = Annotations["ActionArgs"];
47
+
48
+ // clientAction
49
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
50
+
51
+ // HydrateFallback
52
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
53
+
54
+ // Component
55
+ export type ComponentProps = Annotations["ComponentProps"];
56
+
57
+ // ErrorBoundary
58
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
59
+ }
.react-router/types/app/routes/+types/home.ts ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../home.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "routes/home.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../../root.js");
15
+ }, {
16
+ id: "routes/home";
17
+ module: typeof import("../home.js");
18
+ }];
19
+
20
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
21
+
22
+ export namespace Route {
23
+ // links
24
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
25
+ export type LinksFunction = Annotations["LinksFunction"];
26
+
27
+ // meta
28
+ export type MetaArgs = Annotations["MetaArgs"];
29
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
30
+ export type MetaFunction = Annotations["MetaFunction"];
31
+
32
+ // headers
33
+ export type HeadersArgs = Annotations["HeadersArgs"];
34
+ export type HeadersFunction = Annotations["HeadersFunction"];
35
+
36
+ // middleware
37
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
38
+
39
+ // clientMiddleware
40
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
41
+
42
+ // loader
43
+ export type LoaderArgs = Annotations["LoaderArgs"];
44
+
45
+ // clientLoader
46
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
47
+
48
+ // action
49
+ export type ActionArgs = Annotations["ActionArgs"];
50
+
51
+ // clientAction
52
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
53
+
54
+ // HydrateFallback
55
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
56
+
57
+ // Component
58
+ export type ComponentProps = Annotations["ComponentProps"];
59
+
60
+ // ErrorBoundary
61
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
62
+ }
.react-router/types/app/routes/+types/login.ts ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../login.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "routes/login.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../../root.js");
15
+ }, {
16
+ id: "routes/login";
17
+ module: typeof import("../login.js");
18
+ }];
19
+
20
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
21
+
22
+ export namespace Route {
23
+ // links
24
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
25
+ export type LinksFunction = Annotations["LinksFunction"];
26
+
27
+ // meta
28
+ export type MetaArgs = Annotations["MetaArgs"];
29
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
30
+ export type MetaFunction = Annotations["MetaFunction"];
31
+
32
+ // headers
33
+ export type HeadersArgs = Annotations["HeadersArgs"];
34
+ export type HeadersFunction = Annotations["HeadersFunction"];
35
+
36
+ // middleware
37
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
38
+
39
+ // clientMiddleware
40
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
41
+
42
+ // loader
43
+ export type LoaderArgs = Annotations["LoaderArgs"];
44
+
45
+ // clientLoader
46
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
47
+
48
+ // action
49
+ export type ActionArgs = Annotations["ActionArgs"];
50
+
51
+ // clientAction
52
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
53
+
54
+ // HydrateFallback
55
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
56
+
57
+ // Component
58
+ export type ComponentProps = Annotations["ComponentProps"];
59
+
60
+ // ErrorBoundary
61
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
62
+ }
.react-router/types/app/routes/+types/logout.ts ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../logout.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "routes/logout.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../../root.js");
15
+ }, {
16
+ id: "routes/logout";
17
+ module: typeof import("../logout.js");
18
+ }];
19
+
20
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
21
+
22
+ export namespace Route {
23
+ // links
24
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
25
+ export type LinksFunction = Annotations["LinksFunction"];
26
+
27
+ // meta
28
+ export type MetaArgs = Annotations["MetaArgs"];
29
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
30
+ export type MetaFunction = Annotations["MetaFunction"];
31
+
32
+ // headers
33
+ export type HeadersArgs = Annotations["HeadersArgs"];
34
+ export type HeadersFunction = Annotations["HeadersFunction"];
35
+
36
+ // middleware
37
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
38
+
39
+ // clientMiddleware
40
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
41
+
42
+ // loader
43
+ export type LoaderArgs = Annotations["LoaderArgs"];
44
+
45
+ // clientLoader
46
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
47
+
48
+ // action
49
+ export type ActionArgs = Annotations["ActionArgs"];
50
+
51
+ // clientAction
52
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
53
+
54
+ // HydrateFallback
55
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
56
+
57
+ // Component
58
+ export type ComponentProps = Annotations["ComponentProps"];
59
+
60
+ // ErrorBoundary
61
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
62
+ }
.react-router/types/app/routes/+types/register.ts ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../register.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "routes/register.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../../root.js");
15
+ }, {
16
+ id: "routes/register";
17
+ module: typeof import("../register.js");
18
+ }];
19
+
20
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
21
+
22
+ export namespace Route {
23
+ // links
24
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
25
+ export type LinksFunction = Annotations["LinksFunction"];
26
+
27
+ // meta
28
+ export type MetaArgs = Annotations["MetaArgs"];
29
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
30
+ export type MetaFunction = Annotations["MetaFunction"];
31
+
32
+ // headers
33
+ export type HeadersArgs = Annotations["HeadersArgs"];
34
+ export type HeadersFunction = Annotations["HeadersFunction"];
35
+
36
+ // middleware
37
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
38
+
39
+ // clientMiddleware
40
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
41
+
42
+ // loader
43
+ export type LoaderArgs = Annotations["LoaderArgs"];
44
+
45
+ // clientLoader
46
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
47
+
48
+ // action
49
+ export type ActionArgs = Annotations["ActionArgs"];
50
+
51
+ // clientAction
52
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
53
+
54
+ // HydrateFallback
55
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
56
+
57
+ // Component
58
+ export type ComponentProps = Annotations["ComponentProps"];
59
+
60
+ // ErrorBoundary
61
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
62
+ }
.react-router/types/app/routes/+types/uptime.ts ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../uptime.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "routes/uptime.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../../root.js");
15
+ }, {
16
+ id: "routes/uptime";
17
+ module: typeof import("../uptime.js");
18
+ }];
19
+
20
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
21
+
22
+ export namespace Route {
23
+ // links
24
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
25
+ export type LinksFunction = Annotations["LinksFunction"];
26
+
27
+ // meta
28
+ export type MetaArgs = Annotations["MetaArgs"];
29
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
30
+ export type MetaFunction = Annotations["MetaFunction"];
31
+
32
+ // headers
33
+ export type HeadersArgs = Annotations["HeadersArgs"];
34
+ export type HeadersFunction = Annotations["HeadersFunction"];
35
+
36
+ // middleware
37
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
38
+
39
+ // clientMiddleware
40
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
41
+
42
+ // loader
43
+ export type LoaderArgs = Annotations["LoaderArgs"];
44
+
45
+ // clientLoader
46
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
47
+
48
+ // action
49
+ export type ActionArgs = Annotations["ActionArgs"];
50
+
51
+ // clientAction
52
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
53
+
54
+ // HydrateFallback
55
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
56
+
57
+ // Component
58
+ export type ComponentProps = Annotations["ComponentProps"];
59
+
60
+ // ErrorBoundary
61
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
62
+ }
build/client/assets/button-1YLPPCtt.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{r as Ne,j as Te}from"./chunk-OIYGIGL5-O35CAIo3.js";function we(e){var t,r,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(r=we(e[t]))&&(o&&(o+=" "),o+=r)}else for(r in e)e[r]&&(o&&(o+=" "),o+=r);return o}function ye(){for(var e,t,r=0,o="",a=arguments.length;r<a;r++)(e=arguments[r])&&(t=we(e))&&(o&&(o+=" "),o+=t);return o}const be=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,fe=ye,Ve=(e,t)=>r=>{var o;if(t?.variants==null)return fe(e,r?.class,r?.className);const{variants:a,defaultVariants:c}=t,l=Object.keys(a).map(b=>{const f=r?.[b],k=c?.[b];if(f===null)return null;const z=be(f)||be(k);return a[b][z]}),p=r&&Object.entries(r).reduce((b,f)=>{let[k,z]=f;return z===void 0||(b[k]=z),b},{}),u=t==null||(o=t.compoundVariants)===null||o===void 0?void 0:o.reduce((b,f)=>{let{class:k,className:z,...R}=f;return Object.entries(R).every(w=>{let[y,C]=w;return Array.isArray(C)?C.includes({...c,...p}[y]):{...c,...p}[y]===C})?[...b,k,z]:b},[]);return fe(e,l,u,r?.class,r?.className)},se="-",Ee=e=>{const t=Le(e),{conflictingClassGroups:r,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:l=>{const p=l.split(se);return p[0]===""&&p.length!==1&&p.shift(),ve(p,t)||je(l)},getConflictingClassGroupIds:(l,p)=>{const u=r[l]||[];return p&&o[l]?[...u,...o[l]]:u}}},ve=(e,t)=>{if(e.length===0)return t.classGroupId;const r=e[0],o=t.nextPart.get(r),a=o?ve(e.slice(1),o):void 0;if(a)return a;if(t.validators.length===0)return;const c=e.join(se);return t.validators.find(({validator:l})=>l(c))?.classGroupId},ge=/^\[(.+)\]$/,je=e=>{if(ge.test(e)){const t=ge.exec(e)[1],r=t?.substring(0,t.indexOf(":"));if(r)return"arbitrary.."+r}},Le=e=>{const{theme:t,classGroups:r}=e,o={nextPart:new Map,validators:[]};for(const a in r)oe(r[a],o,a,t);return o},oe=(e,t,r,o)=>{e.forEach(a=>{if(typeof a=="string"){const c=a===""?t:he(t,a);c.classGroupId=r;return}if(typeof a=="function"){if(Oe(a)){oe(a(o),t,r,o);return}t.validators.push({validator:a,classGroupId:r});return}Object.entries(a).forEach(([c,l])=>{oe(l,he(t,c),r,o)})})},he=(e,t)=>{let r=e;return t.split(se).forEach(o=>{r.nextPart.has(o)||r.nextPart.set(o,{nextPart:new Map,validators:[]}),r=r.nextPart.get(o)}),r},Oe=e=>e.isThemeGetter,Be=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,o=new Map;const a=(c,l)=>{r.set(c,l),t++,t>e&&(t=0,o=r,r=new Map)};return{get(c){let l=r.get(c);if(l!==void 0)return l;if((l=o.get(c))!==void 0)return a(c,l),l},set(c,l){r.has(c)?r.set(c,l):a(c,l)}}},te="!",ne=":",_e=ne.length,Fe=e=>{const{prefix:t,experimentalParseClassName:r}=e;let o=a=>{const c=[];let l=0,p=0,u=0,b;for(let w=0;w<a.length;w++){let y=a[w];if(l===0&&p===0){if(y===ne){c.push(a.slice(u,w)),u=w+_e;continue}if(y==="/"){b=w;continue}}y==="["?l++:y==="]"?l--:y==="("?p++:y===")"&&p--}const f=c.length===0?a:a.substring(u),k=We(f),z=k!==f,R=b&&b>u?b-u:void 0;return{modifiers:c,hasImportantModifier:z,baseClassName:k,maybePostfixModifierPosition:R}};if(t){const a=t+ne,c=o;o=l=>l.startsWith(a)?c(l.substring(a.length)):{isExternal:!0,modifiers:[],hasImportantModifier:!1,baseClassName:l,maybePostfixModifierPosition:void 0}}if(r){const a=o;o=c=>r({className:c,parseClassName:a})}return o},We=e=>e.endsWith(te)?e.substring(0,e.length-1):e.startsWith(te)?e.substring(1):e,$e=e=>{const t=Object.fromEntries(e.orderSensitiveModifiers.map(o=>[o,!0]));return o=>{if(o.length<=1)return o;const a=[];let c=[];return o.forEach(l=>{l[0]==="["||t[l]?(a.push(...c.sort(),l),c=[]):c.push(l)}),a.push(...c.sort()),a}},Ue=e=>({cache:Be(e.cacheSize),parseClassName:Fe(e),sortModifiers:$e(e),...Ee(e)}),qe=/\s+/,He=(e,t)=>{const{parseClassName:r,getClassGroupId:o,getConflictingClassGroupIds:a,sortModifiers:c}=t,l=[],p=e.trim().split(qe);let u="";for(let b=p.length-1;b>=0;b-=1){const f=p[b],{isExternal:k,modifiers:z,hasImportantModifier:R,baseClassName:w,maybePostfixModifierPosition:y}=r(f);if(k){u=f+(u.length>0?" "+u:u);continue}let C=!!y,I=o(C?w.substring(0,y):w);if(!I){if(!C){u=f+(u.length>0?" "+u:u);continue}if(I=o(w),!I){u=f+(u.length>0?" "+u:u);continue}C=!1}const $=c(z).join(":"),_=R?$+te:$,V=_+I;if(l.includes(V))continue;l.push(V);const E=a(I,C);for(let G=0;G<E.length;++G){const F=E[G];l.push(_+F)}u=f+(u.length>0?" "+u:u)}return u};function Je(){let e=0,t,r,o="";for(;e<arguments.length;)(t=arguments[e++])&&(r=ze(t))&&(o&&(o+=" "),o+=r);return o}const ze=e=>{if(typeof e=="string")return e;let t,r="";for(let o=0;o<e.length;o++)e[o]&&(t=ze(e[o]))&&(r&&(r+=" "),r+=t);return r};function Ke(e,...t){let r,o,a,c=l;function l(u){const b=t.reduce((f,k)=>k(f),e());return r=Ue(b),o=r.cache.get,a=r.cache.set,c=p,p(u)}function p(u){const b=o(u);if(b)return b;const f=He(u,r);return a(u,f),f}return function(){return c(Je.apply(null,arguments))}}const g=e=>{const t=r=>r[e]||[];return t.isThemeGetter=!0,t},Ce=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Ae=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Xe=/^\d+\/\d+$/,De=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Qe=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Ye=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Ze=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,er=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,L=e=>Xe.test(e),m=e=>!!e&&!Number.isNaN(Number(e)),P=e=>!!e&&Number.isInteger(Number(e)),ee=e=>e.endsWith("%")&&m(e.slice(0,-1)),S=e=>De.test(e),rr=()=>!0,or=e=>Qe.test(e)&&!Ye.test(e),Me=()=>!1,tr=e=>Ze.test(e),nr=e=>er.test(e),sr=e=>!n(e)&&!s(e),ar=e=>O(e,Re,Me),n=e=>Ce.test(e),T=e=>O(e,Ie,or),re=e=>O(e,mr,m),xe=e=>O(e,Se,Me),ir=e=>O(e,Pe,nr),X=e=>O(e,Ge,tr),s=e=>Ae.test(e),W=e=>B(e,Ie),lr=e=>B(e,ur),ke=e=>B(e,Se),cr=e=>B(e,Re),dr=e=>B(e,Pe),D=e=>B(e,Ge,!0),O=(e,t,r)=>{const o=Ce.exec(e);return o?o[1]?t(o[1]):r(o[2]):!1},B=(e,t,r=!1)=>{const o=Ae.exec(e);return o?o[1]?t(o[1]):r:!1},Se=e=>e==="position"||e==="percentage",Pe=e=>e==="image"||e==="url",Re=e=>e==="length"||e==="size"||e==="bg-size",Ie=e=>e==="length",mr=e=>e==="number",ur=e=>e==="family-name",Ge=e=>e==="shadow",pr=()=>{const e=g("color"),t=g("font"),r=g("text"),o=g("font-weight"),a=g("tracking"),c=g("leading"),l=g("breakpoint"),p=g("container"),u=g("spacing"),b=g("radius"),f=g("shadow"),k=g("inset-shadow"),z=g("text-shadow"),R=g("drop-shadow"),w=g("blur"),y=g("perspective"),C=g("aspect"),I=g("ease"),$=g("animate"),_=()=>["auto","avoid","all","avoid-page","page","left","right","column"],V=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],E=()=>[...V(),s,n],G=()=>["auto","hidden","clip","visible","scroll"],F=()=>["auto","contain","none"],d=()=>[s,n,u],A=()=>[L,"full","auto",...d()],ae=()=>[P,"none","subgrid",s,n],ie=()=>["auto",{span:["full",P,s,n]},P,s,n],U=()=>[P,"auto",s,n],le=()=>["auto","min","max","fr",s,n],Q=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],j=()=>["start","end","center","stretch","center-safe","end-safe"],M=()=>["auto",...d()],N=()=>[L,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...d()],i=()=>[e,s,n],ce=()=>[...V(),ke,xe,{position:[s,n]}],de=()=>["no-repeat",{repeat:["","x","y","space","round"]}],me=()=>["auto","cover","contain",cr,ar,{size:[s,n]}],Y=()=>[ee,W,T],x=()=>["","none","full",b,s,n],v=()=>["",m,W,T],q=()=>["solid","dashed","dotted","double"],ue=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],h=()=>[m,ee,ke,xe],pe=()=>["","none",w,s,n],H=()=>["none",m,s,n],J=()=>["none",m,s,n],Z=()=>[m,s,n],K=()=>[L,"full",...d()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[S],breakpoint:[S],color:[rr],container:[S],"drop-shadow":[S],ease:["in","out","in-out"],font:[sr],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[S],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[S],shadow:[S],spacing:["px",m],text:[S],"text-shadow":[S],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",L,n,s,C]}],container:["container"],columns:[{columns:[m,n,s,p]}],"break-after":[{"break-after":_()}],"break-before":[{"break-before":_()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:E()}],overflow:[{overflow:G()}],"overflow-x":[{"overflow-x":G()}],"overflow-y":[{"overflow-y":G()}],overscroll:[{overscroll:F()}],"overscroll-x":[{"overscroll-x":F()}],"overscroll-y":[{"overscroll-y":F()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:A()}],"inset-x":[{"inset-x":A()}],"inset-y":[{"inset-y":A()}],start:[{start:A()}],end:[{end:A()}],top:[{top:A()}],right:[{right:A()}],bottom:[{bottom:A()}],left:[{left:A()}],visibility:["visible","invisible","collapse"],z:[{z:[P,"auto",s,n]}],basis:[{basis:[L,"full","auto",p,...d()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[m,L,"auto","initial","none",n]}],grow:[{grow:["",m,s,n]}],shrink:[{shrink:["",m,s,n]}],order:[{order:[P,"first","last","none",s,n]}],"grid-cols":[{"grid-cols":ae()}],"col-start-end":[{col:ie()}],"col-start":[{"col-start":U()}],"col-end":[{"col-end":U()}],"grid-rows":[{"grid-rows":ae()}],"row-start-end":[{row:ie()}],"row-start":[{"row-start":U()}],"row-end":[{"row-end":U()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":le()}],"auto-rows":[{"auto-rows":le()}],gap:[{gap:d()}],"gap-x":[{"gap-x":d()}],"gap-y":[{"gap-y":d()}],"justify-content":[{justify:[...Q(),"normal"]}],"justify-items":[{"justify-items":[...j(),"normal"]}],"justify-self":[{"justify-self":["auto",...j()]}],"align-content":[{content:["normal",...Q()]}],"align-items":[{items:[...j(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...j(),{baseline:["","last"]}]}],"place-content":[{"place-content":Q()}],"place-items":[{"place-items":[...j(),"baseline"]}],"place-self":[{"place-self":["auto",...j()]}],p:[{p:d()}],px:[{px:d()}],py:[{py:d()}],ps:[{ps:d()}],pe:[{pe:d()}],pt:[{pt:d()}],pr:[{pr:d()}],pb:[{pb:d()}],pl:[{pl:d()}],m:[{m:M()}],mx:[{mx:M()}],my:[{my:M()}],ms:[{ms:M()}],me:[{me:M()}],mt:[{mt:M()}],mr:[{mr:M()}],mb:[{mb:M()}],ml:[{ml:M()}],"space-x":[{"space-x":d()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":d()}],"space-y-reverse":["space-y-reverse"],size:[{size:N()}],w:[{w:[p,"screen",...N()]}],"min-w":[{"min-w":[p,"screen","none",...N()]}],"max-w":[{"max-w":[p,"screen","none","prose",{screen:[l]},...N()]}],h:[{h:["screen","lh",...N()]}],"min-h":[{"min-h":["screen","lh","none",...N()]}],"max-h":[{"max-h":["screen","lh",...N()]}],"font-size":[{text:["base",r,W,T]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[o,s,re]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",ee,n]}],"font-family":[{font:[lr,n,t]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[a,s,n]}],"line-clamp":[{"line-clamp":[m,"none",s,re]}],leading:[{leading:[c,...d()]}],"list-image":[{"list-image":["none",s,n]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",s,n]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:i()}],"text-color":[{text:i()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...q(),"wavy"]}],"text-decoration-thickness":[{decoration:[m,"from-font","auto",s,T]}],"text-decoration-color":[{decoration:i()}],"underline-offset":[{"underline-offset":[m,"auto",s,n]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:d()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",s,n]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",s,n]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:ce()}],"bg-repeat":[{bg:de()}],"bg-size":[{bg:me()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},P,s,n],radial:["",s,n],conic:[P,s,n]},dr,ir]}],"bg-color":[{bg:i()}],"gradient-from-pos":[{from:Y()}],"gradient-via-pos":[{via:Y()}],"gradient-to-pos":[{to:Y()}],"gradient-from":[{from:i()}],"gradient-via":[{via:i()}],"gradient-to":[{to:i()}],rounded:[{rounded:x()}],"rounded-s":[{"rounded-s":x()}],"rounded-e":[{"rounded-e":x()}],"rounded-t":[{"rounded-t":x()}],"rounded-r":[{"rounded-r":x()}],"rounded-b":[{"rounded-b":x()}],"rounded-l":[{"rounded-l":x()}],"rounded-ss":[{"rounded-ss":x()}],"rounded-se":[{"rounded-se":x()}],"rounded-ee":[{"rounded-ee":x()}],"rounded-es":[{"rounded-es":x()}],"rounded-tl":[{"rounded-tl":x()}],"rounded-tr":[{"rounded-tr":x()}],"rounded-br":[{"rounded-br":x()}],"rounded-bl":[{"rounded-bl":x()}],"border-w":[{border:v()}],"border-w-x":[{"border-x":v()}],"border-w-y":[{"border-y":v()}],"border-w-s":[{"border-s":v()}],"border-w-e":[{"border-e":v()}],"border-w-t":[{"border-t":v()}],"border-w-r":[{"border-r":v()}],"border-w-b":[{"border-b":v()}],"border-w-l":[{"border-l":v()}],"divide-x":[{"divide-x":v()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":v()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...q(),"hidden","none"]}],"divide-style":[{divide:[...q(),"hidden","none"]}],"border-color":[{border:i()}],"border-color-x":[{"border-x":i()}],"border-color-y":[{"border-y":i()}],"border-color-s":[{"border-s":i()}],"border-color-e":[{"border-e":i()}],"border-color-t":[{"border-t":i()}],"border-color-r":[{"border-r":i()}],"border-color-b":[{"border-b":i()}],"border-color-l":[{"border-l":i()}],"divide-color":[{divide:i()}],"outline-style":[{outline:[...q(),"none","hidden"]}],"outline-offset":[{"outline-offset":[m,s,n]}],"outline-w":[{outline:["",m,W,T]}],"outline-color":[{outline:i()}],shadow:[{shadow:["","none",f,D,X]}],"shadow-color":[{shadow:i()}],"inset-shadow":[{"inset-shadow":["none",k,D,X]}],"inset-shadow-color":[{"inset-shadow":i()}],"ring-w":[{ring:v()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:i()}],"ring-offset-w":[{"ring-offset":[m,T]}],"ring-offset-color":[{"ring-offset":i()}],"inset-ring-w":[{"inset-ring":v()}],"inset-ring-color":[{"inset-ring":i()}],"text-shadow":[{"text-shadow":["none",z,D,X]}],"text-shadow-color":[{"text-shadow":i()}],opacity:[{opacity:[m,s,n]}],"mix-blend":[{"mix-blend":[...ue(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":ue()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[m]}],"mask-image-linear-from-pos":[{"mask-linear-from":h()}],"mask-image-linear-to-pos":[{"mask-linear-to":h()}],"mask-image-linear-from-color":[{"mask-linear-from":i()}],"mask-image-linear-to-color":[{"mask-linear-to":i()}],"mask-image-t-from-pos":[{"mask-t-from":h()}],"mask-image-t-to-pos":[{"mask-t-to":h()}],"mask-image-t-from-color":[{"mask-t-from":i()}],"mask-image-t-to-color":[{"mask-t-to":i()}],"mask-image-r-from-pos":[{"mask-r-from":h()}],"mask-image-r-to-pos":[{"mask-r-to":h()}],"mask-image-r-from-color":[{"mask-r-from":i()}],"mask-image-r-to-color":[{"mask-r-to":i()}],"mask-image-b-from-pos":[{"mask-b-from":h()}],"mask-image-b-to-pos":[{"mask-b-to":h()}],"mask-image-b-from-color":[{"mask-b-from":i()}],"mask-image-b-to-color":[{"mask-b-to":i()}],"mask-image-l-from-pos":[{"mask-l-from":h()}],"mask-image-l-to-pos":[{"mask-l-to":h()}],"mask-image-l-from-color":[{"mask-l-from":i()}],"mask-image-l-to-color":[{"mask-l-to":i()}],"mask-image-x-from-pos":[{"mask-x-from":h()}],"mask-image-x-to-pos":[{"mask-x-to":h()}],"mask-image-x-from-color":[{"mask-x-from":i()}],"mask-image-x-to-color":[{"mask-x-to":i()}],"mask-image-y-from-pos":[{"mask-y-from":h()}],"mask-image-y-to-pos":[{"mask-y-to":h()}],"mask-image-y-from-color":[{"mask-y-from":i()}],"mask-image-y-to-color":[{"mask-y-to":i()}],"mask-image-radial":[{"mask-radial":[s,n]}],"mask-image-radial-from-pos":[{"mask-radial-from":h()}],"mask-image-radial-to-pos":[{"mask-radial-to":h()}],"mask-image-radial-from-color":[{"mask-radial-from":i()}],"mask-image-radial-to-color":[{"mask-radial-to":i()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":V()}],"mask-image-conic-pos":[{"mask-conic":[m]}],"mask-image-conic-from-pos":[{"mask-conic-from":h()}],"mask-image-conic-to-pos":[{"mask-conic-to":h()}],"mask-image-conic-from-color":[{"mask-conic-from":i()}],"mask-image-conic-to-color":[{"mask-conic-to":i()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:ce()}],"mask-repeat":[{mask:de()}],"mask-size":[{mask:me()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",s,n]}],filter:[{filter:["","none",s,n]}],blur:[{blur:pe()}],brightness:[{brightness:[m,s,n]}],contrast:[{contrast:[m,s,n]}],"drop-shadow":[{"drop-shadow":["","none",R,D,X]}],"drop-shadow-color":[{"drop-shadow":i()}],grayscale:[{grayscale:["",m,s,n]}],"hue-rotate":[{"hue-rotate":[m,s,n]}],invert:[{invert:["",m,s,n]}],saturate:[{saturate:[m,s,n]}],sepia:[{sepia:["",m,s,n]}],"backdrop-filter":[{"backdrop-filter":["","none",s,n]}],"backdrop-blur":[{"backdrop-blur":pe()}],"backdrop-brightness":[{"backdrop-brightness":[m,s,n]}],"backdrop-contrast":[{"backdrop-contrast":[m,s,n]}],"backdrop-grayscale":[{"backdrop-grayscale":["",m,s,n]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m,s,n]}],"backdrop-invert":[{"backdrop-invert":["",m,s,n]}],"backdrop-opacity":[{"backdrop-opacity":[m,s,n]}],"backdrop-saturate":[{"backdrop-saturate":[m,s,n]}],"backdrop-sepia":[{"backdrop-sepia":["",m,s,n]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":d()}],"border-spacing-x":[{"border-spacing-x":d()}],"border-spacing-y":[{"border-spacing-y":d()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",s,n]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[m,"initial",s,n]}],ease:[{ease:["linear","initial",I,s,n]}],delay:[{delay:[m,s,n]}],animate:[{animate:["none",$,s,n]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[y,s,n]}],"perspective-origin":[{"perspective-origin":E()}],rotate:[{rotate:H()}],"rotate-x":[{"rotate-x":H()}],"rotate-y":[{"rotate-y":H()}],"rotate-z":[{"rotate-z":H()}],scale:[{scale:J()}],"scale-x":[{"scale-x":J()}],"scale-y":[{"scale-y":J()}],"scale-z":[{"scale-z":J()}],"scale-3d":["scale-3d"],skew:[{skew:Z()}],"skew-x":[{"skew-x":Z()}],"skew-y":[{"skew-y":Z()}],transform:[{transform:[s,n,"","none","gpu","cpu"]}],"transform-origin":[{origin:E()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:K()}],"translate-x":[{"translate-x":K()}],"translate-y":[{"translate-y":K()}],"translate-z":[{"translate-z":K()}],"translate-none":["translate-none"],accent:[{accent:i()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:i()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",s,n]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":d()}],"scroll-mx":[{"scroll-mx":d()}],"scroll-my":[{"scroll-my":d()}],"scroll-ms":[{"scroll-ms":d()}],"scroll-me":[{"scroll-me":d()}],"scroll-mt":[{"scroll-mt":d()}],"scroll-mr":[{"scroll-mr":d()}],"scroll-mb":[{"scroll-mb":d()}],"scroll-ml":[{"scroll-ml":d()}],"scroll-p":[{"scroll-p":d()}],"scroll-px":[{"scroll-px":d()}],"scroll-py":[{"scroll-py":d()}],"scroll-ps":[{"scroll-ps":d()}],"scroll-pe":[{"scroll-pe":d()}],"scroll-pt":[{"scroll-pt":d()}],"scroll-pr":[{"scroll-pr":d()}],"scroll-pb":[{"scroll-pb":d()}],"scroll-pl":[{"scroll-pl":d()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",s,n]}],fill:[{fill:["none",...i()]}],"stroke-w":[{stroke:[m,W,T,re]}],stroke:[{stroke:["none",...i()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},br=Ke(pr);function fr(...e){return br(ye(e))}const gr=Ve("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-zinc-950 disabled:pointer-events-none disabled:opacity-50 dark:focus-visible:ring-zinc-300",{variants:{variant:{default:"bg-zinc-900 text-zinc-50 shadow hover:bg-zinc-900/90 dark:bg-zinc-50 dark:text-zinc-900 dark:hover:bg-zinc-50/90",destructive:"bg-red-500 text-zinc-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-zinc-50 dark:hover:bg-red-900/90",outline:"border border-zinc-200 bg-white shadow-sm hover:bg-zinc-100 hover:text-zinc-900 dark:border-zinc-800 dark:bg-zinc-950 dark:hover:bg-zinc-800 dark:hover:text-zinc-50",secondary:"bg-zinc-100 text-zinc-900 shadow-sm hover:bg-zinc-100/80 dark:bg-zinc-800 dark:text-zinc-50 dark:hover:bg-zinc-800/80",ghost:"hover:bg-zinc-100 hover:text-zinc-900 dark:hover:bg-zinc-800 dark:hover:text-zinc-50",link:"text-zinc-900 underline-offset-4 hover:underline dark:text-zinc-50"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),hr=Ne.forwardRef(({className:e,variant:t,size:r,...o},a)=>Te.jsx("button",{className:fr(gr({variant:t,size:r,className:e})),ref:a,...o}));hr.displayName="Button";export{hr as B,fr as c};
build/client/assets/card-nZ_hrmF6.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{r as s,j as t}from"./chunk-OIYGIGL5-O35CAIo3.js";import{c as d}from"./button-1YLPPCtt.js";const o=s.forwardRef(({className:e,type:a,...r},i)=>t.jsx("input",{type:a,className:d("flex h-9 w-full rounded-md border border-zinc-200 bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-zinc-950 placeholder:text-zinc-500 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-zinc-950 disabled:cursor-not-allowed disabled:opacity-50 dark:border-zinc-800 dark:file:text-zinc-50 dark:placeholder:text-zinc-400 dark:focus-visible:ring-zinc-300",e),ref:i,...r}));o.displayName="Input";const n=s.forwardRef(({className:e,...a},r)=>t.jsx("label",{ref:r,className:d("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",e),...a}));n.displayName="Label";const l=s.forwardRef(({className:e,...a},r)=>t.jsx("div",{ref:r,className:d("rounded-xl border border-zinc-200 bg-white text-zinc-950 shadow dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-50",e),...a}));l.displayName="Card";const c=s.forwardRef(({className:e,...a},r)=>t.jsx("div",{ref:r,className:d("flex flex-col space-y-1.5 p-6",e),...a}));c.displayName="CardHeader";const f=s.forwardRef(({className:e,...a},r)=>t.jsx("h3",{ref:r,className:d("font-semibold leading-none tracking-tight",e),...a}));f.displayName="CardTitle";const p=s.forwardRef(({className:e,...a},r)=>t.jsx("p",{ref:r,className:d("text-sm text-zinc-500 dark:text-zinc-400",e),...a}));p.displayName="CardDescription";const m=s.forwardRef(({className:e,...a},r)=>t.jsx("div",{ref:r,className:d("p-6 pt-0",e),...a}));m.displayName="CardContent";const x=s.forwardRef(({className:e,...a},r)=>t.jsx("div",{ref:r,className:d("flex items-center p-6 pt-0",e),...a}));x.displayName="CardFooter";export{l as C,o as I,n as L,c as a,f as b,p as c,m as d};
build/client/assets/chunk-OIYGIGL5-O35CAIo3.js ADDED
The diff for this file is too large to render. See raw diff
 
build/client/assets/entry.client-BqCLKtvt.js ADDED
The diff for this file is too large to render. See raw diff
 
build/client/assets/home-CCZyLKHc.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{w as t,j as e,L as s}from"./chunk-OIYGIGL5-O35CAIo3.js";function i({}){return[{title:"Always Uptime - Home"},{name:"description",content:"Uptime monitoring service"}]}const l=t(function(){return e.jsx("div",{className:"min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800",children:e.jsx("div",{className:"container mx-auto px-4 py-16",children:e.jsxs("div",{className:"max-w-4xl mx-auto text-center",children:[e.jsx("h1",{className:"text-6xl font-bold text-gray-900 dark:text-white mb-6",children:"Always Uptime"}),e.jsx("p",{className:"text-xl text-gray-600 dark:text-gray-300 mb-8",children:"Monitor your services 24/7 with real-time uptime checks every 30 seconds"}),e.jsx("div",{className:"flex justify-center gap-4 mb-16",children:e.jsxs(s,{to:"/login",className:"inline-flex items-center px-8 py-4 bg-indigo-600 hover:bg-indigo-700 text-white font-semibold rounded-lg shadow-lg transition-all transform hover:scale-105",children:["Get Started",e.jsx("svg",{className:"ml-2 w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})]})}),e.jsxs("div",{className:"grid md:grid-cols-3 gap-8 mt-16",children:[e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6",children:[e.jsx("div",{className:"text-4xl mb-4",children:"⚡"}),e.jsx("h3",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Real-time Monitoring"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Automated checks every 30 seconds to ensure your services are always available"})]}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6",children:[e.jsx("div",{className:"text-4xl mb-4",children:"📊"}),e.jsx("h3",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Detailed Analytics"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Track uptime percentage, response times, and historical data"})]}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6",children:[e.jsx("div",{className:"text-4xl mb-4",children:"🚀"}),e.jsx("h3",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Simple & Fast"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Clean dashboard with instant insights into your service health"})]})]})]})})})});export{l as default,i as meta};
build/client/assets/login-CtRm5tfE.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{w as a,j as e,L as n}from"./chunk-OIYGIGL5-O35CAIo3.js";import{B as i}from"./button-1YLPPCtt.js";import{C as c,a as l,b as d,c as o,d as m,L as r,I as t}from"./card-nZ_hrmF6.js";function j({}){return[{title:"Login - Always Uptime"},{name:"description",content:"Login to your account"}]}const y=a(function({actionData:s}){return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-zinc-50 dark:bg-zinc-900 px-4",children:e.jsxs(c,{className:"w-full max-w-md",children:[e.jsxs(l,{children:[e.jsx(d,{className:"text-2xl",children:"Welcome back"}),e.jsx(o,{children:"Enter your credentials to access your account"})]}),e.jsxs(m,{children:[e.jsxs("form",{method:"post",className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(r,{htmlFor:"email",children:"Email"}),e.jsx(t,{id:"email",name:"email",type:"email",placeholder:"you@example.com",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(r,{htmlFor:"password",children:"Password"}),e.jsx(t,{id:"password",name:"password",type:"password",required:!0,minLength:6})]}),s?.error&&e.jsx("p",{className:"text-sm text-red-500 dark:text-red-400",children:s.error}),e.jsx(i,{type:"submit",className:"w-full",children:"Sign in"})]}),e.jsxs("div",{className:"mt-4 text-center text-sm text-zinc-600 dark:text-zinc-400",children:["Don't have an account?"," ",e.jsx(n,{to:"/register",className:"text-zinc-900 dark:text-zinc-50 underline",children:"Sign up"})]})]})]})})});export{y as default,j as meta};
build/client/assets/logout-l0sNRNKZ.js ADDED
@@ -0,0 +1 @@
 
 
1
+
build/client/assets/manifest-ceec8a43.js ADDED
@@ -0,0 +1 @@
 
 
1
+ window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-BqCLKtvt.js","imports":["/assets/chunk-OIYGIGL5-O35CAIo3.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-C5Mnt1V9.js","imports":["/assets/chunk-OIYGIGL5-O35CAIo3.js"],"css":["/assets/root-DePtEpHZ.css"]},"routes/home":{"id":"routes/home","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/home-CCZyLKHc.js","imports":["/assets/chunk-OIYGIGL5-O35CAIo3.js"],"css":[]},"routes/login":{"id":"routes/login","parentId":"root","path":"login","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-CtRm5tfE.js","imports":["/assets/chunk-OIYGIGL5-O35CAIo3.js","/assets/button-1YLPPCtt.js","/assets/card-nZ_hrmF6.js"],"css":[]},"routes/register":{"id":"routes/register","parentId":"root","path":"register","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/register-BLpbiVIx.js","imports":["/assets/chunk-OIYGIGL5-O35CAIo3.js","/assets/button-1YLPPCtt.js","/assets/card-nZ_hrmF6.js"],"css":[]},"routes/logout":{"id":"routes/logout","parentId":"root","path":"logout","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/logout-l0sNRNKZ.js","imports":[],"css":[]},"routes/uptime":{"id":"routes/uptime","parentId":"root","path":"uptime","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/uptime-BYui58Ub.js","imports":["/assets/chunk-OIYGIGL5-O35CAIo3.js","/assets/button-1YLPPCtt.js"],"css":[]}},"url":"/assets/manifest-ceec8a43.js","version":"ceec8a43"};
build/client/assets/register-BLpbiVIx.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{w as r,j as e,L as n}from"./chunk-OIYGIGL5-O35CAIo3.js";import{B as i}from"./button-1YLPPCtt.js";import{C as c,a as l,b as d,c as m,d as o,L as t,I as a}from"./card-nZ_hrmF6.js";function j({}){return[{title:"Register - Always Uptime"},{name:"description",content:"Create a new account"}]}const w=r(function({actionData:s}){return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-zinc-50 dark:bg-zinc-900 px-4",children:e.jsxs(c,{className:"w-full max-w-md",children:[e.jsxs(l,{children:[e.jsx(d,{className:"text-2xl",children:"Create an account"}),e.jsx(m,{children:"Enter your details to get started"})]}),e.jsxs(o,{children:[e.jsxs("form",{method:"post",className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"email",children:"Email"}),e.jsx(a,{id:"email",name:"email",type:"email",placeholder:"you@example.com",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"password",children:"Password"}),e.jsx(a,{id:"password",name:"password",type:"password",required:!0,minLength:6}),e.jsx("p",{className:"text-xs text-zinc-500 dark:text-zinc-400",children:"Must be at least 6 characters"})]}),s?.error&&e.jsx("p",{className:"text-sm text-red-500 dark:text-red-400",children:s.error}),e.jsx(i,{type:"submit",className:"w-full",children:"Create account"})]}),e.jsxs("div",{className:"mt-4 text-center text-sm text-zinc-600 dark:text-zinc-400",children:["Already have an account?"," ",e.jsx(n,{to:"/login",className:"text-zinc-900 dark:text-zinc-50 underline",children:"Sign in"})]})]})]})})});export{w as default,j as meta};
build/client/assets/root-C5Mnt1V9.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{w as a,a as i,j as s,M as c,b as l,S as p,c as u,O as h,i as d}from"./chunk-OIYGIGL5-O35CAIo3.js";const m=()=>[{rel:"preconnect",href:"https://fonts.googleapis.com"},{rel:"preconnect",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"},{rel:"stylesheet",href:"https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"}];function f({children:e}){return s.jsxs("html",{lang:"en",children:[s.jsxs("head",{children:[s.jsx("meta",{charSet:"utf-8"}),s.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),s.jsx(c,{}),s.jsx(l,{})]}),s.jsxs("body",{children:[e,s.jsx(p,{}),s.jsx(u,{})]})]})}const j=a(function(){return s.jsx(h,{})}),g=i(function({error:t}){let n="Oops!",o="An unexpected error occurred.",r;return d(t)&&(n=t.status===404?"404":"Error",o=t.status===404?"The requested page could not be found.":t.statusText||o),s.jsxs("main",{className:"pt-16 p-4 container mx-auto",children:[s.jsx("h1",{children:n}),s.jsx("p",{children:o}),r]})});export{g as ErrorBoundary,f as Layout,j as default,m as links};
build/client/assets/root-DePtEpHZ.css ADDED
@@ -0,0 +1 @@
 
 
1
+ /*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:"Inter",ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-normal:1.5;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-3xl:1.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-16{margin-top:calc(var(--spacing)*16)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-16{height:calc(var(--spacing)*16)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing)*3)}.w-5{width:calc(var(--spacing)*5)}.w-9{width:calc(var(--spacing)*9)}.w-\[500px\]{width:500px}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[100vw\]{max-width:100vw}.max-w-\[300px\]{max-width:300px}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-8{gap:calc(var(--spacing)*8)}.gap-9{gap:calc(var(--spacing)*9)}.gap-16{gap:calc(var(--spacing)*16)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-gray-200{border-color:var(--color-gray-200)}.border-zinc-200{border-color:var(--color-zinc-200)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-100{--tw-gradient-to:var(--color-indigo-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.stroke-gray-600{stroke:var(--color-gray-600)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-16{padding-top:calc(var(--spacing)*16)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.text-center{text-align:center}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-blue-700{color:var(--color-blue-700)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-800{color:var(--color-green-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.text-zinc-50{color:var(--color-zinc-50)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-900{color:var(--color-zinc-900)}.text-zinc-950{color:var(--color-zinc-950)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.group-hover\:stroke-current:is(:where(.group):hover *){stroke:currentColor}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-zinc-950::file-selector-button{color:var(--color-zinc-950)}.placeholder\:text-zinc-500::placeholder{color:var(--color-zinc-500)}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-red-500\/90:hover{background-color:#fb2c36e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/90:hover{background-color:color-mix(in oklab,var(--color-red-500)90%,transparent)}}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-100\/80:hover{background-color:#f4f4f5cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-100\/80:hover{background-color:color-mix(in oklab,var(--color-zinc-100)80%,transparent)}}.hover\:bg-zinc-900\/90:hover{background-color:#18181be6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-900\/90:hover{background-color:color-mix(in oklab,var(--color-zinc-900)90%,transparent)}}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-zinc-950:focus-visible{--tw-ring-color:var(--color-zinc-950)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:block{display:block}.dark\:hidden{display:none}.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-900{background-color:var(--color-green-900)}.dark\:bg-red-900{background-color:var(--color-red-900)}.dark\:bg-zinc-50{background-color:var(--color-zinc-50)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:from-gray-900{--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-gray-800{--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:stroke-gray-300{stroke:var(--color-gray-300)}.dark\:text-blue-500{color:var(--color-blue-500)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-300{color:var(--color-gray-300)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-200{color:var(--color-green-200)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-red-200{color:var(--color-red-200)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-white{color:var(--color-white)}.dark\:text-zinc-50{color:var(--color-zinc-50)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-900{color:var(--color-zinc-900)}.dark\:file\:text-zinc-50::file-selector-button{color:var(--color-zinc-50)}.dark\:placeholder\:text-zinc-400::placeholder{color:var(--color-zinc-400)}@media(hover:hover){.dark\:hover\:bg-red-900\/90:hover{background-color:#82181ae6}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/90:hover{background-color:color-mix(in oklab,var(--color-red-900)90%,transparent)}}.dark\:hover\:bg-zinc-50\/90:hover{background-color:#fafafae6}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-zinc-50\/90:hover{background-color:color-mix(in oklab,var(--color-zinc-50)90%,transparent)}}.dark\:hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.dark\:hover\:bg-zinc-800\/80:hover{background-color:#27272acc}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-zinc-800\/80:hover{background-color:color-mix(in oklab,var(--color-zinc-800)80%,transparent)}}.dark\:hover\:text-zinc-50:hover{color:var(--color-zinc-50)}}.dark\:focus-visible\:ring-zinc-300:focus-visible{--tw-ring-color:var(--color-zinc-300)}}}html,body{background-color:var(--color-white)}@media(prefers-color-scheme:dark){html,body{background-color:var(--color-gray-950);color-scheme:dark}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
build/client/assets/server-build-DePtEpHZ.css ADDED
@@ -0,0 +1 @@
 
 
1
+ /*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:"Inter",ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-normal:1.5;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-3xl:1.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-16{margin-top:calc(var(--spacing)*16)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-16{height:calc(var(--spacing)*16)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing)*3)}.w-5{width:calc(var(--spacing)*5)}.w-9{width:calc(var(--spacing)*9)}.w-\[500px\]{width:500px}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[100vw\]{max-width:100vw}.max-w-\[300px\]{max-width:300px}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-8{gap:calc(var(--spacing)*8)}.gap-9{gap:calc(var(--spacing)*9)}.gap-16{gap:calc(var(--spacing)*16)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-gray-200{border-color:var(--color-gray-200)}.border-zinc-200{border-color:var(--color-zinc-200)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-100{--tw-gradient-to:var(--color-indigo-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.stroke-gray-600{stroke:var(--color-gray-600)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-16{padding-top:calc(var(--spacing)*16)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.text-center{text-align:center}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-blue-700{color:var(--color-blue-700)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-800{color:var(--color-green-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.text-zinc-50{color:var(--color-zinc-50)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-900{color:var(--color-zinc-900)}.text-zinc-950{color:var(--color-zinc-950)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.group-hover\:stroke-current:is(:where(.group):hover *){stroke:currentColor}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-zinc-950::file-selector-button{color:var(--color-zinc-950)}.placeholder\:text-zinc-500::placeholder{color:var(--color-zinc-500)}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-red-500\/90:hover{background-color:#fb2c36e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/90:hover{background-color:color-mix(in oklab,var(--color-red-500)90%,transparent)}}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-100\/80:hover{background-color:#f4f4f5cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-100\/80:hover{background-color:color-mix(in oklab,var(--color-zinc-100)80%,transparent)}}.hover\:bg-zinc-900\/90:hover{background-color:#18181be6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-900\/90:hover{background-color:color-mix(in oklab,var(--color-zinc-900)90%,transparent)}}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-zinc-950:focus-visible{--tw-ring-color:var(--color-zinc-950)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:block{display:block}.dark\:hidden{display:none}.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-900{background-color:var(--color-green-900)}.dark\:bg-red-900{background-color:var(--color-red-900)}.dark\:bg-zinc-50{background-color:var(--color-zinc-50)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:from-gray-900{--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-gray-800{--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:stroke-gray-300{stroke:var(--color-gray-300)}.dark\:text-blue-500{color:var(--color-blue-500)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-300{color:var(--color-gray-300)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-200{color:var(--color-green-200)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-red-200{color:var(--color-red-200)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-white{color:var(--color-white)}.dark\:text-zinc-50{color:var(--color-zinc-50)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-900{color:var(--color-zinc-900)}.dark\:file\:text-zinc-50::file-selector-button{color:var(--color-zinc-50)}.dark\:placeholder\:text-zinc-400::placeholder{color:var(--color-zinc-400)}@media(hover:hover){.dark\:hover\:bg-red-900\/90:hover{background-color:#82181ae6}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/90:hover{background-color:color-mix(in oklab,var(--color-red-900)90%,transparent)}}.dark\:hover\:bg-zinc-50\/90:hover{background-color:#fafafae6}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-zinc-50\/90:hover{background-color:color-mix(in oklab,var(--color-zinc-50)90%,transparent)}}.dark\:hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.dark\:hover\:bg-zinc-800\/80:hover{background-color:#27272acc}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-zinc-800\/80:hover{background-color:color-mix(in oklab,var(--color-zinc-800)80%,transparent)}}.dark\:hover\:text-zinc-50:hover{color:var(--color-zinc-50)}}.dark\:focus-visible\:ring-zinc-300:focus-visible{--tw-ring-color:var(--color-zinc-300)}}}html,body{background-color:var(--color-white)}@media(prefers-color-scheme:dark){html,body{background-color:var(--color-gray-950);color-scheme:dark}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
build/client/assets/uptime-BYui58Ub.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{w as c,u as n,r as x,j as e,F as m}from"./chunk-OIYGIGL5-O35CAIo3.js";import{B as o}from"./button-1YLPPCtt.js";function p({}){return[{title:"Always Uptime - Monitor Your Services"},{name:"description",content:"Real-time uptime monitoring dashboard"}]}const u=c(function({loaderData:d}){const{stats:r,user:l}=d,a=n();return x.useEffect(()=>{const s=setInterval(()=>{a.revalidate()},3e4);return()=>clearInterval(s)},[a]),e.jsx("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900",children:e.jsxs("div",{className:"container mx-auto px-4 py-8",children:[e.jsxs("header",{className:"mb-8 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-4xl font-bold text-gray-900 dark:text-white mb-2",children:"Always Uptime"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Monitoring your services every 30 seconds"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:l.email}),e.jsx(m,{method:"post",action:"/logout",children:e.jsx(o,{variant:"outline",size:"sm",type:"submit",children:"Logout"})})]})]}),r.length===0?e.jsx("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow p-8 text-center",children:e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"No uptime data available yet. Checks will appear here shortly..."})}):e.jsx("div",{className:"space-y-6",children:r.map(s=>e.jsx("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-lg overflow-hidden",children:e.jsxs("div",{className:"p-6",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-1",children:s.url}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`inline-flex items-center px-3 py-1 rounded-full text-sm font-medium ${s.lastCheck?.status==="up"?"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200":"bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"}`,children:s.lastCheck?.status==="up"?"🟢 Online":"🔴 Offline"}),s.lastCheck?.statusCode&&e.jsxs("span",{className:"text-sm text-gray-500 dark:text-gray-400",children:["Status: ",s.lastCheck.statusCode]})]})]}),e.jsxs("div",{className:"text-right",children:[e.jsxs("div",{className:"text-3xl font-bold text-gray-900 dark:text-white",children:[s.uptime.toFixed(2),"%"]}),e.jsx("div",{className:"text-sm text-gray-500 dark:text-gray-400",children:"Uptime"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 mb-6",children:[e.jsxs("div",{className:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4",children:[e.jsx("div",{className:"text-sm text-gray-500 dark:text-gray-400 mb-1",children:"Total Checks"}),e.jsx("div",{className:"text-2xl font-semibold text-gray-900 dark:text-white",children:s.totalChecks})]}),e.jsxs("div",{className:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4",children:[e.jsx("div",{className:"text-sm text-gray-500 dark:text-gray-400 mb-1",children:"Successful"}),e.jsx("div",{className:"text-2xl font-semibold text-green-600 dark:text-green-400",children:s.successfulChecks})]}),e.jsxs("div",{className:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4",children:[e.jsx("div",{className:"text-sm text-gray-500 dark:text-gray-400 mb-1",children:"Failed"}),e.jsx("div",{className:"text-2xl font-semibold text-red-600 dark:text-red-400",children:s.failedChecks})]}),e.jsxs("div",{className:"bg-gray-50 dark:bg-gray-700 rounded-lg p-4",children:[e.jsx("div",{className:"text-sm text-gray-500 dark:text-gray-400 mb-1",children:"Avg Response"}),e.jsxs("div",{className:"text-2xl font-semibold text-gray-900 dark:text-white",children:[Math.round(s.averageResponseTime),"ms"]})]})]}),s.lastCheck&&e.jsxs("div",{className:"border-t border-gray-200 dark:border-gray-700 pt-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2",children:"Last Check"}),e.jsxs("div",{className:"text-sm text-gray-600 dark:text-gray-400",children:[e.jsxs("p",{children:["Time: ",new Date(s.lastCheck.timestamp).toLocaleString()]}),s.lastCheck.responseTime&&e.jsxs("p",{children:["Response Time: ",s.lastCheck.responseTime,"ms"]}),s.lastCheck.error&&e.jsxs("p",{className:"text-red-600 dark:text-red-400",children:["Error: ",s.lastCheck.error]})]})]}),s.checks.length>0&&e.jsxs("div",{className:"border-t border-gray-200 dark:border-gray-700 pt-4 mt-4",children:[e.jsxs("h3",{className:"text-sm font-semibold text-gray-700 dark:text-gray-300 mb-3",children:["Recent Checks (Last ",Math.min(s.checks.length,20),")"]}),e.jsx("div",{className:"flex gap-1 overflow-x-auto pb-2",children:s.checks.slice(-20).reverse().map((t,i)=>e.jsx("div",{className:`w-3 h-16 rounded ${t.status==="up"?"bg-green-500":"bg-red-500"}`,title:`${new Date(t.timestamp).toLocaleString()} - ${t.status} (${t.responseTime}ms)`},i))})]})]})},s.url))}),e.jsx("footer",{className:"mt-8 text-center text-sm text-gray-500 dark:text-gray-400",children:"Auto-refreshing every 30 seconds"})]})})});export{u as default,p as meta};
build/client/favicon.ico ADDED
build/server/assets/cron.server-BkSBgtlB.js ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cron from "node-cron";
2
+ import { c as checkUptime, s as saveUptimeCheck } from "./server-build-BAW0Iiqy.js";
3
+ import "react/jsx-runtime";
4
+ import "node:stream";
5
+ import "@react-router/node";
6
+ import "react-router";
7
+ import "isbot";
8
+ import "react-dom/server";
9
+ import "lucia";
10
+ import "@lucia-auth/adapter-drizzle";
11
+ import "drizzle-orm/libsql";
12
+ import "@libsql/client";
13
+ import "drizzle-orm/sqlite-core";
14
+ import "drizzle-orm";
15
+ import "@node-rs/argon2";
16
+ import "react";
17
+ import "class-variance-authority";
18
+ import "clsx";
19
+ import "tailwind-merge";
20
+ const monitoredUrls = [
21
+ "https://example.com/"
22
+ ];
23
+ let cronJob = null;
24
+ function startCronJob() {
25
+ if (cronJob) {
26
+ console.log("Cron job already running");
27
+ return;
28
+ }
29
+ cronJob = cron.schedule("*/30 * * * * *", async () => {
30
+ console.log("Running uptime checks...");
31
+ for (const url of monitoredUrls) {
32
+ try {
33
+ const result = await checkUptime(url);
34
+ saveUptimeCheck(result);
35
+ console.log(`Checked ${url}: ${result.status} (${result.responseTime}ms)`);
36
+ } catch (error) {
37
+ console.error(`Error checking ${url}:`, error);
38
+ }
39
+ }
40
+ });
41
+ console.log("Cron job started - checking every 30 seconds");
42
+ }
43
+ export {
44
+ startCronJob
45
+ };
build/server/assets/server-build-BAW0Iiqy.js ADDED
@@ -0,0 +1,990 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { PassThrough } from "node:stream";
3
+ import { createReadableStreamFromReadable } from "@react-router/node";
4
+ import { ServerRouter, UNSAFE_withComponentProps, Outlet, UNSAFE_withErrorBoundaryProps, isRouteErrorResponse, Meta, Links, ScrollRestoration, Scripts, Link, data, redirect, useRevalidator, Form } from "react-router";
5
+ import { isbot } from "isbot";
6
+ import { renderToPipeableStream } from "react-dom/server";
7
+ import { Lucia, generateId } from "lucia";
8
+ import { DrizzleSQLiteAdapter } from "@lucia-auth/adapter-drizzle";
9
+ import { drizzle } from "drizzle-orm/libsql";
10
+ import { createClient } from "@libsql/client";
11
+ import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
12
+ import { eq } from "drizzle-orm";
13
+ import { verify, hash } from "@node-rs/argon2";
14
+ import * as React from "react";
15
+ import { useEffect } from "react";
16
+ import { cva } from "class-variance-authority";
17
+ import { clsx } from "clsx";
18
+ import { twMerge } from "tailwind-merge";
19
+ const streamTimeout = 5e3;
20
+ function handleRequest(request, responseStatusCode, responseHeaders, routerContext, loadContext) {
21
+ return new Promise((resolve, reject) => {
22
+ let shellRendered = false;
23
+ let userAgent = request.headers.get("user-agent");
24
+ let readyOption = userAgent && isbot(userAgent) || routerContext.isSpaMode ? "onAllReady" : "onShellReady";
25
+ let timeoutId = setTimeout(
26
+ () => abort(),
27
+ streamTimeout + 1e3
28
+ );
29
+ const { pipe, abort } = renderToPipeableStream(
30
+ /* @__PURE__ */ jsx(ServerRouter, { context: routerContext, url: request.url }),
31
+ {
32
+ [readyOption]() {
33
+ shellRendered = true;
34
+ const body = new PassThrough({
35
+ final(callback) {
36
+ clearTimeout(timeoutId);
37
+ timeoutId = void 0;
38
+ callback();
39
+ }
40
+ });
41
+ const stream = createReadableStreamFromReadable(body);
42
+ responseHeaders.set("Content-Type", "text/html");
43
+ pipe(body);
44
+ resolve(
45
+ new Response(stream, {
46
+ headers: responseHeaders,
47
+ status: responseStatusCode
48
+ })
49
+ );
50
+ },
51
+ onShellError(error) {
52
+ reject(error);
53
+ },
54
+ onError(error) {
55
+ responseStatusCode = 500;
56
+ if (shellRendered) {
57
+ console.error(error);
58
+ }
59
+ }
60
+ }
61
+ );
62
+ });
63
+ }
64
+ const entryServer = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
65
+ __proto__: null,
66
+ default: handleRequest,
67
+ streamTimeout
68
+ }, Symbol.toStringTag, { value: "Module" }));
69
+ const links = () => [{
70
+ rel: "preconnect",
71
+ href: "https://fonts.googleapis.com"
72
+ }, {
73
+ rel: "preconnect",
74
+ href: "https://fonts.gstatic.com",
75
+ crossOrigin: "anonymous"
76
+ }, {
77
+ rel: "stylesheet",
78
+ href: "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"
79
+ }];
80
+ function Layout({
81
+ children
82
+ }) {
83
+ return /* @__PURE__ */ jsxs("html", {
84
+ lang: "en",
85
+ children: [/* @__PURE__ */ jsxs("head", {
86
+ children: [/* @__PURE__ */ jsx("meta", {
87
+ charSet: "utf-8"
88
+ }), /* @__PURE__ */ jsx("meta", {
89
+ name: "viewport",
90
+ content: "width=device-width, initial-scale=1"
91
+ }), /* @__PURE__ */ jsx(Meta, {}), /* @__PURE__ */ jsx(Links, {})]
92
+ }), /* @__PURE__ */ jsxs("body", {
93
+ children: [children, /* @__PURE__ */ jsx(ScrollRestoration, {}), /* @__PURE__ */ jsx(Scripts, {})]
94
+ })]
95
+ });
96
+ }
97
+ const root = UNSAFE_withComponentProps(function App() {
98
+ return /* @__PURE__ */ jsx(Outlet, {});
99
+ });
100
+ const ErrorBoundary = UNSAFE_withErrorBoundaryProps(function ErrorBoundary2({
101
+ error
102
+ }) {
103
+ let message = "Oops!";
104
+ let details = "An unexpected error occurred.";
105
+ let stack;
106
+ if (isRouteErrorResponse(error)) {
107
+ message = error.status === 404 ? "404" : "Error";
108
+ details = error.status === 404 ? "The requested page could not be found." : error.statusText || details;
109
+ }
110
+ return /* @__PURE__ */ jsxs("main", {
111
+ className: "pt-16 p-4 container mx-auto",
112
+ children: [/* @__PURE__ */ jsx("h1", {
113
+ children: message
114
+ }), /* @__PURE__ */ jsx("p", {
115
+ children: details
116
+ }), stack]
117
+ });
118
+ });
119
+ const route0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
120
+ __proto__: null,
121
+ ErrorBoundary,
122
+ Layout,
123
+ default: root,
124
+ links
125
+ }, Symbol.toStringTag, { value: "Module" }));
126
+ function meta$3({}) {
127
+ return [{
128
+ title: "Always Uptime - Home"
129
+ }, {
130
+ name: "description",
131
+ content: "Uptime monitoring service"
132
+ }];
133
+ }
134
+ const home = UNSAFE_withComponentProps(function Home() {
135
+ return /* @__PURE__ */ jsx("div", {
136
+ className: "min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800",
137
+ children: /* @__PURE__ */ jsx("div", {
138
+ className: "container mx-auto px-4 py-16",
139
+ children: /* @__PURE__ */ jsxs("div", {
140
+ className: "max-w-4xl mx-auto text-center",
141
+ children: [/* @__PURE__ */ jsx("h1", {
142
+ className: "text-6xl font-bold text-gray-900 dark:text-white mb-6",
143
+ children: "Always Uptime"
144
+ }), /* @__PURE__ */ jsx("p", {
145
+ className: "text-xl text-gray-600 dark:text-gray-300 mb-8",
146
+ children: "Monitor your services 24/7 with real-time uptime checks every 30 seconds"
147
+ }), /* @__PURE__ */ jsx("div", {
148
+ className: "flex justify-center gap-4 mb-16",
149
+ children: /* @__PURE__ */ jsxs(Link, {
150
+ to: "/login",
151
+ className: "inline-flex items-center px-8 py-4 bg-indigo-600 hover:bg-indigo-700 text-white font-semibold rounded-lg shadow-lg transition-all transform hover:scale-105",
152
+ children: ["Get Started", /* @__PURE__ */ jsx("svg", {
153
+ className: "ml-2 w-5 h-5",
154
+ fill: "none",
155
+ stroke: "currentColor",
156
+ viewBox: "0 0 24 24",
157
+ children: /* @__PURE__ */ jsx("path", {
158
+ strokeLinecap: "round",
159
+ strokeLinejoin: "round",
160
+ strokeWidth: 2,
161
+ d: "M9 5l7 7-7 7"
162
+ })
163
+ })]
164
+ })
165
+ }), /* @__PURE__ */ jsxs("div", {
166
+ className: "grid md:grid-cols-3 gap-8 mt-16",
167
+ children: [/* @__PURE__ */ jsxs("div", {
168
+ className: "bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6",
169
+ children: [/* @__PURE__ */ jsx("div", {
170
+ className: "text-4xl mb-4",
171
+ children: "⚡"
172
+ }), /* @__PURE__ */ jsx("h3", {
173
+ className: "text-xl font-semibold text-gray-900 dark:text-white mb-2",
174
+ children: "Real-time Monitoring"
175
+ }), /* @__PURE__ */ jsx("p", {
176
+ className: "text-gray-600 dark:text-gray-400",
177
+ children: "Automated checks every 30 seconds to ensure your services are always available"
178
+ })]
179
+ }), /* @__PURE__ */ jsxs("div", {
180
+ className: "bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6",
181
+ children: [/* @__PURE__ */ jsx("div", {
182
+ className: "text-4xl mb-4",
183
+ children: "📊"
184
+ }), /* @__PURE__ */ jsx("h3", {
185
+ className: "text-xl font-semibold text-gray-900 dark:text-white mb-2",
186
+ children: "Detailed Analytics"
187
+ }), /* @__PURE__ */ jsx("p", {
188
+ className: "text-gray-600 dark:text-gray-400",
189
+ children: "Track uptime percentage, response times, and historical data"
190
+ })]
191
+ }), /* @__PURE__ */ jsxs("div", {
192
+ className: "bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6",
193
+ children: [/* @__PURE__ */ jsx("div", {
194
+ className: "text-4xl mb-4",
195
+ children: "🚀"
196
+ }), /* @__PURE__ */ jsx("h3", {
197
+ className: "text-xl font-semibold text-gray-900 dark:text-white mb-2",
198
+ children: "Simple & Fast"
199
+ }), /* @__PURE__ */ jsx("p", {
200
+ className: "text-gray-600 dark:text-gray-400",
201
+ children: "Clean dashboard with instant insights into your service health"
202
+ })]
203
+ })]
204
+ })]
205
+ })
206
+ })
207
+ });
208
+ });
209
+ const route1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
210
+ __proto__: null,
211
+ default: home,
212
+ meta: meta$3
213
+ }, Symbol.toStringTag, { value: "Module" }));
214
+ const user = sqliteTable("user", {
215
+ id: text("id").primaryKey(),
216
+ email: text("email").notNull().unique(),
217
+ hashedPassword: text("hashed_password").notNull(),
218
+ createdAt: integer("created_at").notNull()
219
+ });
220
+ const session = sqliteTable("session", {
221
+ id: text("id").primaryKey(),
222
+ userId: text("user_id").notNull().references(() => user.id),
223
+ expiresAt: integer("expires_at").notNull()
224
+ });
225
+ const uptimeMonitor = sqliteTable("uptime_monitor", {
226
+ id: text("id").primaryKey(),
227
+ userId: text("user_id").notNull().references(() => user.id),
228
+ url: text("url").notNull(),
229
+ name: text("name").notNull(),
230
+ interval: integer("interval").notNull().default(30),
231
+ // seconds
232
+ createdAt: integer("created_at").notNull()
233
+ });
234
+ const uptimeCheck = sqliteTable("uptime_check", {
235
+ id: text("id").primaryKey(),
236
+ monitorId: text("monitor_id").notNull().references(() => uptimeMonitor.id),
237
+ status: text("status", { enum: ["up", "down"] }).notNull(),
238
+ statusCode: integer("status_code"),
239
+ responseTime: integer("response_time"),
240
+ error: text("error"),
241
+ timestamp: integer("timestamp").notNull()
242
+ });
243
+ const schema = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
244
+ __proto__: null,
245
+ session,
246
+ uptimeCheck,
247
+ uptimeMonitor,
248
+ user
249
+ }, Symbol.toStringTag, { value: "Module" }));
250
+ const client = createClient({
251
+ url: process.env.TURSO_DATABASE_URL,
252
+ authToken: process.env.TURSO_AUTH_TOKEN
253
+ });
254
+ const db = drizzle(client, { schema });
255
+ const adapter = new DrizzleSQLiteAdapter(db, session, user);
256
+ const lucia = new Lucia(adapter, {
257
+ sessionCookie: {
258
+ attributes: {
259
+ secure: process.env.NODE_ENV === "production"
260
+ }
261
+ },
262
+ getUserAttributes: (attributes) => {
263
+ return {
264
+ email: attributes.email
265
+ };
266
+ }
267
+ });
268
+ function cn(...inputs) {
269
+ return twMerge(clsx(inputs));
270
+ }
271
+ const buttonVariants = cva(
272
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-zinc-950 disabled:pointer-events-none disabled:opacity-50 dark:focus-visible:ring-zinc-300",
273
+ {
274
+ variants: {
275
+ variant: {
276
+ default: "bg-zinc-900 text-zinc-50 shadow hover:bg-zinc-900/90 dark:bg-zinc-50 dark:text-zinc-900 dark:hover:bg-zinc-50/90",
277
+ destructive: "bg-red-500 text-zinc-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-zinc-50 dark:hover:bg-red-900/90",
278
+ outline: "border border-zinc-200 bg-white shadow-sm hover:bg-zinc-100 hover:text-zinc-900 dark:border-zinc-800 dark:bg-zinc-950 dark:hover:bg-zinc-800 dark:hover:text-zinc-50",
279
+ secondary: "bg-zinc-100 text-zinc-900 shadow-sm hover:bg-zinc-100/80 dark:bg-zinc-800 dark:text-zinc-50 dark:hover:bg-zinc-800/80",
280
+ ghost: "hover:bg-zinc-100 hover:text-zinc-900 dark:hover:bg-zinc-800 dark:hover:text-zinc-50",
281
+ link: "text-zinc-900 underline-offset-4 hover:underline dark:text-zinc-50"
282
+ },
283
+ size: {
284
+ default: "h-9 px-4 py-2",
285
+ sm: "h-8 rounded-md px-3 text-xs",
286
+ lg: "h-10 rounded-md px-8",
287
+ icon: "h-9 w-9"
288
+ }
289
+ },
290
+ defaultVariants: {
291
+ variant: "default",
292
+ size: "default"
293
+ }
294
+ }
295
+ );
296
+ const Button = React.forwardRef(
297
+ ({ className, variant, size, ...props }, ref) => {
298
+ return /* @__PURE__ */ jsx(
299
+ "button",
300
+ {
301
+ className: cn(buttonVariants({ variant, size, className })),
302
+ ref,
303
+ ...props
304
+ }
305
+ );
306
+ }
307
+ );
308
+ Button.displayName = "Button";
309
+ const Input = React.forwardRef(
310
+ ({ className, type, ...props }, ref) => {
311
+ return /* @__PURE__ */ jsx(
312
+ "input",
313
+ {
314
+ type,
315
+ className: cn(
316
+ "flex h-9 w-full rounded-md border border-zinc-200 bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-zinc-950 placeholder:text-zinc-500 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-zinc-950 disabled:cursor-not-allowed disabled:opacity-50 dark:border-zinc-800 dark:file:text-zinc-50 dark:placeholder:text-zinc-400 dark:focus-visible:ring-zinc-300",
317
+ className
318
+ ),
319
+ ref,
320
+ ...props
321
+ }
322
+ );
323
+ }
324
+ );
325
+ Input.displayName = "Input";
326
+ const Label = React.forwardRef(
327
+ ({ className, ...props }, ref) => {
328
+ return /* @__PURE__ */ jsx(
329
+ "label",
330
+ {
331
+ ref,
332
+ className: cn(
333
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
334
+ className
335
+ ),
336
+ ...props
337
+ }
338
+ );
339
+ }
340
+ );
341
+ Label.displayName = "Label";
342
+ const Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
343
+ "div",
344
+ {
345
+ ref,
346
+ className: cn(
347
+ "rounded-xl border border-zinc-200 bg-white text-zinc-950 shadow dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-50",
348
+ className
349
+ ),
350
+ ...props
351
+ }
352
+ ));
353
+ Card.displayName = "Card";
354
+ const CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
355
+ "div",
356
+ {
357
+ ref,
358
+ className: cn("flex flex-col space-y-1.5 p-6", className),
359
+ ...props
360
+ }
361
+ ));
362
+ CardHeader.displayName = "CardHeader";
363
+ const CardTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
364
+ "h3",
365
+ {
366
+ ref,
367
+ className: cn("font-semibold leading-none tracking-tight", className),
368
+ ...props
369
+ }
370
+ ));
371
+ CardTitle.displayName = "CardTitle";
372
+ const CardDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
373
+ "p",
374
+ {
375
+ ref,
376
+ className: cn("text-sm text-zinc-500 dark:text-zinc-400", className),
377
+ ...props
378
+ }
379
+ ));
380
+ CardDescription.displayName = "CardDescription";
381
+ const CardContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
382
+ CardContent.displayName = "CardContent";
383
+ const CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
384
+ "div",
385
+ {
386
+ ref,
387
+ className: cn("flex items-center p-6 pt-0", className),
388
+ ...props
389
+ }
390
+ ));
391
+ CardFooter.displayName = "CardFooter";
392
+ async function action$2({
393
+ request
394
+ }) {
395
+ const formData = await request.formData();
396
+ const email = formData.get("email");
397
+ const password = formData.get("password");
398
+ if (!email || typeof email !== "string" || !email.includes("@")) {
399
+ return data({
400
+ error: "Invalid email"
401
+ }, {
402
+ status: 400
403
+ });
404
+ }
405
+ if (!password || typeof password !== "string" || password.length < 6) {
406
+ return data({
407
+ error: "Password must be at least 6 characters"
408
+ }, {
409
+ status: 400
410
+ });
411
+ }
412
+ const existingUser = await db.query.user.findFirst({
413
+ where: eq(user.email, email)
414
+ });
415
+ if (!existingUser) {
416
+ return data({
417
+ error: "Invalid email or password"
418
+ }, {
419
+ status: 400
420
+ });
421
+ }
422
+ const validPassword = await verify(existingUser.hashedPassword, password);
423
+ if (!validPassword) {
424
+ return data({
425
+ error: "Invalid email or password"
426
+ }, {
427
+ status: 400
428
+ });
429
+ }
430
+ const session2 = await lucia.createSession(existingUser.id, {});
431
+ const sessionCookie = lucia.createSessionCookie(session2.id);
432
+ return redirect("/uptime", {
433
+ headers: {
434
+ "Set-Cookie": sessionCookie.serialize()
435
+ }
436
+ });
437
+ }
438
+ function meta$2({}) {
439
+ return [{
440
+ title: "Login - Always Uptime"
441
+ }, {
442
+ name: "description",
443
+ content: "Login to your account"
444
+ }];
445
+ }
446
+ const login = UNSAFE_withComponentProps(function Login({
447
+ actionData
448
+ }) {
449
+ return /* @__PURE__ */ jsx("div", {
450
+ className: "min-h-screen flex items-center justify-center bg-zinc-50 dark:bg-zinc-900 px-4",
451
+ children: /* @__PURE__ */ jsxs(Card, {
452
+ className: "w-full max-w-md",
453
+ children: [/* @__PURE__ */ jsxs(CardHeader, {
454
+ children: [/* @__PURE__ */ jsx(CardTitle, {
455
+ className: "text-2xl",
456
+ children: "Welcome back"
457
+ }), /* @__PURE__ */ jsx(CardDescription, {
458
+ children: "Enter your credentials to access your account"
459
+ })]
460
+ }), /* @__PURE__ */ jsxs(CardContent, {
461
+ children: [/* @__PURE__ */ jsxs("form", {
462
+ method: "post",
463
+ className: "space-y-4",
464
+ children: [/* @__PURE__ */ jsxs("div", {
465
+ className: "space-y-2",
466
+ children: [/* @__PURE__ */ jsx(Label, {
467
+ htmlFor: "email",
468
+ children: "Email"
469
+ }), /* @__PURE__ */ jsx(Input, {
470
+ id: "email",
471
+ name: "email",
472
+ type: "email",
473
+ placeholder: "you@example.com",
474
+ required: true
475
+ })]
476
+ }), /* @__PURE__ */ jsxs("div", {
477
+ className: "space-y-2",
478
+ children: [/* @__PURE__ */ jsx(Label, {
479
+ htmlFor: "password",
480
+ children: "Password"
481
+ }), /* @__PURE__ */ jsx(Input, {
482
+ id: "password",
483
+ name: "password",
484
+ type: "password",
485
+ required: true,
486
+ minLength: 6
487
+ })]
488
+ }), actionData?.error && /* @__PURE__ */ jsx("p", {
489
+ className: "text-sm text-red-500 dark:text-red-400",
490
+ children: actionData.error
491
+ }), /* @__PURE__ */ jsx(Button, {
492
+ type: "submit",
493
+ className: "w-full",
494
+ children: "Sign in"
495
+ })]
496
+ }), /* @__PURE__ */ jsxs("div", {
497
+ className: "mt-4 text-center text-sm text-zinc-600 dark:text-zinc-400",
498
+ children: ["Don't have an account?", " ", /* @__PURE__ */ jsx(Link, {
499
+ to: "/register",
500
+ className: "text-zinc-900 dark:text-zinc-50 underline",
501
+ children: "Sign up"
502
+ })]
503
+ })]
504
+ })]
505
+ })
506
+ });
507
+ });
508
+ const route2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
509
+ __proto__: null,
510
+ action: action$2,
511
+ default: login,
512
+ meta: meta$2
513
+ }, Symbol.toStringTag, { value: "Module" }));
514
+ async function action$1({
515
+ request
516
+ }) {
517
+ const formData = await request.formData();
518
+ const email = formData.get("email");
519
+ const password = formData.get("password");
520
+ if (!email || typeof email !== "string" || !email.includes("@")) {
521
+ return data({
522
+ error: "Invalid email"
523
+ }, {
524
+ status: 400
525
+ });
526
+ }
527
+ if (!password || typeof password !== "string" || password.length < 6) {
528
+ return data({
529
+ error: "Password must be at least 6 characters"
530
+ }, {
531
+ status: 400
532
+ });
533
+ }
534
+ const existingUser = await db.query.user.findFirst({
535
+ where: eq(user.email, email)
536
+ });
537
+ if (existingUser) {
538
+ return data({
539
+ error: "Email already in use"
540
+ }, {
541
+ status: 400
542
+ });
543
+ }
544
+ const userId = generateId(15);
545
+ const hashedPassword = await hash(password);
546
+ await db.insert(user).values({
547
+ id: userId,
548
+ email,
549
+ hashedPassword,
550
+ createdAt: Date.now()
551
+ });
552
+ const session2 = await lucia.createSession(userId, {});
553
+ const sessionCookie = lucia.createSessionCookie(session2.id);
554
+ return redirect("/uptime", {
555
+ headers: {
556
+ "Set-Cookie": sessionCookie.serialize()
557
+ }
558
+ });
559
+ }
560
+ function meta$1({}) {
561
+ return [{
562
+ title: "Register - Always Uptime"
563
+ }, {
564
+ name: "description",
565
+ content: "Create a new account"
566
+ }];
567
+ }
568
+ const register = UNSAFE_withComponentProps(function Register({
569
+ actionData
570
+ }) {
571
+ return /* @__PURE__ */ jsx("div", {
572
+ className: "min-h-screen flex items-center justify-center bg-zinc-50 dark:bg-zinc-900 px-4",
573
+ children: /* @__PURE__ */ jsxs(Card, {
574
+ className: "w-full max-w-md",
575
+ children: [/* @__PURE__ */ jsxs(CardHeader, {
576
+ children: [/* @__PURE__ */ jsx(CardTitle, {
577
+ className: "text-2xl",
578
+ children: "Create an account"
579
+ }), /* @__PURE__ */ jsx(CardDescription, {
580
+ children: "Enter your details to get started"
581
+ })]
582
+ }), /* @__PURE__ */ jsxs(CardContent, {
583
+ children: [/* @__PURE__ */ jsxs("form", {
584
+ method: "post",
585
+ className: "space-y-4",
586
+ children: [/* @__PURE__ */ jsxs("div", {
587
+ className: "space-y-2",
588
+ children: [/* @__PURE__ */ jsx(Label, {
589
+ htmlFor: "email",
590
+ children: "Email"
591
+ }), /* @__PURE__ */ jsx(Input, {
592
+ id: "email",
593
+ name: "email",
594
+ type: "email",
595
+ placeholder: "you@example.com",
596
+ required: true
597
+ })]
598
+ }), /* @__PURE__ */ jsxs("div", {
599
+ className: "space-y-2",
600
+ children: [/* @__PURE__ */ jsx(Label, {
601
+ htmlFor: "password",
602
+ children: "Password"
603
+ }), /* @__PURE__ */ jsx(Input, {
604
+ id: "password",
605
+ name: "password",
606
+ type: "password",
607
+ required: true,
608
+ minLength: 6
609
+ }), /* @__PURE__ */ jsx("p", {
610
+ className: "text-xs text-zinc-500 dark:text-zinc-400",
611
+ children: "Must be at least 6 characters"
612
+ })]
613
+ }), actionData?.error && /* @__PURE__ */ jsx("p", {
614
+ className: "text-sm text-red-500 dark:text-red-400",
615
+ children: actionData.error
616
+ }), /* @__PURE__ */ jsx(Button, {
617
+ type: "submit",
618
+ className: "w-full",
619
+ children: "Create account"
620
+ })]
621
+ }), /* @__PURE__ */ jsxs("div", {
622
+ className: "mt-4 text-center text-sm text-zinc-600 dark:text-zinc-400",
623
+ children: ["Already have an account?", " ", /* @__PURE__ */ jsx(Link, {
624
+ to: "/login",
625
+ className: "text-zinc-900 dark:text-zinc-50 underline",
626
+ children: "Sign in"
627
+ })]
628
+ })]
629
+ })]
630
+ })
631
+ });
632
+ });
633
+ const route3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
634
+ __proto__: null,
635
+ action: action$1,
636
+ default: register,
637
+ meta: meta$1
638
+ }, Symbol.toStringTag, { value: "Module" }));
639
+ async function action({
640
+ request
641
+ }) {
642
+ const cookie = request.headers.get("Cookie");
643
+ const sessionId = lucia.readSessionCookie(cookie ?? "");
644
+ if (!sessionId) {
645
+ return redirect("/login");
646
+ }
647
+ await lucia.invalidateSession(sessionId);
648
+ const sessionCookie = lucia.createBlankSessionCookie();
649
+ return redirect("/login", {
650
+ headers: {
651
+ "Set-Cookie": sessionCookie.serialize()
652
+ }
653
+ });
654
+ }
655
+ async function loader$1() {
656
+ return redirect("/uptime");
657
+ }
658
+ const route4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
659
+ __proto__: null,
660
+ action,
661
+ loader: loader$1
662
+ }, Symbol.toStringTag, { value: "Module" }));
663
+ const uptimeData = /* @__PURE__ */ new Map();
664
+ async function checkUptime(url) {
665
+ const startTime = Date.now();
666
+ try {
667
+ const response = await fetch(url, {
668
+ method: "GET",
669
+ signal: AbortSignal.timeout(1e4)
670
+ // 10s timeout
671
+ });
672
+ const responseTime = Date.now() - startTime;
673
+ return {
674
+ url,
675
+ status: response.ok ? "up" : "down",
676
+ statusCode: response.status,
677
+ responseTime,
678
+ timestamp: Date.now()
679
+ };
680
+ } catch (error) {
681
+ const responseTime = Date.now() - startTime;
682
+ return {
683
+ url,
684
+ status: "down",
685
+ responseTime,
686
+ timestamp: Date.now(),
687
+ error: error instanceof Error ? error.message : "Unknown error"
688
+ };
689
+ }
690
+ }
691
+ function saveUptimeCheck(check) {
692
+ const stats = uptimeData.get(check.url) || {
693
+ url: check.url,
694
+ totalChecks: 0,
695
+ successfulChecks: 0,
696
+ failedChecks: 0,
697
+ uptime: 0,
698
+ averageResponseTime: 0,
699
+ checks: []
700
+ };
701
+ stats.totalChecks++;
702
+ if (check.status === "up") {
703
+ stats.successfulChecks++;
704
+ } else {
705
+ stats.failedChecks++;
706
+ }
707
+ stats.uptime = stats.successfulChecks / stats.totalChecks * 100;
708
+ const totalResponseTime = stats.checks.reduce((sum, c) => sum + (c.responseTime || 0), 0);
709
+ stats.averageResponseTime = (totalResponseTime + (check.responseTime || 0)) / (stats.checks.length + 1);
710
+ stats.lastCheck = check;
711
+ stats.checks = [...stats.checks, check].slice(-100);
712
+ uptimeData.set(check.url, stats);
713
+ }
714
+ function getAllUptimeStats() {
715
+ return Array.from(uptimeData.values());
716
+ }
717
+ async function loader({
718
+ request
719
+ }) {
720
+ const cookie = request.headers.get("Cookie");
721
+ const sessionId = lucia.readSessionCookie(cookie ?? "");
722
+ if (!sessionId) {
723
+ return redirect("/login");
724
+ }
725
+ const {
726
+ session: session2,
727
+ user: user2
728
+ } = await lucia.validateSession(sessionId);
729
+ if (!session2) {
730
+ return redirect("/login");
731
+ }
732
+ const {
733
+ startCronJob
734
+ } = await import("./cron.server-BkSBgtlB.js");
735
+ startCronJob();
736
+ const stats = getAllUptimeStats();
737
+ return {
738
+ stats,
739
+ user: user2
740
+ };
741
+ }
742
+ function meta({}) {
743
+ return [{
744
+ title: "Always Uptime - Monitor Your Services"
745
+ }, {
746
+ name: "description",
747
+ content: "Real-time uptime monitoring dashboard"
748
+ }];
749
+ }
750
+ const uptime = UNSAFE_withComponentProps(function Uptime({
751
+ loaderData
752
+ }) {
753
+ const {
754
+ stats,
755
+ user: user2
756
+ } = loaderData;
757
+ const revalidator = useRevalidator();
758
+ useEffect(() => {
759
+ const interval = setInterval(() => {
760
+ revalidator.revalidate();
761
+ }, 3e4);
762
+ return () => clearInterval(interval);
763
+ }, [revalidator]);
764
+ return /* @__PURE__ */ jsx("div", {
765
+ className: "min-h-screen bg-gray-50 dark:bg-gray-900",
766
+ children: /* @__PURE__ */ jsxs("div", {
767
+ className: "container mx-auto px-4 py-8",
768
+ children: [/* @__PURE__ */ jsxs("header", {
769
+ className: "mb-8 flex items-center justify-between",
770
+ children: [/* @__PURE__ */ jsxs("div", {
771
+ children: [/* @__PURE__ */ jsx("h1", {
772
+ className: "text-4xl font-bold text-gray-900 dark:text-white mb-2",
773
+ children: "Always Uptime"
774
+ }), /* @__PURE__ */ jsx("p", {
775
+ className: "text-gray-600 dark:text-gray-400",
776
+ children: "Monitoring your services every 30 seconds"
777
+ })]
778
+ }), /* @__PURE__ */ jsxs("div", {
779
+ className: "flex items-center gap-4",
780
+ children: [/* @__PURE__ */ jsx("span", {
781
+ className: "text-sm text-gray-600 dark:text-gray-400",
782
+ children: user2.email
783
+ }), /* @__PURE__ */ jsx(Form, {
784
+ method: "post",
785
+ action: "/logout",
786
+ children: /* @__PURE__ */ jsx(Button, {
787
+ variant: "outline",
788
+ size: "sm",
789
+ type: "submit",
790
+ children: "Logout"
791
+ })
792
+ })]
793
+ })]
794
+ }), stats.length === 0 ? /* @__PURE__ */ jsx("div", {
795
+ className: "bg-white dark:bg-gray-800 rounded-lg shadow p-8 text-center",
796
+ children: /* @__PURE__ */ jsx("p", {
797
+ className: "text-gray-600 dark:text-gray-400",
798
+ children: "No uptime data available yet. Checks will appear here shortly..."
799
+ })
800
+ }) : /* @__PURE__ */ jsx("div", {
801
+ className: "space-y-6",
802
+ children: stats.map((stat) => /* @__PURE__ */ jsx("div", {
803
+ className: "bg-white dark:bg-gray-800 rounded-lg shadow-lg overflow-hidden",
804
+ children: /* @__PURE__ */ jsxs("div", {
805
+ className: "p-6",
806
+ children: [/* @__PURE__ */ jsxs("div", {
807
+ className: "flex items-center justify-between mb-4",
808
+ children: [/* @__PURE__ */ jsxs("div", {
809
+ className: "flex-1",
810
+ children: [/* @__PURE__ */ jsx("h2", {
811
+ className: "text-xl font-semibold text-gray-900 dark:text-white mb-1",
812
+ children: stat.url
813
+ }), /* @__PURE__ */ jsxs("div", {
814
+ className: "flex items-center gap-2",
815
+ children: [/* @__PURE__ */ jsx("span", {
816
+ className: `inline-flex items-center px-3 py-1 rounded-full text-sm font-medium ${stat.lastCheck?.status === "up" ? "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200" : "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"}`,
817
+ children: stat.lastCheck?.status === "up" ? "🟢 Online" : "🔴 Offline"
818
+ }), stat.lastCheck?.statusCode && /* @__PURE__ */ jsxs("span", {
819
+ className: "text-sm text-gray-500 dark:text-gray-400",
820
+ children: ["Status: ", stat.lastCheck.statusCode]
821
+ })]
822
+ })]
823
+ }), /* @__PURE__ */ jsxs("div", {
824
+ className: "text-right",
825
+ children: [/* @__PURE__ */ jsxs("div", {
826
+ className: "text-3xl font-bold text-gray-900 dark:text-white",
827
+ children: [stat.uptime.toFixed(2), "%"]
828
+ }), /* @__PURE__ */ jsx("div", {
829
+ className: "text-sm text-gray-500 dark:text-gray-400",
830
+ children: "Uptime"
831
+ })]
832
+ })]
833
+ }), /* @__PURE__ */ jsxs("div", {
834
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4 mb-6",
835
+ children: [/* @__PURE__ */ jsxs("div", {
836
+ className: "bg-gray-50 dark:bg-gray-700 rounded-lg p-4",
837
+ children: [/* @__PURE__ */ jsx("div", {
838
+ className: "text-sm text-gray-500 dark:text-gray-400 mb-1",
839
+ children: "Total Checks"
840
+ }), /* @__PURE__ */ jsx("div", {
841
+ className: "text-2xl font-semibold text-gray-900 dark:text-white",
842
+ children: stat.totalChecks
843
+ })]
844
+ }), /* @__PURE__ */ jsxs("div", {
845
+ className: "bg-gray-50 dark:bg-gray-700 rounded-lg p-4",
846
+ children: [/* @__PURE__ */ jsx("div", {
847
+ className: "text-sm text-gray-500 dark:text-gray-400 mb-1",
848
+ children: "Successful"
849
+ }), /* @__PURE__ */ jsx("div", {
850
+ className: "text-2xl font-semibold text-green-600 dark:text-green-400",
851
+ children: stat.successfulChecks
852
+ })]
853
+ }), /* @__PURE__ */ jsxs("div", {
854
+ className: "bg-gray-50 dark:bg-gray-700 rounded-lg p-4",
855
+ children: [/* @__PURE__ */ jsx("div", {
856
+ className: "text-sm text-gray-500 dark:text-gray-400 mb-1",
857
+ children: "Failed"
858
+ }), /* @__PURE__ */ jsx("div", {
859
+ className: "text-2xl font-semibold text-red-600 dark:text-red-400",
860
+ children: stat.failedChecks
861
+ })]
862
+ }), /* @__PURE__ */ jsxs("div", {
863
+ className: "bg-gray-50 dark:bg-gray-700 rounded-lg p-4",
864
+ children: [/* @__PURE__ */ jsx("div", {
865
+ className: "text-sm text-gray-500 dark:text-gray-400 mb-1",
866
+ children: "Avg Response"
867
+ }), /* @__PURE__ */ jsxs("div", {
868
+ className: "text-2xl font-semibold text-gray-900 dark:text-white",
869
+ children: [Math.round(stat.averageResponseTime), "ms"]
870
+ })]
871
+ })]
872
+ }), stat.lastCheck && /* @__PURE__ */ jsxs("div", {
873
+ className: "border-t border-gray-200 dark:border-gray-700 pt-4",
874
+ children: [/* @__PURE__ */ jsx("h3", {
875
+ className: "text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2",
876
+ children: "Last Check"
877
+ }), /* @__PURE__ */ jsxs("div", {
878
+ className: "text-sm text-gray-600 dark:text-gray-400",
879
+ children: [/* @__PURE__ */ jsxs("p", {
880
+ children: ["Time: ", new Date(stat.lastCheck.timestamp).toLocaleString()]
881
+ }), stat.lastCheck.responseTime && /* @__PURE__ */ jsxs("p", {
882
+ children: ["Response Time: ", stat.lastCheck.responseTime, "ms"]
883
+ }), stat.lastCheck.error && /* @__PURE__ */ jsxs("p", {
884
+ className: "text-red-600 dark:text-red-400",
885
+ children: ["Error: ", stat.lastCheck.error]
886
+ })]
887
+ })]
888
+ }), stat.checks.length > 0 && /* @__PURE__ */ jsxs("div", {
889
+ className: "border-t border-gray-200 dark:border-gray-700 pt-4 mt-4",
890
+ children: [/* @__PURE__ */ jsxs("h3", {
891
+ className: "text-sm font-semibold text-gray-700 dark:text-gray-300 mb-3",
892
+ children: ["Recent Checks (Last ", Math.min(stat.checks.length, 20), ")"]
893
+ }), /* @__PURE__ */ jsx("div", {
894
+ className: "flex gap-1 overflow-x-auto pb-2",
895
+ children: stat.checks.slice(-20).reverse().map((check, idx) => /* @__PURE__ */ jsx("div", {
896
+ className: `w-3 h-16 rounded ${check.status === "up" ? "bg-green-500" : "bg-red-500"}`,
897
+ title: `${new Date(check.timestamp).toLocaleString()} - ${check.status} (${check.responseTime}ms)`
898
+ }, idx))
899
+ })]
900
+ })]
901
+ })
902
+ }, stat.url))
903
+ }), /* @__PURE__ */ jsx("footer", {
904
+ className: "mt-8 text-center text-sm text-gray-500 dark:text-gray-400",
905
+ children: "Auto-refreshing every 30 seconds"
906
+ })]
907
+ })
908
+ });
909
+ });
910
+ const route5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
911
+ __proto__: null,
912
+ default: uptime,
913
+ loader,
914
+ meta
915
+ }, Symbol.toStringTag, { value: "Module" }));
916
+ const serverManifest = { "entry": { "module": "/assets/entry.client-BqCLKtvt.js", "imports": ["/assets/chunk-OIYGIGL5-O35CAIo3.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasErrorBoundary": true, "module": "/assets/root-C5Mnt1V9.js", "imports": ["/assets/chunk-OIYGIGL5-O35CAIo3.js"], "css": ["/assets/root-DePtEpHZ.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/home": { "id": "routes/home", "parentId": "root", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasErrorBoundary": false, "module": "/assets/home-CCZyLKHc.js", "imports": ["/assets/chunk-OIYGIGL5-O35CAIo3.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/login": { "id": "routes/login", "parentId": "root", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasErrorBoundary": false, "module": "/assets/login-CtRm5tfE.js", "imports": ["/assets/chunk-OIYGIGL5-O35CAIo3.js", "/assets/button-1YLPPCtt.js", "/assets/card-nZ_hrmF6.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/register": { "id": "routes/register", "parentId": "root", "path": "register", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasErrorBoundary": false, "module": "/assets/register-BLpbiVIx.js", "imports": ["/assets/chunk-OIYGIGL5-O35CAIo3.js", "/assets/button-1YLPPCtt.js", "/assets/card-nZ_hrmF6.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/logout": { "id": "routes/logout", "parentId": "root", "path": "logout", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasErrorBoundary": false, "module": "/assets/logout-l0sNRNKZ.js", "imports": [], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/uptime": { "id": "routes/uptime", "parentId": "root", "path": "uptime", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasErrorBoundary": false, "module": "/assets/uptime-BYui58Ub.js", "imports": ["/assets/chunk-OIYGIGL5-O35CAIo3.js", "/assets/button-1YLPPCtt.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 } }, "url": "/assets/manifest-ceec8a43.js", "version": "ceec8a43", "sri": void 0 };
917
+ const assetsBuildDirectory = "build/client";
918
+ const basename = "/";
919
+ const future = { "v8_middleware": false, "unstable_optimizeDeps": false, "unstable_splitRouteModules": false, "unstable_subResourceIntegrity": false, "unstable_viteEnvironmentApi": false };
920
+ const ssr = true;
921
+ const isSpaMode = false;
922
+ const prerender = [];
923
+ const routeDiscovery = { "mode": "lazy", "manifestPath": "/__manifest" };
924
+ const publicPath = "/";
925
+ const entry = { module: entryServer };
926
+ const routes = {
927
+ "root": {
928
+ id: "root",
929
+ parentId: void 0,
930
+ path: "",
931
+ index: void 0,
932
+ caseSensitive: void 0,
933
+ module: route0
934
+ },
935
+ "routes/home": {
936
+ id: "routes/home",
937
+ parentId: "root",
938
+ path: void 0,
939
+ index: true,
940
+ caseSensitive: void 0,
941
+ module: route1
942
+ },
943
+ "routes/login": {
944
+ id: "routes/login",
945
+ parentId: "root",
946
+ path: "login",
947
+ index: void 0,
948
+ caseSensitive: void 0,
949
+ module: route2
950
+ },
951
+ "routes/register": {
952
+ id: "routes/register",
953
+ parentId: "root",
954
+ path: "register",
955
+ index: void 0,
956
+ caseSensitive: void 0,
957
+ module: route3
958
+ },
959
+ "routes/logout": {
960
+ id: "routes/logout",
961
+ parentId: "root",
962
+ path: "logout",
963
+ index: void 0,
964
+ caseSensitive: void 0,
965
+ module: route4
966
+ },
967
+ "routes/uptime": {
968
+ id: "routes/uptime",
969
+ parentId: "root",
970
+ path: "uptime",
971
+ index: void 0,
972
+ caseSensitive: void 0,
973
+ module: route5
974
+ }
975
+ };
976
+ export {
977
+ assetsBuildDirectory as a,
978
+ basename as b,
979
+ checkUptime as c,
980
+ ssr as d,
981
+ publicPath as e,
982
+ future as f,
983
+ entry as g,
984
+ routes as h,
985
+ isSpaMode as i,
986
+ serverManifest as j,
987
+ prerender as p,
988
+ routeDiscovery as r,
989
+ saveUptimeCheck as s
990
+ };
build/server/index.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { j, a, b, g, f, i, p, e, r, h, d } from "./assets/server-build-BAW0Iiqy.js";
2
+ import "react/jsx-runtime";
3
+ import "node:stream";
4
+ import "@react-router/node";
5
+ import "react-router";
6
+ import "isbot";
7
+ import "react-dom/server";
8
+ import "lucia";
9
+ import "@lucia-auth/adapter-drizzle";
10
+ import "drizzle-orm/libsql";
11
+ import "@libsql/client";
12
+ import "drizzle-orm/sqlite-core";
13
+ import "drizzle-orm";
14
+ import "@node-rs/argon2";
15
+ import "react";
16
+ import "class-variance-authority";
17
+ import "clsx";
18
+ import "tailwind-merge";
19
+ export {
20
+ j as assets,
21
+ a as assetsBuildDirectory,
22
+ b as basename,
23
+ g as entry,
24
+ f as future,
25
+ i as isSpaMode,
26
+ p as prerender,
27
+ e as publicPath,
28
+ r as routeDiscovery,
29
+ h as routes,
30
+ d as ssr
31
+ };