/* ==========================================================================
   resume.css
   Purpose: The handful of layout primitives the /resume page needs that the
   Tailwind utility set compiled into _content/TrBlazeUI.Components/trblazeui.css
   does not provide:

     - the sticky in-page section-nav strip  (TrBlazeUI has no scrollspy — TR-003)
     - the CSS-only experience timeline      (TrBlazeUI has no Timeline  — TR-004)
     - auto-fit responsive grids             (no grid-cols-* utilities are compiled)
     - fixed-size media boxes + print optimisation

   Everything else on the page is expressed with TrBlazeUI components
   (Card / Badge / Button / Separator / Avatar) and utility classes.

   Every colour, radius and spacing value below resolves to a design token, so
   the page is correct in both light and dark mode (REQ-UI-033). No literal
   colours, no legacy --color-* bridge variables.

   Loaded from source/TechieBlog/Components/App.razor after theme.css +
   trblazeui.css; these rules are unlayered and therefore win over the library's
   @layer utilities.
   ========================================================================== */

/* --------------------------------------------------------------------------
   PAGE SHELL
   -------------------------------------------------------------------------- */

.resume-page {
    display: flex;
    flex-direction: column;
    gap: calc(var(--spacing) * 8);
}

/* Smooth-scroll only while the resume page is mounted, so the rest of the
   site keeps the browser default. */
:root:has(.resume-page) {
    scroll-behavior: smooth;
}

/* Anchor targets must clear the sticky nav strip. */
.resume-section {
    scroll-margin-top: calc(var(--spacing) * 20);
}

/* --------------------------------------------------------------------------
   STICKY SECTION NAV (anchor chip row — TR-003 fallback)
   -------------------------------------------------------------------------- */

.resume-nav {
    position: sticky;
    top: 0;
    z-index: 20;
    display: flex;
    gap: calc(var(--spacing) * 2);
    overflow-x: auto;
    padding: calc(var(--spacing) * 2) 0;
    background-color: var(--background);
    border-bottom: 1px solid var(--border);
    white-space: nowrap;
}

/* --------------------------------------------------------------------------
   HERO
   -------------------------------------------------------------------------- */

.resume-hero {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: calc(var(--spacing) * 3);
    text-align: center;
    padding: calc(var(--spacing) * 8) 0;
}

.resume-photo {
    width: calc(var(--spacing) * 40);
    height: calc(var(--spacing) * 40);
    border-radius: 9999px;
    object-fit: cover;
    border: 3px solid var(--primary);
    background-color: var(--muted);
}

.resume-tagline {
    max-width: 42rem;
}

/* --------------------------------------------------------------------------
   EXPERIENCE TIMELINE (TR-004 — no Timeline component in TrBlazeUI 2.0.1)
   -------------------------------------------------------------------------- */

.resume-timeline {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: calc(var(--spacing) * 8);
    padding-left: calc(var(--spacing) * 6);
    border-left: 2px solid var(--border);
}

.resume-timeline-item {
    position: relative;
}

.resume-timeline-item::before {
    content: '';
    position: absolute;
    top: calc(var(--spacing) * 3);
    left: calc(-1 * var(--spacing) * 6 - 6px);
    width: 10px;
    height: 10px;
    border-radius: 9999px;
    background-color: var(--primary);
    box-shadow: 0 0 0 3px var(--background);
}

/* --------------------------------------------------------------------------
   MEDIA BOXES (object-fit has no compiled utility)
   -------------------------------------------------------------------------- */

.resume-logo {
    width: calc(var(--spacing) * 12);
    height: calc(var(--spacing) * 12);
    flex-shrink: 0;
    object-fit: contain;
    border-radius: var(--radius);
    background-color: var(--muted);
    padding: calc(var(--spacing) * 1);
}

.resume-badge-image {
    width: calc(var(--spacing) * 16);
    height: calc(var(--spacing) * 16);
    flex-shrink: 0;
    object-fit: contain;
    border-radius: var(--radius);
}

/* --------------------------------------------------------------------------
   AUTO-FIT GRIDS (no grid-cols-* / md:grid-cols-* utilities are compiled)
   -------------------------------------------------------------------------- */

.resume-autogrid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
    gap: calc(var(--spacing) * 4);
}

.resume-stack {
    display: flex;
    flex-direction: column;
    gap: calc(var(--spacing) * 4);
}

/* --------------------------------------------------------------------------
   PRIMARY CONTACT CALL TO ACTION (LinkedIn)

   The public contact block publishes no email address and no phone number
   (owner decision, 2026-08-10), so LinkedIn is the ONLY route a reader has.
   It therefore reads as a full-width primary panel rather than as one tile
   among several. Every value below is a theme token — the panel inherits the
   active site theme and both light and dark automatically.
   -------------------------------------------------------------------------- */

.resume-contact-primary {
    display: flex;
    align-items: center;
    gap: calc(var(--spacing) * 4);
    padding: calc(var(--spacing) * 5);
    border: 1px solid var(--primary);
    border-radius: var(--radius);
    background-color: var(--primary);
    color: var(--primary-foreground);
    text-decoration: none;
    transition: opacity 150ms ease-in-out, box-shadow 150ms ease-in-out;
}

.resume-contact-primary:hover,
.resume-contact-primary:focus-visible {
    opacity: 0.92;
    box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--ring);
}

.resume-contact-primary-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: calc(var(--spacing) * 12);
    height: calc(var(--spacing) * 12);
    border-radius: var(--radius);
    background-color: var(--primary-foreground);
    color: var(--primary);
}

.resume-contact-primary-text {
    display: flex;
    flex-direction: column;
    min-width: 0;
    flex: 1 1 auto;
}

/* Type SIZE comes from the shared utility classes on the markup (text-xs /
   text-lg font-semibold), so this file states only what those cannot: the
   letter-spacing and the muting of the label against the primary fill. */
.resume-contact-primary-label {
    letter-spacing: 0.06em;
    text-transform: uppercase;
    opacity: 0.85;
}

.resume-contact-primary-chevron {
    display: flex;
    align-items: center;
    flex: none;
}

/* --------------------------------------------------------------------------
   PRINT
   -------------------------------------------------------------------------- */

@media print {
    .resume-nav,
    .resume-actions,
    .resume-social {
        display: none;
    }

    .resume-hero {
        padding: calc(var(--spacing) * 2) 0;
    }

    .resume-section,
    .resume-timeline-item,
    .resume-award {
        page-break-inside: avoid;
    }
}
