diff --git a/public/images/services-hero-dark.png b/public/images/services-hero-dark.png index b527799..fcfeaaa 100644 Binary files a/public/images/services-hero-dark.png and b/public/images/services-hero-dark.png differ diff --git a/public/images/services-hero-dark2.png b/public/images/services-hero-dark2.png new file mode 100644 index 0000000..b527799 Binary files /dev/null and b/public/images/services-hero-dark2.png differ diff --git a/src/app/[locale]/services/[slug]/service-detail-page.tsx b/src/app/[locale]/services/[slug]/service-detail-page.tsx index 61f4136..42797c3 100644 --- a/src/app/[locale]/services/[slug]/service-detail-page.tsx +++ b/src/app/[locale]/services/[slug]/service-detail-page.tsx @@ -61,8 +61,7 @@ function GradientIconBox({ children }: { children: React.ReactNode }) { } function FeatureIcon({ name }: { name: 'bolt' | 'shield' | 'cloud' | 'wp' | 'headphones' | 'rocket' }) { - const className = - 'w-6 h-6 text-[#84e1bc] drop-shadow-[0_0_14px_rgba(132,225,188,0.25)]'; + const className = 'w-6 h-6 text-current drop-shadow-[0_0_14px_rgba(255,255,255,0.18)]'; switch (name) { case 'bolt': return ; @@ -115,7 +114,7 @@ export default function ServiceDetailPage({ slug }: { slug: ServiceSlug }) { }; return ( -
+
{/* Hero */}
@@ -130,7 +129,7 @@ export default function ServiceDetailPage({ slug }: { slug: ServiceSlug }) { transition={{ duration: 1.1, ease: 'easeOut' }} className="absolute inset-0 opacity-[var(--hero-image-opacity)]" > -
+
{/* Bottom fade */} -
+
{/* Dark-only bottom fade (from #010D1F to transparent) */} -
+
@@ -225,7 +224,7 @@ export default function ServiceDetailPage({ slug }: { slug: ServiceSlug }) {
-
+
{content.quickStats.map((s, idx) => (
-
+ {/*
*/}
{/* Features */} @@ -256,18 +255,52 @@ export default function ServiceDetailPage({ slug }: { slug: ServiceSlug }) {
- {content.features.map((f) => ( -
-
- + {content.features.map((f, idx) => { + const accents = [ + { border: '#a78bfa', icon: '#a78bfa' }, // purple + { border: '#60a5fa', icon: '#60a5fa' }, // blue + { border: '#22d3ee', icon: '#22d3ee' }, // cyan + { border: '#34d399', icon: '#34d399' }, // green + ]; + const accent = accents[idx % accents.length]; + + return ( +
+
+
+ +
+ + + +
+ +
{f.title}
+
{f.desc}
+
-
{f.title}
-
{f.desc}
-
- ))} + ); + })}
@@ -283,7 +316,7 @@ export default function ServiceDetailPage({ slug }: { slug: ServiceSlug }) {
-
+

{content.faqTitle}

{content.faqSubtitle}

@@ -364,7 +397,7 @@ export default function ServiceDetailPage({ slug }: { slug: ServiceSlug }) {
-
+
@@ -403,7 +436,7 @@ export default function ServiceDetailPage({ slug }: { slug: ServiceSlug }) { {/* Final CTA */} -
+

{content.finalCtaTitle}

{content.finalCtaDesc}

diff --git a/src/app/components/maincontext.tsx b/src/app/components/maincontext.tsx index 137d13f..017d920 100644 --- a/src/app/components/maincontext.tsx +++ b/src/app/components/maincontext.tsx @@ -37,7 +37,7 @@ export default function MainContent() { کادر اصلی دربرگیرنده کل محتوا استفاده از mt-32- برای کشیدن کادر به بالا و ادغام با هیرو */} -
+
{/* بخش محصولات */} '; + inherits: false; + initial-value: 0deg; + } + + @keyframes rb-spin { + to { + --rb-angle: 360deg; + } + } + + @keyframes rb-fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + .glass-rotating-border { + position: relative; + } + + .glass-rotating-border::before { + content: ''; + position: absolute; + inset: 0; + border-radius: inherit; + padding: 1.5px; /* border thickness */ + pointer-events: none; + opacity: 0; + background: conic-gradient( + from var(--rb-angle), + rgba(255, 255, 255, 0) 0deg, + rgba(128, 200, 245, 0.55) 80deg, + rgba(167, 139, 250, 0.55) 155deg, + rgba(132, 225, 188, 0.55) 230deg, + rgba(96, 165, 250, 0.55) 305deg, + rgba(255, 255, 255, 0) 360deg + ); + -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + filter: drop-shadow(0 0 22px rgba(128, 200, 245, 0.12)); + animation: rb-fade-in 700ms ease-out 150ms forwards, rb-spin 7.5s linear infinite; + } + + html.light .glass-rotating-border::before { + background: conic-gradient( + from var(--rb-angle), + rgba(255, 255, 255, 0) 0deg, + rgba(96, 165, 250, 0.40) 85deg, + rgba(167, 139, 250, 0.38) 165deg, + rgba(34, 211, 238, 0.36) 235deg, + rgba(52, 211, 153, 0.34) 310deg, + rgba(255, 255, 255, 0) 360deg + ); + filter: drop-shadow(0 0 18px rgba(2, 6, 23, 0.06)); + } + +html.light .glass-rotating-border::after { + background: conic-gradient( + rgba(255, 255, 255, 0) 0deg 30deg, + rgba(96, 165, 250, 0.22) 46deg 72deg, + rgba(255, 255, 255, 0) 88deg 124deg, + rgba(167, 139, 250, 0.20) 138deg 164deg, + rgba(255, 255, 255, 0) 180deg 216deg, + rgba(34, 211, 238, 0.18) 230deg 256deg, + rgba(255, 255, 255, 0) 272deg 308deg, + rgba(52, 211, 153, 0.16) 322deg 346deg, + rgba(255, 255, 255, 0) 360deg + ); + filter: blur(16px); +} + +html.light .glass-rotating-border::before { + background: conic-gradient( + rgba(255, 255, 255, 0) 0deg 28deg, + rgba(96, 165, 250, 0.38) 44deg 70deg, + rgba(255, 255, 255, 0) 86deg 126deg, + rgba(167, 139, 250, 0.34) 140deg 166deg, + rgba(255, 255, 255, 0) 182deg 222deg, + rgba(34, 211, 238, 0.32) 236deg 262deg, + rgba(255, 255, 255, 0) 278deg 318deg, + rgba(52, 211, 153, 0.30) 332deg 352deg, + rgba(255, 255, 255, 0) 360deg + ); + filter: drop-shadow(0 0 10px rgba(2, 6, 23, 0.05)); +} + @font-face { font-family: "YekanBakhFaNum"; src: url("/fonts/YekanBakhFaNum-Regular.woff") format("woff");