Googolplexic commited on
Commit
c79f5fa
·
1 Parent(s): 7766a85

certainly some ui

Browse files
keygenServer/client/app/globals.css CHANGED
@@ -1,26 +1,118 @@
1
  @import "tailwindcss";
2
 
3
  :root {
4
- --background: #ffffff;
5
- --foreground: #171717;
6
- }
7
-
8
- @theme inline {
9
- --color-background: var(--background);
10
- --color-foreground: var(--foreground);
11
- --font-sans: var(--font-geist-sans);
12
- --font-mono: var(--font-geist-mono);
 
 
 
13
  }
14
 
15
  @media (prefers-color-scheme: dark) {
16
  :root {
17
- --background: #0a0a0a;
18
- --foreground: #ededed;
 
 
 
 
 
 
 
19
  }
20
  }
21
 
22
  body {
23
  background: var(--background);
24
  color: var(--foreground);
25
- font-family: Arial, Helvetica, sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  @import "tailwindcss";
2
 
3
  :root {
4
+ --background: #e6e7ee;
5
+ --foreground: #1a202c;
6
+ --text-muted: #2d3748;
7
+ --text-button: #2d3748;
8
+ --text-button-hover: #1a202c;
9
+ --shadow-light: #ffffff;
10
+ --shadow-dark: #a3b1c6;
11
+ --primary: #667eea;
12
+ --primary-dark: #5a67d8;
13
+ --success: #48bb78;
14
+ --error: #f56565;
15
+ --warning: #ed8936;
16
  }
17
 
18
  @media (prefers-color-scheme: dark) {
19
  :root {
20
+ --background: #2d3748;
21
+ --foreground: #e2e8f0;
22
+ --text-muted: #a0aec0;
23
+ --text-button: #e2e8f0;
24
+ --text-button-hover: #f7fafc;
25
+ --shadow-light: #374151;
26
+ --shadow-dark: #1a202c;
27
+ --primary: #667eea;
28
+ --primary-dark: #5a67d8;
29
  }
30
  }
31
 
32
  body {
33
  background: var(--background);
34
  color: var(--foreground);
35
+ font-family: var(--font-vollkorn), serif;
36
+ min-height: 100vh;
37
+ }
38
+
39
+ /* Neumorphic utility classes */
40
+ .neuro-container {
41
+ background: var(--background);
42
+ box-shadow:
43
+ 20px 20px 60px var(--shadow-dark),
44
+ -20px -20px 60px var(--shadow-light);
45
+ border-radius: 20px;
46
+ }
47
+
48
+ .neuro-inset {
49
+ background: var(--background);
50
+ box-shadow:
51
+ inset 8px 8px 16px var(--shadow-dark),
52
+ inset -8px -8px 16px var(--shadow-light);
53
+ border-radius: 12px;
54
+ }
55
+
56
+ .neuro-button {
57
+ background: var(--background);
58
+ color: var(--text-button);
59
+ box-shadow:
60
+ 8px 8px 16px var(--shadow-dark),
61
+ -8px -8px 16px var(--shadow-light);
62
+ border-radius: 12px;
63
+ transition: all 0.2s ease;
64
+ border: none;
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ }
69
+
70
+ .neuro-button:hover {
71
+ color: var(--text-button-hover);
72
+ transform: translateY(-1px);
73
+ box-shadow:
74
+ 10px 10px 20px var(--shadow-dark),
75
+ -10px -10px 20px var(--shadow-light);
76
+ }
77
+
78
+ .neuro-button:active {
79
+ transform: translateY(1px);
80
+ box-shadow:
81
+ inset 4px 4px 8px var(--shadow-dark),
82
+ inset -4px -4px 8px var(--shadow-light);
83
  }
84
+
85
+ .neuro-input {
86
+ background: var(--background);
87
+ box-shadow:
88
+ inset 6px 6px 12px var(--shadow-dark),
89
+ inset -6px -6px 12px var(--shadow-light);
90
+ border-radius: 8px;
91
+ border: none;
92
+ outline: none;
93
+ }
94
+
95
+ .neuro-card {
96
+ background: var(--background);
97
+ box-shadow:
98
+ 15px 15px 30px var(--shadow-dark),
99
+ -15px -15px 30px var(--shadow-light);
100
+ border-radius: 16px;
101
+ }
102
+
103
+ /* Text color utilities */
104
+ .text-primary {
105
+ color: var(--foreground);
106
+ }
107
+
108
+ .text-secondary {
109
+ color: var(--text-muted);
110
+ }
111
+
112
+ .text-button {
113
+ color: var(--text-button);
114
+ }
115
+
116
+ .text-button:hover {
117
+ color: var(--text-button-hover);
118
+ }
keygenServer/client/app/layout.tsx CHANGED
@@ -1,20 +1,16 @@
1
  import type { Metadata } from "next";
2
- import { Geist, Geist_Mono } from "next/font/google";
3
  import "./globals.css";
4
 
5
- const geistSans = Geist({
6
- variable: "--font-geist-sans",
7
- subsets: ["latin"],
8
- });
9
-
10
- const geistMono = Geist_Mono({
11
- variable: "--font-geist-mono",
12
  subsets: ["latin"],
 
13
  });
14
 
15
  export const metadata: Metadata = {
16
- title: "Create Next App",
17
- description: "Generated by create next app",
18
  };
19
 
20
  export default function RootLayout({
@@ -25,7 +21,7 @@ export default function RootLayout({
25
  return (
26
  <html lang="en">
27
  <body
28
- className={`${geistSans.variable} ${geistMono.variable} antialiased`}
29
  >
30
  {children}
31
  </body>
 
1
  import type { Metadata } from "next";
2
+ import { Vollkorn } from "next/font/google";
3
  import "./globals.css";
4
 
5
+ const vollkorn = Vollkorn({
6
+ variable: "--font-vollkorn",
 
 
 
 
 
7
  subsets: ["latin"],
8
+ weight: ["400", "500", "600", "700"],
9
  });
10
 
11
  export const metadata: Metadata = {
12
+ title: "API Key Generator",
13
+ description: "Generate and manage your API keys",
14
  };
15
 
16
  export default function RootLayout({
 
21
  return (
22
  <html lang="en">
23
  <body
24
+ className={`${vollkorn.variable} antialiased font-vollkorn`}
25
  >
26
  {children}
27
  </body>
keygenServer/client/app/main/page.tsx CHANGED
@@ -10,7 +10,6 @@ export default function MainPage() {
10
  const [apiKey, setApiKey] = useState('');
11
  const [error, setError] = useState('');
12
  const router = useRouter();
13
-
14
  useEffect(() => {
15
  const unsub = auth.onAuthStateChanged((user) => {
16
  if (!user) {
@@ -22,7 +21,7 @@ export default function MainPage() {
22
  }
23
  });
24
  return () => unsub();
25
- }, []);
26
 
27
  const generateApiKey = async () => {
28
  try {
@@ -47,40 +46,141 @@ export default function MainPage() {
47
  }
48
  };
49
 
50
- if (loading) return <p>Loading...</p>;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
 
52
- return (
53
- <main className="p-4">
54
- <h1 className="text-xl mb-4">Welcome, {userDisplayName}!</h1>
55
-
56
- <div className="space-y-4">
57
- <button
58
- onClick={generateApiKey}
59
- className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
60
- >
61
- Generate API Key
62
- </button>
 
63
 
64
- {apiKey && (
65
- <div className="mt-4 p-4 bg-gray-100 rounded">
66
- <p className="font-semibold">Your API Key:</p>
67
- <code className="block mt-2 p-2 bg-white rounded border">{apiKey}</code>
68
- </div>
69
- )}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
 
71
- {error && (
72
- <div className="mt-4 p-4 bg-red-100 text-red-700 rounded">
73
- {error}
 
 
 
 
 
 
 
 
74
  </div>
75
- )}
76
 
77
- <button
78
- onClick={() => auth.signOut().then(() => router.push('/'))}
79
- className="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded"
80
- >
81
- Logout
82
- </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  </div>
84
- </main>
85
  );
86
  }
 
10
  const [apiKey, setApiKey] = useState('');
11
  const [error, setError] = useState('');
12
  const router = useRouter();
 
13
  useEffect(() => {
14
  const unsub = auth.onAuthStateChanged((user) => {
15
  if (!user) {
 
21
  }
22
  });
23
  return () => unsub();
24
+ }, [router]);
25
 
26
  const generateApiKey = async () => {
27
  try {
 
46
  }
47
  };
48
 
49
+ const copyToClipboard = async () => {
50
+ try {
51
+ await navigator.clipboard.writeText(apiKey);
52
+ // You could add a toast notification here
53
+ } catch (err) {
54
+ console.error('Failed to copy to clipboard:', err);
55
+ }
56
+ };
57
+ if (loading) {
58
+ return (
59
+ <div className="min-h-screen flex items-center justify-center">
60
+ <div className="neuro-container p-4 md:p-8">
61
+ <div className="flex items-center space-x-3">
62
+ <div className="animate-spin rounded-full h-6 w-6 md:h-8 md:w-8 border-b-2 border-gray-600"></div>
63
+ <span className="text-base md:text-lg text-secondary">Loading...</span>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ );
68
+ } return (
69
+ <div className="min-h-screen p-3 md:p-6 flex justify-center items-center">
70
+ <div className="w-full max-w-4xl py-4 md:py-8">
71
+ {/* Header */}
72
+ <div className="neuro-container p-4 md:p-8 mb-6 md:mb-8">
73
+ <div className="flex justify-between items-center gap-4">
74
+ <div>
75
+ <h1 className="text-xl md:text-3xl font-bold text-primary mb-2">
76
+ Welcome back, {userDisplayName}!
77
+ </h1>
78
+ <p className="text-sm md:text-base text-secondary">
79
+ Generate your MCP API key for monitoring external APIs
80
+ </p>
81
+ </div>
82
+ <button
83
+ onClick={() => auth.signOut().then(() => router.push('/'))}
84
+ className="neuro-button px-3 py-2 md:px-6 md:py-3 text-sm md:text-base text-button font-medium"
85
+ >
86
+ Sign Out
87
+ </button>
88
+ </div>
89
+ </div>
90
+
91
+ {/* Main Content */}
92
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4 md:gap-8">
93
+ {/* API Key Generation */} <div className="neuro-card p-4 md:p-8">
94
+ <h2 className="text-lg md:text-2xl font-semibold text-primary mb-4 md:mb-6">
95
+ Generate MCP API Key
96
+ </h2>
97
 
98
+ <div className="space-y-6">
99
+ <button
100
+ onClick={generateApiKey}
101
+ className="neuro-button w-full py-3 px-4 md:py-4 md:px-6 text-base md:text-lg font-semibold text-button"
102
+ >
103
+ <span className="flex items-center justify-center space-x-2">
104
+ <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
105
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v-2L2.257 8.257a6 6 0 017.743-7.743L15 7z" />
106
+ </svg>
107
+ <span>Generate New MCP API Key</span>
108
+ </span>
109
+ </button>
110
 
111
+ {apiKey && (<div className="neuro-inset p-4 md:p-6">
112
+ <div className="flex justify-between items-center mb-3">
113
+ <h3 className="text-sm md:text-base font-semibold text-primary">Your MCP API Key</h3><button
114
+ onClick={copyToClipboard}
115
+ className="neuro-button px-3 py-2 text-sm text-button"
116
+ title="Copy to clipboard"
117
+ >
118
+ <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
119
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
120
+ </svg>
121
+ </button>
122
+ </div>
123
+ <div className="neuro-input p-4">
124
+ <code className="text-sm text-primary font-mono break-all">
125
+ {apiKey}
126
+ </code>
127
+ </div> <p className="text-xs text-secondary mt-2">
128
+ Keep this MCP API key secure - use it for monitoring external APIs
129
+ </p>
130
+ </div>
131
+ )}
132
 
133
+ {error && (
134
+ <div className="neuro-inset p-4 border-l-4 border-red-400">
135
+ <div className="flex items-center">
136
+ <svg className="w-5 h-5 text-red-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
137
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
138
+ </svg>
139
+ <span className="text-red-700 font-medium">{error}</span>
140
+ </div>
141
+ </div>
142
+ )}
143
+ </div>
144
  </div>
 
145
 
146
+ {/* User Info & Instructions */}
147
+ <div className="space-y-4 md:space-y-8">
148
+ {/* User Profile */} <div className="neuro-card p-4 md:p-8">
149
+ <h2 className="text-lg md:text-2xl font-semibold text-primary mb-4 md:mb-6">
150
+ Account Information
151
+ </h2>
152
+ <div className="space-y-4">
153
+ <div className="neuro-inset p-4"> <label className="text-sm font-medium text-secondary">Email</label>
154
+ <p className="text-primary font-medium">{userEmail}</p>
155
+ </div>
156
+ <div className="neuro-inset p-4"> <label className="text-sm font-medium text-secondary">Display Name</label>
157
+ <p className="text-primary font-medium">{userDisplayName}</p>
158
+ </div>
159
+ </div>
160
+ </div>
161
+
162
+ {/* Usage Instructions */} <div className="neuro-card p-4 md:p-8">
163
+ <h2 className="text-lg md:text-2xl font-semibold text-primary mb-4 md:mb-6">
164
+ How to Use Your MCP API Key
165
+ </h2>
166
+ <div className="space-y-4 text-sm md:text-base text-secondary">
167
+ <div className="flex items-start space-x-3">
168
+ <span className="flex-shrink-0 w-6 h-6 bg-blue-500 text-white rounded-full flex items-center justify-center text-sm font-semibold">1</span>
169
+ <p>Use this key with the MCP API monitoring system to track external APIs</p>
170
+ </div>
171
+ <div className="flex items-start space-x-3">
172
+ <span className="flex-shrink-0 w-6 h-6 bg-blue-500 text-white rounded-full flex items-center justify-center text-sm font-semibold">2</span>
173
+ <p>Set up API monitoring rules for automated external API calls</p>
174
+ </div>
175
+ <div className="flex items-start space-x-3">
176
+ <span className="flex-shrink-0 w-6 h-6 bg-blue-500 text-white rounded-full flex items-center justify-center text-sm font-semibold">3</span>
177
+ <p>Monitor API responses and receive alerts when external services change</p>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ </div>
183
  </div>
184
+ </div>
185
  );
186
  }
keygenServer/client/app/page.tsx CHANGED
@@ -16,13 +16,33 @@ export default function LoginPage() {
16
  }
17
  };
18
 
19
- return (
20
- <main className="p-4">
21
- <h1 className="text-xl mb-4">Sign In</h1>
22
- <button onClick={signInWithGoogle} className="bg-blue-500 text-white px-4 py-2 rounded">
23
- Sign in with Google
24
- </button>
25
- </main>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  );
27
  }
28
 
 
16
  }
17
  };
18
 
19
+ return (<div className="min-h-screen flex items-center justify-center p-3 md:p-6">
20
+ <div className="neuro-container w-full max-w-md p-4 md:p-8"> <div className="text-center mb-6 md:mb-8">
21
+ <h1 className="text-2xl md:text-4xl font-bold mb-2 text-primary">
22
+ MCP API Monitor
23
+ </h1>
24
+ <p className="text-sm md:text-lg text-secondary">
25
+ Sign in to generate your MCP API key for monitoring external APIs
26
+ </p>
27
+ </div> <div className="space-y-4 md:space-y-6"> <button
28
+ onClick={signInWithGoogle}
29
+ className="neuro-button w-full py-3 px-4 md:py-4 md:px-6 text-base md:text-lg font-semibold text-button space-x-3"
30
+ >
31
+ <svg className="w-5 h-5 md:w-6 md:h-6" viewBox="0 0 24 24">
32
+ <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" />
33
+ <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" />
34
+ <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" />
35
+ <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" />
36
+ </svg>
37
+ <span>Continue with Google</span>
38
+ </button> <div className="neuro-inset p-4">
39
+ <p className="text-sm text-secondary text-center">
40
+ Generate your MCP API key to start monitoring external APIs
41
+ </p>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </div>
46
  );
47
  }
48