-
+
📄
{reportCount}
Reports Generated
@@ -144,11 +142,7 @@ const Home = () => {
-
+
⚡
AI-Powered
Smart Analysis
@@ -156,34 +150,23 @@ const Home = () => {
- {/* Error Display */}
{(formError || error) && (
-
-
-
-
-
{formError || error}
setFormError("")} className="error-close">×
)}
- {/* Left Panel - Job Description */}
-
- 💼 Target Job Description
-
+
💼 Target Job Description
Required
4500 ? 'char-count--warning' : ''}`}>
@@ -191,116 +174,53 @@ const Home = () => {
- {/* Right Panel - Profile */}
-
- 👤 Your Profile
-
+
👤 Your Profile
-
- Upload Resume
- (Recommended for best results)
-
+
Upload Resume (Recommended)
- {/* File Upload Area */}
-
+
{resumeFile ? (
-
-
-
-
-
-
-
-
- {resumeFile.name}
- {(resumeFile.size / 1024).toFixed(1)} KB
-
-
{
- e.stopPropagation()
- setResumeFile(null)
- if (resumeInputRef.current) resumeInputRef.current.value = ""
- }}
- >
- ×
-
+
{resumeFile.name}
+
{(resumeFile.size / 1024).toFixed(1)} KB
+
{
+ e.stopPropagation();
+ setResumeFile(null);
+ if (resumeInputRef.current) resumeInputRef.current.value = "";
+ }}>×
) : (
<>
-
+
↑
Click to upload or drag & drop
PDF or DOCX (Max 5MB)
>
)}
-
+
-
+
Quick Self-Description
- )
-}
+ );
+};
-export default Home
\ No newline at end of file
+export default Home;
\ No newline at end of file
diff --git a/client/src/features/auth/interview/pages/Interview.jsx b/client/src/features/auth/interview/pages/Interview.jsx
index 81b5768..cb8af45 100644
--- a/client/src/features/auth/interview/pages/Interview.jsx
+++ b/client/src/features/auth/interview/pages/Interview.jsx
@@ -159,16 +159,7 @@ const Interview = () => {
))}
-
getResumePdf(interviewId)}
- className='button primary-button'
- >
-
-
-
- Download Resume
-
+
diff --git a/client/src/features/auth/interview/pages/style/home.scss b/client/src/features/auth/interview/pages/style/home.scss
index 5286ad1..00bf562 100644
--- a/client/src/features/auth/interview/pages/style/home.scss
+++ b/client/src/features/auth/interview/pages/style/home.scss
@@ -1,3 +1,5 @@
+/* ====================== FINAL home.scss ====================== */
+
* {
box-sizing: border-box;
margin: 0;
@@ -5,22 +7,68 @@
}
.page {
- background: #0f1117;
+ background: #0a0c14;
min-height: 100vh;
- padding: 2.5rem 1.5rem;
- font-family: 'Georgia', serif;
+ padding: 1.2rem 1rem;
+ font-family: 'Inter', system-ui, sans-serif;
color: #e2e8f0;
+ /* ================== HEADER ================== */
+ .header {
+ max-width: 920px;
+ margin: 0 auto 1.3rem auto;
+
+ .header-content {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ h2 {
+ font-size: 1.45rem;
+ font-weight: 700;
+ color: #ffffff;
+ }
+
+ .user-section {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ font-size: 0.92rem;
+
+ button {
+ padding: 7px 17px;
+ border-radius: 8px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s;
+ }
+
+ .logout-btn {
+ background: transparent;
+ color: #f43f7a;
+ border: 1px solid #f43f7a33;
+ }
+
+ .login-btn {
+ background: #f43f7a;
+ color: white;
+ border: none;
+ }
+ }
+ }
+
+ /* ================== HERO ================== */
.hero {
text-align: center;
- margin-bottom: 2.5rem;
+ margin-bottom: 1.6rem;
h1 {
- font-size: 2rem;
+ font-size: 1.85rem;
font-weight: 700;
color: #fff;
letter-spacing: -0.5px;
- margin-bottom: 0.6rem;
+ margin-bottom: 0.5rem;
span {
color: #f43f7a;
@@ -28,58 +76,47 @@
}
p {
- font-size: 0.9rem;
+ font-size: 0.93rem;
color: #94a3b8;
- max-width: 440px;
+ max-width: 460px;
margin: 0 auto;
- line-height: 1.6;
+ line-height: 1.5;
}
}
- // ✅ Stats Banner - Report Count
+ /* ================== STATS BANNER ================== */
.stats-banner {
display: flex;
justify-content: center;
align-items: center;
- gap: 2rem;
- max-width: 500px;
- margin: 0 auto 2rem auto;
- background: linear-gradient(135deg, #1a1f2e 0%, #131720 100%);
+ gap: 1.5rem;
+ max-width: 460px;
+ margin: 0 auto 1.8rem auto;
+ background: #161b26;
border: 1px solid #2d3348;
border-radius: 12px;
- padding: 1rem 1.5rem;
+ padding: 0.9rem 1.5rem;
.stat-item {
display: flex;
align-items: center;
- gap: 0.75rem;
-
- .stat-icon {
- width: 40px;
- height: 40px;
- background: linear-gradient(135deg, #3d1a2a 0%, #2d1a2a 100%);
- border-radius: 10px;
- display: flex;
- align-items: center;
- justify-content: center;
- color: #f43f7a;
- }
+ gap: 0.7rem;
+ }
- .stat-content {
- display: flex;
- flex-direction: column;
+ .stat-content {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ }
- .stat-value {
- font-size: 1.25rem;
- font-weight: 700;
- color: #f8fafc;
- }
+ .stat-value {
+ font-size: 1.22rem;
+ font-weight: 700;
+ }
- .stat-label {
- font-size: 0.75rem;
- color: #64748b;
- }
- }
+ .stat-label {
+ font-size: 0.74rem;
+ color: #64748b;
}
.stat-divider {
@@ -87,24 +124,14 @@
height: 40px;
background: #2d3348;
}
-
- @media (max-width: 600px) {
- flex-direction: column;
- gap: 1rem;
- padding: 1rem;
-
- .stat-divider {
- width: 100%;
- height: 1px;
- }
- }
}
+ /* ================== TWO COLUMN LAYOUT ================== */
.two-col {
display: grid;
grid-template-columns: 1fr 1fr;
- gap: 1.25rem;
- max-width: 860px;
+ gap: 1.3rem;
+ max-width: 920px;
margin: 0 auto;
@media (max-width: 768px) {
@@ -112,372 +139,171 @@
}
}
+ /* ================== PANEL (Balanced Height) ================== */
.panel {
- background: #1a1f2e;
- border: 0.5px solid #2d3348;
+ background: #161b26;
+ border: 1px solid #2d3348;
border-radius: 14px;
- padding: 1.25rem;
-
- .panel-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 1rem;
- }
+ padding: 1.4rem;
+ display: flex;
+ flex-direction: column;
+ min-height: 470px; /* Dono panels ki height same */
+ }
- .panel-title {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- font-size: 0.92rem;
- font-weight: 600;
- color: #e2e8f0;
- }
+ .panel-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+ }
- .right-panel-title {
- font-size: 0.92rem;
- font-weight: 600;
- color: #e2e8f0;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- margin-bottom: 1rem;
- }
+ .panel-title,
+ .right-panel-title {
+ font-size: 1.02rem;
+ font-weight: 600;
+ color: #e2e8f0;
}
.badge-required {
font-size: 0.7rem;
background: #3d1a2a;
color: #f43f7a;
- border: 0.5px solid #f43f7a55;
- padding: 2px 8px;
+ padding: 3px 9px;
border-radius: 6px;
}
.badge-best {
- font-size: 0.7rem;
color: #f43f7a;
+ font-size: 0.76rem;
}
+ /* Textarea */
textarea {
width: 100%;
- height: 220px;
- background: #131720;
- border: 0.5px solid #2d3348;
+ background: #0f141f;
+ border: 1px solid #334155;
border-radius: 10px;
- color: #94a3b8;
- font-size: 0.82rem;
- padding: 0.85rem 1rem;
+ color: #cbd5e1;
+ padding: 0.9rem;
+ font-size: 0.9rem;
resize: none;
outline: none;
- line-height: 1.6;
- font-family: system-ui;
+ line-height: 1.5;
&.self-desc {
- height: 90px;
- }
-
- &::placeholder {
- color: #4a5568;
+ height: 82px;
}
}
.char-count {
text-align: right;
- font-size: 0.72rem;
- color: #4a5568;
- margin-top: 0.4rem;
-
- &--warning {
- color: #fbbf24;
- font-weight: 600;
- }
- }
-
- .upload-label {
- font-size: 0.82rem;
- color: #94a3b8;
- margin-bottom: 0.5rem;
+ font-size: 0.73rem;
+ color: #64748b;
+ margin-top: 5px;
}
+ /* Upload Area */
.upload-area {
- border: 1.5px dashed #2d3348;
- border-radius: 10px;
- padding: 2rem 1rem;
+ border: 2px dashed #475569;
+ background: #0f141f;
+ border-radius: 12px;
+ padding: 2.2rem 1rem;
text-align: center;
cursor: pointer;
- background: #131720;
- transition: border-color 0.2s;
+ transition: all 0.3s ease;
&:hover {
- border-color: #f43f7a66;
- }
-
- &--has-file {
- background: rgba(74, 222, 128, 0.05);
- border-color: rgba(74, 222, 128, 0.3);
- border-style: solid;
+ border-color: #f43f7a;
+ background: #1a2333;
}
.upload-icon {
- width: 38px;
- height: 38px;
- background: #3d1a2a;
+ width: 46px;
+ height: 46px;
+ background: #2a1f2e;
border-radius: 50%;
+ margin: 0 auto 0.8rem;
display: flex;
align-items: center;
justify-content: center;
- margin: 0 auto 0.75rem;
-
- svg {
- width: 18px;
- height: 18px;
- fill: #f43f7a;
- }
+ font-size: 1.4rem;
}
.upload-text {
- font-size: 0.82rem;
- color: #e2e8f0;
- margin-bottom: 0.25rem;
+ font-size: 0.94rem;
+ margin-bottom: 4px;
}
.upload-sub {
- font-size: 0.72rem;
- color: #4a5568;
- }
-
- .file-info {
- display: flex;
- align-items: center;
- gap: 0.75rem;
- width: 100%;
- padding: 0.5rem;
-
- svg {
- color: #4ade80;
- flex-shrink: 0;
- }
-
- .file-details {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
-
- .file-name {
- color: #e2e8f0;
- font-size: 0.9rem;
- font-weight: 500;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .file-size {
- color: #64748b;
- font-size: 0.75rem;
- }
- }
-
- .file-remove {
- background: rgba(244, 63, 122, 0.1);
- border: none;
- color: #f43f7a;
- width: 28px;
- height: 28px;
- border-radius: 6px;
- cursor: pointer;
- font-size: 1.2rem;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.2s;
-
- &:hover {
- background: rgba(244, 63, 122, 0.2);
- }
- }
+ font-size: 0.77rem;
+ color: #64748b;
}
}
+ /* Divider */
.divider {
display: flex;
align-items: center;
- gap: 0.75rem;
- margin: 1rem 0;
+ gap: 10px;
+ margin: 1.2rem 0;
.divider-line {
flex: 1;
- height: 0.5px;
- background: #2d3348;
+ height: 1px;
+ background: #334155;
}
.divider-text {
- font-size: 0.72rem;
- color: #4a5568;
+ font-size: 0.74rem;
+ color: #64748b;
}
}
.section-label {
- font-size: 0.82rem;
+ font-size: 0.88rem;
color: #94a3b8;
margin-bottom: 0.5rem;
}
- .info-box {
- background: #1a2540;
- border: 0.5px solid #2d4a8a;
- border-radius: 8px;
- padding: 0.75rem 1rem;
- display: flex;
- gap: 0.6rem;
- align-items: flex-start;
- margin-top: 0.75rem;
-
- .info-dot {
- width: 14px;
- height: 14px;
- background: #2563eb;
- border-radius: 50%;
- flex-shrink: 0;
- margin-top: 2px;
- }
-
- .info-text {
- font-size: 0.75rem;
- color: #94a3b8;
- line-height: 1.5;
-
- strong {
- color: #e2e8f0;
- font-weight: 600;
- }
- }
- }
-
+ /* Button Group */
.button-group {
+ margin-top: auto;
display: flex;
- gap: 1rem;
- margin-top: 1rem;
+ gap: 10px;
.secondary-button {
flex: 1;
- padding: 0.75rem;
+ padding: 13px;
background: transparent;
color: #94a3b8;
- border: 1px solid #334155;
+ border: 1px solid #475569;
border-radius: 10px;
- font-size: 0.9rem;
font-weight: 600;
- cursor: pointer;
- transition: all 0.25s;
-
- &:hover {
- border-color: #64748b;
- color: #e2e8f0;
- }
}
.primary-button {
flex: 2;
- padding: 0.75rem;
- background: #f43f7a;
- color: #fff;
+ padding: 13px;
+ background: linear-gradient(135deg, #f43f7a, #e11d62);
+ color: white;
border: none;
border-radius: 10px;
- font-size: 0.9rem;
font-weight: 600;
- cursor: pointer;
- transition: all 0.25s;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 0.5rem;
- box-shadow: 0 4px 15px rgba(244, 63, 122, 0.3);
-
- &:hover {
- background: #e11d62;
- transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(244, 63, 122, 0.4);
- }
-
- .btn-spinner {
- width: 16px;
- height: 16px;
- border: 2px solid rgba(255, 255, 255, 0.3);
- border-top-color: #fff;
- border-radius: 50%;
- animation: spin 0.8s linear infinite;
- }
}
}
}
-// Error Banner
+/* Error Banner */
.error-banner {
- max-width: 700px;
- margin: 0 auto 1.5rem auto;
+ max-width: 920px;
+ margin: 1rem auto 1.3rem auto;
background: #3d1a2a;
- border: 1px solid rgba(244, 63, 122, 0.4);
+ border: 1px solid #f43f7a44;
border-radius: 10px;
- padding: 0.9rem 1.25rem;
+ padding: 0.9rem 1.2rem;
color: #f43f7a;
font-size: 0.88rem;
display: flex;
align-items: center;
- gap: 0.6rem;
-
- .error-close {
- margin-left: auto;
- background: transparent;
- border: none;
- color: #f43f7a;
- cursor: pointer;
- font-size: 1.2rem;
- padding: 0;
- line-height: 1;
- opacity: 0.7;
-
- &:hover {
- opacity: 1;
- }
- }
-}
-
-// Loading Screen
-.loading-screen {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: 1.5rem;
- min-height: 100vh;
- background: #0f1117;
- color: #e2e8f0;
-
- .loading-spinner {
- width: 48px;
- height: 48px;
- border: 3px solid #2d3348;
- border-top-color: #f43f7a;
- border-radius: 50%;
- animation: spin 0.8s linear infinite;
- }
-
- h1 {
- font-size: 1.5rem;
- font-weight: 600;
- }
-
- p {
- color: #64748b;
- font-size: 0.9rem;
- }
-}
-
-@keyframes spin {
- to {
- transform: rotate(360deg);
- }
+ gap: 10px;
}
\ No newline at end of file
diff --git a/client/src/features/auth/interview/pages/style/interview.scss b/client/src/features/auth/interview/pages/style/interview.scss
index 4d37301..6daa7fc 100644
--- a/client/src/features/auth/interview/pages/style/interview.scss
+++ b/client/src/features/auth/interview/pages/style/interview.scss
@@ -29,32 +29,19 @@
height: 100vh;
overflow: hidden;
- @media (max-width: 1200px) {
- grid-template-columns: 240px auto 1fr auto;
- }
-
- @media (max-width: 1024px) {
- grid-template-columns: 220px auto 1fr;
- }
-
- @media (max-width: 768px) {
- grid-template-columns: 1fr;
- height: auto;
- min-height: 100vh;
- overflow: visible;
- }
+ @media (max-width: 1200px) { grid-template-columns: 240px auto 1fr auto; }
+ @media (max-width: 1024px) { grid-template-columns: 220px auto 1fr; }
+ @media (max-width: 768px) { grid-template-columns: 1fr; height: auto; min-height: 100vh; overflow: visible; }
}
.interview-divider {
width: 1px;
background: linear-gradient(180deg, #2d3348 0%, #1e2433 100%);
height: 100%;
-
- @media (max-width: 768px) {
- display: none;
- }
+ @media (max-width: 768px) { display: none; }
}
+// ── Nav ───────────────────────────────────────────────────────────────────────
.interview-nav {
background: linear-gradient(180deg, #13171f 0%, #0f1117 100%);
padding: 1.5rem 1rem;
@@ -103,10 +90,7 @@
letter-spacing: 0.15em;
margin-bottom: 0.5rem;
padding-left: 0.5rem;
-
- @media (max-width: 768px) {
- display: none;
- }
+ @media (max-width: 768px) { display: none; }
}
.interview-nav__item {
@@ -149,9 +133,7 @@
color: #64748b;
}
- &.interview-nav__item--active .interview-nav__icon {
- color: #f43f7a;
- }
+ &.interview-nav__item--active .interview-nav__icon { color: #f43f7a; }
@media (max-width: 768px) {
width: auto;
@@ -182,15 +164,11 @@
box-shadow: 0 6px 20px rgba(244, 63, 122, 0.4);
}
- @media (max-width: 768px) {
- padding: 0.6rem 1rem;
- font-size: 0.8rem;
- margin-top: 0;
- }
+ @media (max-width: 768px) { padding: 0.6rem 1rem; font-size: 0.8rem; }
}
}
-// ✅ Main content area
+// ── Content ───────────────────────────────────────────────────────────────────
.interview-content {
padding: 0;
overflow-y: auto;
@@ -201,11 +179,7 @@
display: flex;
flex-direction: column;
- @media (max-width: 768px) {
- height: auto;
- overflow-y: visible;
- padding: 0;
- }
+ @media (max-width: 768px) { height: auto; overflow-y: visible; padding: 0; }
section {
display: flex;
@@ -215,7 +189,6 @@
min-height: 100%;
}
- // ✅ Content Header
.content-header {
position: sticky;
top: 0;
@@ -236,12 +209,7 @@
padding: 1.5rem 2rem;
width: 100%;
- @media (max-width: 768px) {
- flex-direction: column;
- align-items: flex-start;
- padding: 1rem;
- gap: 1rem;
- }
+ @media (max-width: 768px) { flex-direction: column; align-items: flex-start; padding: 1rem; gap: 1rem; }
.content-header__title-row {
display: flex;
@@ -284,14 +252,10 @@
white-space: nowrap;
flex-shrink: 0;
- &::before {
- content: '📋';
- font-size: 0.95rem;
- }
+ &::before { content: '📋'; font-size: 0.95rem; }
}
}
- // ✅ Search Box
.search-box {
display: flex;
align-items: center;
@@ -309,10 +273,7 @@
background: #0f172a;
}
- svg {
- color: #64748b;
- flex-shrink: 0;
- }
+ svg { color: #64748b; flex-shrink: 0; }
input {
background: transparent;
@@ -322,10 +283,7 @@
font-size: 0.9rem;
width: 220px;
padding: 0;
-
- &::placeholder {
- color: #64748b;
- }
+ &::placeholder { color: #64748b; }
}
.search-box__clear {
@@ -340,34 +298,23 @@
font-size: 1.2rem;
line-height: 1;
transition: color 0.2s;
-
- &:hover {
- color: #f43f7a;
- }
+ &:hover { color: #f43f7a; }
}
}
}
}
- // ✅ Question List
.q-list {
display: flex;
flex-direction: column;
gap: 1rem;
padding: 1.5rem 2rem 2rem;
width: 100%;
-
- @media (max-width: 768px) {
- padding: 1rem;
- }
-
- .q-card:first-child {
- margin-top: 0;
- }
+ @media (max-width: 768px) { padding: 1rem; }
}
}
-// ✅ Question Card
+// ── Question Card ─────────────────────────────────────────────────────────────
.q-card {
background: linear-gradient(135deg, #1a1f2e 0%, #151922 100%);
border: 1px solid #2d3348;
@@ -376,17 +323,8 @@
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- &:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
- border-color: #3d4559;
- }
-
- &.q-card--open {
- border-color: #f43f7a;
- box-shadow: 0 8px 30px rgba(244, 63, 122, 0.1);
- background: linear-gradient(135deg, #1e2433 0%, #1a1f2e 100%);
- }
+ &:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0,0,0,0.15); border-color: #3d4559; }
+ &.q-card--open { border-color: #f43f7a; box-shadow: 0 8px 30px rgba(244,63,122,0.1); background: linear-gradient(135deg, #1e2433 0%, #1a1f2e 100%); }
.q-card__header {
display: flex;
@@ -395,10 +333,7 @@
padding: 1.25rem 1.5rem;
cursor: pointer;
transition: background 0.2s;
-
- &:hover {
- background: rgba(255, 255, 255, 0.02);
- }
+ &:hover { background: rgba(255,255,255,0.02); }
.q-card__index {
font-size: 0.85rem;
@@ -410,18 +345,11 @@
flex-shrink: 0;
min-width: 42px;
text-align: center;
- border: 1px solid rgba(244, 63, 122, 0.2);
+ border: 1px solid rgba(244,63,122,0.2);
line-height: 1.2;
}
- .q-card__question {
- flex: 1;
- font-size: 1rem;
- color: #f8fafc;
- font-weight: 600;
- line-height: 1.6;
- margin: 0;
- }
+ .q-card__question { flex: 1; font-size: 1rem; color: #f8fafc; font-weight: 600; line-height: 1.6; margin: 0; }
.q-card__chevron {
color: #64748b;
@@ -429,19 +357,11 @@
transition: transform 0.3s ease;
padding: 0.5rem;
border-radius: 6px;
- background: rgba(255, 255, 255, 0.05);
+ background: rgba(255,255,255,0.05);
display: flex;
align-items: center;
-
- &:hover {
- background: rgba(255, 255, 255, 0.1);
- }
-
- &.q-card__chevron--open {
- transform: rotate(180deg);
- color: #f43f7a;
- background: rgba(244, 63, 122, 0.1);
- }
+ &:hover { background: rgba(255,255,255,0.1); }
+ &.q-card__chevron--open { transform: rotate(180deg); color: #f43f7a; background: rgba(244,63,122,0.1); }
}
}
@@ -453,14 +373,8 @@
animation: slideDown 0.3s ease;
@keyframes slideDown {
- from {
- opacity: 0;
- transform: translateY(-10px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
+ from { opacity: 0; transform: translateY(-10px); }
+ to { opacity: 1; transform: translateY(0); }
}
.q-card__section {
@@ -469,63 +383,7 @@
padding: 1.25rem;
border: 1px solid #2d3348;
- &.q-card__section--answer {
- border-color: rgba(124, 58, 237, 0.2);
- background: linear-gradient(135deg, #1a1025 0%, #0f1117 100%);
- }
-
- .q-card__section-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 0.75rem;
- flex-wrap: wrap;
- gap: 0.5rem;
-
- .q-card__difficulty, .q-card__time {
- font-size: 0.75rem;
- color: #64748b;
- font-weight: 500;
- background: rgba(100, 116, 139, 0.1);
- padding: 0.2rem 0.6rem;
- border-radius: 4px;
- }
- }
-
- p {
- font-size: 0.92rem;
- color: #cbd5e1;
- line-height: 1.85;
- margin: 0;
- white-space: pre-line;
- word-break: break-word;
- }
-
- .q-card__answer-content {
- p {
- margin-bottom: 1rem;
- }
-
- .q-card__tips {
- background: rgba(244, 63, 122, 0.05);
- border-left: 3px solid #f43f7a;
- padding: 1rem;
- border-radius: 0 8px 8px 0;
- margin-top: 1rem;
-
- strong {
- color: #f43f7a;
- display: block;
- margin-bottom: 0.5rem;
- font-size: 0.85rem;
- }
-
- p {
- color: #94a3b8;
- font-size: 0.85rem;
- }
- }
- }
+ p { font-size: 0.92rem; color: #cbd5e1; line-height: 1.85; margin: 0; white-space: pre-line; word-break: break-word; }
}
.q-card__tag {
@@ -538,32 +396,20 @@
display: inline-flex;
align-items: center;
gap: 0.4rem;
+ margin-bottom: 0.75rem;
- &.q-card__tag--intention {
- background: linear-gradient(135deg, #064e3b 0%, #065f46 100%);
- color: #34d399;
- border: 1px solid rgba(16, 185, 129, 0.2);
- }
-
- &.q-card__tag--answer {
- background: linear-gradient(135deg, #3b0764 0%, #4c1d95 100%);
- color: #a78bfa;
- border: 1px solid rgba(139, 92, 246, 0.2);
- }
+ &.q-card__tag--intention { background: linear-gradient(135deg,#064e3b,#065f46); color: #34d399; border: 1px solid rgba(16,185,129,0.2); }
+ &.q-card__tag--answer { background: linear-gradient(135deg,#3b0764,#4c1d95); color: #a78bfa; border: 1px solid rgba(139,92,246,0.2); }
}
}
}
-// ✅ Roadmap Timeline
+// ── Roadmap ───────────────────────────────────────────────────────────────────
.roadmap-timeline {
display: flex;
flex-direction: column;
- padding-left: 0.5rem;
padding: 1.5rem 2rem 2rem;
-
- @media (max-width: 768px) {
- padding: 1rem;
- }
+ @media (max-width: 768px) { padding: 1rem; }
}
.roadmap-item {
@@ -571,39 +417,11 @@
gap: 0;
position: relative;
- &:last-child {
- .roadmap-item__connector {
- display: none;
- }
- }
-
- .roadmap-item__line {
- display: flex;
- flex-direction: column;
- align-items: center;
- flex-shrink: 0;
- width: 32px;
- padding-top: 0.85rem;
- }
-
- .roadmap-item__dot {
- width: 12px;
- height: 12px;
- border-radius: 50%;
- background: #f43f7a;
- border: 2px solid #3d1a2a;
- box-shadow: 0 0 8px rgba(244, 63, 122, 0.4);
- flex-shrink: 0;
- z-index: 1;
- }
+ &:last-child .roadmap-item__connector { display: none; }
- .roadmap-item__connector {
- width: 2px;
- flex: 1;
- min-height: 20px;
- background: linear-gradient(to bottom, rgba(244, 63, 122, 0.33), rgba(45, 51, 72, 0.53));
- margin-top: 4px;
- }
+ .roadmap-item__line { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; width: 32px; padding-top: 0.85rem; }
+ .roadmap-item__dot { width: 12px; height: 12px; border-radius: 50%; background: #f43f7a; border: 2px solid #3d1a2a; box-shadow: 0 0 8px rgba(244,63,122,0.4); flex-shrink: 0; z-index: 1; }
+ .roadmap-item__connector { width: 2px; flex: 1; min-height: 20px; background: linear-gradient(to bottom,rgba(244,63,122,0.33),rgba(45,51,72,0.53)); margin-top: 4px; }
.roadmap-item__card {
flex: 1;
@@ -613,36 +431,11 @@
padding: 1rem;
margin-bottom: 0.75rem;
transition: border-color 0.2s;
+ &:hover { border-color: rgba(244,63,122,0.27); }
- &:hover {
- border-color: rgba(244, 63, 122, 0.27);
- }
-
- .roadmap-item__header {
- display: flex;
- align-items: center;
- flex-wrap: wrap;
- gap: 0.65rem;
- margin-bottom: 0.6rem;
- }
-
- .roadmap-item__badge {
- font-size: 0.7rem;
- font-weight: 700;
- color: #f43f7a;
- background: #3d1a2a;
- border-radius: 5px;
- padding: 0.15rem 0.5rem;
- white-space: nowrap;
- flex-shrink: 0;
- }
-
- .roadmap-item__focus {
- font-size: 0.95rem;
- color: #e2e8f0;
- font-weight: 600;
- line-height: 1.3;
- }
+ .roadmap-item__header { display: flex; align-items: center; flex-wrap: wrap; gap: 0.65rem; margin-bottom: 0.6rem; }
+ .roadmap-item__badge { font-size: 0.7rem; font-weight: 700; color: #f43f7a; background: #3d1a2a; border-radius: 5px; padding: 0.15rem 0.5rem; white-space: nowrap; flex-shrink: 0; }
+ .roadmap-item__focus { font-size: 0.95rem; color: #e2e8f0; font-weight: 600; line-height: 1.3; }
.roadmap-item__tasks {
list-style: none;
@@ -651,42 +444,13 @@
gap: 0.45rem;
padding-left: 0.25rem;
- li {
- font-size: 0.85rem;
- color: #94a3b8;
- line-height: 1.6;
- display: flex;
- align-items: flex-start;
- gap: 0.5rem;
-
- a {
- color: #60a5fa;
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- }
- }
-
- strong {
- color: #e2e8f0;
- font-weight: 600;
- }
- }
-
- .roadmap-item__bullet {
- width: 5px;
- height: 5px;
- border-radius: 50%;
- background: rgba(244, 63, 122, 0.53);
- flex-shrink: 0;
- margin-top: 0.5rem;
- }
+ li { font-size: 0.85rem; color: #94a3b8; line-height: 1.6; display: flex; align-items: flex-start; gap: 0.5rem; }
+ .roadmap-item__bullet { width: 5px; height: 5px; border-radius: 50%; background: rgba(244,63,122,0.53); flex-shrink: 0; margin-top: 0.5rem; }
}
}
}
-// ✅ Right Sidebar - FIXED Match Score
+// ── Right Sidebar ─────────────────────────────────────────────────────────────
.interview-sidebar {
background: linear-gradient(180deg, #13171f 0%, #0f1117 100%);
padding: 1.5rem 1rem;
@@ -695,10 +459,7 @@
position: sticky;
top: 0;
border-left: 1px solid #2d3348;
-
- @media (max-width: 1024px) {
- display: none;
- }
+ @media (max-width: 1024px) { display: none; }
.match-score {
display: flex;
@@ -706,247 +467,497 @@
align-items: center;
margin-bottom: 1.5rem;
- .match-score__label {
- font-size: 0.7rem;
- font-weight: 700;
- color: #64748b;
- text-transform: uppercase;
- letter-spacing: 0.15em;
- margin-bottom: 1rem;
- }
+ .match-score__label { font-size: 0.7rem; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: 0.15em; margin-bottom: 1rem; }
- // ✅ FIXED: Circular Progress Ring with SVG
.match-score__ring {
position: relative;
width: 120px;
height: 120px;
margin-bottom: 0.6rem;
- .score-circle {
- width: 100%;
- height: 100%;
- transform: scaleX(-1);
+ .score-circle { width: 100%; height: 100%; transform: scaleX(-1); }
+ .score-circle__bg { fill: none; stroke: #1a1f2e; stroke-width: 8; }
+ .score-circle__progress {
+ fill: none; stroke-width: 8; stroke-linecap: round; transition: stroke-dashoffset 1s ease-in-out;
+ &.score--high { stroke: #4ade80; filter: drop-shadow(0 0 8px rgba(74,222,128,0.4)); }
+ &.score--mid { stroke: #fbbf24; filter: drop-shadow(0 0 8px rgba(251,191,36,0.4)); }
+ &.score--low { stroke: #f43f7a; filter: drop-shadow(0 0 8px rgba(244,63,122,0.4)); }
+ }
- .score-circle__bg {
- fill: none;
- stroke: #1a1f2e;
- stroke-width: 8;
- }
+ .score-circle__content {
+ position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
+ display: flex; align-items: baseline; justify-content: center;
+ .match-score__value { font-size: 2rem; font-weight: 700; color: #e2e8f0; line-height: 1; }
+ .match-score__pct { font-size: 0.85rem; color: #94a3b8; margin-left: 2px; }
+ }
+ }
- .score-circle__progress {
- fill: none;
- stroke-width: 8;
- stroke-linecap: round;
- transition: stroke-dashoffset 1s ease-in-out;
+ .match-score__sub {
+ font-size: 0.78rem; text-align: center; font-weight: 500; padding: 0 0.5rem;
+ &.score--high { color: #4ade80; }
+ &.score--mid { color: #fbbf24; }
+ &.score--low { color: #f43f7a; }
+ }
+ }
- &.score--high {
- stroke: #4ade80;
- filter: drop-shadow(0 0 8px rgba(74, 222, 128, 0.4));
- }
+ .sidebar-divider { height: 1px; background: #2d3348; margin-bottom: 1.5rem; }
- &.score--mid {
- stroke: #fbbf24;
- filter: drop-shadow(0 0 8px rgba(251, 191, 36, 0.4));
- }
+ .skill-gaps {
+ .skill-gaps__label { font-size: 0.7rem; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: 0.15em; margin-bottom: 0.75rem; }
+ .skill-gaps__list { display: flex; flex-direction: column; gap: 0.5rem; }
+ }
+}
- &.score--low {
- stroke: #f43f7a;
- filter: drop-shadow(0 0 8px rgba(244, 63, 122, 0.4));
- }
- }
- }
+.skill-tag {
+ font-size: 0.8rem; border-radius: 6px; padding: 0.5rem 0.85rem; border: 1px solid; font-weight: 500;
+ display: inline-block; transition: all 0.2s;
+ &:hover { transform: translateX(4px); }
+ &.skill-tag--low { color: #4ade80; background: rgba(15,42,26,0.5); border-color: rgba(74,222,128,0.27); }
+ &.skill-tag--medium { color: #fbbf24; background: rgba(42,31,15,0.5); border-color: rgba(251,191,36,0.27); }
+ &.skill-tag--high { color: #f43f7a; background: rgba(61,26,42,0.5); border-color: rgba(244,63,122,0.27); }
+}
- .score-circle__content {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- display: flex;
- align-items: baseline;
- justify-content: center;
+// ── Loading ───────────────────────────────────────────────────────────────────
+.loading-screen {
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
+ gap: 1.5rem; width: 100vw; height: 100vh; background: #0f1117; color: #94a3b8; font-size: 1.1rem;
- .match-score__value {
- font-size: 2rem;
- font-weight: 700;
- color: #e2e8f0;
- line-height: 1;
- }
+ .loading-screen__spinner { width: 48px; height: 48px; border: 3px solid #2d3348; border-top-color: #f43f7a; border-radius: 50%; animation: spin 0.8s linear infinite; }
+}
- .match-score__pct {
- font-size: 0.85rem;
- color: #94a3b8;
- margin-left: 2px;
- }
- }
- }
+.empty-state { text-align: center; padding: 3rem 2rem; color: #64748b; p { font-size: 0.9rem; } }
- .match-score__sub {
- font-size: 0.78rem;
- text-align: center;
- font-weight: 500;
- padding: 0 0.5rem;
+@keyframes spin { to { transform: rotate(360deg); } }
- &.score--high {
- color: #4ade80;
- }
+.interview-content {
+ .q-list { margin-top: 0 !important; padding-top: 1.5rem !important; }
+ .q-card:first-child { margin-top: 0 !important; }
+ section { display: flex; flex-direction: column; min-height: 100%; }
+}
+.content-header { box-shadow: 0 4px 12px rgba(0,0,0,0.3) !important; z-index: 100 !important; }
- &.score--mid {
- color: #fbbf24;
- }
- &.score--low {
- color: #f43f7a;
- }
+// ═════════════════════════════════════════════════════════════════════════════
+// VOICE RECORDER (.vr & .vrf)
+// ═════════════════════════════════════════════════════════════════════════════
+
+.vr {
+ margin-top: 0.25rem;
+
+ // ── Toggle button ──────────────────────────────────────────────────────
+ &__toggle {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ width: 100%;
+ padding: 0.6rem 1rem;
+ background: rgba(244, 63, 122, 0.06);
+ border: 1px dashed rgba(244, 63, 122, 0.3);
+ border-radius: 8px;
+ color: #f43f7a;
+ font-size: 0.82rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s;
+ letter-spacing: 0.01em;
+
+ span { flex: 1; text-align: left; }
+
+ &:hover {
+ background: rgba(244, 63, 122, 0.12);
+ border-style: solid;
+ transform: none;
+ }
+
+ &-chevron {
+ transition: transform 0.25s;
+ opacity: 0.7;
+ &.open { transform: rotate(180deg); }
}
}
- .sidebar-divider {
- height: 1px;
- background: #2d3348;
- margin-bottom: 1.5rem;
+ // ── Panel ─────────────────────────────────────────────────────────────
+ &__panel {
+ margin-top: 0.6rem;
+ background: linear-gradient(135deg, #12151e 0%, #0d1018 100%);
+ border: 1px solid #252b3b;
+ border-radius: 10px;
+ padding: 1.25rem;
+ animation: vrSlide 0.2s ease;
}
- .skill-gaps {
- .skill-gaps__label {
- font-size: 0.7rem;
- font-weight: 700;
- color: #64748b;
- text-transform: uppercase;
- letter-spacing: 0.15em;
- margin-bottom: 0.75rem;
+ // ── Alert ─────────────────────────────────────────────────────────────
+ &__alert {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
+ padding: 0.7rem 0.9rem;
+ border-radius: 8px;
+ font-size: 0.82rem;
+ margin-bottom: 1rem;
+
+ &--err {
+ background: rgba(248, 113, 113, 0.08);
+ border: 1px solid rgba(248, 113, 113, 0.25);
+ color: #fca5a5;
+ span { font-size: 0.9rem; flex-shrink: 0; }
}
+ }
- .skill-gaps__list {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
- }
+ // ── Idle state ────────────────────────────────────────────────────────
+ &__idle {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 1rem 0;
}
-}
-// ✅ Skill Tags
-.skill-tag {
- font-size: 0.8rem;
- border-radius: 6px;
- padding: 0.5rem 0.85rem;
- border: 1px solid;
- font-weight: 500;
- display: inline-block;
- transition: all 0.2s;
+ &__idle-icon {
+ width: 52px;
+ height: 52px;
+ border-radius: 50%;
+ background: rgba(244, 63, 122, 0.08);
+ border: 1px solid rgba(244, 63, 122, 0.2);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #f43f7a;
+ }
- &:hover {
- transform: translateX(4px);
+ &__idle-hint {
+ font-size: 0.8rem;
+ color: #64748b;
+ text-align: center;
+ max-width: 260px;
+ line-height: 1.5;
}
- &.skill-tag--low {
- color: #4ade80;
- background: rgba(15, 42, 26, 0.5);
- border-color: rgba(74, 222, 128, 0.27);
+ // ── Recording state ───────────────────────────────────────────────────
+ &__recording {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.9rem;
+ padding: 0.5rem 0 0.75rem;
}
- &.skill-tag--medium {
- color: #fbbf24;
- background: rgba(42, 31, 15, 0.5);
- border-color: rgba(251, 191, 36, 0.27);
+ &__waveform {
+ display: flex;
+ align-items: center;
+ gap: 3px;
+ height: 36px;
+ }
+
+ &__bar {
+ display: inline-block;
+ width: 3px;
+ border-radius: 2px;
+ background: linear-gradient(to top, #f43f7a, #ec276b);
+ animation: vrWave 0.8s ease-in-out infinite alternate;
+ height: 12px;
+
+ &:nth-child(odd) { animation-duration: 0.6s; }
+ &:nth-child(3n) { animation-duration: 1s; }
+ &:nth-child(4n) { background: linear-gradient(to top, #7c3aed, #a78bfa); }
}
- &.skill-tag--high {
+ &__timer {
+ font-size: 1.5rem;
+ font-weight: 700;
color: #f43f7a;
- background: rgba(61, 26, 42, 0.5);
- border-color: rgba(244, 63, 122, 0.27);
+ font-variant-numeric: tabular-nums;
+ letter-spacing: 0.04em;
}
-}
-// ✅ Loading Screen
-.loading-screen {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: 1.5rem;
- width: 100vw;
- height: 100vh;
- background: #0f1117;
- color: #94a3b8;
- font-size: 1.1rem;
-
- .loading-screen__spinner {
- width: 48px;
- height: 48px;
- border: 3px solid #2d3348;
- border-top-color: #f43f7a;
- border-radius: 50%;
- animation: spin 0.8s linear infinite;
+ // ── Recorded state ────────────────────────────────────────────────────
+ &__recorded {
+ display: flex;
+ flex-direction: column;
+ gap: 0.85rem;
+ }
+
+ &__playback-row {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ }
+
+ &__audio {
+ flex: 1;
+ height: 34px;
+ filter: invert(1) hue-rotate(180deg) saturate(0.8);
+ border-radius: 6px;
}
- .loading-screen__text {
- font-size: 1rem;
+ &__dur-badge {
+ font-size: 0.75rem;
+ font-weight: 700;
color: #64748b;
+ background: #1e293b;
+ border: 1px solid #334155;
+ border-radius: 6px;
+ padding: 0.25rem 0.6rem;
+ white-space: nowrap;
+ flex-shrink: 0;
}
-}
-// ✅ Questions Loading State
-.questions-loading {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 3rem;
- gap: 1rem;
+ &__action-row {
+ display: flex;
+ gap: 0.65rem;
+ flex-wrap: wrap;
+ }
- .spinner {
- width: 36px;
- height: 36px;
- border: 3px solid #2d3348;
- border-top-color: #f43f7a;
+ // ── Buttons ───────────────────────────────────────────────────────────
+ &__btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.45rem;
+ padding: 0.65rem 1.1rem;
+ border-radius: 8px;
+ border: none;
+ font-size: 0.85rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s;
+
+ &--record {
+ background: linear-gradient(135deg, #f43f7a, #ec276b);
+ color: #fff;
+ box-shadow: 0 4px 14px rgba(244, 63, 122, 0.3);
+ &:hover { transform: translateY(-1px); box-shadow: 0 6px 18px rgba(244, 63, 122, 0.4); }
+ }
+
+ &--stop {
+ background: rgba(248, 113, 113, 0.1);
+ color: #fca5a5;
+ border: 1px solid rgba(248, 113, 113, 0.25);
+ &:hover { background: rgba(248, 113, 113, 0.18); }
+ }
+
+ &--feedback {
+ background: linear-gradient(135deg, #7c3aed, #6d28d9);
+ color: #fff;
+ box-shadow: 0 4px 14px rgba(124, 58, 237, 0.3);
+ flex: 1;
+ justify-content: center;
+ &:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 6px 18px rgba(124,58,237,0.4); }
+ &:disabled { opacity: 0.55; cursor: not-allowed; transform: none; }
+ }
+
+ &--reset {
+ background: transparent;
+ color: #64748b;
+ border: 1px solid #2d3348;
+ &:hover { color: #94a3b8; border-color: #3d4559; }
+ }
+ }
+
+ // ── Spinner inside button ─────────────────────────────────────────────
+ &__spin {
+ width: 13px;
+ height: 13px;
+ border: 2px solid rgba(255, 255, 255, 0.25);
+ border-top-color: #fff;
border-radius: 50%;
- animation: spin 0.8s linear infinite;
+ animation: spin 0.65s linear infinite;
+ display: inline-block;
+ flex-shrink: 0;
+ }
+
+ // ── Feedback card ─────────────────────────────────────────────────────
+ &__feedback {
+ margin-top: 1rem;
+ background: linear-gradient(135deg, #110e1c 0%, #0d0f18 100%);
+ border: 1px solid rgba(124, 58, 237, 0.22);
+ border-radius: 12px;
+ overflow: hidden;
+ animation: vrSlide 0.3s ease;
}
}
-// ✅ Empty State
-.empty-state {
- text-align: center;
- padding: 3rem 2rem;
- color: #64748b;
+// ── Feedback internals (.vrf) ─────────────────────────────────────────────────
+.vrf {
- h3 {
- font-size: 1.2rem;
- color: #94a3b8;
- margin-bottom: 0.5rem;
+ &__header {
+ display: flex;
+ align-items: center;
+ gap: 0.65rem;
+ padding: 1rem 1.25rem;
+ background: rgba(124, 58, 237, 0.08);
+ border-bottom: 1px solid rgba(124, 58, 237, 0.15);
}
- p {
- font-size: 0.9rem;
+ &__title-row {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ flex: 1;
+ svg { color: #a78bfa; }
}
-}
-// ✅ Spin Animation
-@keyframes spin {
- to {
- transform: rotate(360deg);
+ &__title {
+ font-size: 0.85rem;
+ font-weight: 700;
+ color: #a78bfa;
+ letter-spacing: 0.02em;
}
-}
-// ✅ Final Fixes
-.interview-content {
- .q-list {
- margin-top: 0 !important;
- padding-top: 1.5rem !important;
+ &__overall {
+ display: flex;
+ align-items: baseline;
+ gap: 2px;
+ padding: 0.3rem 0.75rem;
+ border-radius: 8px;
+
+ &--high { background: rgba(74,222,128,0.1); color: #4ade80; }
+ &--mid { background: rgba(251,191,36,0.1); color: #fbbf24; }
+ &--low { background: rgba(244,63,122,0.1); color: #f43f7a; }
}
- .q-card:first-child {
- margin-top: 0 !important;
+ &__overall-num { font-size: 1.35rem; font-weight: 800; line-height: 1; }
+ &__overall-denom { font-size: 0.75rem; font-weight: 600; opacity: 0.7; }
+
+ // metrics
+ &__metrics {
+ padding: 1rem 1.25rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.65rem;
+ border-bottom: 1px solid #1a1f2e;
}
- section {
+ &__metric {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ }
+
+ &__metric-label {
+ font-size: 0.72rem;
+ color: #64748b;
+ font-weight: 600;
+ width: 68px;
+ flex-shrink: 0;
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+ }
+
+ &__metric-track {
+ flex: 1;
+ height: 5px;
+ background: #1e293b;
+ border-radius: 999px;
+ overflow: hidden;
+ }
+
+ &__metric-fill {
+ height: 100%;
+ border-radius: 999px;
+ transition: width 0.9s cubic-bezier(0.4,0,0.2,1);
+
+ &--high { background: linear-gradient(90deg, #4ade80, #86efac); }
+ &--mid { background: linear-gradient(90deg, #fbbf24, #fde68a); }
+ &--low { background: linear-gradient(90deg, #f43f7a, #fb7aa8); }
+ }
+
+ &__metric-val {
+ font-size: 0.72rem;
+ font-weight: 700;
+ width: 24px;
+ text-align: right;
+ flex-shrink: 0;
+
+ &--high { color: #4ade80; }
+ &--mid { color: #fbbf24; }
+ &--low { color: #f43f7a; }
+ }
+
+ // sections
+ &__section {
+ padding: 0.9rem 1.25rem;
+ border-bottom: 1px solid #1a1f2e;
+
+ &:last-child { border-bottom: none; }
+
+ &--strengths {}
+ &--improve {}
+ }
+
+ &__section-label {
+ font-size: 0.72rem;
+ font-weight: 700;
+ color: #64748b;
+ text-transform: uppercase;
+ letter-spacing: 0.07em;
+ margin-bottom: 0.6rem;
+ display: flex;
+ align-items: center;
+ gap: 0.35rem;
+ }
+
+ &__section-emoji { font-size: 0.9rem; }
+
+ &__list {
+ list-style: none;
+ padding: 0;
display: flex;
flex-direction: column;
- min-height: 100%;
+ gap: 0.4rem;
+
+ li {
+ font-size: 0.85rem;
+ color: #cbd5e1;
+ line-height: 1.65;
+ padding-left: 1rem;
+ position: relative;
+
+ &::before { content: '–'; position: absolute; left: 0; color: #a78bfa; font-weight: 700; }
+ }
+ }
+
+ .vrf__section--improve &__list li::before { color: #fbbf24; }
+
+ // pro tip
+ &__protip {
+ padding: 0.9rem 1.25rem;
+ background: rgba(251, 191, 36, 0.04);
+ border-bottom: 1px solid #1a1f2e;
+
+ p { font-size: 0.85rem; color: #fde68a; line-height: 1.65; margin: 0; }
}
+
+ &__protip-badge {
+ font-size: 0.72rem;
+ font-weight: 700;
+ color: #fbbf24;
+ text-transform: uppercase;
+ letter-spacing: 0.07em;
+ display: block;
+ margin-bottom: 0.4rem;
+ }
+
+ // transcript
+ &__transcript {
+ padding: 0.9rem 1.25rem;
+ background: rgba(10, 12, 18, 0.5);
+ }
+
+ &__transcript-text {
+ font-size: 0.82rem !important;
+ color: #475569 !important;
+ line-height: 1.75 !important;
+ font-style: italic;
+ }
+}
+
+// ── Animations ────────────────────────────────────────────────────────────────
+@keyframes vrSlide {
+ from { opacity: 0; transform: translateY(-6px); }
+ to { opacity: 1; transform: translateY(0); }
}
-.content-header {
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3) !important;
- z-index: 100 !important;
+@keyframes vrWave {
+ from { height: 4px; opacity: 0.5; }
+ to { height: 28px; opacity: 1; }
}
\ No newline at end of file
diff --git a/client/src/features/auth/interview/pages/style/landing.scss b/client/src/features/auth/interview/pages/style/landing.scss
new file mode 100644
index 0000000..06979f7
--- /dev/null
+++ b/client/src/features/auth/interview/pages/style/landing.scss
@@ -0,0 +1,153 @@
+/* ====================== landing.scss ====================== */
+
+.landing-page {
+ background: #0a0c14;
+ min-height: 100vh;
+ color: #e2e8f0;
+ font-family: 'Inter', system-ui, sans-serif;
+}
+
+.landing-header {
+ max-width: 1100px;
+ margin: 0 auto;
+ padding: 1.5rem 2rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ h2 {
+ font-size: 1.6rem;
+ font-weight: 700;
+ color: #fff;
+ }
+
+ .header-buttons {
+ display: flex;
+ gap: 12px;
+
+ button {
+ padding: 10px 20px;
+ border-radius: 8px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s;
+ }
+
+ .login-btn {
+ background: transparent;
+ color: #f43f7a;
+ border: 1px solid #f43f7a33;
+ }
+
+ .register-btn {
+ background: #f43f7a;
+ color: white;
+ border: none;
+ }
+ }
+}
+
+.hero-section {
+ max-width: 1100px;
+ margin: 4rem auto 3rem auto;
+ text-align: center;
+ padding: 0 2rem;
+
+ h1 {
+ font-size: 3.2rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin-bottom: 1.2rem;
+ color: #fff;
+
+ span {
+ color: #f43f7a;
+ }
+ }
+
+ p {
+ font-size: 1.15rem;
+ color: #94a3b8;
+ max-width: 620px;
+ margin: 0 auto 2.5rem auto;
+ line-height: 1.6;
+ }
+
+ .hero-buttons {
+ display: flex;
+ justify-content: center;
+ gap: 16px;
+ flex-wrap: wrap;
+
+ .cta-button {
+ padding: 14px 28px;
+ border-radius: 50px;
+ font-size: 1.05rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s;
+
+ &.primary {
+ background: linear-gradient(135deg, #f43f7a, #e11d62);
+ color: white;
+ border: none;
+ box-shadow: 0 8px 25px rgba(244, 63, 122, 0.4);
+ }
+
+ &.secondary {
+ background: transparent;
+ color: #e2e8f0;
+ border: 2px solid #64748b;
+ }
+
+ &:hover {
+ transform: translateY(-3px);
+ }
+ }
+ }
+}
+
+.features {
+ max-width: 1100px;
+ margin: 4rem auto;
+ padding: 0 2rem;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 1.5rem;
+
+ .feature-card {
+ background: #161b26;
+ border: 1px solid #2d3348;
+ border-radius: 14px;
+ padding: 2rem 1.5rem;
+ text-align: center;
+ transition: all 0.3s;
+
+ &:hover {
+ transform: translateY(-8px);
+ border-color: #f43f7a;
+ }
+
+ h3 {
+ font-size: 1.3rem;
+ margin-bottom: 0.8rem;
+ color: #fff;
+ }
+
+ p {
+ color: #94a3b8;
+ line-height: 1.5;
+ }
+ }
+}
+
+/* Responsive */
+@media (max-width: 768px) {
+ .hero-section h1 {
+ font-size: 2.4rem;
+ }
+
+ .landing-header {
+ padding: 1rem 1.5rem;
+ }
+}
\ No newline at end of file
diff --git a/client/src/features/auth/pages/ForgotPassword.jsx b/client/src/features/auth/pages/ForgotPassword.jsx
new file mode 100644
index 0000000..6633978
--- /dev/null
+++ b/client/src/features/auth/pages/ForgotPassword.jsx
@@ -0,0 +1,68 @@
+import React, { useState } from "react";
+import { useNavigate, Link } from "react-router-dom";
+import { sendOtp } from "../services/auth.api";
+import "../auth.form.scss";
+
+const ForgotPassword = () => {
+ const navigate = useNavigate();
+ const [email, setEmail] = useState("");
+ const [error, setError] = useState("");
+ const [loading, setLoading] = useState(false);
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ setError("");
+ setLoading(true);
+
+ try {
+ await sendOtp(email);
+ navigate("/verify-code", { state: { email } });
+ } catch (err) {
+ setError(err?.response?.data?.message || "Something went wrong");
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+
← Back
+
Forgot Password
+
+ Please enter your email to reset the password
+
+
+ {error &&
{error}
}
+
+
+
+
+ Remember password? Login
+
+
+
+ );
+};
+
+export default ForgotPassword;
\ No newline at end of file
diff --git a/client/src/features/auth/pages/Landing.jsx b/client/src/features/auth/pages/Landing.jsx
new file mode 100644
index 0000000..26538ee
--- /dev/null
+++ b/client/src/features/auth/pages/Landing.jsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import { Link } from "react-router-dom";
+import "../interview/pages/style/landing.scss"; // Naya CSS file bana sakte ho ya home.scss mein add kar sakte ho
+
+const Landing = () => {
+ return (
+
+
+
+
+
Master Your Next Interview with AI
+
Upload your resume, paste job description, and get a personalized interview preparation plan in minutes.
+
+
+
+ Start Preparing Now
+
+
+ I already have an account
+
+
+
+
+
+
+
AI-Powered Analysis
+
Smart matching between your profile and job requirements
+
+
+
Personalized Questions
+
Technical + Behavioral questions based on your experience
+
+
+
14-Day Prep Plan
+
Step-by-step roadmap to crack the interview
+
+
+
+ );
+};
+
+export default Landing;
\ No newline at end of file
diff --git a/client/src/features/auth/pages/Login.jsx b/client/src/features/auth/pages/Login.jsx
index e44fe19..9149f98 100644
--- a/client/src/features/auth/pages/Login.jsx
+++ b/client/src/features/auth/pages/Login.jsx
@@ -1,56 +1,116 @@
-import React,{useState} from 'react'
-import {useNavigate,Link} from "react-router"
-import "../auth.form.scss"
-import {useAuth} from "../hooks/useAuth"
+import React, { useState } from "react";
+import { useNavigate, Link } from "react-router-dom";
+import "../auth.form.scss";
+import { useAuth } from "../hooks/useAuth";
+import { GoogleLogin } from "@react-oauth/google";
+
+/**
+ * @component Login
+ * @desc Login page with email/password and Google OAuth
+ * Redirects to /dashboard on success
+ */
const Login = () => {
- const navigate=useNavigate()
- const {loading,handleLogin}=useAuth()
+ const navigate = useNavigate();
+ const { loading, handleLogin, handleGoogleLogin, error, clearError } = useAuth();
+
+ const [email, setEmail] = useState("");
+ const [password, setPassword] = useState("");
+
+ /**
+ * @desc Handle email/password login form submit
+ */
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ clearError();
+
+ const result = await handleLogin({ email, password });
- const [email, setEmail] = useState("")
- const [password, setPassword] = useState("")
+ if (result?.success) {
+ navigate("/dashboard", { replace: true });
+ }
+ };
+ /**
+ * @desc Handle Google OAuth login success
+ */
+ const handleGoogleSuccess = async (credentialResponse) => {
+ clearError();
-const handleSubmit=async (e)=>{
- e.preventDefault()
- await handleLogin({email,password})
- navigate("/")
-}
+ const token = credentialResponse?.credential;
+ if (!token) return;
-if(loading){
- return (
Loading....... )
-}
+ const result = await handleGoogleLogin(token);
+ if (result?.success) {
+ navigate("/dashboard", { replace: true });
+ }
+ };
+ if (loading) {
+ return (
+
+ Loading.......
+
+ );
+ }
return (
-
-
+
+
Login
+ {/* Error message display */}
+ {error &&
{error}
}
+
+ {/* Login form */}
-
Don't have an account? Register
-
-
- )
-}
+ {/* Google OAuth button */}
+
+ console.log("Google Login Failed")}
+ />
+
+
+ {/* Navigation links */}
+
+ Forgot Password?
+
+
+ Don't have an account? Register
+
+
+
+ );
+};
-export default Login
+export default Login;
\ No newline at end of file
diff --git a/client/src/features/auth/pages/Register.jsx b/client/src/features/auth/pages/Register.jsx
index 5761678..18e989c 100644
--- a/client/src/features/auth/pages/Register.jsx
+++ b/client/src/features/auth/pages/Register.jsx
@@ -1,70 +1,79 @@
-import React,{useState} from 'react'
-import {useNavigate,Link} from "react-router"
-import {useAuth} from "../hooks/useAuth"
-
-
+import React, { useState } from 'react';
+import { useNavigate, Link } from "react-router-dom";
+import { useAuth } from "../hooks/useAuth";
const Register = () => {
-
- const navigate=useNavigate()
- const [username, setUsername] = useState("")
- const [email, setEmail] = useState("")
- const [password, setPassword] = useState("")
-
- const {loading,handleRegister}=useAuth()
-
-
-
- const handleSubmit=async(e)=>{
- e.preventDefault()
- await handleRegister({
- username,
- email,
- password
- })
- navigate("/")
-}
-
-if(loading){
- return (
Loading..... )
-}
-
-
- return (
-
-