Files
my-protfolio/src/components/HeroSection.module.css

359 lines
8.5 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
HeroSection — central content overlay on the hero stage
============================================================ */
/* ── Content wrapper ─────────────────────────────────────────── */
.heroContentWrapper {
position: relative;
width: 100%;
height: 100%;
z-index: 5;
}
/* ── Top bar: theme toggle (left) + language (right) ─────────── */
.topBar {
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 10;
display: flex;
align-items: center;
justify-content: space-between;
padding: clamp(18px, 2.5vw, 32px) var(--layout-page-gutter) 0;
}
/* ── Icon buttons ───────────────────────────────────────────── */
.iconButton {
display: inline-flex;
align-items: center;
justify-content: center;
width: var(--size-icon-button);
height: var(--size-icon-button);
padding: 0;
border: 0;
background: transparent;
color: var(--color-blue-700);
cursor: pointer;
transition:
color var(--motion-duration-fast) ease,
transform var(--motion-duration-fast) var(--motion-ease-out);
}
.iconButton:focus-visible {
border-radius: var(--radius-sm);
outline: 3px solid var(--focus-ring);
outline-offset: 4px;
}
[data-theme="dark"] .iconButton {
color: var(--text-primary);
}
.controlIcon,
.themeIcon {
color: currentColor;
}
.themeIcon {
fill: currentColor;
}
/* ── Hero central content ────────────────────────────────────── */
.heroContent {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
/* Horizontal padding keeps text clear of illustration zones */
padding: 0 clamp(160px, 22vw, 460px);
text-align: center;
}
/* ── Avatar ─────────────────────────────────────────────────── */
.avatarWrapper {
margin-bottom: clamp(14px, 1.8vw, 22px);
}
.avatarRingOuter {
display: inline-block;
padding: clamp(4px, 0.5vw, 7px);
border: clamp(2px, 0.25vw, 3px) solid var(--color-blue-700);
border-radius: 50%;
background: transparent;
box-shadow: 0 8px 32px var(--shadow-color);
}
[data-theme="dark"] .avatarRingOuter {
border-color: var(--color-blue-white);
}
.avatarContainer {
position: relative;
width: clamp(100px, 13vw, 168px);
height: clamp(100px, 13vw, 168px);
overflow: hidden;
border: 0;
border-radius: 50%;
}
.avatarImg {
width: 100%;
height: 100%;
object-fit: cover;
}
/* ── Display title ──────────────────────────────────────────── */
.heroTitle {
margin-bottom: clamp(8px, 1vw, 14px);
color: var(--text-primary);
font-size: clamp(32px, 5vw, 64px);
line-height: 1.12;
text-shadow: none;
/* Allow wrapping on smaller screens so text never clips */
}
/* ── Subtitle ───────────────────────────────────────────────── */
.heroSubtitle {
margin-bottom: clamp(20px, 2.8vw, 36px);
color: var(--text-primary);
font-size: clamp(11px, 1vw, 15px);
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
}
/* ── Action buttons ─────────────────────────────────────────── */
.actionButtons {
display: flex;
align-items: center;
gap: clamp(10px, 1.4vw, 20px);
margin-bottom: clamp(18px, 2.2vw, 30px);
}
.heroButton {
min-width: clamp(80px, 9vw, 120px);
height: clamp(40px, 4.5vw, 52px);
padding: 0 clamp(16px, 2vw, 28px);
border-width: 2px;
font-size: clamp(13px, 1.1vw, 16px);
}
.heroButtonOutline {
border-color: var(--color-blue-600);
background: transparent;
color: var(--color-blue-700);
}
.heroButtonPrimary {
border-color: var(--color-blue-600);
background: var(--color-blue-600);
color: var(--color-blue-white);
}
.heroButton:focus-visible {
outline: 3px solid var(--focus-ring);
outline-offset: 3px;
}
[data-theme="dark"] .heroButtonOutline {
border-color: var(--color-blue-white);
background: transparent;
color: var(--text-primary);
}
[data-theme="dark"] .heroButtonPrimary {
border-color: var(--color-blue-white);
background: var(--color-blue-100);
color: var(--color-blue-950);
}
/* ── Contact bar ─────────────────────────────────────────────── */
.contactBar {
display: inline-flex;
align-items: center;
gap: clamp(10px, 1.4vw, 18px);
border: 0;
background: transparent;
color: var(--color-blue-700);
font-size: clamp(11px, 1vw, 14px);
font-weight: 500;
line-height: 1.6;
}
[data-theme="dark"] .contactBar {
color: var(--text-primary);
}
.contactItem {
display: inline-flex;
align-items: center;
gap: 6px;
color: inherit;
transition: opacity var(--motion-duration-fast) ease;
}
.contactItem:focus-visible {
border-radius: 2px;
outline: 3px solid var(--focus-ring);
outline-offset: 4px;
}
.contactIcon {
flex: 0 0 auto;
color: currentColor;
}
.filledIcon {
fill: currentColor;
}
.contactDivider {
width: 1px;
height: 18px;
background: var(--color-blue-500);
opacity: 0.6;
}
/* ================================================================
MOBILE ≤ 640px
================================================================ */
/* ================================================================
TABLET 501px – 1100px — match the illustration breakpoint
================================================================ */
@media (max-width: 1100px) and (min-width: 501px) {
.heroContent {
/* Top-anchor content so it sits nicely in the upper-center zone */
justify-content: flex-start;
padding-top: clamp(60px, 8vw, 90px);
}
.heroTitle {
/* Allow wrapping at tablet so text stays within the center zone */
max-width: 520px;
}
.contactBar {
/* Wrap contact items on narrow tablets */
flex-wrap: wrap;
justify-content: center;
gap: 8px 14px;
}
.contactDivider {
display: none;
}
}
/* ================================================================
MOBILE ≤ 500px (screensizes under 500px)
================================================================ */
@media (max-width: 500px) {
.heroContentWrapper {
height: auto;
min-height: 520px;
}
.topBar {
padding: 16px 14px 0;
}
.iconButton {
width: 40px;
height: 40px;
}
.heroContent {
height: auto;
min-height: 520px;
padding: 66px 16px 36px;
justify-content: flex-start;
}
.heroTitle {
font-size: clamp(26px, 7.8vw, 36px);
white-space: normal;
max-width: 270px;
line-height: 1.15;
}
.heroSubtitle {
white-space: normal;
max-width: 250px;
font-size: 11px;
letter-spacing: 0.12em;
}
.actionButtons {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
width: 100%;
max-width: 276px;
gap: 6px;
}
.heroButton {
min-width: 0;
width: auto;
height: 38px;
padding: 0 6px;
font-size: 12px;
}
.contactBar {
flex-direction: column;
gap: 5px;
white-space: normal;
font-size: 11.5px;
}
.contactItem {
max-width: 100%;
overflow-wrap: anywhere;
}
.contactDivider {
display: none;
}
}
/* ================================================================
HOVER STATES
================================================================ */
@media (hover: hover) and (pointer: fine) {
.iconButton:hover {
color: var(--color-blue-500);
transform: translateY(-1px);
}
.contactItem:hover {
opacity: 0.75;
}
[data-theme="dark"] .iconButton:hover {
color: var(--accent-default);
}
.heroButtonOutline:hover {
border-color: var(--color-blue-700);
background: rgba(255, 255, 255, 0.2);
}
.heroButtonPrimary:hover {
border-color: var(--color-blue-700);
background: var(--color-blue-700);
}
[data-theme="dark"] .heroButtonOutline:hover {
border-color: var(--color-blue-100);
background: rgba(130, 181, 255, 0.12);
}
[data-theme="dark"] .heroButtonPrimary:hover {
border-color: var(--color-blue-white);
background: var(--color-blue-white);
}
}