File History: src/main/resources/static/css/styles.css

← View file content

File Content at Commit e6d1548

1 * {
2 margin: 0;
3 padding: 0;
4 box-sizing: border-box;
5 }
6
7 :root {
8 --primary-color: #6366f1;
9 --primary-dark: #4f46e5;
10 --primary-light: #818cf8;
11 --secondary-color: #10b981;
12 --secondary-dark: #059669;
13 --accent-color: #f59e0b;
14 --text-color: #1f2937;
15 --text-light: #6b7280;
16 --bg-color: #f9fafb;
17 --card-bg: #ffffff;
18 --border-color: #e5e7eb;
19 --border-light: #f3f4f6;
20 --shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
21 --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
22 --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
23 --shadow-hover: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
24 --gradient-primary: var(--primary-color);
25 --gradient-success: var(--secondary-color);
26 }
27
28 body {
29 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Inter', Oxygen, Ubuntu, Cantarell, sans-serif;
30 background-color: var(--bg-color);
31 color: var(--text-color);
32 line-height: 1.6;
33 min-height: 100vh;
34 display: flex;
35 flex-direction: column;
36 -webkit-font-smoothing: antialiased;
37 -moz-osx-font-smoothing: grayscale;
38 }
39
40 .container {
41 max-width: 1200px;
42 margin: 0 auto;
43 padding: 0 24px;
44 width: 100%;
45 }
46
47 @media (max-width: 768px) {
48 .container {
49 padding: 0 16px;
50 }
51 }
52
53 header {
54 background: rgba(255, 255, 255, 0.95);
55 backdrop-filter: blur(10px);
56 -webkit-backdrop-filter: blur(10px);
57 color: var(--text-color);
58 padding: 0;
59 box-shadow: var(--shadow-md);
60 position: sticky;
61 top: 0;
62 z-index: 1000;
63 border-bottom: 1px solid var(--border-color);
64 }
65
66 .navbar {
67 display: flex;
68 justify-content: space-between;
69 align-items: center;
70 padding: 1rem 0;
71 max-width: 1200px;
72 margin: 0 auto;
73 width: 100%;
74 }
75
76 .navbar-brand {
77 display: flex;
78 align-items: center;
79 text-decoration: none;
80 color: var(--text-color);
81 }
82
83 .navbar-brand h1 {
84 font-size: 1.75rem;
85 font-weight: 800;
86 margin: 0;
87 color: var(--primary-color);
88 letter-spacing: -0.02em;
89 }
90
91 .navbar-actions {
92 display: flex;
93 align-items: center;
94 gap: 1rem;
95 }
96
97 .cart-button {
98 position: relative;
99 display: flex;
100 align-items: center;
101 justify-content: center;
102 gap: 0.5rem;
103 padding: 0.75rem;
104 background: var(--primary-color);
105 color: white;
106 text-decoration: none;
107 border-radius: 10px;
108 font-weight: 600;
109 transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
110 border: none;
111 cursor: pointer;
112 box-shadow: var(--shadow-md);
113 }
114
115 .cart-button:hover {
116 background: var(--primary-dark);
117 transform: translateY(-2px);
118 box-shadow: var(--shadow-lg);
119 }
120
121 .cart-button:active {
122 transform: translateY(0);
123 }
124
125 .cart-badge {
126 position: absolute;
127 top: -8px;
128 right: -8px;
129 background: #ef4444;
130 color: white;
131 border-radius: 50%;
132 width: 22px;
133 height: 22px;
134 font-size: 11px;
135 display: flex;
136 align-items: center;
137 justify-content: center;
138 font-weight: 700;
139 border: 2.5px solid white;
140 box-shadow: var(--shadow-md);
141 animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
142 }
143
144 @keyframes pulse {
145 0%, 100% {
146 opacity: 1;
147 }
148 50% {
149 opacity: 0.8;
150 }
151 }
152
153 .subtitle {
154 font-size: 0.9rem;
155 opacity: 0.7;
156 margin: 0;
157 display: none;
158 }
159
160 main {
161 flex: 1;
162 padding: 3rem 0;
163 min-height: calc(100vh - 200px);
164 animation: fadeIn 0.5s ease-out;
165 }
166
167 .page-header {
168 margin-bottom: 2.5rem;
169 }
170
171 .page-header h2 {
172 font-size: 2.5rem;
173 font-weight: 800;
174 color: var(--text-color);
175 margin-bottom: 0.5rem;
176 letter-spacing: -0.02em;
177 }
178
179 .page-header p {
180 color: var(--text-light);
181 font-size: 1.1rem;
182 font-weight: 400;
183 }
184
185 .loading, .error {
186 text-align: center;
187 padding: 2rem;
188 font-size: 1.1rem;
189 }
190
191 .error {
192 color: #e74c3c;
193 background: #fee;
194 border: 1px solid #e74c3c;
195 border-radius: 8px;
196 margin-bottom: 2rem;
197 }
198
199 .products-grid {
200 display: grid;
201 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
202 gap: 2rem;
203 animation: fadeInUp 0.6s ease-out;
204 }
205
206 @keyframes fadeInUp {
207 from {
208 opacity: 0;
209 transform: translateY(20px);
210 }
211 to {
212 opacity: 1;
213 transform: translateY(0);
214 }
215 }
216
217 .product-card {
218 background: var(--card-bg);
219 border-radius: 16px;
220 overflow: hidden;
221 box-shadow: var(--shadow);
222 transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
223 cursor: pointer;
224 border: 1px solid var(--border-color);
225 position: relative;
226 }
227
228 .product-card::before {
229 content: '';
230 position: absolute;
231 top: 0;
232 left: 0;
233 right: 0;
234 height: 4px;
235 background: var(--gradient-primary);
236 transform: scaleX(0);
237 transform-origin: left;
238 transition: transform 0.3s ease;
239 }
240
241 .product-card:hover {
242 transform: none;
243 box-shadow: var(--shadow-hover);
244 border-color: var(--primary-light);
245 }
246
247 .product-card:hover::before {
248 transform: none;
249 }
250
251 .product-image {
252 width: 100%;
253 height: 160px;
254 object-fit: cover;
255 background: var(--gradient-primary);
256 display: flex;
257 align-items: center;
258 justify-content: center;
259 font-size: 3rem;
260 color: white;
261 transition: transform 0.5s ease;
262 }
263
264 .product-card:hover .product-image {
265 /* transform: scale(1.05); Removed scale effect */
266 }
267
268 .product-info {
269 padding: 1rem;
270 display: flex;
271 flex-direction: column;
272 gap: 0.5rem;
273 }
274
275 .product-name {
276 font-size: 1.1rem;
277 font-weight: 700;
278 color: var(--text-color);
279 line-height: 1.4;
280 min-height: auto;
281 margin-bottom: 0;
282 display: -webkit-box;
283 -webkit-line-clamp: 2;
284 -webkit-box-orient: vertical;
285 overflow: hidden;
286 letter-spacing: -0.01em;
287 }
288
289 .product-description {
290 color: var(--text-light);
291 font-size: 0.9rem;
292 line-height: 1.5;
293 display: -webkit-box;
294 -webkit-line-clamp: 2;
295 -webkit-box-orient: vertical;
296 overflow: hidden;
297 flex: unset;
298 margin-bottom: 0;
299 }
300
301 .product-price {
302 font-size: 1.5rem;
303 font-weight: 800;
304 color: var(--primary-color);
305 margin: 0.25rem 0;
306 letter-spacing: -0.02em;
307 }
308
309 .product-stock {
310 font-size: 0.85rem;
311 color: #666;
312 margin: 0;
313 }
314
315 .product-stock.low {
316 color: #e74c3c;
317 }
318
319 .product-stock.out {
320 color: #e74c3c;
321 font-weight: 600;
322 }
323
324 .btn {
325 display: inline-block;
326 padding: 0.6rem 1rem;
327 background: var(--primary-color);
328 color: white;
329 text-decoration: none;
330 border-radius: 10px;
331 border: none;
332 font-size: 1rem;
333 font-weight: 600;
334 cursor: pointer;
335 transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
336 width: 100%;
337 text-align: center;
338 box-shadow: var(--shadow-md);
339 position: relative;
340 overflow: hidden;
341 }
342
343 .btn::before {
344 content: '';
345 position: absolute;
346 top: 50%;
347 left: 50%;
348 width: 0;
349 height: 0;
350 border-radius: 50%;
351 background: rgba(255, 255, 255, 0.2);
352 transform: translate(-50%, -50%);
353 transition: width 0.6s, height 0.6s;
354 }
355
356 .btn:hover::before {
357 width: 300px;
358 height: 300px;
359 }
360
361 .btn:hover {
362 background: var(--primary-dark);
363 transform: translateY(-2px);
364 box-shadow: var(--shadow-lg);
365 }
366
367 .btn:active {
368 transform: translateY(0);
369 }
370
371 .btn:disabled {
372 background: #d1d5db;
373 cursor: not-allowed;
374 transform: none;
375 box-shadow: none;
376 }
377
378 .btn-success {
379 background: var(--secondary-color);
380 }
381
382 .btn-success:hover {
383 background: var(--secondary-dark);
384 }
385
386 /* Modal Styles */
387 .modal {
388 display: none;
389 position: fixed;
390 z-index: 1000;
391 left: 0;
392 top: 0;
393 width: 100%;
394 height: 100%;
395 background-color: rgba(0, 0, 0, 0.5);
396 animation: fadeIn 0.3s;
397 }
398
399 .modal-content {
400 background-color: var(--card-bg);
401 margin: 5% auto;
402 padding: 2.5rem;
403 border-radius: 20px;
404 width: 90%;
405 max-width: 600px;
406 max-height: 90vh;
407 overflow-y: auto;
408 position: relative;
409 animation: slideDown 0.4s cubic-bezier(0.4, 0, 0.2, 1);
410 box-shadow: var(--shadow-lg);
411 border: 1px solid var(--border-color);
412 }
413
414 @keyframes fadeIn {
415 from { opacity: 0; }
416 to { opacity: 1; }
417 }
418
419 @keyframes slideDown {
420 from {
421 transform: translateY(-50px);
422 opacity: 0;
423 }
424 to {
425 transform: translateY(0);
426 opacity: 1;
427 }
428 }
429
430 .close {
431 color: var(--text-light);
432 float: right;
433 font-size: 28px;
434 font-weight: bold;
435 cursor: pointer;
436 position: absolute;
437 right: 1.25rem;
438 top: 1.25rem;
439 width: 36px;
440 height: 36px;
441 display: flex;
442 align-items: center;
443 justify-content: center;
444 border-radius: 8px;
445 transition: all 0.2s ease;
446 background: var(--border-light);
447 }
448
449 .close:hover {
450 color: var(--text-color);
451 background: var(--border-color);
452 transform: rotate(90deg);
453 }
454
455 .form-group {
456 margin-bottom: 1.5rem;
457 }
458
459 .form-group label {
460 display: block;
461 margin-bottom: 0.5rem;
462 font-weight: 600;
463 color: var(--text-color);
464 }
465
466 .form-group input,
467 .form-group select {
468 width: 100%;
469 padding: 0.875rem 1rem;
470 border: 2px solid var(--border-color);
471 border-radius: 10px;
472 font-size: 1rem;
473 transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
474 background: var(--card-bg);
475 color: var(--text-color);
476 }
477
478 .form-group input:focus,
479 .form-group select:focus {
480 outline: none;
481 border-color: var(--primary-color);
482 box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
483 transform: translateY(-1px);
484 }
485
486 .form-group input:hover,
487 .form-group select:hover {
488 border-color: var(--primary-light);
489 }
490
491 .form-group small {
492 display: block;
493 margin-top: 0.25rem;
494 color: #666;
495 font-size: 0.85rem;
496 }
497
498 .contact-options {
499 display: grid;
500 grid-template-columns: 1fr 1fr;
501 gap: 1rem;
502 margin-bottom: 1rem;
503 }
504
505 .contact-option {
506 padding: 1rem;
507 border: 2px solid var(--border-color);
508 border-radius: 8px;
509 cursor: pointer;
510 transition: all 0.3s ease;
511 text-align: center;
512 }
513
514 .contact-option:hover {
515 border-color: var(--primary-color);
516 background: #f0f7ff;
517 }
518
519 .contact-option.selected {
520 border-color: var(--primary-color);
521 background: #e8f4ff;
522 }
523
524 .contact-option input[type="radio"] {
525 display: none;
526 }
527
528 footer {
529 background: #f8f9fa;
530 color: #666;
531 text-align: center;
532 padding: 2rem 0;
533 margin-top: auto;
534 border-top: 1px solid var(--border-color);
535 font-size: 0.9rem;
536 }
537
538 /* Notification System */
539 .notification-container {
540 position: fixed;
541 bottom: 20px;
542 right: 20px;
543 z-index: 10000;
544 display: flex;
545 flex-direction: column;
546 gap: 10px;
547 max-width: 400px;
548 }
549
550 .notification {
551 background: var(--card-bg);
552 border-radius: 8px;
553 padding: 1rem 1.5rem;
554 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
555 display: flex;
556 align-items: center;
557 gap: 1rem;
558 animation: slideInRight 0.3s ease-out;
559 border-left: 4px solid;
560 min-width: 300px;
561 }
562
563 .notification.success {
564 border-left-color: var(--secondary-color);
565 }
566
567 .notification.error {
568 border-left-color: #e74c3c;
569 }
570
571 .notification.warning {
572 border-left-color: #f39c12;
573 }
574
575 .notification.info {
576 border-left-color: var(--primary-color);
577 }
578
579 .notification-content {
580 flex: 1;
581 }
582
583 .notification-title {
584 font-weight: 600;
585 margin-bottom: 0.25rem;
586 color: var(--text-color);
587 }
588
589 .notification-message {
590 color: #666;
591 font-size: 0.9rem;
592 }
593
594 .notification-close {
595 background: none;
596 border: none;
597 font-size: 1.5rem;
598 color: #999;
599 cursor: pointer;
600 padding: 0;
601 width: 24px;
602 height: 24px;
603 display: flex;
604 align-items: center;
605 justify-content: center;
606 line-height: 1;
607 transition: color 0.2s;
608 }
609
610 .notification-close:hover {
611 color: var(--text-color);
612 }
613
614 @keyframes slideInRight {
615 from {
616 transform: translateX(100%);
617 opacity: 0;
618 }
619 to {
620 transform: translateX(0);
621 opacity: 1;
622 }
623 }
624
625 /* Confirmation Dialog */
626 .confirm-dialog-overlay {
627 position: fixed;
628 top: 0;
629 left: 0;
630 width: 100%;
631 height: 100%;
632 background: rgba(0, 0, 0, 0.5);
633 z-index: 10001;
634 display: flex;
635 align-items: center;
636 justify-content: center;
637 animation: fadeIn 0.3s;
638 }
639
640 .confirm-dialog {
641 background: var(--card-bg);
642 border-radius: 12px;
643 padding: 2rem;
644 max-width: 400px;
645 width: 90%;
646 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
647 animation: slideDown 0.3s;
648 }
649
650 .confirm-dialog-title {
651 font-size: 1.25rem;
652 font-weight: 600;
653 margin-bottom: 1rem;
654 color: var(--text-color);
655 }
656
657 .confirm-dialog-message {
658 color: #666;
659 margin-bottom: 1.5rem;
660 line-height: 1.6;
661 }
662
663 .confirm-dialog-actions {
664 display: flex;
665 gap: 1rem;
666 justify-content: flex-end;
667 }
668
669 .confirm-dialog-actions button {
670 padding: 0.75rem 1.5rem;
671 border: none;
672 border-radius: 6px;
673 font-size: 1rem;
674 cursor: pointer;
675 transition: all 0.2s;
676 font-weight: 500;
677 }
678
679 .confirm-dialog-actions .btn-cancel {
680 background: #f0f0f0;
681 color: var(--text-color);
682 }
683
684 .confirm-dialog-actions .btn-cancel:hover {
685 background: #e0e0e0;
686 }
687
688 .confirm-dialog-actions .btn-confirm {
689 background: var(--primary-color);
690 color: white;
691 }
692
693 .confirm-dialog-actions .btn-confirm:hover {
694 background: var(--primary-dark);
695 }
696
697 @media (max-width: 768px) {
698 .products-grid {
699 grid-template-columns: 1fr;
700 gap: 1.5rem;
701 }
702
703 .contact-options {
704 grid-template-columns: 1fr;
705 }
706
707 .navbar {
708 padding: 1rem;
709 flex-wrap: wrap;
710 }
711
712 .navbar-brand h1 {
713 font-size: 1.5rem;
714 }
715
716 .navbar-actions {
717 flex-wrap: wrap;
718 gap: 0.5rem;
719 }
720
721 .cart-button {
722 padding: 0.6rem;
723 font-size: 0.9rem;
724 }
725
726 .page-header h2 {
727 font-size: 1.75rem;
728 }
729
730 main {
731 padding: 2rem 0;
732 }
733
734 .notification-container {
735 right: 10px;
736 bottom: 10px;
737 max-width: calc(100% - 20px);
738 }
739
740 .notification {
741 min-width: auto;
742 padding: 0.75rem 1rem;
743 }
744
745 .modal-content {
746 width: 95%;
747 margin: 10% auto;
748 padding: 1.5rem;
749 max-height: 85vh;
750 }
751
752 .product-card {
753 margin: 0;
754 }
755
756 .product-info {
757 padding: 1rem;
758 }
759
760 .product-name {
761 font-size: 1.1rem;
762 min-height: auto;
763 }
764
765 .product-price {
766 font-size: 1.5rem;
767 }
768 }
769

Commits

Commit Author Date Message File SHA Actions
f0438c2 <f69e50@finnacloud.com> 1766443042 +0300 12/22/2025, 10:37:22 PM increment once more 28d60d4 View
188fc92 <f69e50@finnacloud.com> 1766442998 +0300 12/22/2025, 10:36:38 PM increment 28d60d4 View
4617f76 <f69e50@finnacloud.com> 1766442953 +0300 12/22/2025, 10:35:53 PM rename branch from main to master oops 28d60d4 View
e6d1548 <f69e50@finnacloud.com> 1766442769 +0300 12/22/2025, 10:32:49 PM add initial test workflow file 28d60d4 Hide
9c24ca4 <f69e50@finnacloud.com> 1766442705 +0300 12/22/2025, 10:31:45 PM add CI configuration and test script for Jenkins build 28d60d4 View
690c1f6 <f69e50@finnacloud.com> 1766368110 +0300 12/22/2025, 1:48:30 AM initialize backend structure with controllers, DTOs, and configuration files 28d60d4 View