hashan-7's picture
Redesign certificates section with manual grid paging
fd4ba90
Raw
History Blame Contribute Delete
56.1 kB
:root {
--bg: #020006;
--bg-2: #070010;
--bg-3: #140022;
--surface: rgba(255, 255, 255, 0.06);
--border: rgba(216, 180, 254, 0.16);
--border-strong: rgba(216, 180, 254, 0.38);
--heading: #fbf7ff;
--text: #eadbff;
--muted: #b99ce4;
--accent: #a855f7;
--accent-2: #ec4899;
--cyan: #67e8f9;
--danger: #ef4444;
--success: #22c55e;
--shadow: 0 34px 120px rgba(0, 0, 0, 0.5);
--soft-shadow: 0 22px 70px rgba(0, 0, 0, 0.34);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
background: var(--bg);
}
body {
margin: 0;
min-width: 320px;
color: var(--text);
background:
radial-gradient(circle at 10% 14%, rgba(168, 85, 247, 0.32), transparent 31%),
radial-gradient(circle at 84% 10%, rgba(236, 72, 153, 0.17), transparent 34%),
radial-gradient(circle at 78% 84%, rgba(124, 58, 237, 0.24), transparent 35%),
linear-gradient(135deg, #020006, #070010 48%, #140022);
background-size: 145% 145%;
background-attachment: fixed;
animation: h7LuxuryBg 18s ease-in-out infinite alternate;
overflow-x: hidden;
}
@keyframes h7LuxuryBg {
0% {
background-position: 0% 0%;
}
50% {
background-position: 82% 36%;
}
100% {
background-position: 100% 100%;
}
}
a {
color: inherit;
}
button,
input,
textarea,
select {
font: inherit;
}
button {
-webkit-tap-highlight-color: transparent;
}
.portfolio-page {
width: min(1160px, calc(100% - 30px));
margin: 0 auto;
padding: 16px 0 48px;
}
.glass {
border: 1px solid var(--border);
background:
linear-gradient(135deg, rgba(255, 255, 255, 0.105), rgba(255, 255, 255, 0.035));
backdrop-filter: blur(26px) saturate(155%);
box-shadow: var(--shadow);
}
.top-nav-wrap {
position: sticky;
top: 14px;
z-index: 50;
display: flex;
justify-content: center;
margin-bottom: 18px;
pointer-events: none;
}
.top-nav {
pointer-events: auto;
width: fit-content;
max-width: min(720px, calc(100vw - 42px));
display: flex;
align-items: center;
justify-content: center;
gap: 7px;
border: 1px solid rgba(216, 180, 254, 0.22);
border-radius: 999px;
padding: 7px;
background: rgba(24, 10, 38, 0.82);
backdrop-filter: blur(24px) saturate(155%);
box-shadow:
0 18px 70px rgba(0, 0, 0, 0.42),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.nav-link {
flex: 0 0 auto;
border: 0;
border-radius: 999px;
padding: 11px 17px;
color: rgba(250, 245, 255, 0.78);
background: transparent;
font-size: 14px;
font-weight: 760;
cursor: pointer;
text-decoration: none;
transition:
background 0.22s ease,
transform 0.22s ease,
color 0.22s ease,
box-shadow 0.22s ease;
}
.nav-link:hover,
.nav-link.active {
color: #ffffff;
background: linear-gradient(135deg, rgba(168, 85, 247, 0.5), rgba(236, 72, 153, 0.28));
box-shadow: 0 10px 28px rgba(168, 85, 247, 0.25);
transform: translateY(-1px);
}
.hero {
position: relative;
min-height: 600px;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(300px, 0.75fr);
gap: clamp(22px, 4vw, 44px);
align-items: center;
border-radius: 36px;
padding: clamp(24px, 4.6vw, 46px);
overflow: hidden;
background:
linear-gradient(rgba(255,255,255,0.024) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.024) 1px, transparent 1px),
radial-gradient(circle at 80% 15%, rgba(168, 85, 247, 0.20), transparent 30%),
radial-gradient(circle at 12% 80%, rgba(236, 72, 153, 0.13), transparent 28%),
linear-gradient(135deg, rgba(16, 5, 29, 0.96), rgba(37, 8, 61, 0.92));
background-size: 38px 38px, 38px 38px, auto, auto, auto;
box-shadow: 0 40px 130px rgba(0, 0, 0, 0.50);
}
.hero::after {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(circle at 50% 50%, transparent 48%, rgba(0, 0, 0, 0.18));
pointer-events: none;
}
.about-snapshot {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 18px;
align-items: center;
margin-top: 16px;
border-radius: 28px;
padding: clamp(18px, 3vw, 26px);
scroll-margin-top: 106px;
}
.about-copy {
min-width: 0;
}
.about-copy h2 {
margin: 8px 0 8px;
color: var(--heading);
font-size: clamp(24px, 3.2vw, 36px);
line-height: 1.05;
letter-spacing: -0.045em;
}
.about-copy p {
max-width: 720px;
margin: 0;
color: #d8b4fe;
line-height: 1.65;
font-size: 14px;
}
.about-stats {
display: flex;
gap: 10px;
justify-content: flex-end;
flex-wrap: wrap;
}
.about-stats div {
min-width: 116px;
display: grid;
justify-items: center;
border: 1px solid rgba(216, 180, 254, 0.22);
border-radius: 20px;
padding: 12px 14px;
background: rgba(255, 255, 255, 0.062);
backdrop-filter: blur(14px) saturate(145%);
}
.about-stats strong {
color: #ffffff;
font-size: 22px;
line-height: 1;
}
.about-stats span {
margin-top: 5px;
color: #d8b4fe;
font-size: 10px;
font-weight: 850;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.hero-content,
.hero-visual {
position: relative;
z-index: 1;
}
.eyebrow {
margin: 0;
color: #d8b4fe;
font-size: 11px;
font-weight: 900;
letter-spacing: 0.16em;
text-transform: uppercase;
}
.section-only-title {
align-self: center;
font-size: 13px;
letter-spacing: 0.18em;
}
.hero-kicker {
display: inline-flex;
align-items: center;
gap: 8px;
margin-bottom: 18px;
border: 1px solid rgba(216, 180, 254, 0.20);
border-radius: 999px;
padding: 8px 12px;
color: #f4e8ff;
background: rgba(255, 255, 255, 0.065);
font-size: 13px;
font-weight: 760;
}
.hero-kicker::before {
content: "";
width: 8px;
height: 8px;
border-radius: 50%;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
box-shadow: 0 0 20px rgba(168, 85, 247, 0.7);
}
.hero h1 {
margin: 0;
max-width: 680px;
color: var(--heading);
font-size: clamp(34px, 5.8vw, 62px);
line-height: 1.03;
letter-spacing: -0.058em;
}
.hero p {
max-width: 590px;
margin: 18px 0 0;
color: #d8b4fe;
line-height: 1.7;
font-size: 15px;
}
.hero-role,
.profile-location {
color: #f4e8ff !important;
}
.social-only-row {
display: flex;
flex-wrap: nowrap;
justify-content: center;
gap: 11px;
width: 100%;
max-width: 430px;
overflow-x: auto;
padding: 2px 4px 4px;
scrollbar-width: none;
}
.social-only-row::-webkit-scrollbar {
display: none;
}
.social-only {
display: grid;
place-items: center;
width: 46px;
height: 46px;
border: 1px solid rgba(216, 180, 254, 0.24);
border-radius: 50%;
color: #ffffff;
background: rgba(255, 255, 255, 0.08);
backdrop-filter: blur(18px);
transition:
transform 0.24s ease,
background 0.24s ease,
border-color 0.24s ease;
}
.social-only:hover {
transform: translateY(-4px);
border-color: rgba(216, 180, 254, 0.56);
background: rgba(168, 85, 247, 0.20);
}
.social-only svg {
width: 21px;
height: 21px;
fill: currentColor;
}
.cv-social {
background: linear-gradient(135deg, rgba(168, 85, 247, 0.28), rgba(236, 72, 153, 0.18));
}
.cv-social-text {
color: #ffffff;
font-size: 13px;
font-weight: 950;
letter-spacing: 0.02em;
}
.hero-visual {
min-height: 470px;
border-radius: 28px;
overflow: hidden;
}
.portrait-card {
position: relative;
min-height: 470px;
border-radius: 28px;
overflow: hidden;
border: 1px solid rgba(216, 180, 254, 0.18);
background:
radial-gradient(circle at 50% 26%, rgba(216, 180, 254, 0.26), transparent 22%),
linear-gradient(135deg, #3b1558, #170722 50%, #070211);
box-shadow: 0 30px 90px rgba(0, 0, 0, 0.44);
}
.portrait-fallback {
position: absolute;
inset: 28px;
display: grid;
place-items: center;
border-radius: 26px;
color: rgba(255, 255, 255, 0.085);
font-size: clamp(100px, 16vw, 176px);
font-weight: 950;
background: linear-gradient(135deg, rgba(255,255,255,0.08), rgba(255,255,255,0.02));
}
.profile-photo {
position: absolute;
inset: 0;
z-index: 2;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
}
.portrait-card.has-photo .portrait-fallback {
opacity: 0;
}
.portrait-card:not(.has-photo)::after {
content: "";
position: absolute;
right: 42px;
bottom: 0;
width: 210px;
height: 350px;
border-radius: 130px 130px 0 0;
background:
radial-gradient(circle at 50% 16%, #f5d0fe 0 9%, transparent 10%),
linear-gradient(135deg, rgba(168, 85, 247, 0.48), rgba(236, 72, 153, 0.22));
box-shadow: 0 -20px 90px rgba(168, 85, 247, 0.20);
opacity: 0.76;
}
.status-dot {
position: absolute;
right: 18px;
top: 18px;
z-index: 3;
display: grid;
place-items: center;
width: 38px;
height: 38px;
border-radius: 50%;
color: #d8b4fe;
background: rgba(255,255,255,0.14);
backdrop-filter: blur(18px);
}
.section {
margin-top: 22px;
border-radius: 34px;
padding: clamp(20px, 3.2vw, 30px);
scroll-margin-top: 106px;
}
.section-header {
display: flex;
justify-content: space-between;
gap: 18px;
align-items: center;
margin-bottom: 18px;
}
.section-header.compact {
margin-bottom: 14px;
}
.section-title-wrap {
display: flex;
align-items: center;
gap: 14px;
}
.section-counter {
display: grid;
place-items: center;
min-width: 52px;
height: 52px;
border: 1px solid rgba(216, 180, 254, 0.24);
border-radius: 18px;
color: #ffffff;
background: linear-gradient(135deg, rgba(168, 85, 247, 0.52), rgba(236, 72, 153, 0.28));
box-shadow: 0 18px 42px rgba(168, 85, 247, 0.22);
font-size: 17px;
font-weight: 950;
}
.section-counter small {
display: block;
font-size: 8px;
letter-spacing: 0.1em;
opacity: 0.78;
}
.skills-marquee {
position: relative;
overflow: hidden;
border: 1px solid rgba(216, 180, 254, 0.16);
border-radius: 999px;
padding: 13px 0;
background: rgba(255, 255, 255, 0.055);
mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
}
.skills-track {
display: flex;
gap: 12px;
width: max-content;
animation: skillMove 23s linear infinite;
}
.skills-marquee:hover .skills-track {
animation-play-state: paused;
}
@keyframes skillMove {
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
}
.skill-pill {
flex: 0 0 auto;
border: 1px solid rgba(216, 180, 254, 0.22);
border-radius: 999px;
padding: 10px 15px;
color: #f8edff;
background: rgba(168, 85, 247, 0.12);
font-size: 14px;
font-weight: 760;
white-space: nowrap;
transition:
transform 0.24s ease,
background 0.24s ease,
border-color 0.24s ease;
}
.skill-pill.featured {
color: #ffffff;
background: linear-gradient(135deg, rgba(168, 85, 247, 0.46), rgba(236, 72, 153, 0.26));
border-color: rgba(216, 180, 254, 0.42);
box-shadow: 0 12px 34px rgba(168, 85, 247, 0.18);
}
.project-carousel {
position: relative;
overflow: hidden;
border-radius: 28px;
}
.project-track {
display: flex;
transition: transform 0.78s cubic-bezier(.16, 1, .3, 1);
will-change: transform;
}
.project-slide {
min-width: 100%;
padding: 1px;
}
.project-card {
min-height: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);
gap: 20px;
align-items: center;
border: 1px solid rgba(216, 180, 254, 0.16);
border-radius: 28px;
padding: clamp(18px, 3vw, 26px);
background:
radial-gradient(circle at 12% 10%, rgba(236, 72, 153, 0.14), transparent 30%),
linear-gradient(135deg, rgba(255, 255, 255, 0.10), rgba(255, 255, 255, 0.04));
backdrop-filter: blur(24px) saturate(150%);
box-shadow: 0 24px 80px rgba(0,0,0,0.28);
}
.project-info {
min-width: 0;
}
.project-index {
display: inline-grid;
place-items: center;
width: 40px;
height: 40px;
border-radius: 15px;
color: #fff;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
font-weight: 950;
box-shadow: 0 14px 34px rgba(168, 85, 247, 0.30);
}
.project-card h3 {
margin: 16px 0 10px;
color: var(--heading);
font-size: clamp(28px, 4.2vw, 44px);
line-height: 1;
letter-spacing: -0.056em;
}
.project-description {
min-height: 94px;
margin: 0;
line-height: 1.66;
color: #dcc6ff;
font-size: 14.5px;
}
.cursor {
display: inline-block;
width: 8px;
color: #d8b4fe;
animation: blink 0.7s infinite;
}
@keyframes blink {
50% {
opacity: 0;
}
}
.project-tags {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 16px;
}
.project-tags span {
border-radius: 999px;
padding: 7px 10px;
color: #f5e8ff;
background: rgba(255,255,255,0.075);
font-size: 12px;
font-weight: 700;
}
.project-links {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 18px;
}
.project-link,
.cert-view {
display: inline-flex;
align-items: center;
width: fit-content;
gap: 7px;
border: 1px solid rgba(216, 180, 254, 0.24);
border-radius: 999px;
padding: 9px 12px;
color: #ffffff;
background: rgba(168, 85, 247, 0.14);
font-size: 13px;
font-weight: 800;
text-decoration: none;
transition:
transform 0.24s ease,
background 0.24s ease;
}
.project-link:hover,
.cert-view:hover {
transform: translateY(-2px);
background: rgba(168, 85, 247, 0.22);
}
.project-visual {
width: 100%;
height: clamp(230px, 26vw, 310px);
border: 1px solid rgba(216, 180, 254, 0.16);
border-radius: 24px;
overflow: hidden;
position: relative;
background: #10051d;
}
.project-visual img,
.project-visual video {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
display: block;
animation: mediaSoftIn 0.52s ease;
}
@keyframes mediaSoftIn {
from {
opacity: 0.35;
transform: scale(1.04);
}
to {
opacity: 1;
transform: scale(1);
}
}
.project-shot {
position: absolute;
inset: 0;
opacity: 0;
transform: scale(1.04);
transition:
opacity 0.52s ease,
transform 0.52s ease;
background:
radial-gradient(circle at 30% 30%, rgba(168, 85, 247, 0.34), transparent 28%),
radial-gradient(circle at 70% 70%, rgba(236, 72, 153, 0.18), transparent 30%),
linear-gradient(135deg, #1b0730, #080212);
}
.project-shot.active {
opacity: 1;
transform: scale(1);
}
.project-controls,
.cert-controls {
display: flex;
justify-content: space-between;
gap: 12px;
align-items: center;
margin-top: 10px;
}
.dots,
.cert-dots {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.dot,
.cert-dot {
width: 10px;
height: 10px;
border: 0;
border-radius: 999px;
background: rgba(216, 180, 254, 0.28);
cursor: pointer;
transition:
width 0.3s ease,
background 0.3s ease;
}
.dot.active,
.cert-dot.active {
width: 34px;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
}
.circle-buttons {
display: flex;
gap: 10px;
}
.circle-btn {
width: 38px;
height: 38px;
border: 1px solid rgba(216, 180, 254, 0.24);
border-radius: 50%;
color: #fff;
background: rgba(255, 255, 255, 0.08);
cursor: pointer;
transition:
transform 0.24s ease,
background 0.24s ease;
}
.circle-btn:hover {
transform: translateY(-2px);
background: rgba(168, 85, 247, 0.18);
}
.circle-btn:disabled {
opacity: 0.42;
cursor: not-allowed;
transform: none;
}
.certificate-grid-panel {
display: grid;
gap: 12px;
}
.certificate-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
}
.cert-card {
position: relative;
min-width: 0;
display: grid;
grid-template-rows: 118px minmax(0, 1fr);
border: 1px solid rgba(216, 180, 254, 0.18);
border-radius: 24px;
overflow: hidden;
background:
radial-gradient(circle at 84% 8%, rgba(236, 72, 153, 0.14), transparent 32%),
linear-gradient(135deg, rgba(31, 8, 55, 0.93), rgba(12, 4, 24, 0.90));
box-shadow: var(--soft-shadow);
}
.cert-card::before {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.055), transparent 42%);
}
.cert-thumb {
position: relative;
display: grid;
place-items: center;
overflow: hidden;
background:
radial-gradient(circle at 34% 28%, rgba(168, 85, 247, 0.30), transparent 34%),
linear-gradient(135deg, #2d0b47, #090215);
}
.cert-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
display: block;
}
.cert-thumb:not(.has-image) span {
display: grid;
place-items: center;
width: 56px;
height: 56px;
border-radius: 18px;
color: #ffffff;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
font-size: 19px;
font-weight: 950;
box-shadow: 0 18px 42px rgba(168, 85, 247, 0.28);
}
.cert-body {
position: relative;
z-index: 1;
padding: 14px;
}
.cert-number {
display: inline-flex;
margin-bottom: 9px;
border: 1px solid rgba(216, 180, 254, 0.22);
border-radius: 999px;
padding: 5px 8px;
color: #f5e8ff;
background: rgba(255, 255, 255, 0.07);
font-size: 10px;
font-weight: 950;
letter-spacing: 0.06em;
}
.cert-card h3 {
margin: 0;
color: var(--heading);
font-size: clamp(17px, 1.9vw, 22px);
line-height: 1.12;
letter-spacing: -0.04em;
}
.cert-meta {
display: flex;
flex-wrap: wrap;
gap: 7px;
margin-top: 12px;
}
.cert-meta span {
border: 1px solid rgba(216, 180, 254, 0.18);
border-radius: 999px;
padding: 6px 9px;
color: #f5e8ff;
background: rgba(255,255,255,0.07);
font-size: 11.5px;
font-weight: 760;
}
.cert-view {
margin-top: 13px;
}
.cert-page-label {
color: #d8b4fe;
font-size: 12px;
font-weight: 850;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.education-stack {
display: grid;
gap: 12px;
}
.edu-card {
position: relative;
border: 1px solid rgba(216, 180, 254, 0.14);
border-radius: 22px;
padding: 18px;
background:
linear-gradient(90deg, rgba(236, 72, 153, 0.10), transparent 52%),
rgba(255,255,255,0.060);
overflow: hidden;
transition:
transform 0.28s ease,
border-color 0.28s ease,
background 0.28s ease;
}
.edu-card:hover {
transform: translateX(6px);
border-color: rgba(216, 180, 254, 0.36);
background:
linear-gradient(90deg, rgba(236, 72, 153, 0.13), transparent 52%),
rgba(255,255,255,0.078);
}
.edu-card::before {
content: "";
position: absolute;
left: 0;
top: 18px;
bottom: 18px;
width: 4px;
border-radius: 999px;
background: linear-gradient(var(--accent), var(--accent-2), var(--cyan));
}
.edu-card span {
display: inline-flex;
margin-bottom: 10px;
border-radius: 999px;
padding: 6px 9px;
color: #d8b4fe;
background: rgba(168, 85, 247, 0.13);
font-size: 12px;
font-weight: 900;
}
.edu-card h3 {
margin: 0;
color: var(--heading);
font-size: 21px;
letter-spacing: -0.04em;
}
.edu-card p {
margin: 8px 0 0;
color: var(--muted);
line-height: 1.55;
}
.portfolio-footer {
display: flex;
justify-content: space-between;
gap: 16px;
align-items: center;
margin-top: 22px;
border-radius: 28px;
padding: 20px 22px;
}
.portfolio-footer strong {
display: block;
color: var(--heading);
}
.portfolio-footer span,
.portfolio-footer p {
margin: 0;
color: var(--muted);
font-size: 13px;
line-height: 1.5;
}
/* Chatbot popup */
.h7-launcher {
position: fixed;
right: 20px;
bottom: 20px;
z-index: 90;
display: inline-flex;
align-items: center;
gap: 10px;
border: 1px solid rgba(216, 180, 254, 0.36);
border-radius: 999px;
padding: 11px 14px;
color: #ffffff;
background: rgba(42, 14, 70, 0.74);
backdrop-filter: blur(22px) saturate(160%);
box-shadow:
0 22px 70px rgba(0, 0, 0, 0.38),
0 0 44px rgba(168, 85, 247, 0.22),
inset 0 1px 0 rgba(255, 255, 255, 0.16);
cursor: pointer;
transition: transform 0.32s cubic-bezier(.2, .8, .2, 1), opacity 0.24s ease;
}
.h7-launcher:hover {
transform: translateY(-4px) scale(1.02);
}
.h7-launcher-orb {
display: grid;
place-items: center;
width: 34px;
height: 34px;
border-radius: 50%;
color: #fff;
font-weight: 950;
background: radial-gradient(circle at 30% 20%, #f5d0fe, #a855f7 38%, #6d28d9 100%);
box-shadow: inset 0 1px 10px rgba(255, 255, 255, 0.35);
}
.h7-launcher strong {
display: block;
font-size: 13px;
}
.h7-launcher span:last-child span {
display: block;
color: #d8b4fe;
font-size: 11px;
}
.chat-pop {
position: fixed;
right: 18px;
bottom: 78px;
z-index: 100;
width: min(360px, calc(100vw - 24px));
height: min(520px, calc(100vh - 104px));
display: flex;
flex-direction: column;
overflow: hidden;
border: 1px solid rgba(216, 180, 254, 0.22);
border-radius: 28px;
background:
linear-gradient(145deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0.055)),
rgba(31, 8, 53, 0.84);
backdrop-filter: blur(30px) saturate(175%);
box-shadow:
0 34px 110px rgba(0, 0, 0, 0.52),
inset 0 1px 0 rgba(255, 255, 255, 0.22);
transform-origin: 88% 100%;
}
.chat-pop.open {
animation: chatOpen 0.52s cubic-bezier(.18, 1.15, .28, 1) forwards;
}
.chat-pop.closing {
animation: chatClose 0.3s cubic-bezier(.55, 0, .35, 1) forwards;
pointer-events: none;
}
@keyframes chatOpen {
0% {
opacity: 0;
transform: translate3d(18px, 30px, 0) scale(0.74);
filter: blur(7px);
}
68% {
opacity: 1;
transform: translate3d(-1px, -4px, 0) scale(1.025);
filter: blur(0);
}
100% {
opacity: 1;
transform: translate3d(0, 0, 0) scale(1);
filter: blur(0);
}
}
@keyframes chatClose {
to {
opacity: 0;
transform: translate3d(18px, 28px, 0) scale(0.74);
filter: blur(6px);
}
}
.chat-header {
padding: 16px;
border-bottom: 1px solid rgba(216, 180, 254, 0.14);
background: linear-gradient(135deg, rgba(168, 85, 247, 0.22), rgba(236, 72, 153, 0.10));
}
.chat-header.draggable {
cursor: grab;
touch-action: none;
user-select: none;
}
.chat-header.draggable:active {
cursor: grabbing;
}
.chat-top {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 12px;
}
.chat-title h2 {
margin: 0;
color: #ffffff;
font-size: 19px;
}
.chat-title p {
margin: 6px 0 0;
color: #d8b4fe;
font-size: 12px;
line-height: 1.45;
}
.close-btn {
width: 34px;
height: 34px;
border: 1px solid rgba(255, 255, 255, 0.20);
border-radius: 50%;
color: #ffffff;
background: rgba(255, 255, 255, 0.12);
cursor: pointer;
}
.chat-messages {
flex: 1;
display: flex;
flex-direction: column;
gap: 12px;
overflow-y: auto;
padding: 14px;
scroll-behavior: smooth;
}
.empty-chat,
.msg {
border: 1px solid rgba(216, 180, 254, 0.16);
border-radius: 22px;
background: rgba(255, 255, 255, 0.075);
backdrop-filter: blur(18px) saturate(155%);
}
.empty-chat {
margin: auto 0;
padding: 15px;
text-align: center;
border-style: dashed;
}
.empty-chat strong {
display: block;
margin-bottom: 7px;
color: #ffffff;
}
.empty-chat p {
margin: 0;
line-height: 1.55;
font-size: 13px;
color: #d8b4fe;
}
.msg {
max-width: 88%;
padding: 11px 13px;
animation: msgIn 0.26s cubic-bezier(.16, 1, .3, 1);
}
@keyframes msgIn {
from {
transform: translateY(8px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.msg.user {
align-self: flex-end;
background: linear-gradient(135deg, rgba(168, 85, 247, 0.26), rgba(236, 72, 153, 0.14));
}
.msg.assistant {
align-self: flex-start;
}
.msg-label {
display: block;
margin-bottom: 6px;
color: #f0abfc;
font-size: 10px;
font-weight: 950;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.msg p {
margin: 0;
color: #eadcff;
line-height: 1.6;
white-space: pre-wrap;
font-size: 13px;
}
.msg a {
color: #f0abfc;
word-break: break-word;
}
.typing {
display: inline-flex;
gap: 5px;
align-items: center;
min-height: 17px;
}
.typing i {
width: 6px;
height: 6px;
border-radius: 50%;
background: #e9d5ff;
animation: typingBounce 1s infinite ease-in-out;
}
.typing i:nth-child(2) {
animation-delay: 0.12s;
}
.typing i:nth-child(3) {
animation-delay: 0.24s;
}
@keyframes typingBounce {
0%, 80%, 100% {
transform: translateY(0);
opacity: 0.42;
}
40% {
transform: translateY(-5px);
opacity: 1;
}
}
.chat-form {
display: flex;
gap: 9px;
padding: 12px;
border-top: 1px solid rgba(216, 180, 254, 0.14);
background: rgba(255, 255, 255, 0.045);
}
.chat-form input {
min-width: 0;
flex: 1;
border: 1px solid rgba(216, 180, 254, 0.17);
border-radius: 999px;
padding: 11px 13px;
color: #ffffff;
background: rgba(255, 255, 255, 0.08);
outline: none;
font-size: 13px;
}
.send-btn {
border: 0;
border-radius: 999px;
padding: 11px 14px;
color: #ffffff;
background: linear-gradient(135deg, #a855f7, #ec4899);
cursor: pointer;
font-size: 13px;
font-weight: 800;
}
.send-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* State */
.state-message {
width: min(720px, calc(100% - 32px));
margin: 80px auto;
padding: 24px;
border: 1px solid var(--border);
border-radius: 18px;
color: var(--heading);
background: var(--surface);
}
.state-message.error {
color: #fecaca;
}
/* Admin compatibility styles */
.admin-shell {
display: grid;
min-height: 100vh;
grid-template-columns: 280px minmax(0, 1fr);
color: var(--text);
background:
radial-gradient(circle at top left, rgba(168, 85, 247, 0.18), transparent 32%),
radial-gradient(circle at bottom right, rgba(236, 72, 153, 0.12), transparent 34%),
var(--bg);
}
.admin-sidebar {
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
padding: 24px;
border-right: 1px solid var(--border);
background: rgba(15, 4, 28, 0.78);
backdrop-filter: blur(18px);
}
.admin-brand,
.admin-login-brand {
display: flex;
align-items: center;
gap: 12px;
}
.admin-brand {
margin-bottom: 32px;
}
.admin-brand-logo {
display: grid;
place-items: center;
width: 46px;
height: 46px;
flex: 0 0 46px;
border-radius: 16px;
color: #ffffff;
font-weight: 800;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
box-shadow: 0 12px 36px rgba(168, 85, 247, 0.28);
}
.admin-brand h1,
.admin-login-brand h1 {
margin: 0;
color: var(--heading);
font-size: 20px;
letter-spacing: -0.03em;
}
.admin-brand p {
margin: 2px 0 0;
color: var(--text);
font-size: 13px;
}
.admin-nav-label {
margin: 24px 0 10px;
font-size: 12px;
font-weight: 800;
letter-spacing: 0.13em;
text-transform: uppercase;
color: var(--text);
}
.admin-nav-list {
display: grid;
gap: 8px;
}
.admin-nav-item {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
border: 1px solid transparent;
border-radius: 14px;
padding: 12px 14px;
color: var(--text);
background: transparent;
cursor: pointer;
text-align: left;
text-decoration: none;
}
.admin-nav-item:hover,
.admin-nav-item.active {
color: var(--heading);
border-color: var(--border);
background: rgba(42, 14, 70, 0.72);
}
.admin-nav-item span {
display: grid;
place-items: center;
width: 28px;
height: 28px;
border-radius: 10px;
color: #f0abfc;
background: rgba(168, 85, 247, 0.12);
font-size: 13px;
font-weight: 800;
}
.admin-sidebar-note {
margin-top: 28px;
padding: 16px;
border: 1px solid var(--border);
border-radius: 18px;
background: rgba(42, 14, 70, 0.42);
}
.admin-sidebar-note strong {
display: block;
margin-bottom: 6px;
color: var(--heading);
}
.admin-sidebar-note span {
font-size: 13px;
color: var(--text);
}
.admin-main {
min-width: 0;
padding: 28px;
}
.admin-topbar {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 20px;
margin-bottom: 24px;
}
.admin-topbar h1 {
margin: 0;
color: var(--heading);
font-size: clamp(32px, 5vw, 52px);
line-height: 1;
letter-spacing: -0.06em;
}
.admin-topbar p {
max-width: 780px;
margin: 14px 0 0;
color: var(--text);
line-height: 1.6;
}
.admin-actions {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.admin-actions.top {
justify-content: flex-end;
}
.admin-actions button,
.admin-panel-footer button,
.admin-login-form button,
.admin-form button {
border: 0;
border-radius: 999px;
padding: 12px 18px;
color: #ffffff;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
cursor: pointer;
box-shadow: 0 12px 30px rgba(168, 85, 247, 0.25);
}
.admin-actions button:disabled,
.admin-panel-footer button:disabled,
.admin-login-form button:disabled,
.admin-form button:disabled,
.admin-file-button:has(input:disabled) {
cursor: not-allowed;
opacity: 0.55;
}
.admin-secondary-button {
border: 1px solid var(--border) !important;
color: var(--heading) !important;
background: rgba(42, 14, 70, 0.58) !important;
box-shadow: none !important;
}
.admin-danger-button {
border: 1px solid rgba(239, 68, 68, 0.35) !important;
color: #fecaca !important;
background: rgba(239, 68, 68, 0.16) !important;
box-shadow: none !important;
}
.admin-danger-button.small {
padding: 8px 12px;
font-size: 13px;
}
.admin-stats-grid,
.admin-stats {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 14px;
margin-bottom: 20px;
}
.admin-stats-grid > div,
.admin-stats div {
padding: 18px;
border: 1px solid var(--border);
border-radius: 20px;
background: rgba(42, 14, 70, 0.42);
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.18);
}
.admin-stats-grid span,
.admin-stats span {
display: block;
margin-bottom: 8px;
color: var(--text);
font-size: 13px;
}
.admin-stats-grid strong,
.admin-stats strong {
display: block;
color: var(--heading);
font-size: 26px;
letter-spacing: -0.04em;
}
.admin-content-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 360px;
gap: 20px;
align-items: start;
}
.admin-panel,
.admin-card {
overflow: hidden;
border: 1px solid var(--border);
border-radius: 24px;
background: rgba(42, 14, 70, 0.58);
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.28);
}
.admin-card {
padding: 32px;
}
.admin-page {
width: min(1100px, calc(100% - 32px));
margin: 0 auto;
padding: 48px 0;
}
.admin-panel.small {
box-shadow: 0 16px 44px rgba(0, 0, 0, 0.2);
}
.admin-panel-header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
padding: 22px 24px;
border-bottom: 1px solid var(--border);
background: rgba(15, 4, 28, 0.3);
}
.admin-panel-header h2,
.admin-card h1,
.admin-card h2 {
margin: 0 0 12px;
color: var(--heading);
letter-spacing: -0.03em;
}
.admin-panel-header h2 {
font-size: 22px;
}
.admin-panel-header p {
margin: 6px 0 0;
color: var(--text);
font-size: 14px;
}
.admin-panel-body {
padding: 24px;
}
.admin-panel-footer {
display: flex;
justify-content: flex-end;
gap: 10px;
padding: 18px 24px;
border-top: 1px solid var(--border);
background: rgba(15, 4, 28, 0.62);
backdrop-filter: blur(18px);
}
.admin-side-panel {
position: sticky;
top: 28px;
display: grid;
gap: 20px;
}
.admin-section {
margin-top: 24px;
padding-top: 24px;
border-top: 1px solid var(--border);
}
.admin-section.clean {
display: grid;
gap: 18px;
margin: 0;
padding: 0;
border: 0;
background: transparent;
}
.admin-section.clean h2,
.project-image-manager h3,
.admin-profile-image-panel h3 {
margin: 0;
color: var(--heading);
letter-spacing: -0.03em;
}
.admin-muted {
color: var(--text);
line-height: 1.55;
}
.admin-form-toolbar {
display: flex;
justify-content: space-between;
gap: 18px;
align-items: flex-start;
}
.admin-form {
display: grid;
gap: 18px;
margin-top: 24px;
}
.admin-form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
.admin-form-grid label,
.admin-form label,
.admin-login-form label,
.admin-section label {
display: grid;
gap: 8px;
color: var(--heading);
font-weight: 700;
font-size: 14px;
}
.admin-form-grid label.wide {
grid-column: 1 / -1;
}
.admin-form-grid input,
.admin-form-grid textarea,
.admin-form-grid select,
.admin-form input,
.admin-form textarea,
.admin-form select,
.admin-section input,
.admin-section textarea,
.admin-section select,
.admin-login-form input,
.admin-json-editor {
width: 100%;
border: 1px solid var(--border);
border-radius: 14px;
padding: 13px 14px;
color: var(--heading);
background: rgba(15, 4, 28, 0.58);
outline: none;
}
.admin-form-grid input:focus,
.admin-form-grid textarea:focus,
.admin-form-grid select:focus,
.admin-form input:focus,
.admin-form textarea:focus,
.admin-form select:focus,
.admin-login-form input:focus,
.admin-json-editor:focus {
border-color: rgba(216, 180, 254, 0.70);
box-shadow: 0 0 0 4px rgba(168, 85, 247, 0.12);
}
.admin-json-editor {
min-height: 360px;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 13px;
line-height: 1.55;
resize: vertical;
}
.admin-json-editor.large {
min-height: 560px;
}
.admin-json-editor.compact {
min-height: 120px;
}
.admin-json-editor.compact.tall {
min-height: 180px;
}
.admin-profile-image-panel {
display: grid;
grid-template-columns: minmax(0, 1fr) 170px;
gap: 18px;
align-items: stretch;
border: 1px solid var(--border);
border-radius: 22px;
padding: 18px;
background: rgba(15, 4, 28, 0.36);
}
.admin-profile-image-actions {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin: 14px 0;
}
.admin-image-path-field {
margin-top: 12px;
}
.admin-profile-image-preview {
display: grid;
place-items: center;
min-height: 170px;
border: 1px solid var(--border);
border-radius: 20px;
overflow: hidden;
background:
radial-gradient(circle at 50% 26%, rgba(216, 180, 254, 0.26), transparent 22%),
linear-gradient(135deg, #3b1558, #170722 50%, #070211);
}
.admin-profile-image-preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.admin-profile-image-preview span {
color: rgba(255, 255, 255, 0.16);
font-size: 56px;
font-weight: 950;
}
.admin-certificate-image-panel {
display: grid;
grid-template-columns: 180px minmax(0, 1fr);
gap: 18px;
align-items: stretch;
margin-bottom: 18px;
border: 1px solid var(--border);
border-radius: 22px;
padding: 18px;
background: rgba(15, 4, 28, 0.36);
}
.admin-certificate-image-preview {
display: grid;
place-items: center;
min-height: 150px;
max-height: 180px;
border: 1px solid var(--border);
border-radius: 20px;
overflow: hidden;
background:
radial-gradient(circle at 50% 26%, rgba(216, 180, 254, 0.26), transparent 22%),
linear-gradient(135deg, #3b1558, #170722 50%, #070211);
}
.admin-certificate-image-preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.admin-certificate-image-preview span {
color: rgba(255, 255, 255, 0.16);
font-size: 36px;
font-weight: 950;
}
.admin-switch-grid {
display: flex;
flex-wrap: wrap;
gap: 14px;
padding: 16px;
border: 1px solid var(--border);
border-radius: 18px;
background: rgba(15, 4, 28, 0.3);
}
.admin-checkbox-row {
display: inline-flex !important;
align-items: center;
gap: 8px;
color: var(--heading);
font-weight: 700;
}
.admin-checkbox-row input {
width: auto;
}
.admin-empty-box {
padding: 18px;
border: 1px dashed rgba(216, 180, 254, 0.45);
border-radius: 18px;
color: var(--text);
background: rgba(168, 85, 247, 0.08);
}
.admin-badge {
display: inline-flex;
align-items: center;
white-space: nowrap;
border: 1px solid rgba(216, 180, 254, 0.25);
border-radius: 999px;
padding: 6px 10px;
color: #f0abfc;
background: rgba(168, 85, 247, 0.1);
font-size: 12px;
font-weight: 800;
}
.admin-status-list {
display: grid;
gap: 12px;
}
.admin-status-list div {
display: flex;
justify-content: space-between;
gap: 12px;
padding: 13px 14px;
border: 1px solid var(--border);
border-radius: 14px;
background: rgba(15, 4, 28, 0.32);
}
.admin-status-list span {
color: var(--text);
}
.admin-status-list strong {
color: var(--heading);
}
.admin-success,
.admin-error {
padding: 12px 14px;
border-radius: 14px;
line-height: 1.5;
}
.admin-success {
border: 1px solid rgba(34, 197, 94, 0.3);
color: #bbf7d0;
background: rgba(34, 197, 94, 0.1);
}
.admin-error {
border: 1px solid rgba(239, 68, 68, 0.3);
color: #fecaca;
background: rgba(239, 68, 68, 0.1);
}
.admin-success.floating,
.admin-error.floating {
margin-top: 18px;
}
.project-image-manager {
display: grid;
gap: 16px;
padding: 18px;
border: 1px solid var(--border);
border-radius: 20px;
background: rgba(15, 4, 28, 0.32);
}
.admin-file-button {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: fit-content;
border-radius: 999px;
padding: 12px 18px;
color: #ffffff;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
cursor: pointer;
box-shadow: 0 12px 30px rgba(168, 85, 247, 0.25);
}
.admin-file-button input {
position: absolute;
inset: 0;
opacity: 0;
cursor: pointer;
}
.project-image-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px;
}
.project-image-card {
overflow: hidden;
border: 1px solid var(--border);
border-radius: 18px;
background: rgba(15, 4, 28, 0.44);
}
.project-image-card img {
display: block;
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
border-bottom: 1px solid var(--border);
}
.project-image-card div {
display: grid;
gap: 6px;
padding: 12px;
}
.project-image-card span {
color: var(--heading);
font-weight: 800;
}
.project-image-card code {
overflow: hidden;
color: var(--text);
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
.project-image-card button {
margin: 0 12px 12px;
}
.card-media {
overflow: hidden;
border-radius: 16px;
border: 1px solid var(--border);
background: rgba(15, 4, 28, 0.44);
}
.card-media img,
.card-media video {
display: block;
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
}
.confirm-backdrop {
position: fixed;
z-index: 120;
inset: 0;
display: grid;
place-items: center;
padding: 20px;
background: rgba(4, 0, 11, 0.72);
backdrop-filter: blur(10px);
}
.confirm-dialog {
width: min(460px, 100%);
border: 1px solid var(--border);
border-radius: 24px;
padding: 24px;
background: rgba(42, 14, 70, 0.92);
box-shadow: 0 24px 90px rgba(0, 0, 0, 0.36);
}
.confirm-dialog h3 {
margin: 0;
color: var(--heading);
font-size: 24px;
}
.confirm-dialog p {
margin: 12px 0 0;
color: var(--text);
line-height: 1.6;
}
.confirm-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 22px;
}
.confirm-actions button {
border-radius: 999px;
padding: 12px 18px;
cursor: pointer;
}
.admin-login-page {
display: grid;
min-height: 100vh;
place-items: center;
padding: 24px;
background:
radial-gradient(circle at top left, rgba(168, 85, 247, 0.18), transparent 32%),
radial-gradient(circle at bottom right, rgba(236, 72, 153, 0.12), transparent 34%),
var(--bg);
}
.admin-login-card {
width: min(480px, 100%);
display: grid;
gap: 20px;
border: 1px solid var(--border);
border-radius: 28px;
padding: 28px;
background: rgba(42, 14, 70, 0.82);
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.32);
}
.admin-login-form {
display: grid;
gap: 16px;
}
@media (max-width: 1180px) {
.admin-shell {
grid-template-columns: 1fr;
}
.admin-sidebar {
position: static;
height: auto;
}
.admin-content-layout {
grid-template-columns: 1fr;
}
.admin-side-panel {
position: static;
}
}
@media (max-width: 980px) {
.hero,
.project-card {
grid-template-columns: 1fr;
}
.hero {
min-height: auto;
}
.hero-visual,
.portrait-card {
min-height: 420px;
}
.project-visual {
height: 280px;
}
.cert-stage {
min-height: 270px;
}
}
@media (max-width: 820px) {
.admin-main {
padding: 18px;
}
.admin-topbar,
.admin-form-toolbar,
.admin-panel-header {
flex-direction: column;
align-items: flex-start;
}
.admin-actions.top {
justify-content: flex-start;
}
.admin-stats-grid,
.admin-stats,
.admin-form-grid,
.project-image-grid,
.admin-profile-image-panel,
.admin-certificate-image-panel {
grid-template-columns: 1fr;
}
.admin-panel-footer,
.confirm-actions {
flex-direction: column;
}
.admin-panel-footer button,
.confirm-actions button,
.admin-actions button,
.admin-file-button {
width: 100%;
}
}
@media (max-width: 720px) {
.portfolio-page {
width: min(100% - 20px, 1160px);
padding-top: 12px;
}
.top-nav-wrap {
top: 8px;
margin-bottom: 14px;
}
.top-nav {
width: min(100% - 44px, 560px);
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 4px;
border-radius: 22px;
padding: 5px;
}
.nav-link {
width: 100%;
padding: 9px 4px;
text-align: center;
font-size: clamp(9.5px, 2.8vw, 12px);
font-weight: 800;
}
.hero,
.section {
border-radius: 28px;
}
.hero {
padding: 22px;
}
.section {
scroll-margin-top: 90px;
}
.section-header {
flex-direction: column;
align-items: flex-start;
}
.section-title-wrap {
width: 100%;
gap: 12px;
}
.section-counter {
min-width: 48px;
height: 48px;
border-radius: 16px;
font-size: 16px;
}
.hero h1 {
font-size: clamp(34px, 11.5vw, 52px);
letter-spacing: -0.05em;
}
.hero-visual,
.portrait-card {
min-height: 330px;
}
.portrait-card:not(.has-photo)::after {
right: 22px;
width: 180px;
height: 300px;
}
.social-only-row {
margin-top: 30px;
}
.project-card {
min-height: auto;
gap: 16px;
}
.project-description {
min-height: 145px;
}
.project-visual {
height: 230px;
}
.project-controls,
.cert-controls {
flex-direction: column;
align-items: flex-start;
}
.cert-stage {
min-height: 300px;
}
.cert-page {
grid-template-columns: 1fr;
align-content: center;
gap: 12px;
padding: 18px;
}
.cert-no {
width: 54px;
height: 54px;
border-radius: 18px;
font-size: 18px;
}
.cert-page h3 {
font-size: clamp(21px, 7.2vw, 30px);
}
.cert-meta {
gap: 7px;
margin-top: 12px;
}
.cert-view {
margin-top: 15px;
}
.portfolio-footer {
flex-direction: column;
align-items: flex-start;
}
.h7-launcher {
right: 14px;
bottom: 14px;
padding: 10px 12px;
}
.h7-launcher span:last-child span {
display: none;
}
.chat-pop {
width: min(330px, calc(100vw - 20px));
height: min(480px, calc(100vh - 90px));
border-radius: 24px;
}
.admin-card,
.admin-sidebar,
.admin-main,
.admin-panel-body,
.admin-panel-header,
.admin-panel-footer,
.admin-login-card {
padding: 18px;
}
.admin-topbar h1 {
font-size: 34px;
}
.admin-certificate-image-panel {
display: grid;
grid-template-columns: 180px minmax(0, 1fr);
gap: 18px;
align-items: stretch;
margin-bottom: 18px;
border: 1px solid var(--border);
border-radius: 22px;
padding: 18px;
background: rgba(15, 4, 28, 0.36);
}
.admin-certificate-image-preview {
display: grid;
place-items: center;
min-height: 150px;
max-height: 180px;
border: 1px solid var(--border);
border-radius: 20px;
overflow: hidden;
background:
radial-gradient(circle at 50% 26%, rgba(216, 180, 254, 0.26), transparent 22%),
linear-gradient(135deg, #3b1558, #170722 50%, #070211);
}
.admin-certificate-image-preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.admin-certificate-image-preview span {
color: rgba(255, 255, 255, 0.16);
font-size: 36px;
font-weight: 950;
}
.admin-switch-grid {
flex-direction: column;
}
}
@media (max-width: 420px) {
.portfolio-page {
width: min(100% - 14px, 1160px);
}
.top-nav {
width: min(100% - 34px, 560px);
gap: 3px;
}
.nav-link {
padding: 8px 2px;
font-size: 9.2px;
}
.hero,
.section {
padding: 18px;
}
.hero-kicker {
font-size: 12px;
}
.social-only {
width: 42px;
height: 42px;
}
.project-card {
padding: 18px;
}
.project-description {
min-height: 165px;
}
.project-visual {
height: 215px;
}
.cert-stage {
min-height: 315px;
}
.chat-pop {
width: min(318px, calc(100vw - 18px));
height: min(460px, calc(100vh - 88px));
}
}
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
html {
min-height: 100%;
overscroll-behavior-y: none;
background:
radial-gradient(circle at 10% 14%, rgba(168, 85, 247, 0.32), transparent 31%),
radial-gradient(circle at 84% 10%, rgba(236, 72, 153, 0.17), transparent 34%),
radial-gradient(circle at 78% 84%, rgba(124, 58, 237, 0.24), transparent 35%),
linear-gradient(135deg, #020006, #070010 48%, #140022);
}
body {
position: relative;
min-height: 100%;
background: #070010;
overscroll-behavior-y: none;
}
body::before {
content: "";
position: fixed;
inset: -2px;
z-index: -1;
pointer-events: none;
background:
radial-gradient(circle at 10% 14%, rgba(168, 85, 247, 0.32), transparent 31%),
radial-gradient(circle at 84% 10%, rgba(236, 72, 153, 0.17), transparent 34%),
radial-gradient(circle at 78% 84%, rgba(124, 58, 237, 0.24), transparent 35%),
linear-gradient(135deg, #020006, #070010 48%, #140022);
background-size: 145% 145%;
animation: h7LuxuryBg 18s ease-in-out infinite alternate;
}
#root {
min-height: 100vh;
background: transparent;
}
.glass {
background:
radial-gradient(circle at 12% 12%, rgba(168, 85, 247, 0.14), transparent 28%),
linear-gradient(135deg, rgba(35, 10, 58, 0.86), rgba(12, 4, 25, 0.80));
border-color: rgba(216, 180, 254, 0.22);
}
.skills-marquee {
background:
linear-gradient(135deg, rgba(35, 10, 58, 0.92), rgba(12, 4, 25, 0.86));
border-color: rgba(216, 180, 254, 0.22);
}
.skill-pill {
background: rgba(21, 6, 39, 0.88);
border-color: rgba(216, 180, 254, 0.28);
color: #f8edff;
}
.skill-pill.featured {
background: linear-gradient(135deg, rgba(126, 34, 206, 0.60), rgba(190, 24, 93, 0.30));
border-color: rgba(216, 180, 254, 0.46);
}
.project-card {
background:
radial-gradient(circle at 12% 10%, rgba(168, 85, 247, 0.18), transparent 30%),
radial-gradient(circle at 90% 80%, rgba(236, 72, 153, 0.12), transparent 32%),
linear-gradient(135deg, rgba(34, 9, 58, 0.94), rgba(11, 3, 23, 0.90));
border-color: rgba(216, 180, 254, 0.24);
}
.cert-page {
background:
linear-gradient(90deg, rgba(91, 33, 182, 0.32), transparent 56%),
radial-gradient(circle at 84% 10%, rgba(236, 72, 153, 0.15), transparent 30%),
linear-gradient(135deg, rgba(31, 8, 55, 0.93), rgba(12, 4, 24, 0.90));
border-color: rgba(216, 180, 254, 0.24);
}
.edu-card {
background:
linear-gradient(90deg, rgba(91, 33, 182, 0.22), transparent 52%),
rgba(17, 5, 31, 0.86);
border-color: rgba(216, 180, 254, 0.20);
}
.edu-card:hover {
background:
linear-gradient(90deg, rgba(168, 85, 247, 0.24), transparent 52%),
rgba(27, 8, 48, 0.92);
border-color: rgba(216, 180, 254, 0.38);
}
.portfolio-footer {
display: flex !important;
justify-content: center !important;
align-items: center !important;
width: 100% !important;
margin: 28px auto 0 !important;
padding: 10px 0 4px;
color: rgba(234, 219, 255, 0.72);
text-align: center !important;
font-size: 13px;
line-height: 1.5;
background: transparent !important;
border: 0 !important;
box-shadow: none !important;
backdrop-filter: none !important;
}
.chat-pop {
background:
linear-gradient(145deg, rgba(36, 10, 61, 0.96), rgba(10, 3, 22, 0.94)),
rgba(18, 5, 32, 0.96);
border-color: rgba(216, 180, 254, 0.30);
}
.chat-header {
background:
linear-gradient(135deg, rgba(91, 33, 182, 0.42), rgba(31, 8, 55, 0.76));
}
.chat-drag-zone {
min-width: 0;
flex: 1;
border-radius: 18px;
cursor: grab;
touch-action: none;
user-select: none;
}
.chat-drag-zone:active {
cursor: grabbing;
}
.empty-chat,
.msg {
background: rgba(19, 6, 34, 0.82);
border-color: rgba(216, 180, 254, 0.20);
}
.msg.user {
background: linear-gradient(135deg, rgba(126, 34, 206, 0.38), rgba(190, 24, 93, 0.20));
}
.chat-form {
background: rgba(10, 3, 22, 0.72);
}
.chat-form input {
background: rgba(18, 5, 33, 0.82);
border-color: rgba(216, 180, 254, 0.22);
}
@media (max-width: 720px) {
body {
overscroll-behavior-y: contain;
}
}
.hero-mobile-frame {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(220px, 0.58fr);
gap: clamp(18px, 3vw, 34px);
align-items: center;
}
.hero-mobile-actions {
position: relative;
z-index: 1;
display: grid;
justify-items: center;
gap: 13px;
margin-top: 2px;
}
.download-cv-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 150px;
border: 1px solid rgba(216, 180, 254, 0.32);
border-radius: 999px;
padding: 10px 16px;
color: #ffffff;
background: linear-gradient(135deg, rgba(168, 85, 247, 0.34), rgba(236, 72, 153, 0.22));
box-shadow: 0 16px 42px rgba(0, 0, 0, 0.28);
font-size: 13px;
font-weight: 900;
text-decoration: none;
transition:
transform 0.24s ease,
border-color 0.24s ease,
background 0.24s ease;
}
.download-cv-button:hover {
transform: translateY(-2px);
border-color: rgba(216, 180, 254, 0.56);
background: linear-gradient(135deg, rgba(168, 85, 247, 0.48), rgba(236, 72, 153, 0.30));
}
.hero-mini-counts {
display: flex;
justify-content: center;
gap: 8px;
flex-wrap: wrap;
}
.hero-mini-counts div {
min-width: 112px;
display: grid;
justify-items: center;
border: 1px solid rgba(216, 180, 254, 0.22);
border-radius: 999px;
padding: 8px 12px;
background: rgba(255, 255, 255, 0.065);
backdrop-filter: blur(18px) saturate(155%);
}
.hero-mini-counts strong {
color: #ffffff;
font-size: 15px;
line-height: 1;
}
.hero-mini-counts span {
color: #d8b4fe;
font-size: 10px;
font-weight: 850;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.message-link {
display: inline-flex;
align-items: center;
width: fit-content;
max-width: 100%;
margin: 4px 4px 2px 0;
border: 1px solid rgba(216, 180, 254, 0.28);
border-radius: 999px;
padding: 6px 10px;
color: #ffffff !important;
background: rgba(168, 85, 247, 0.18);
text-decoration: none;
font-size: 12px;
font-weight: 850;
line-height: 1.2;
white-space: nowrap;
}
.message-link:hover {
background: rgba(168, 85, 247, 0.30);
border-color: rgba(216, 180, 254, 0.52);
}
.message-text-part {
white-space: pre-wrap;
}
@media (min-width: 761px) {
.hero {
grid-template-columns: 1fr;
}
}
@media (max-width: 760px) {
html {
background:
radial-gradient(circle at 10% 14%, rgba(168, 85, 247, 0.22), transparent 31%),
radial-gradient(circle at 84% 10%, rgba(236, 72, 153, 0.11), transparent 34%),
radial-gradient(circle at 78% 84%, rgba(124, 58, 237, 0.16), transparent 35%),
linear-gradient(135deg, #020006, #070010 48%, #140022);
}
body {
background: #070010;
}
.hero {
min-height: auto;
padding: 18px;
border-radius: 28px;
display: grid;
grid-template-columns: 1fr;
gap: 0;
}
.hero-mobile-frame {
grid-template-columns: minmax(0, 1fr) 118px;
gap: 12px;
align-items: start;
}
.hero-content {
min-width: 0;
}
.hero-kicker {
margin-bottom: 12px;
padding: 6px 10px;
font-size: 11px;
}
.hero h1 {
max-width: 100%;
font-size: clamp(27px, 8.5vw, 39px);
line-height: 1.02;
letter-spacing: -0.055em;
}
.hero p {
margin-top: 11px;
font-size: 12.6px;
line-height: 1.48;
}
.hero-role {
max-width: 100%;
}
.profile-location {
margin-top: 8px !important;
font-size: 12px !important;
}
.hero-visual {
min-height: 118px;
height: 118px;
border-radius: 50%;
overflow: visible;
}
.portrait-card {
width: 118px;
height: 118px;
min-height: 118px;
border-radius: 50%;
}
.portrait-fallback {
inset: 10px;
border-radius: 50%;
font-size: 42px;
}
.status-dot {
right: 0;
top: 0;
width: 28px;
height: 28px;
font-size: 12px;
}
.hero-mobile-actions {
margin-top: 16px;
gap: 11px;
}
.download-cv-button {
min-width: 142px;
padding: 9px 15px;
font-size: 12px;
}
.hero-mini-counts {
width: 100%;
gap: 7px;
}
.hero-mini-counts div {
min-width: 106px;
padding: 7px 10px;
}
.social-only-row {
display: flex;
flex-wrap: nowrap;
justify-content: center;
gap: 9px;
width: 100%;
max-width: 100%;
overflow-x: auto;
padding: 2px 4px 4px;
scrollbar-width: none;
}
.social-only-row::-webkit-scrollbar {
display: none;
}
.social-only {
width: 38px;
height: 38px;
flex: 0 0 38px;
}
.social-only svg {
width: 18px;
height: 18px;
}
}
@media (max-width: 420px) {
.hero-mobile-frame {
grid-template-columns: minmax(0, 1fr) 104px;
}
.hero h1 {
font-size: clamp(24px, 8vw, 32px);
}
.hero p {
font-size: 12px;
}
.hero-visual {
min-height: 104px;
height: 104px;
}
.portrait-card {
width: 104px;
height: 104px;
min-height: 104px;
}
.social-only {
width: 35px;
height: 35px;
flex-basis: 35px;
}
.social-only svg {
width: 17px;
height: 17px;
}
}
@media (max-width: 760px) {
body {
background-attachment: scroll;
animation: none;
}
.portfolio-page {
padding-top: 12px;
}
.glass,
.project-card,
.cert-page,
.chat-pop,
.top-nav,
.social-only,
.about-stats div {
backdrop-filter: blur(12px) saturate(135%);
-webkit-backdrop-filter: blur(12px) saturate(135%);
}
.glass,
.hero,
.project-card,
.cert-page {
box-shadow: 0 18px 54px rgba(0, 0, 0, 0.38);
}
.about-snapshot {
grid-template-columns: 1fr;
gap: 14px;
margin-top: 14px;
border-radius: 24px;
padding: 17px;
}
.about-copy h2 {
font-size: clamp(22px, 6.5vw, 30px);
}
.about-copy p {
font-size: 12.8px;
line-height: 1.55;
}
.about-stats {
justify-content: center;
width: 100%;
gap: 8px;
}
.about-stats div {
min-width: 112px;
flex: 1 1 112px;
padding: 10px 12px;
}
.about-stats strong {
font-size: 18px;
}
.project-track,
.cert-page,
.msg {
will-change: transform, opacity;
}
.skills-track {
animation-duration: 30s;
}
}
@media (max-width: 420px) {
.about-snapshot {
padding: 15px;
}
.about-stats div {
min-width: 104px;
padding: 9px 10px;
}
.about-stats strong {
font-size: 17px;
}
}
@media (max-width: 980px) {
.certificate-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 720px) {
.certificate-grid {
grid-template-columns: 1fr;
}
.cert-card {
grid-template-columns: 96px minmax(0, 1fr);
grid-template-rows: auto;
min-height: 126px;
border-radius: 22px;
}
.cert-thumb {
min-height: 126px;
}
.cert-body {
padding: 13px;
}
.cert-card h3 {
font-size: clamp(18px, 5.4vw, 23px);
}
.cert-controls {
flex-direction: row;
align-items: center;
}
}
@media (max-width: 420px) {
.cert-card {
grid-template-columns: 82px minmax(0, 1fr);
}
.cert-thumb {
min-height: 118px;
}
.cert-body {
padding: 12px;
}
.cert-meta span {
font-size: 10.8px;
}
}