create-tinny-backend 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,437 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="light">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
6
+ <title>TinnyBackend · Server Running</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
8
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
9
+
10
+ <style>
11
+ :root {
12
+ --bg: #f4f6fa;
13
+ --text: #1e293b;
14
+ --text-secondary: #475569;
15
+ --text-muted: #64748b;
16
+ --border: #e2e8f0;
17
+ --card-bg: #ffffff;
18
+ --card-border: #e9eef3;
19
+ --input-focus: #2563eb;
20
+ --heading: #0f172a;
21
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.06);
22
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.08);
23
+ --shadow-lg: 0 12px 40px rgba(0,0,0,0.1);
24
+ --toggle-bg: #f1f5f9;
25
+ --badge-bg: #dbeafe;
26
+ --success: #48bb78;
27
+ --success-bg: #48bb7820;
28
+ --danger: #fc8181;
29
+ }
30
+
31
+ [data-theme="dark"] {
32
+ --bg: #1a1a1a;
33
+ --text: #d4d4d4;
34
+ --text-secondary: #a0a0a0;
35
+ --text-muted: #808080;
36
+ --border: #3a3a3a;
37
+ --card-bg: #2a2a2a;
38
+ --card-border: #3a3a3a;
39
+ --input-focus: #60a5fa;
40
+ --heading: #e0e0e0;
41
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.3);
42
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.4);
43
+ --shadow-lg: 0 12px 40px rgba(0,0,0,0.5);
44
+ --toggle-bg: #333333;
45
+ --badge-bg: #2a2a2a;
46
+ --success: #48bb78;
47
+ --success-bg: #48bb7820;
48
+ }
49
+
50
+ * {
51
+ margin: 0;
52
+ padding: 0;
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ body {
57
+ background: var(--bg);
58
+ font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
59
+ min-height: 100vh;
60
+ color: var(--text);
61
+ transition: background 0.3s ease, color 0.3s ease;
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ padding: 20px;
66
+ line-height: 1.6;
67
+ }
68
+
69
+ .container {
70
+ background: var(--card-bg);
71
+ border-radius: 1.2rem;
72
+ border: 1px solid var(--border);
73
+ box-shadow: var(--shadow-lg);
74
+ max-width: 520px;
75
+ width: 100%;
76
+ padding: 3rem 2.5rem;
77
+ transition: all 0.3s ease;
78
+ position: relative;
79
+ overflow: hidden;
80
+ animation: slideUp 0.5s ease-out;
81
+ }
82
+
83
+ @keyframes slideUp {
84
+ from {
85
+ opacity: 0;
86
+ transform: translateY(20px);
87
+ }
88
+ to {
89
+ opacity: 1;
90
+ transform: translateY(0);
91
+ }
92
+ }
93
+
94
+ .container::before {
95
+ content: '';
96
+ position: absolute;
97
+ top: 0;
98
+ left: 0;
99
+ right: 0;
100
+ height: 4px;
101
+ background: linear-gradient(90deg, var(--input-focus), var(--success));
102
+ }
103
+
104
+ /* Theme toggle */
105
+ .theme-toggle {
106
+ position: absolute;
107
+ top: 1.2rem;
108
+ right: 1.2rem;
109
+ background: var(--toggle-bg);
110
+ border: 1px solid var(--border);
111
+ color: var(--text);
112
+ width: 36px;
113
+ height: 36px;
114
+ border-radius: 0.6rem;
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ cursor: pointer;
119
+ font-size: 1rem;
120
+ transition: all 0.2s ease;
121
+ }
122
+
123
+ .theme-toggle:hover {
124
+ background: var(--input-focus);
125
+ color: white;
126
+ border-color: var(--input-focus);
127
+ }
128
+
129
+ /* Logo */
130
+ .logo {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 0.7rem;
134
+ margin-bottom: 1.5rem;
135
+ }
136
+
137
+ .logo i {
138
+ font-size: 2.2rem;
139
+ color: var(--input-focus);
140
+ background: var(--badge-bg);
141
+ padding: 10px;
142
+ border-radius: 12px;
143
+ }
144
+
145
+ .logo span {
146
+ font-weight: 700;
147
+ font-size: 1.5rem;
148
+ color: var(--heading);
149
+ }
150
+
151
+ .logo span strong {
152
+ color: var(--input-focus);
153
+ }
154
+
155
+ /* Status */
156
+ .status {
157
+ display: flex;
158
+ align-items: center;
159
+ gap: 0.6rem;
160
+ background: var(--success-bg);
161
+ color: var(--success);
162
+ padding: 0.5rem 1rem;
163
+ border-radius: 2rem;
164
+ font-weight: 600;
165
+ font-size: 0.85rem;
166
+ width: fit-content;
167
+ margin-bottom: 1rem;
168
+ border: 1px solid var(--success);
169
+ }
170
+
171
+ .status i {
172
+ font-size: 0.5rem;
173
+ animation: pulse 2s infinite;
174
+ }
175
+
176
+ @keyframes pulse {
177
+ 0%, 100% { opacity: 1; }
178
+ 50% { opacity: 0.4; }
179
+ }
180
+
181
+ /* Title */
182
+ h1 {
183
+ font-size: 1.8rem;
184
+ font-weight: 700;
185
+ color: var(--heading);
186
+ margin-bottom: 0.3rem;
187
+ letter-spacing: -0.3px;
188
+ }
189
+
190
+ .subtitle {
191
+ color: var(--text-secondary);
192
+ font-size: 1rem;
193
+ margin-bottom: 1.8rem;
194
+ border-left: 3px solid var(--input-focus);
195
+ padding-left: 1rem;
196
+ }
197
+
198
+ /* Divider */
199
+ .divider {
200
+ border: none;
201
+ border-top: 1px solid var(--border);
202
+ margin: 1.5rem 0;
203
+ }
204
+
205
+ /* Message */
206
+ .message {
207
+ background: var(--bg);
208
+ border-radius: 0.7rem;
209
+ padding: 1rem 1.2rem;
210
+ margin: 1.2rem 0;
211
+ border-left: 3px solid var(--success);
212
+ font-size: 0.95rem;
213
+ color: var(--text-secondary);
214
+ }
215
+
216
+ .message strong {
217
+ color: var(--text);
218
+ }
219
+
220
+ .message .check {
221
+ color: var(--success);
222
+ margin-right: 0.3rem;
223
+ }
224
+
225
+ /* Features mini grid */
226
+ .features {
227
+ display: grid;
228
+ grid-template-columns: 1fr 1fr;
229
+ gap: 0.6rem;
230
+ margin: 1.2rem 0;
231
+ }
232
+
233
+ .feature {
234
+ display: flex;
235
+ align-items: center;
236
+ gap: 0.5rem;
237
+ padding: 0.5rem 0.8rem;
238
+ background: var(--bg);
239
+ border-radius: 0.5rem;
240
+ font-size: 0.85rem;
241
+ color: var(--text-secondary);
242
+ border: 1px solid var(--border);
243
+ transition: all 0.2s ease;
244
+ }
245
+
246
+ .feature:hover {
247
+ border-color: var(--input-focus);
248
+ }
249
+
250
+ .feature i {
251
+ color: var(--success);
252
+ font-size: 0.7rem;
253
+ }
254
+
255
+ /* Footer links */
256
+ .footer-links {
257
+ display: flex;
258
+ justify-content: center;
259
+ gap: 1.5rem;
260
+ margin-top: 1.5rem;
261
+ padding-top: 1.2rem;
262
+ border-top: 1px solid var(--border);
263
+ }
264
+
265
+ .footer-links a {
266
+ color: var(--text-muted);
267
+ text-decoration: none;
268
+ font-size: 0.85rem;
269
+ transition: color 0.2s ease;
270
+ display: inline-flex;
271
+ align-items: center;
272
+ gap: 0.4rem;
273
+ }
274
+
275
+ .footer-links a:hover {
276
+ color: var(--input-focus);
277
+ }
278
+
279
+ .footer-links a i {
280
+ font-size: 0.9rem;
281
+ }
282
+
283
+ /* Version */
284
+ .version {
285
+ text-align: center;
286
+ margin-top: 1rem;
287
+ font-size: 0.75rem;
288
+ color: var(--text-muted);
289
+ }
290
+
291
+ .version strong {
292
+ color: var(--text-secondary);
293
+ }
294
+
295
+ /* Responsive */
296
+ @media (max-width: 480px) {
297
+ .container {
298
+ padding: 2rem 1.2rem;
299
+ }
300
+
301
+ h1 {
302
+ font-size: 1.4rem;
303
+ }
304
+
305
+ .logo i {
306
+ font-size: 1.8rem;
307
+ padding: 8px;
308
+ }
309
+
310
+ .logo span {
311
+ font-size: 1.2rem;
312
+ }
313
+
314
+ .features {
315
+ grid-template-columns: 1fr;
316
+ }
317
+
318
+ .footer-links {
319
+ flex-wrap: wrap;
320
+ gap: 0.8rem;
321
+ }
322
+ }
323
+ </style>
324
+ </head>
325
+ <body>
326
+
327
+ <div class="container">
328
+ <!-- Theme Toggle -->
329
+ <button class="theme-toggle" id="themeToggle" title="Toggle dark/light mode">
330
+ <i class="fas fa-moon"></i>
331
+ </button>
332
+
333
+ <!-- Logo -->
334
+ <div class="logo">
335
+ <i class="fas fa-cube"></i>
336
+ <span>tinny<strong>backend</strong></span>
337
+ </div>
338
+
339
+ <!-- Status -->
340
+ <div class="status">
341
+ <i class="fas fa-circle"></i>
342
+ Online · All Systems Operational
343
+ </div>
344
+
345
+ <!-- Title -->
346
+ <h1>Server is Running</h1>
347
+ <p class="subtitle">Everything is working perfectly. Your TinnyBackend server is ready.</p>
348
+
349
+ <hr class="divider">
350
+
351
+ <!-- Features -->
352
+ <div class="features">
353
+ <div class="feature">
354
+ <i class="fas fa-check-circle"></i> Routing Ready
355
+ </div>
356
+ <div class="feature">
357
+ <i class="fas fa-check-circle"></i> Middleware Active
358
+ </div>
359
+ <div class="feature">
360
+ <i class="fas fa-check-circle"></i> Static Files Serving
361
+ </div>
362
+ <div class="feature">
363
+ <i class="fas fa-check-circle"></i> Admin Monitor
364
+ </div>
365
+ </div>
366
+
367
+ <!-- Message -->
368
+ <div class="message">
369
+ <i class="fas fa-check-circle check"></i>
370
+ <strong>Success:</strong> Your TinnyBackend server is up and running. Start building your application now.
371
+ </div>
372
+
373
+ <!-- Footer Links -->
374
+ <div class="footer-links">
375
+
376
+ <a href="https://github.com/iaceene/tinny-backend" target="_blank">
377
+ <i class="fab fa-github"></i> GitHub
378
+ </a>
379
+ <a href="https://admin-tinny.hypercube1337.studio/docs" target="_blank">
380
+ <i class="fas fa-book"></i> Docs
381
+ </a>
382
+ </div>
383
+
384
+ <!-- Version -->
385
+ <div class="version">
386
+ <strong>TinnyBackend</strong> v2.0.0 · Ready to Serve
387
+ </div>
388
+ </div>
389
+
390
+ <script>
391
+ (function() {
392
+ // ===== THEME TOGGLE =====
393
+ const html = document.documentElement;
394
+ const themeToggle = document.getElementById('themeToggle');
395
+ const savedTheme = localStorage.getItem('tinnybackend-theme');
396
+
397
+ if (savedTheme) {
398
+ html.setAttribute('data-theme', savedTheme);
399
+ } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
400
+ html.setAttribute('data-theme', 'dark');
401
+ }
402
+
403
+ function updateThemeUI(theme) {
404
+ const icon = themeToggle.querySelector('i');
405
+ if (theme === 'dark') {
406
+ icon.classList.remove('fa-moon');
407
+ icon.classList.add('fa-sun');
408
+ } else {
409
+ icon.classList.remove('fa-sun');
410
+ icon.classList.add('fa-moon');
411
+ }
412
+ }
413
+
414
+ updateThemeUI(html.getAttribute('data-theme'));
415
+
416
+ themeToggle.addEventListener('click', () => {
417
+ const currentTheme = html.getAttribute('data-theme');
418
+ const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
419
+ html.setAttribute('data-theme', newTheme);
420
+ localStorage.setItem('tinnybackend-theme', newTheme);
421
+ updateThemeUI(newTheme);
422
+ });
423
+
424
+ if (window.matchMedia) {
425
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
426
+ if (!localStorage.getItem('tinnybackend-theme')) {
427
+ const newTheme = e.matches ? 'dark' : 'light';
428
+ html.setAttribute('data-theme', newTheme);
429
+ updateThemeUI(newTheme);
430
+ }
431
+ });
432
+ }
433
+ })();
434
+ </script>
435
+
436
+ </body>
437
+ </html>
Binary file
@@ -0,0 +1,109 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
9
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
10
+ min-height: 100vh;
11
+ display: flex;
12
+ justify-content: center;
13
+ align-items: center;
14
+ }
15
+
16
+ .container {
17
+ width: 100%;
18
+ max-width: 400px;
19
+ padding: 20px;
20
+ }
21
+
22
+ .login-box {
23
+ background: white;
24
+ padding: 40px;
25
+ border-radius: 8px;
26
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
27
+ }
28
+
29
+ h1 {
30
+ text-align: center;
31
+ color: #333;
32
+ margin-bottom: 30px;
33
+ font-size: 28px;
34
+ }
35
+
36
+ .form-group {
37
+ margin-bottom: 20px;
38
+ }
39
+
40
+ label {
41
+ display: block;
42
+ margin-bottom: 8px;
43
+ color: #555;
44
+ font-weight: 500;
45
+ }
46
+
47
+ input[type="text"],
48
+ input[type="password"] {
49
+ width: 100%;
50
+ padding: 12px;
51
+ border: 1px solid #ddd;
52
+ border-radius: 4px;
53
+ font-size: 14px;
54
+ transition: border-color 0.3s;
55
+ }
56
+
57
+ input[type="text"]:focus,
58
+ input[type="password"]:focus {
59
+ outline: none;
60
+ border-color: #667eea;
61
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
62
+ }
63
+
64
+ .btn {
65
+ width: 100%;
66
+ padding: 12px;
67
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
68
+ color: white;
69
+ border: none;
70
+ border-radius: 4px;
71
+ font-size: 16px;
72
+ font-weight: 600;
73
+ cursor: pointer;
74
+ transition: transform 0.2s, box-shadow 0.2s;
75
+ }
76
+
77
+ .btn:hover {
78
+ transform: translateY(-2px);
79
+ box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
80
+ }
81
+
82
+ .btn:active {
83
+ transform: translateY(0);
84
+ }
85
+
86
+ .message {
87
+ margin-top: 20px;
88
+ padding: 12px;
89
+ border-radius: 4px;
90
+ text-align: center;
91
+ font-size: 14px;
92
+ display: none;
93
+ }
94
+
95
+ .message:not(:empty) {
96
+ display: block;
97
+ }
98
+
99
+ .message.success {
100
+ background-color: #d4edda;
101
+ color: #155724;
102
+ border: 1px solid #c3e6cb;
103
+ }
104
+
105
+ .message.error {
106
+ background-color: #f8d7da;
107
+ color: #721c24;
108
+ border: 1px solid #f5c6cb;
109
+ }