From 64e2965d1c9213bee25de3f199bc916409742f57 Mon Sep 17 00:00:00 2001 From: richardtekula Date: Mon, 10 Nov 2025 13:05:33 +0100 Subject: [PATCH] improve styles --- src/App.css | 500 +++++++++++++++++++++++++++++-- src/App.jsx | 35 ++- src/components/NavigationBar.jsx | 14 +- src/index.css | 8 +- src/sections/About.jsx | 89 +++++- src/sections/Contact.jsx | 99 ++++-- src/sections/Footer.jsx | 15 +- src/sections/Hero.css | 254 +++++++++++++++- src/sections/Hero.jsx | 117 +++++++- src/sections/Services.jsx | 118 ++++++-- 10 files changed, 1138 insertions(+), 111 deletions(-) diff --git a/src/App.css b/src/App.css index b9d355d..35c8d83 100644 --- a/src/App.css +++ b/src/App.css @@ -1,42 +1,482 @@ #root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; + width: 100%; + min-height: 100vh; + background: radial-gradient(circle at 10% 20%, rgba(99, 102, 241, 0.2), transparent 50%), + radial-gradient(circle at 90% 10%, rgba(14, 165, 233, 0.2), transparent 45%), + #020617; + color: var(--white); +} + +.app-shell { + position: relative; + min-height: 100vh; + overflow: hidden; + background: linear-gradient(140deg, rgba(15, 23, 42, 0.9), rgba(2, 6, 23, 0.9)); +} + +.app-shell::after { + content: ''; + position: fixed; + inset: 10% auto auto 60%; + width: 400px; + height: 400px; + background: radial-gradient(circle, rgba(14, 165, 233, 0.25), transparent 70%); + filter: blur(80px); + z-index: -1; +} + +main { + width: 100%; + display: flex; + flex-direction: column; + gap: clamp(4rem, 8vw, 7rem); +} + +.section { + position: relative; + padding: clamp(4rem, 8vw, 7rem) 0; + isolation: isolate; +} + +.section::after { + content: ''; + position: absolute; + inset: 1rem; + border-radius: 32px; + background: radial-gradient(circle at top, rgba(99, 102, 241, 0.08), transparent 55%); + z-index: -2; + pointer-events: none; +} + +.section-heading { text-align: center; + max-width: 760px; + margin: 0 auto 3.5rem; } -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); +.eyebrow { + display: inline-flex; + align-items: center; + gap: 0.5rem; + text-transform: uppercase; + letter-spacing: 0.2rem; + font-size: 0.75rem; + color: var(--primary-light); + background: rgba(99, 102, 241, 0.1); + padding: 0.35rem 0.9rem; + border-radius: 999px; + margin-bottom: 1.2rem; } -@keyframes logo-spin { - from { - transform: rotate(0deg); +.section-heading p { + color: rgba(226, 232, 240, 0.8); + font-size: 1.1rem; +} + +.pill, .pill-chip { + display: inline-flex; + align-items: center; + gap: 0.4rem; + border-radius: 999px; + padding: 0.35rem 1rem; + font-size: 0.85rem; + font-weight: 600; + background: rgba(255, 255, 255, 0.05); + color: rgba(226, 232, 240, 0.9); + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.pill-chip svg { + width: 0.9rem; + height: 0.9rem; + color: var(--accent-color); +} + +.gradient-divider { + width: 100%; + height: 1px; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); + margin: 3rem 0 2rem; +} + +.glass-panel { + border-radius: 24px; + padding: 2rem; + background: rgba(15, 23, 42, 0.7); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 20px 80px rgba(15, 23, 42, 0.45); + backdrop-filter: blur(16px); +} + +.stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 1.5rem; + margin-top: 2rem; +} + +.stat-card { + padding: 1.35rem; + border-radius: 18px; + background: rgba(255, 255, 255, 0.04); + border: 1px solid rgba(255, 255, 255, 0.08); +} + +.stat-card strong { + display: block; + font-size: 1.8rem; + color: var(--white); +} + +.stat-card span { + color: rgba(226, 232, 240, 0.7); + font-size: 0.95rem; +} + +.mega-nav { + background: rgba(2, 6, 23, 0.65) !important; + backdrop-filter: blur(20px); + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + padding: 0.65rem 0; +} + +.mega-nav .navbar-brand { + font-weight: 800; + letter-spacing: 0.04em; + text-transform: lowercase; + color: var(--white); +} + +.mega-nav .navbar-brand span { + color: var(--secondary-color); +} + +.mega-nav .nav-link { + color: rgba(226, 232, 240, 0.75) !important; + margin-left: 1rem; + position: relative; + font-weight: 500; +} + +.mega-nav .nav-link::after { + content: ''; + position: absolute; + left: 0; + bottom: -6px; + width: 0; + height: 2px; + background: linear-gradient(90deg, var(--secondary-color), var(--primary-light)); + transition: width 0.3s ease; +} + +.mega-nav .nav-link:hover::after, +.mega-nav .nav-link:focus::after { + width: 100%; +} + +.nav-cta { + margin-left: 1.5rem; + border-radius: 999px; + background: linear-gradient(120deg, var(--secondary-color), var(--primary-color)); + border: none; + color: #fff !important; + font-weight: 600; + padding: 0.45rem 1.2rem; + box-shadow: 0 10px 25px rgba(99, 102, 241, 0.35); +} + +.about-image { + position: relative; + border-radius: 28px; + overflow: hidden; + box-shadow: 0 30px 80px rgba(2, 6, 23, 0.6); +} + +.about-image img { + width: 100%; + display: block; +} + +.image-note { + position: absolute; + bottom: 1.5rem; + right: 1.5rem; + width: min(280px, 70%); + font-size: 0.9rem; +} + +.image-note strong { + font-size: 1.3rem; + display: block; + margin: 0.25rem 0; +} + +.about-panel { + position: relative; +} + +.about-panel p { + color: rgba(226, 232, 240, 0.85); +} + +.pill-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: 1rem; + margin: 1.5rem 0; +} + +.pillar-card { + padding: 1rem; + border-radius: 18px; + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(15, 23, 42, 0.55); + display: flex; + gap: 0.85rem; + align-items: flex-start; +} + +.pillar-icon { + width: 42px; + height: 42px; + border-radius: 14px; + background: rgba(99, 102, 241, 0.15); + display: flex; + align-items: center; + justify-content: center; + color: var(--primary-light); +} + +.pillar-card h4 { + margin-bottom: 0.25rem; + font-size: 1rem; + color: var(--white); +} + +.pillar-card p { + margin: 0; + font-size: 0.9rem; +} + +.journey-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.journey-step { + display: flex; + gap: 1rem; + align-items: center; +} + +.journey-step span { + font-size: 0.85rem; + text-transform: uppercase; + letter-spacing: 0.15em; + color: rgba(226, 232, 240, 0.6); + min-width: 70px; +} + +.journey-step strong { + color: var(--white); +} + +.journey-step p { + margin: 0.15rem 0 0; +} + +.services-section { + background: rgba(8, 15, 35, 0.7); +} + +.services-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); + gap: 1.5rem; +} + +.service-card { + padding: 1.5rem; + border-radius: 22px; + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(15, 23, 42, 0.6); + transition: transform 0.45s ease, border-color 0.45s ease; + min-height: 240px; +} + +.service-card:hover { + transform: translateY(-6px); + border-color: rgba(99, 102, 241, 0.4); +} + +.service-card svg { + color: var(--secondary-color); + font-size: 1.8rem; + margin-bottom: 1rem; +} + +.service-card h3 { + color: var(--white); + margin-bottom: 0.5rem; +} + +.service-card p { + margin-bottom: 0; +} + +.service-tags { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-top: 1rem; +} + +.service-tags .pill { + border-color: rgba(255, 255, 255, 0.12); +} + +.workflow-card { + margin-top: 3rem; + padding: 2rem; + border-radius: 28px; + background: linear-gradient(120deg, rgba(99, 102, 241, 0.25), rgba(14, 165, 233, 0.2)); + border: 1px solid rgba(255, 255, 255, 0.15); +} + +.workflow-steps { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 1rem; + margin-top: 1.5rem; +} + +.workflow-step { + padding: 1rem; + border-radius: 18px; + background: rgba(2, 6, 23, 0.45); +} + +.contact-section { + background: rgba(2, 6, 23, 0.9); +} + +.contact-card { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.contact-list { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.contact-list li { + display: flex; + gap: 0.75rem; + align-items: center; + color: rgba(226, 232, 240, 0.8); +} + +.contact-list svg { + color: var(--secondary-color); +} + +.contact-form { + padding: 2rem; + border-radius: 24px; + background: rgba(15, 23, 42, 0.7); + border: 1px solid rgba(255, 255, 255, 0.08); +} + +.contact-form .form-control { + background: rgba(15, 23, 42, 0.6); + border: 1px solid rgba(255, 255, 255, 0.15); + color: var(--white); +} + +.contact-form .form-control:focus { + border-color: var(--primary-light); + box-shadow: none; +} + +.contact-form .form-label { + color: rgba(226, 232, 240, 0.85); + font-weight: 500; +} + +.social-row { + display: flex; + gap: 0.75rem; +} + +.social-row a { + width: 42px; + height: 42px; + border-radius: 14px; + border: 1px solid rgba(255, 255, 255, 0.12); + display: inline-flex; + align-items: center; + justify-content: center; + color: rgba(226, 232, 240, 0.85); +} + +.social-row a:hover { + color: var(--secondary-color); + border-color: var(--secondary-color); +} + +.contact-form button { + border-radius: 999px; + padding: 0.85rem 1.8rem; + font-weight: 600; + background: linear-gradient(120deg, var(--secondary-color), var(--primary-color)); + border: none; +} + +footer { + border-top: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(2, 6, 23, 0.95); +} + +.footer-brand { + font-weight: 700; + letter-spacing: 0.04em; + text-transform: lowercase; + color: #fff; +} + +.footer-meta { + color: rgba(226, 232, 240, 0.6); + font-size: 0.9rem; +} + +.delay-0 { transition-delay: 0s; } +.delay-1 { transition-delay: 0.1s; } +.delay-2 { transition-delay: 0.2s; } +.delay-3 { transition-delay: 0.3s; } +.delay-4 { transition-delay: 0.4s; } +.delay-5 { transition-delay: 0.5s; } + +@media (max-width: 992px) { + .mega-nav .nav-link { + margin-left: 0; + margin-bottom: 0.7rem; } - to { - transform: rotate(360deg); + + main { + gap: 3rem; } } -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; +@media (max-width: 576px) { + .glass-panel, + .stat-card { + padding: 1.25rem; } } - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/App.jsx b/src/App.jsx index 24e5ef7..732acdc 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,19 +1,44 @@ +import { useEffect } from 'react'; import NavigationBar from './components/NavigationBar'; import Hero from './sections/Hero'; import About from './sections/About'; import Services from './sections/Services'; import Contact from './sections/Contact'; import Footer from './sections/Footer'; +import './App.css'; import './sections/Hero.css'; function App() { + useEffect(() => { + const revealElements = document.querySelectorAll('.reveal'); + if (!('IntersectionObserver' in window) || !revealElements.length) return undefined; + + const observer = new IntersectionObserver( + entries => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('active'); + observer.unobserve(entry.target); + } + }); + }, + { threshold: 0.2 } + ); + + revealElements.forEach(element => observer.observe(element)); + + return () => observer.disconnect(); + }, []); + return ( -
+
- - - - +
+ + + + +
); diff --git a/src/components/NavigationBar.jsx b/src/components/NavigationBar.jsx index b751558..c5cdcb2 100644 --- a/src/components/NavigationBar.jsx +++ b/src/components/NavigationBar.jsx @@ -1,17 +1,23 @@ import React from 'react'; -import { Navbar, Nav, Container } from 'react-bootstrap'; +import { Navbar, Nav, Container, Button } from 'react-bootstrap'; const NavigationBar = () => { return ( - + - slovensko.ai + + slovensko.ai + -