diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts
index 92fc1d4..a25bd5f 100644
--- a/src/app/app.routes.ts
+++ b/src/app/app.routes.ts
@@ -3,10 +3,11 @@ import { Home } from './pages/home/home';
import { Register } from './pages/register/register';
import { LoginComponent } from './pages/login/login';
import { Geral } from './pages/geral/geral';
+import { authGuard } from './guards/auth.guard';
export const routes: Routes = [
{ path: '', component: Home },
{ path: "register", component: Register },
{ path: "login", component: LoginComponent },
- { path: "geral", component: Geral },
+ { path: 'geral', component: Geral, canActivate: [authGuard] },
];
diff --git a/src/app/components/feature-card/feature-card.html b/src/app/components/feature-card/feature-card.html
index d1f2c5e..79dd997 100644
--- a/src/app/components/feature-card/feature-card.html
+++ b/src/app/components/feature-card/feature-card.html
@@ -1,21 +1,31 @@
-
-
-
-
-
-
- {{ title }}
-
+
+
+
-
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/src/app/components/feature-card/feature-card.scss b/src/app/components/feature-card/feature-card.scss
index 4eb5754..68e69fa 100644
--- a/src/app/components/feature-card/feature-card.scss
+++ b/src/app/components/feature-card/feature-card.scss
@@ -1,136 +1,250 @@
-.feature-card-container {
- padding: 10px;
+:host {
+ --brand: #E33DCF;
+ --text: #111214;
+ --muted: rgba(17, 18, 20, 0.70);
+ --radius-xl: 22px;
+ --radius-lg: 16px;
+
+ display: block;
}
-/* CARD BASE — mantém o design exato do Figma em desktops */
+/* ✅ CARD PRINCIPAL */
.feature-card {
- border: 1px solid #000000;
- background-color: #FFFFFF;
- padding: 30px;
- border-radius: 5px;
+ position: relative;
+ overflow: hidden;
+ width: 365px;
+ min-height: 175px;
+ padding: 18px 18px 16px 18px;
+ border-radius: 18px;
cursor: default;
- /* DESKTOP (layout original) */
- width: 365px;
- height: 169px;
+ background: rgba(255, 255, 255, 0.82);
+ border: 1px solid rgba(227, 61, 207, 0.18);
+ backdrop-filter: blur(10px);
+ box-shadow: 0 18px 38px rgba(17, 18, 20, 0.10);
- overflow: hidden;
display: flex;
flex-direction: column;
- justify-content: flex-start;
+ gap: 10px;
- transition: background-color 0.2s ease-in-out;
+ transform: translateZ(0);
+ transition:
+ transform 180ms ease,
+ border-color 180ms ease,
+ box-shadow 180ms ease,
+ background 180ms ease;
+
+ /* borda interna sutil */
+ &::before {
+ content: '';
+ position: absolute;
+ inset: 1px;
+ border-radius: 17px;
+ pointer-events: none;
+ border: 1px solid rgba(255, 255, 255, 0.65);
+ opacity: 0.75;
+ }
+
+ /* efeito “radial” suave no fundo */
+ &::after {
+ content: '';
+ position: absolute;
+ inset: -80px;
+ pointer-events: none;
+ background:
+ radial-gradient(380px 200px at 20% 10%, rgba(227, 61, 207, 0.16), transparent 60%),
+ radial-gradient(320px 180px at 85% 70%, rgba(227, 61, 207, 0.10), transparent 60%);
+ opacity: 0.85;
+ }
/* ================================
📱 RESPONSIVIDADE
================================ */
-
@media (min-width: 1200px) and (max-width: 1399.98px) {
width: 330px;
- height: auto;
- padding: 24px;
+ min-height: 170px;
}
-
- /* Telas MUITO pequenas (≤ 360px) */
- @media (max-width: 360px) {
- width: 95%;
- height: auto;
- padding: 20px;
- }
-
- /* Celulares (≤ 480px) */
- @media (max-width: 480px) {
- width: 95%;
- height: auto; /* Permite texto quebrar */
- }
-
- /* Tablets pequenos (≤ 768px) */
- @media (max-width: 768px) {
- width: 300px;
- height: auto;
- }
-
- /* Tablets grandes e monitores pequenos (≤ 1024px) */
@media (max-width: 1024px) {
width: 330px;
- height: auto;
+ min-height: 170px;
+ }
+
+ @media (max-width: 768px) {
+ width: 300px;
+ min-height: 170px;
+ }
+
+ @media (max-width: 480px) {
+ width: 95%;
+ min-height: 170px;
+ }
+
+ @media (max-width: 360px) {
+ width: 95%;
+ min-height: 165px;
+ padding: 16px;
}
}
-/* HOVER */
+/* ✅ HOVER PREMIUM (sem “cinza chapado”) */
.feature-card.hover-state {
- background-color: #E1E1E1;
+ transform: translateY(-4px);
+ border-color: rgba(227, 61, 207, 0.32);
+ box-shadow: 0 26px 52px rgba(17, 18, 20, 0.14);
+ background: rgba(255, 255, 255, 0.90);
}
-/* -------------------------
- TÍTULO DO CARD
--------------------------- */
-.card-title {
- font-family: 'Inter', sans-serif;
- font-size: 20px;
- font-weight: 700;
- color: #E33DCF;
+/* brilho animado (fica bem SaaS) */
+.shine {
+ position: absolute;
+ inset: -40%;
+ pointer-events: none;
+ transform: translateX(-120%) rotate(12deg);
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.55), transparent);
+ opacity: 0.0;
+ transition: opacity 200ms ease;
+ z-index: 1;
+}
- margin-top: -15px;
- margin-bottom: 10px;
+.feature-card.hover-state .shine {
+ opacity: 1;
+ animation: shine 1.25s ease-in-out 1;
+}
+
+/* header */
+.card-head {
+ position: relative;
+ z-index: 2;
display: flex;
align-items: center;
- justify-content: center;
-
- @media (min-width: 1200px) and (max-width: 1399.98px) {
- font-size: 18px;
- margin-top: -10px;
- }
-
-
- /* Mobile */
- @media (max-width: 480px) {
- font-size: 18px;
- margin-top: -5px;
- }
+ gap: 12px;
+ justify-content: center; /* seu layout atual é centralizado */
}
-/* ÍCONE */
+/* ícone no estilo do mock */
+.icon-wrap {
+ width: 42px;
+ height: 42px;
+ border-radius: 14px;
+
+ display: grid;
+ place-items: center;
+
+ background: rgba(227, 61, 207, 0.10);
+ border: 1px solid rgba(227, 61, 207, 0.22);
+
+ transition: transform 180ms ease, box-shadow 180ms ease, background 180ms ease;
+}
+
+.feature-card.hover-state .icon-wrap {
+ transform: translateY(-1px) scale(1.03);
+ box-shadow: 0 12px 24px rgba(227, 61, 207, 0.18);
+ background: rgba(227, 61, 207, 0.14);
+}
+
+/* ícone */
.card-icon {
- margin-right: 10px;
- font-size: 24px;
-
- @media (min-width: 1200px) and (max-width: 1399.98px) {
- font-size: 22px;
- }
-
-
- /* Mobile */
- @media (max-width: 480px) {
- font-size: 20px;
- }
+ font-size: 18px;
+ color: var(--brand);
}
-/* -------------------------
- DESCRIÇÃO DO CARD
--------------------------- */
-.card-description {
+/* título */
+.card-title {
+ position: relative;
+ z-index: 2;
+
+ margin: 0;
font-family: 'Inter', sans-serif;
- font-size: 17px;
- color: #000000;
- line-height: 1;
- padding-left: 15px;
+ font-size: 18px;
+ font-weight: 950;
+ color: var(--text);
+ letter-spacing: -0.2px;
- @media (min-width: 1200px) and (max-width: 1399.98px) {
- font-size: 16px;
- line-height: 1.2;
- }
+ transition: transform 180ms ease, color 180ms ease;
+}
+.feature-card.hover-state .card-title {
+ transform: translateY(-1px);
+}
- /* Mobile */
+/* descrição */
+.card-description {
+ position: relative;
+ z-index: 2;
+
+ margin: 0;
+ padding: 0 6px;
+
+ font-family: 'Inter', sans-serif;
+ font-size: 14px;
+ line-height: 1.35;
+ color: var(--muted);
+
+ /* deixa mais “SaaS” e menos apertado */
@media (max-width: 480px) {
- font-size: 15px;
- padding-left: 8px;
+ font-size: 13.5px;
+ padding: 0 2px;
}
}
.card-description strong {
- font-weight: 700;
+ font-weight: 900;
+ color: #111214;
+}
+
+/* linha decorativa inferior */
+.card-accent {
+ position: relative;
+ z-index: 2;
+
+ margin-top: auto;
+ height: 6px;
+ border-radius: 999px;
+ background: rgba(227, 61, 207, 0.12);
+ border: 1px solid rgba(227, 61, 207, 0.18);
+ overflow: hidden;
+
+ &::after {
+ content: '';
+ position: absolute;
+ inset: 0;
+ transform: translateX(-60%);
+ background: linear-gradient(90deg, transparent, rgba(227, 61, 207, 0.28), transparent);
+ opacity: 0.0;
+ transition: opacity 180ms ease;
+ }
+}
+
+.feature-card.hover-state .card-accent::after {
+ opacity: 1;
+ animation: sweep 1.2s ease-in-out 1;
+}
+
+/* acessibilidade: reduz animações */
+@media (prefers-reduced-motion: reduce) {
+ .feature-card,
+ .icon-wrap,
+ .card-title {
+ transition: none !important;
+ }
+ .feature-card.hover-state {
+ transform: none;
+ }
+ .feature-card.hover-state .shine,
+ .feature-card.hover-state .card-accent::after {
+ animation: none !important;
+ }
+}
+
+/* animações */
+@keyframes shine {
+ 0% { transform: translateX(-120%) rotate(12deg); }
+ 100% { transform: translateX(120%) rotate(12deg); }
+}
+
+@keyframes sweep {
+ 0% { transform: translateX(-60%); }
+ 100% { transform: translateX(60%); }
}
diff --git a/src/app/components/feature-card/feature-card.ts b/src/app/components/feature-card/feature-card.ts
index 860269d..21289f0 100644
--- a/src/app/components/feature-card/feature-card.ts
+++ b/src/app/components/feature-card/feature-card.ts
@@ -1,24 +1,23 @@
import { Component, Input, OnInit } from '@angular/core';
-import { CommonModule } from '@angular/common'; // <-- Importe aqui!
+import { CommonModule } from '@angular/common';
@Component({
selector: 'app-feature-card',
- standalone: true, // <-- DEVE ser standalone
- imports: [CommonModule], // <-- PRECISA do CommonModule para usar [ngClass]
+ standalone: true,
+ imports: [CommonModule],
templateUrl: './feature-card.html',
styleUrls: ['./feature-card.scss']
})
export class FeatureCardComponent implements OnInit {
-
- // ... o restante da lógica ...
+
@Input() title: string = '';
@Input() description: string = '';
- @Input() iconClass: string = '';
+ @Input() iconClass: string = '';
@Input() textAlign: 'left' | 'center' = 'left';
- isHovered: boolean = false;
+ isHovered: boolean = false;
- constructor() { }
+ constructor() {}
- ngOnInit(): void { }
-}
\ No newline at end of file
+ ngOnInit(): void {}
+}
diff --git a/src/app/components/header/header.html b/src/app/components/header/header.html
index 6cc84e4..64460f7 100644
--- a/src/app/components/header/header.html
+++ b/src/app/components/header/header.html
@@ -1,52 +1,115 @@