canx-starter-admin 1.0.0 → 1.1.1

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.
package/src/css/input.css CHANGED
@@ -1,8 +1,584 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
1
+ /* Custom Font */
2
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap");
3
+
4
+ @import "tailwindcss";
5
+
6
+ /* =========================================
7
+ PREMIUM UI ANIMATIONS - CanxJS Starter
8
+ Inspired by Magic UI, Aceternity, React Bits
9
+ ========================================= */
10
+
11
+
12
+ :root {
13
+ --font-sans: "Inter", system-ui, sans-serif;
14
+
15
+ /* Premium Color Palette */
16
+ --color-primary: #10b981;
17
+ --color-primary-light: #34d399;
18
+ --color-secondary: #06b6d4;
19
+ --color-accent: #8b5cf6;
20
+
21
+ /* Glow Colors */
22
+ --glow-emerald: rgba(16, 185, 129, 0.4);
23
+ --glow-cyan: rgba(6, 182, 212, 0.4);
24
+ --glow-purple: rgba(139, 92, 246, 0.4);
25
+ }
4
26
 
5
- /* Custom admin styles */
6
27
  body {
7
- font-family: 'Inter', system-ui, -apple-system, sans-serif;
28
+ font-family: var(--font-sans);
29
+ }
30
+
31
+ /* =========================================
32
+ GRADIENT ANIMATIONS
33
+ ========================================= */
34
+
35
+ @keyframes gradient-shift {
36
+ 0%,
37
+ 100% {
38
+ background-position: 0% 50%;
39
+ }
40
+ 50% {
41
+ background-position: 100% 50%;
42
+ }
43
+ }
44
+
45
+ @keyframes gradient-x {
46
+ 0%,
47
+ 100% {
48
+ background-position: 0% 0%;
49
+ }
50
+ 50% {
51
+ background-position: 100% 0%;
52
+ }
53
+ }
54
+
55
+ .animate-gradient {
56
+ background-size: 200% 200%;
57
+ animation: gradient-shift 3s ease infinite;
58
+ }
59
+
60
+ .animate-gradient-x {
61
+ background-size: 200% 100%;
62
+ animation: gradient-x 3s ease infinite;
63
+ }
64
+
65
+ /* =========================================
66
+ SHIMMER EFFECT
67
+ ========================================= */
68
+
69
+ @keyframes shimmer {
70
+ 0% {
71
+ transform: translateX(-100%);
72
+ }
73
+ 100% {
74
+ transform: translateX(100%);
75
+ }
76
+ }
77
+
78
+ .shimmer-effect {
79
+ position: relative;
80
+ overflow: hidden;
81
+ }
82
+
83
+ .shimmer-effect::after {
84
+ content: "";
85
+ position: absolute;
86
+ top: 0;
87
+ left: 0;
88
+ width: 100%;
89
+ height: 100%;
90
+ background: linear-gradient(
91
+ 90deg,
92
+ transparent,
93
+ rgba(255, 255, 255, 0.2),
94
+ transparent
95
+ );
96
+ animation: shimmer 2s infinite;
97
+ }
98
+
99
+ /* =========================================
100
+ GLOW EFFECTS
101
+ ========================================= */
102
+
103
+ @keyframes glow-pulse {
104
+ 0%,
105
+ 100% {
106
+ box-shadow: 0 0 20px var(--glow-emerald), 0 0 40px transparent;
107
+ opacity: 1;
108
+ }
109
+ 50% {
110
+ box-shadow: 0 0 30px var(--glow-emerald), 0 0 60px var(--glow-cyan);
111
+ opacity: 0.8;
112
+ }
113
+ }
114
+
115
+ @keyframes border-glow {
116
+ 0%,
117
+ 100% {
118
+ border-color: rgba(16, 185, 129, 0.5);
119
+ box-shadow: 0 0 15px rgba(16, 185, 129, 0.3);
120
+ }
121
+ 33% {
122
+ border-color: rgba(6, 182, 212, 0.5);
123
+ box-shadow: 0 0 15px rgba(6, 182, 212, 0.3);
124
+ }
125
+ 66% {
126
+ border-color: rgba(139, 92, 246, 0.5);
127
+ box-shadow: 0 0 15px rgba(139, 92, 246, 0.3);
128
+ }
129
+ }
130
+
131
+ .animate-glow {
132
+ animation: glow-pulse 3s ease-in-out infinite;
133
+ }
134
+
135
+ .animate-border-glow {
136
+ animation: border-glow 4s ease-in-out infinite;
137
+ }
138
+
139
+ /* =========================================
140
+ AURORA BACKGROUND
141
+ ========================================= */
142
+
143
+ @keyframes aurora-1 {
144
+ 0%,
145
+ 100% {
146
+ transform: translate(0, 0) rotate(0deg) scale(1);
147
+ }
148
+ 33% {
149
+ transform: translate(30px, -50px) rotate(10deg) scale(1.1);
150
+ }
151
+ 66% {
152
+ transform: translate(-20px, 20px) rotate(-5deg) scale(0.9);
153
+ }
154
+ }
155
+
156
+ @keyframes aurora-2 {
157
+ 0%,
158
+ 100% {
159
+ transform: translate(0, 0) rotate(0deg) scale(1);
160
+ }
161
+ 33% {
162
+ transform: translate(-40px, 30px) rotate(-15deg) scale(1.2);
163
+ }
164
+ 66% {
165
+ transform: translate(50px, -20px) rotate(10deg) scale(0.85);
166
+ }
167
+ }
168
+
169
+ @keyframes aurora-3 {
170
+ 0%,
171
+ 100% {
172
+ transform: translate(0, 0) rotate(0deg) scale(1);
173
+ }
174
+ 33% {
175
+ transform: translate(20px, 40px) rotate(5deg) scale(0.95);
176
+ }
177
+ 66% {
178
+ transform: translate(-30px, -30px) rotate(-10deg) scale(1.15);
179
+ }
180
+ }
181
+
182
+ .aurora-blob-1 {
183
+ animation: aurora-1 15s ease-in-out infinite;
184
+ }
185
+
186
+ .aurora-blob-2 {
187
+ animation: aurora-2 18s ease-in-out infinite;
188
+ }
189
+
190
+ .aurora-blob-3 {
191
+ animation: aurora-3 20s ease-in-out infinite;
192
+ }
193
+
194
+ /* =========================================
195
+ ENTRANCE ANIMATIONS
196
+ ========================================= */
197
+
198
+ @keyframes fade-in-up {
199
+ 0% {
200
+ opacity: 0;
201
+ transform: translateY(30px);
202
+ }
203
+ 100% {
204
+ opacity: 1;
205
+ transform: translateY(0);
206
+ }
207
+ }
208
+
209
+ @keyframes fade-in-down {
210
+ 0% {
211
+ opacity: 0;
212
+ transform: translateY(-30px);
213
+ }
214
+ 100% {
215
+ opacity: 1;
216
+ transform: translateY(0);
217
+ }
218
+ }
219
+
220
+ @keyframes fade-in-scale {
221
+ 0% {
222
+ opacity: 0;
223
+ transform: scale(0.9);
224
+ }
225
+ 100% {
226
+ opacity: 1;
227
+ transform: scale(1);
228
+ }
229
+ }
230
+
231
+ @keyframes slide-in-left {
232
+ 0% {
233
+ opacity: 0;
234
+ transform: translateX(-50px);
235
+ }
236
+ 100% {
237
+ opacity: 1;
238
+ transform: translateX(0);
239
+ }
240
+ }
241
+
242
+ @keyframes slide-in-right {
243
+ 0% {
244
+ opacity: 0;
245
+ transform: translateX(50px);
246
+ }
247
+ 100% {
248
+ opacity: 1;
249
+ transform: translateX(0);
250
+ }
251
+ }
252
+
253
+ .animate-fade-in-up {
254
+ animation: fade-in-up 0.6s ease-out forwards;
255
+ }
256
+
257
+ .animate-fade-in-down {
258
+ animation: fade-in-down 0.6s ease-out forwards;
259
+ }
260
+
261
+ .animate-fade-in-scale {
262
+ animation: fade-in-scale 0.5s ease-out forwards;
263
+ }
264
+
265
+ .animate-slide-in-left {
266
+ animation: slide-in-left 0.6s ease-out forwards;
267
+ }
268
+
269
+ .animate-slide-in-right {
270
+ animation: slide-in-right 0.6s ease-out forwards;
271
+ }
272
+
273
+ /* Animation Delays */
274
+ .delay-100 {
275
+ animation-delay: 100ms;
276
+ }
277
+ .delay-200 {
278
+ animation-delay: 200ms;
279
+ }
280
+ .delay-300 {
281
+ animation-delay: 300ms;
282
+ }
283
+ .delay-400 {
284
+ animation-delay: 400ms;
285
+ }
286
+ .delay-500 {
287
+ animation-delay: 500ms;
288
+ }
289
+ .delay-600 {
290
+ animation-delay: 600ms;
291
+ }
292
+ .delay-700 {
293
+ animation-delay: 700ms;
294
+ }
295
+ .delay-800 {
296
+ animation-delay: 800ms;
297
+ }
298
+
299
+ /* =========================================
300
+ FLOATING ANIMATION
301
+ ========================================= */
302
+
303
+ @keyframes float {
304
+ 0%,
305
+ 100% {
306
+ transform: translateY(0px);
307
+ }
308
+ 50% {
309
+ transform: translateY(-20px);
310
+ }
311
+ }
312
+
313
+ @keyframes float-slow {
314
+ 0%,
315
+ 100% {
316
+ transform: translateY(0px) rotate(0deg);
317
+ }
318
+ 50% {
319
+ transform: translateY(-15px) rotate(3deg);
320
+ }
321
+ }
322
+
323
+ .animate-float {
324
+ animation: float 6s ease-in-out infinite;
325
+ }
326
+
327
+ .animate-float-slow {
328
+ animation: float-slow 8s ease-in-out infinite;
329
+ }
330
+
331
+ /* =========================================
332
+ SPOTLIGHT / CARD EFFECTS
333
+ ========================================= */
334
+
335
+ .spotlight-card {
336
+ position: relative;
337
+ background: rgba(15, 23, 42, 0.6);
338
+ backdrop-filter: blur(12px);
339
+ border: 1px solid rgba(255, 255, 255, 0.1);
340
+ border-radius: 1rem;
341
+ overflow: hidden;
342
+ transition: all 0.3s ease;
343
+ }
344
+
345
+ .spotlight-card::before {
346
+ content: "";
347
+ position: absolute;
348
+ top: 0;
349
+ left: 0;
350
+ right: 0;
351
+ bottom: 0;
352
+ background: radial-gradient(
353
+ 600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%),
354
+ rgba(16, 185, 129, 0.1),
355
+ transparent 40%
356
+ );
357
+ opacity: 0;
358
+ transition: opacity 0.3s ease;
359
+ pointer-events: none;
360
+ }
361
+
362
+ .spotlight-card:hover::before {
363
+ opacity: 1;
364
+ }
365
+
366
+ .spotlight-card:hover {
367
+ border-color: rgba(16, 185, 129, 0.3);
368
+ transform: translateY(-2px);
369
+ }
370
+
371
+ /* =========================================
372
+ GLASSMORPHISM
373
+ ========================================= */
374
+
375
+ .glass {
376
+ background: rgba(15, 23, 42, 0.7);
377
+ backdrop-filter: blur(20px);
378
+ border: 1px solid rgba(255, 255, 255, 0.1);
379
+ }
380
+
381
+ .glass-light {
382
+ background: rgba(255, 255, 255, 0.05);
383
+ backdrop-filter: blur(16px);
384
+ border: 1px solid rgba(255, 255, 255, 0.08);
385
+ }
386
+
387
+ /* =========================================
388
+ GRID PATTERN
389
+ ========================================= */
390
+
391
+ .grid-pattern {
392
+ background-image: linear-gradient(
393
+ to right,
394
+ rgba(30, 41, 59, 0.3) 1px,
395
+ transparent 1px
396
+ ),
397
+ linear-gradient(to bottom, rgba(30, 41, 59, 0.3) 1px, transparent 1px);
398
+ background-size: 60px 60px;
399
+ }
400
+
401
+ .dots-pattern {
402
+ background-image: radial-gradient(
403
+ rgba(16, 185, 129, 0.15) 1px,
404
+ transparent 1px
405
+ );
406
+ background-size: 30px 30px;
407
+ }
408
+
409
+ /* =========================================
410
+ BUTTON STYLES
411
+ ========================================= */
412
+
413
+ .btn-premium {
414
+ position: relative;
415
+ display: inline-flex;
416
+ align-items: center;
417
+ justify-content: center;
418
+ padding: 0.75rem 1.5rem;
419
+ font-weight: 600;
420
+ color: white;
421
+ background: linear-gradient(135deg, #10b981 0%, #06b6d4 100%);
422
+ border: none;
423
+ border-radius: 0.75rem;
424
+ cursor: pointer;
425
+ overflow: hidden;
426
+ transition: all 0.3s ease;
427
+ box-shadow: 0 4px 15px rgba(16, 185, 129, 0.25);
428
+ }
429
+
430
+ .btn-premium::before {
431
+ content: "";
432
+ position: absolute;
433
+ top: 0;
434
+ left: -100%;
435
+ width: 100%;
436
+ height: 100%;
437
+ background: linear-gradient(
438
+ 90deg,
439
+ transparent,
440
+ rgba(255, 255, 255, 0.3),
441
+ transparent
442
+ );
443
+ transition: left 0.5s ease;
444
+ }
445
+
446
+ .btn-premium:hover::before {
447
+ left: 100%;
448
+ }
449
+
450
+ .btn-premium:hover {
451
+ transform: translateY(-2px) scale(1.02);
452
+ box-shadow: 0 8px 25px rgba(16, 185, 129, 0.4);
453
+ }
454
+
455
+ .btn-outline-glow {
456
+ position: relative;
457
+ display: inline-flex;
458
+ align-items: center;
459
+ justify-content: center;
460
+ padding: 0.75rem 1.5rem;
461
+ font-weight: 600;
462
+ color: #10b981;
463
+ background: transparent;
464
+ border: 2px solid rgba(16, 185, 129, 0.5);
465
+ border-radius: 0.75rem;
466
+ cursor: pointer;
467
+ transition: all 0.3s ease;
468
+ }
469
+
470
+ .btn-outline-glow:hover {
471
+ background: rgba(16, 185, 129, 0.1);
472
+ border-color: #10b981;
473
+ box-shadow: 0 0 20px rgba(16, 185, 129, 0.3);
474
+ }
475
+
476
+ /* =========================================
477
+ INPUT STYLES
478
+ ========================================= */
479
+
480
+ .input-premium {
481
+ width: 100%;
482
+ padding: 0.875rem 1rem;
483
+ background: rgba(15, 23, 42, 0.6);
484
+ border: 1px solid rgba(255, 255, 255, 0.1);
485
+ border-radius: 0.75rem;
486
+ color: white;
487
+ font-size: 1rem;
488
+ transition: all 0.3s ease;
489
+ outline: none;
490
+ }
491
+
492
+ .input-premium::placeholder {
493
+ color: rgba(148, 163, 184, 0.6);
494
+ }
495
+
496
+ .input-premium:focus {
497
+ border-color: rgba(16, 185, 129, 0.5);
498
+ box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1),
499
+ 0 0 20px rgba(16, 185, 129, 0.1);
500
+ }
501
+
502
+ /* =========================================
503
+ CARD HOVER EFFECTS
504
+ ========================================= */
505
+
506
+ .card-hover-lift {
507
+ transition: all 0.3s ease;
508
+ }
509
+
510
+ .card-hover-lift:hover {
511
+ transform: translateY(-8px);
512
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
513
+ }
514
+
515
+ .card-hover-glow {
516
+ transition: all 0.3s ease;
517
+ }
518
+
519
+ .card-hover-glow:hover {
520
+ box-shadow: 0 0 30px rgba(16, 185, 129, 0.2), 0 20px 40px rgba(0, 0, 0, 0.2);
521
+ }
522
+
523
+ /* =========================================
524
+ TEXT EFFECTS
525
+ ========================================= */
526
+
527
+ .text-gradient {
528
+ background: linear-gradient(135deg, #10b981 0%, #06b6d4 50%, #8b5cf6 100%);
529
+ -webkit-background-clip: text;
530
+ -webkit-text-fill-color: transparent;
531
+ background-clip: text;
532
+ }
533
+
534
+ .text-gradient-animated {
535
+ background: linear-gradient(90deg, #10b981, #06b6d4, #8b5cf6, #10b981);
536
+ background-size: 300% 100%;
537
+ -webkit-background-clip: text;
538
+ -webkit-text-fill-color: transparent;
539
+ background-clip: text;
540
+ animation: gradient-x 4s ease infinite;
541
+ }
542
+
543
+ .text-glow {
544
+ text-shadow: 0 0 20px rgba(16, 185, 129, 0.5),
545
+ 0 0 40px rgba(16, 185, 129, 0.3);
546
+ }
547
+
548
+ /* =========================================
549
+ SCROLLBAR
550
+ ========================================= */
551
+
552
+ ::-webkit-scrollbar {
553
+ width: 8px;
554
+ height: 8px;
555
+ }
556
+
557
+ ::-webkit-scrollbar-track {
558
+ background: rgba(15, 23, 42, 0.5);
559
+ }
560
+
561
+ ::-webkit-scrollbar-thumb {
562
+ background: rgba(16, 185, 129, 0.3);
563
+ border-radius: 4px;
564
+ }
565
+
566
+ ::-webkit-scrollbar-thumb:hover {
567
+ background: rgba(16, 185, 129, 0.5);
568
+ }
569
+
570
+ /* =========================================
571
+ UTILITY CLASSES
572
+ ========================================= */
573
+
574
+ .backdrop-blur-xl {
575
+ backdrop-filter: blur(24px);
576
+ }
577
+
578
+ .perspective-1000 {
579
+ perspective: 1000px;
580
+ }
581
+
582
+ .preserve-3d {
583
+ transform-style: preserve-3d;
8
584
  }
package/src/routes.ts CHANGED
@@ -2,6 +2,8 @@ import type { RouterInstance } from 'canxjs';
2
2
  import { DashboardController } from './controllers/DashboardController';
3
3
  import { UserController } from './controllers/UserController';
4
4
  import { AuthController } from './controllers/AuthController';
5
+ import { ProductsController, OrdersController, AnalyticsController, SettingsController } from './controllers/PlaceholderControllers';
6
+ import { ProfileController } from './controllers/ProfileController';
5
7
 
6
8
  export function webRoutes(router: RouterInstance) {
7
9
  // Auth routes
@@ -10,4 +12,11 @@ export function webRoutes(router: RouterInstance) {
10
12
  // Admin routes (protected)
11
13
  router.controller('/', DashboardController);
12
14
  router.controller('/users', UserController);
15
+ router.controller('/profile', ProfileController);
16
+
17
+ // Placeholder routes
18
+ router.controller('/products', ProductsController);
19
+ router.controller('/orders', OrdersController);
20
+ router.controller('/analytics', AnalyticsController);
21
+ router.controller('/settings', SettingsController);
13
22
  }