/* Global styles — imports tokens.css via index.html, applies base typography and layout. */

*, *::before, *::after { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    min-height: 100vh;
    font-family: var(--jb-font-family-sans);
    font-size: var(--jb-text-body-md);
    line-height: var(--jb-text-leading-normal);
    color: var(--jb-color-text-primary);
    background: var(--jb-color-surface-canvas);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

a {
    color: var(--jb-color-text-link);
    text-decoration: none;
}
a:hover { color: var(--jb-color-text-link-hover); text-decoration: underline; }

h1, h2, h3, h4, h5, h6 { margin: 0 0 var(--jb-space-sm) 0; line-height: var(--jb-text-leading-tight); }
h1 { font-size: var(--jb-text-heading-xl); font-weight: var(--jb-text-weight-semibold); }
h2 { font-size: var(--jb-text-heading-lg); font-weight: var(--jb-text-weight-semibold); }
h3 { font-size: var(--jb-text-heading-md); font-weight: var(--jb-text-weight-semibold); }

p { margin: 0 0 var(--jb-space-md) 0; }
p:last-child { margin-bottom: 0; }

.jb-splash {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
    gap: var(--jb-space-lg);
}
.jb-splash__logo {
    font-size: var(--jb-text-heading-lg);
    font-weight: var(--jb-text-weight-bold);
    color: var(--jb-color-brand-primary);
}
.jb-splash__spinner {
    width: 32px; height: 32px;
    border: 3px solid var(--jb-color-neutral-200);
    border-top-color: var(--jb-color-brand-primary);
    border-radius: 50%;
    animation: jb-spin 0.8s linear infinite;
}
@keyframes jb-spin { to { transform: rotate(360deg); } }

#blazor-error-ui {
    background: var(--jb-color-status-error-bg);
    color: var(--jb-color-status-error);
    bottom: 0;
    box-shadow: var(--jb-shadow-md);
    display: none;
    left: 0;
    padding: var(--jb-space-sm) var(--jb-space-lg);
    position: fixed;
    width: 100%;
    z-index: var(--jb-z-toast);
}
/* axe link-in-text-block: ".reload" is a text-only link inside the
   error banner — give it an underline so it's distinguishable from
   the surrounding "An unhandled error has occurred." text. */
#blazor-error-ui .reload { text-decoration: underline; color: inherit; }
#blazor-error-ui .dismiss {
    cursor: pointer;
    position: absolute;
    right: var(--jb-space-md);
    top: var(--jb-space-xs);
    /* axe couldn't resolve the inherited foreground colour against the
       absolute-positioned containing block — set both explicitly so the
       contrast check has a deterministic pair. */
    color: var(--jb-color-status-error);
    background: var(--jb-color-status-error-bg);
}

.jb-stack { display: flex; flex-direction: column; gap: var(--jb-space-md); }
.jb-cluster { display: flex; gap: var(--jb-space-sm); align-items: center; flex-wrap: wrap; }
.jb-muted { color: var(--jb-color-text-muted); }
.jb-text-sm { font-size: var(--jb-text-body-sm); }
.jb-text-xs { font-size: var(--jb-text-body-xs); }

/* Auth-page (.login__*) shell styles live in each page's *.razor.css
 * scoped file so Blazor's content-hashed JobBoardAdmin.styles.css bundle
 * auto-busts the cache on every deploy. See Pages/Login.razor.css. */

/* ───────── Scroll-reveal (driven by js/scroll-reveal.js) ─────────
   Sections marked [data-reveal] start translated + transparent and
   fade up when they enter the viewport. The .is-visible class is
   applied by an IntersectionObserver so animation only fires once. */
[data-reveal] {
    opacity: 0;
    transform: translateY(16px);
    transition: opacity 600ms cubic-bezier(0.22, 1, 0.36, 1),
                transform 600ms cubic-bezier(0.22, 1, 0.36, 1);
    will-change: opacity, transform;
}
[data-reveal].is-visible {
    opacity: 1;
    transform: none;
}
@media (prefers-reduced-motion: reduce) {
    [data-reveal] { opacity: 1; transform: none; transition: none; }
}

/* ───────── Accessibility primitives ─────────
   Global classes used by every layout (scoped CSS doesn't reach
   across components, so layout-shared styles live here).
   See WCAG 2.4.1 Bypass Blocks + 2.4.7 Focus Visible. */

/* Skip-to-content link styling lives on <SkipToMain/> directly so
   the rules and the markup ship together. Old .skip-link / .public__skip
   / .shell__skip rules removed: they sometimes leaked into view due
   to specificity conflicts on top of being keyed off an <a href> that
   Blazor's NavigationManager rewrote into a home-page nav. */

/* Programmatic focus targets — when the skip link puts focus on
   <main tabindex="-1">, we don't want a visual ring around the
   whole content area. Real interactive elements still get rings
   via the global :focus-visible rule below. */
[tabindex="-1"]:focus { outline: none; }

/* Global focus-visible — every interactive element gets a high-
   contrast ring on keyboard focus. The :focus-visible pseudo-class
   means mouse clicks DON'T trigger it (no hidden-by-default
   navy-on-teal halo every click), but Tab does. WCAG 2.4.7. */
:focus-visible {
    outline: 3px solid var(--jb-color-focus, #FFD23F);
    outline-offset: 2px;
    border-radius: 2px;
}

/* Visually hidden but available to screen readers — the canonical
   "sr-only" recipe. Use for labels that are visually redundant
   (e.g. an icon-only button has its meaning conveyed by the icon
   for sighted users; AT users still need the text). */
.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* ───────── Form validation messages ─────────
   Blazor's <ValidationMessage> renders as <div class="validation-message">.
   Style it red + slightly muted so it sits comfortably under each input
   without competing with the input itself. The same class is used for
   both client-side DataAnnotations errors and server-side errors piped
   through ServerValidationBridge — no need to distinguish in the UI. */
.validation-message,
.cv__field-error {
    display: block;
    color: var(--jb-color-status-error, #b91c1c);
    font-size: 0.85em;
    margin-top: 4px;
    line-height: 1.3;
}

/* When an input is in an error state, give it a red border + ring so
   the field stands out before the user reads the message text. The
   .modified.invalid pair is what Blazor toggles on bound inputs. */
input.invalid,
input.modified.invalid,
textarea.invalid,
textarea.modified.invalid,
select.invalid,
select.modified.invalid {
    border-color: var(--jb-color-status-error, #b91c1c) !important;
    box-shadow: 0 0 0 3px rgba(185, 28, 28, 0.15);
}

/* ───────── Public-page chrome (shared by WASM + SSR) ─────────
   The WASM PublicLayout has a scoped-CSS twin in
   JobBoardAdmin/Layout/PublicLayout.razor.css that ONLY matches
   elements with the page-component's scope-hash attribute. Static SSR
   renders the same markup from JobBoardAdmin.Public, where the scope
   hash is different — the scoped rules don't match. Defining the
   chrome rules globally here means both projects share one source
   of truth, and the SSR public surface no longer renders as plain
   default-browser HTML. */

.public {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    background: var(--jb-color-surface-canvas);
}

.public__skip {
    position: fixed; top: -200px; left: -200px;
    width: 1px; height: 1px; padding: 0; margin: 0; border: 0;
    background: transparent;
    clip: rect(0,0,0,0); clip-path: inset(50%);
    overflow: hidden; white-space: nowrap;
}
.public__skip:focus, .public__skip:focus-visible {
    top: 0; left: 0;
    width: auto; height: auto;
    padding: 12px 18px;
    clip: auto; clip-path: none; overflow: visible; white-space: normal;
    z-index: 9999;
    background: var(--jb-color-brand-primary, #0E7C7B);
    color: #fff; font-weight: 600;
    border-radius: 0 0 8px 0;
    outline: 3px solid var(--jb-color-focus, #FFD23F);
    outline-offset: 2px;
}

.public__header {
    display: flex; align-items: center;
    gap: var(--jb-space-xl);
    padding: 0 var(--jb-space-xl);
    height: 72px;
    background: var(--jb-color-surface-card);
    border-bottom: 1px solid var(--jb-color-border-subtle);
    position: sticky; top: 0;
    z-index: var(--jb-z-sticky, 10);
}

.public__brand {
    display: inline-flex; align-items: center; gap: var(--jb-space-sm);
    color: var(--jb-color-text-primary);
    text-decoration: none;
    font-size: var(--jb-text-heading-sm);
    font-weight: var(--jb-text-weight-bold);
}
.public__brand:hover { text-decoration: none; }

.public__brand-mark {
    display: inline-flex; align-items: center; justify-content: center;
    width: 36px; height: 36px;
    border-radius: var(--jb-radius-md);
    background: var(--jb-color-brand-primary);
    color: var(--jb-color-text-inverse);
    font-weight: var(--jb-text-weight-bold);
}

.public__nav {
    display: flex; gap: var(--jb-space-lg);
    flex: 1;
    margin-left: var(--jb-space-xl);
}
.public__nav a {
    color: var(--jb-color-text-secondary);
    text-decoration: none;
    font-size: var(--jb-text-body-sm);
    font-weight: var(--jb-text-weight-medium);
    padding: var(--jb-space-xs) 0;
    border-bottom: 2px solid transparent;
    transition: border-color 120ms;
}
.public__nav a:hover {
    color: var(--jb-color-text-primary);
    border-bottom-color: var(--jb-color-brand-primary);
    text-decoration: none;
}

.public__actions {
    display: flex; align-items: center; gap: var(--jb-space-md);
}
.public__theme {
    display: inline-flex; gap: 2px; padding: 2px;
    background: var(--jb-color-surface-sunken);
    border: 1px solid var(--jb-color-border-subtle);
    border-radius: var(--jb-radius-pill);
}
.public__theme-btn {
    background: transparent; border: 0; padding: 4px 8px;
    border-radius: var(--jb-radius-pill); cursor: pointer;
    font-size: 14px; line-height: 1;
    color: var(--jb-color-text-secondary);
}
.public__theme-btn:hover { color: var(--jb-color-text-primary); }
@media (max-width: 700px) { .public__theme { display: none; } }
.public__signin, .public__create {
    color: var(--jb-color-text-primary);
    font-size: var(--jb-text-body-sm);
    font-weight: var(--jb-text-weight-medium);
    text-decoration: none;
}
.public__signin:hover, .public__create:hover {
    color: var(--jb-color-brand-primary);
    text-decoration: none;
}

.public__cta {
    display: inline-flex; align-items: center;
    padding: 8px 14px;
    border-radius: var(--jb-radius-md);
    background: var(--jb-color-brand-primary);
    color: var(--jb-color-text-inverse);
    font-size: var(--jb-text-body-sm);
    font-weight: var(--jb-text-weight-semibold);
    text-decoration: none;
    border: 1px solid transparent;
    transition: background 120ms, transform 120ms, box-shadow 120ms;
}
.public__cta:hover {
    background: var(--jb-color-brand-primary-hover);
    color: var(--jb-color-text-inverse);
    text-decoration: none;
    transform: translateY(-1px);
    box-shadow: 0 6px 14px rgba(15, 118, 110, 0.28);
}

.public__main { flex: 1; }
.public__main:focus { outline: none; }

.public__footer {
    background: var(--jb-color-neutral-900);
    color: var(--jb-color-neutral-200);
    padding: var(--jb-space-2xl) var(--jb-space-xl) var(--jb-space-lg);
    margin-top: var(--jb-space-3xl);
}
.public__footer-grid {
    max-width: 1200px;
    margin: 0 auto;
    display: grid;
    grid-template-columns: 2fr 1fr 1fr 1fr;
    gap: var(--jb-space-xl);
    padding-bottom: var(--jb-space-xl);
    border-bottom: 1px solid var(--jb-color-neutral-800);
}
.public__footer-brand {
    font-size: var(--jb-text-heading-md);
    font-weight: var(--jb-text-weight-bold);
    color: var(--jb-color-text-inverse);
    margin-bottom: var(--jb-space-xs);
}
.public__footer-grid h4 {
    font-size: var(--jb-text-body-sm);
    font-weight: var(--jb-text-weight-semibold);
    color: var(--jb-color-text-inverse);
    margin-bottom: var(--jb-space-sm);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}
.public__footer-grid a {
    display: block;
    color: var(--jb-color-neutral-300);
    font-size: var(--jb-text-body-sm);
    padding: var(--jb-space-3xs, 4px) 0;
    text-decoration: none;
}
.public__footer-grid a:hover {
    color: var(--jb-color-text-inverse);
    text-decoration: underline;
}
/* `.jb-muted` defaults to neutral-500 — fine on white, grey-on-black on
   the dark footer. Lift to neutral-300 in this scope so muted descriptive
   text stays WCAG AA against the neutral-900 footer background. */
.public__footer .jb-muted { color: var(--jb-color-neutral-300); }
.public__footer .jb-muted a { color: inherit; text-decoration: underline; }
.public__footer-meta {
    max-width: 1200px;
    margin: var(--jb-space-md) auto 0;
    display: flex; justify-content: space-between;
    font-size: var(--jb-text-body-xs);
    color: var(--jb-color-neutral-300);
}
/* Sawmill Software link inside the meta strip inherits neutral-300 so
   contrast clears WCAG AA against neutral-900; underlined so it's
   distinguishable from surrounding copyright text. */
.public__footer-meta a { color: var(--jb-color-neutral-200); text-decoration: underline; }

/* ───────── Mobile hamburger menu (public surface) ─────────
   <details>/<summary> gives a CSS-only click-to-toggle drawer so SSR
   pages without a Blazor runtime can still expose nav + login on
   mobile. Three-stripe icon via spans on <summary>; the default
   browser triangle is removed below. Hidden on desktop (≥900px). */
.public__mobile-menu { display: none; position: relative; }
.public__mobile-menu > summary {
    list-style: none;
    cursor: pointer;
    display: inline-flex;
    flex-direction: column;
    justify-content: center;
    gap: 4px;
    width: 40px;
    height: 40px;
    padding: 8px;
    background: transparent;
    border: 0;
    border-radius: 6px;
}
.public__mobile-menu > summary::-webkit-details-marker { display: none; }
.public__mobile-menu > summary::marker { display: none; content: ""; }
.public__mobile-menu > summary:hover { background: var(--jb-color-surface-sunken, #f3f4f6); }
.public__hamburger span {
    display: block;
    height: 2px;
    width: 22px;
    background: var(--jb-color-text-primary, #111);
    border-radius: 1px;
}
.public__mobile-drawer {
    position: absolute;
    top: calc(100% + 4px);
    right: 0;
    min-width: 220px;
    background: var(--jb-color-surface-card, #fff);
    border: 1px solid var(--jb-color-border-subtle, #e5e7eb);
    border-radius: 8px;
    box-shadow: var(--jb-shadow-md, 0 4px 12px rgba(0,0,0,0.08));
    padding: var(--jb-space-sm, 8px);
    display: flex;
    flex-direction: column;
    gap: 2px;
    z-index: 100;
}
.public__mobile-drawer a {
    display: block;
    padding: 10px 12px;
    border-radius: 6px;
    color: var(--jb-color-text-primary, #111);
    text-decoration: none;
}
.public__mobile-drawer a:hover { background: var(--jb-color-surface-sunken, #f3f4f6); }
.public__mobile-drawer .public__mobile-cta {
    background: var(--jb-color-brand-primary, #0E7C7B);
    color: var(--jb-color-text-inverse, #fff);
    text-align: center;
    font-weight: 600;
}
.public__mobile-drawer .public__mobile-cta:hover {
    background: var(--jb-color-brand-primary-hover, #0B6362);
}
.public__mobile-divider {
    border: 0;
    border-top: 1px solid var(--jb-color-border-subtle, #e5e7eb);
    margin: 6px 0;
}

@media (max-width: 900px) {
    .public__footer-grid { grid-template-columns: 1fr 1fr; }
    .public__nav { display: none; }
    /* Show hamburger on the same breakpoint where the desktop nav
       hides — visitors otherwise lose access to the nav links. */
    .public__mobile-menu { display: inline-block; }
}
@media (max-width: 600px) {
    .public__cta { display: none; }
    .public__signin, .public__create { display: none; }
    /* On the narrowest viewports the action buttons in the header
       also hide; the drawer below carries them so login/signup
       stay reachable. */
}

/* ───────── Buttons (shared by WASM + SSR) ─────────
   The Blazor <Button> component has scoped CSS in
   JobBoardAdmin.Shared/Components/Button.razor.css. SSR pages use
   plain <a class="jb-button"> for navigation rather than the
   component (to avoid an OnClick handler that wouldn't fire under
   Static SSR), so the scope-hash selectors don't match. Defining
   the rules globally here lets both work. */

.jb-button {
    display: inline-flex; align-items: center; justify-content: center;
    gap: 8px;
    padding: 10px 18px;
    border-radius: 8px;
    border: 1px solid transparent;
    font-size: 0.95rem;
    font-weight: 600;
    line-height: 1.2;
    text-decoration: none;
    cursor: pointer;
    transition: background 120ms, border-color 120ms, color 120ms, transform 120ms;
}
.jb-button:disabled { opacity: 0.6; cursor: not-allowed; }
.jb-button:hover { text-decoration: none; }

.jb-button--primary {
    background: var(--jb-color-brand-primary, #0E7C7B);
    color: #fff;
    border-color: var(--jb-color-brand-primary, #0E7C7B);
}
.jb-button--primary:hover {
    background: var(--jb-color-brand-primary-hover, #0A6261);
    color: #fff;
    transform: translateY(-1px);
}

.jb-button--secondary {
    background: var(--jb-color-surface-card, #fff);
    color: var(--jb-color-text-primary);
    border-color: var(--jb-color-border-default, #d1d5db);
}
.jb-button--secondary:hover {
    border-color: var(--jb-color-brand-primary, #0E7C7B);
    color: var(--jb-color-brand-primary, #0E7C7B);
}

.jb-button--neutral {
    background: var(--jb-color-surface-sunken, #f3f4f6);
    color: var(--jb-color-text-primary);
    border-color: transparent;
}
.jb-button--neutral:hover {
    background: var(--jb-color-border-subtle, #e5e7eb);
    color: var(--jb-color-text-primary);
}

.jb-button--ghost {
    background: transparent;
    color: var(--jb-color-text-primary);
    border-color: var(--jb-color-border-default, #d1d5db);
}
.jb-button--ghost:hover {
    border-color: var(--jb-color-brand-primary, #0E7C7B);
    color: var(--jb-color-brand-primary, #0E7C7B);
}

.jb-button--destructive {
    background: var(--jb-color-status-error, #b91c1c);
    color: #fff;
    border-color: var(--jb-color-status-error, #b91c1c);
}

.jb-button--sm {
    padding: 6px 12px;
    font-size: 0.85rem;
}

/* ───────── Marketing pages (About, ForEmployers, etc.) ───────── */

.marketing {
    padding: var(--jb-space-2xl, 48px) var(--jb-space-xl, 24px);
}
.marketing__inner {
    max-width: 880px;
    margin: 0 auto;
}
.marketing__inner h1 {
    font-size: 2.4rem;
    margin: 0 0 var(--jb-space-md, 16px);
    letter-spacing: -0.02em;
}
.marketing__inner h2 {
    font-size: 1.4rem;
    margin: var(--jb-space-xl, 32px) 0 var(--jb-space-sm, 12px);
}
.marketing__inner p {
    line-height: 1.6;
    color: var(--jb-color-text-secondary, #4b5563);
    margin: 0 0 var(--jb-space-md, 16px);
}
.marketing__lede {
    font-size: 1.15rem;
    color: var(--jb-color-text-primary) !important;
}
.marketing__cta {
    display: flex; gap: var(--jb-space-sm, 12px);
    flex-wrap: wrap;
    margin: var(--jb-space-lg, 24px) 0;
}
.marketing__sublinks {
    color: var(--jb-color-text-muted, #6b7280);
    font-size: 0.95rem;
}
.marketing__features {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: var(--jb-space-lg, 24px);
    margin-top: var(--jb-space-xl, 32px);
}
.marketing__features > div {
    padding: var(--jb-space-md, 16px);
    background: var(--jb-color-surface-card, #fff);
    border: 1px solid var(--jb-color-border-subtle, #e5e7eb);
    border-radius: 8px;
}
.marketing__features h3 {
    font-size: 1.05rem;
    margin: 0 0 var(--jb-space-xs, 8px);
}
.marketing__features p {
    margin: 0;
    font-size: 0.95rem;
}

/* =====================================================================
   Public home page (/) — moved off scoped CSS so the SSR Razor
   Components host renders styled markup. Scoped .razor.css would only
   apply when the WASM client mounts; under Static SSR there is no
   client component to attach the scoped attribute, so styles flowed
   through to nothing. Global rules under stable BEM-ish class names
   are the canonical form.
   ===================================================================== */

/* Hero */
.hero {
    /* The image layer reads --jb-tenant-hero-bg when the tenant has
       uploaded one; otherwise the platform default (single url) wins.
       The injected variable is either a single url() or an image-set
       with WebP + JPEG type hints — both are valid <bg-image> values
       so the cascade just slots in without any per-layer rewrite. */
    background:
        linear-gradient(
            135deg,
            color-mix(in srgb, var(--jb-color-brand-primary) 78%, black 30%) 0%,
            color-mix(in srgb, var(--jb-color-brand-primary) 55%, transparent) 60%,
            color-mix(in srgb, var(--jb-color-brand-primary) 70%, transparent) 100%),
        var(--jb-tenant-hero-bg, url('/images/hero-team.webp')) center/cover no-repeat;
    background-color: var(--jb-color-brand-primary);
    color: var(--jb-color-text-inverse);
    position: relative;
    overflow: hidden;
}
.hero::before {
    content: "";
    position: absolute;
    inset: 0;
    background:
        radial-gradient(ellipse at 50% 40%, rgba(0,0,0,0.0) 0%, rgba(0,0,0,0.35) 80%),
        linear-gradient(180deg, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.45) 100%);
    pointer-events: none;
}
.hero__inner {
    position: relative;
    max-width: 960px;
    margin: 0 auto;
    padding: 96px var(--jb-space-xl, 32px) 120px;
    text-align: center;
}
.hero__eyebrow {
    display: inline-block;
    padding: var(--jb-space-2xs, 4px) var(--jb-space-md, 16px);
    background: rgba(255,255,255,0.1);
    border: 1px solid rgba(255,255,255,0.15);
    border-radius: 999px;
    font-size: var(--jb-text-body-xs, .8em);
    font-weight: 500;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    margin-bottom: var(--jb-space-md, 16px);
}
.hero__title {
    font-size: clamp(2rem, 4vw, 3.25rem);
    font-weight: 700;
    line-height: 1.1;
    margin: 0 0 var(--jb-space-md, 16px);
    color: var(--jb-color-text-inverse);
    text-shadow: 0 2px 8px rgba(0,0,0,0.45);
}
.hero__subtitle {
    font-size: var(--jb-text-body-lg, 1.1rem);
    line-height: 1.6;
    color: rgba(255,255,255,0.85);
    max-width: 640px;
    margin: 0 auto var(--jb-space-xl, 32px);
    text-shadow: 0 1px 2px rgba(0,0,0,0.35);
}
.hero__search {
    display: grid;
    grid-template-columns: 1.2fr 1fr auto;
    gap: var(--jb-space-2xs, 4px);
    background: var(--jb-color-surface-card, #fff);
    border-radius: 12px;
    padding: var(--jb-space-2xs, 4px);
    box-shadow: 0 20px 50px rgba(0,0,0,0.25);
    margin-bottom: var(--jb-space-xl, 32px);
    text-align: left;
}
.hero__search-field {
    display: flex;
    flex-direction: column;
    padding: var(--jb-space-xs, 8px) var(--jb-space-md, 16px);
}
.hero__search-field label {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 600;
    color: var(--jb-color-text-muted, #6b7280);
    margin-bottom: 2px;
}
.hero__search-field input {
    border: none;
    outline: none;
    font-size: var(--jb-text-body-md, 1rem);
    font-family: inherit;
    color: var(--jb-color-text-primary);
    background: transparent;
    padding: 0;
}
.hero__search-field + .hero__search-field {
    border-left: 1px solid var(--jb-color-border-subtle, #e5e7eb);
}
.hero__search-btn {
    padding: 0 var(--jb-space-lg, 24px);
    background: var(--jb-color-brand-primary, #0E7C7B);
    color: var(--jb-color-text-inverse, #fff);
    border: none;
    border-radius: 8px;
    font-size: var(--jb-text-body-md, 1rem);
    font-weight: 600;
    cursor: pointer;
    transition: background 150ms ease;
}
.hero__search-btn:hover { background: var(--jb-color-brand-primary-hover, #0a615f); }
.hero__trust {
    display: flex;
    justify-content: center;
    gap: var(--jb-space-2xl, 48px);
    color: rgba(255,255,255,0.85);
    font-size: var(--jb-text-body-sm, .9rem);
    text-shadow: 0 1px 2px rgba(0,0,0,0.4);
}
.hero__trust strong {
    display: block;
    font-size: var(--jb-text-heading-md, 1.5rem);
    color: var(--jb-color-text-inverse, #fff);
    font-weight: 700;
}
@media (max-width: 700px) {
    .hero__search { grid-template-columns: 1fr; }
    .hero__search-field + .hero__search-field { border-left: none; border-top: 1px solid var(--jb-color-border-subtle, #e5e7eb); }
    .hero__search-btn { padding: var(--jb-space-md, 16px); }
    .hero__trust { gap: var(--jb-space-lg, 24px); flex-wrap: wrap; }
}

/* Sections (home) */
.section { padding: var(--jb-space-3xl, 64px) var(--jb-space-xl, 32px); }
.section--muted { background: var(--jb-color-surface-sunken, #f3f4f6); }
.section__inner { max-width: 1200px; margin: 0 auto; }
.section__head { margin-bottom: var(--jb-space-xl, 32px); text-align: center; }
.section__head h2 { font-size: var(--jb-text-heading-xl, 2rem); margin: 0 0 var(--jb-space-xs, 8px); }

/* Category tiles */
.tiles {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: var(--jb-space-md, 16px);
}
.tile {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--jb-space-xs, 8px);
    padding: var(--jb-space-lg, 24px);
    background: var(--jb-color-surface-card, #fff);
    border: 1px solid var(--jb-color-border-subtle, #e5e7eb);
    border-radius: 12px;
    text-decoration: none;
    color: var(--jb-color-text-primary);
    transition: transform 150ms ease, box-shadow 150ms ease, border-color 150ms ease;
}
.tile:hover {
    transform: translateY(-2px);
    box-shadow: var(--jb-shadow-md, 0 6px 16px rgba(0,0,0,.08));
    border-color: var(--jb-color-brand-primary, #0E7C7B);
}
.tile__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px; height: 44px;
    border-radius: 8px;
    background: rgba(15, 118, 110, 0.08);
    color: var(--jb-color-brand-primary, #0E7C7B);
    margin-bottom: var(--jb-space-xs, 8px);
    transition: background 150ms ease, color 150ms ease, transform 150ms ease;
}
.tile:hover .tile__icon {
    background: var(--jb-color-brand-primary, #0E7C7B);
    color: var(--jb-color-text-inverse, #fff);
    transform: scale(1.05);
}
.tile__name { font-size: var(--jb-text-body-lg, 1.1rem); font-weight: 600; }
.tile__count { font-size: var(--jb-text-body-sm, .9rem); color: var(--jb-color-text-muted, #6b7280); }

/* Location pills */
.pills { display: flex; flex-wrap: wrap; gap: var(--jb-space-xs, 8px); justify-content: center; }
.pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: var(--jb-space-xs, 8px) var(--jb-space-md, 16px);
    background: var(--jb-color-surface-card, #fff);
    border: 1px solid var(--jb-color-border-default, #d1d5db);
    border-radius: 999px;
    color: var(--jb-color-text-primary);
    font-size: var(--jb-text-body-sm, .9rem);
    font-weight: 500;
    text-decoration: none;
    transition: all 150ms ease;
}
.pill:hover {
    background: var(--jb-color-brand-primary, #0E7C7B);
    color: var(--jb-color-text-inverse, #fff);
    border-color: var(--jb-color-brand-primary, #0E7C7B);
}
.pill__pin { color: var(--jb-color-brand-primary, #0E7C7B); flex-shrink: 0; transition: color 150ms ease; }
.pill:hover .pill__pin { color: var(--jb-color-text-inverse, #fff); }
.pill__count {
    display: inline-block;
    margin-left: 6px;
    padding: 1px 8px;
    background: var(--jb-color-surface-sunken, #f3f4f6);
    border-radius: 999px;
    font-size: 0.8em;
    color: var(--jb-color-text-muted, #6b7280);
    font-variant-numeric: tabular-nums;
}
.pill:hover .pill__count {
    background: rgba(255, 255, 255, 0.18);
    color: rgba(255, 255, 255, 0.9);
}

/* Featured employers (home) */
.employers { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--jb-space-md, 16px); }
.employer-card {
    display: flex;
    align-items: center;
    gap: var(--jb-space-md, 16px);
    padding: var(--jb-space-md, 16px);
    background: var(--jb-color-surface-card, #fff);
    border: 1px solid var(--jb-color-border-subtle, #e5e7eb);
    border-radius: 12px;
    text-decoration: none;
    color: var(--jb-color-text-primary);
    transition: transform 150ms ease, box-shadow 150ms ease, border-color 150ms ease;
}
.employer-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--jb-shadow-md, 0 6px 16px rgba(0,0,0,.08));
    border-color: var(--jb-color-brand-primary, #0E7C7B);
}
.employer-card__logo {
    width: 56px; height: 56px;
    border-radius: 8px;
    background: linear-gradient(135deg, var(--jb-color-brand-primary, #0E7C7B), var(--jb-color-brand-primary-active, #0a615f));
    color: var(--jb-color-text-inverse, #fff);
    display: flex; align-items: center; justify-content: center;
    font-weight: 700;
    font-size: var(--jb-text-body-md, 1rem);
}
.employer-card__name { font-size: var(--jb-text-body-md, 1rem); font-weight: 600; }
.employer-card__meta { font-size: var(--jb-text-body-sm, .9rem); color: var(--jb-color-text-secondary, #6b7280); }

/* Blog grid (home) */
.blog-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--jb-space-lg, 24px);
}
@media (max-width: 1024px) { .blog-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px)  { .blog-grid { grid-template-columns: 1fr; } }
.blog-card {
    display: flex; flex-direction: column;
    background: var(--jb-color-surface-card, #fff);
    border: 1px solid var(--jb-color-border-subtle, #e5e7eb);
    border-radius: 8px;
    overflow: hidden;
    text-decoration: none;
    color: inherit;
    transition: transform .15s ease, box-shadow .15s ease;
}
.blog-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 24px rgba(0,0,0,.08);
}
.blog-card__hero {
    aspect-ratio: 16 / 9;
    background-size: cover;
    background-position: center;
    background-color: var(--jb-color-surface-sunken, #f3f4f6);
}
.blog-card__hero--placeholder {
    background-image: linear-gradient(135deg, var(--jb-color-brand-soft, #d8efee), var(--jb-color-surface-sunken, #f3f4f6));
}
.blog-card__body {
    display: flex; flex-direction: column; gap: 6px;
    padding: var(--jb-space-md, 16px);
}
.blog-card__category {
    text-transform: uppercase; letter-spacing: .05em;
    color: var(--jb-color-brand-primary, #0E7C7B);
    font-weight: 600;
}
.blog-card__title { margin: 0; font-size: var(--jb-text-body-lg, 1.1rem); line-height: 1.3; }
.blog-card__excerpt { margin: 0; }
.blog-card__date { margin-top: auto; }
.section__more { text-align: center; margin-top: var(--jb-space-lg, 24px); }
.section__more a { color: var(--jb-color-brand-primary, #0E7C7B); font-weight: 600; text-decoration: none; }
.section__more a:hover { text-decoration: underline; }

/* CTA */
.cta {
    background: var(--jb-color-neutral-900, #111827);
    color: var(--jb-color-text-inverse, #fff);
    padding: var(--jb-space-2xl, 48px) var(--jb-space-xl, 32px);
}
.cta__inner {
    max-width: 1200px;
    margin: 0 auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--jb-space-xl, 32px);
}
.cta__title { font-size: var(--jb-text-heading-lg, 1.75rem); margin: 0 0 var(--jb-space-xs, 8px); color: var(--jb-color-text-inverse, #fff); }
.cta__body { color: rgba(255, 255, 255, 0.75); margin: 0; max-width: 520px; }
.cta__actions { display: flex; gap: var(--jb-space-sm, 12px); flex-shrink: 0; }
.cta__btn { padding: 10px 18px; border-radius: 6px; text-decoration: none; font-weight: 600; }
.cta__btn--primary { background: var(--jb-color-brand-primary, #0E7C7B); color: var(--jb-color-text-inverse, #fff); }
.cta__btn--primary:hover { background: var(--jb-color-brand-primary-hover, #0a615f); }
.cta__btn--neutral { background: rgba(255, 255, 255, 0.1); color: var(--jb-color-text-inverse, #fff); border: 1px solid rgba(255, 255, 255, 0.25); }
.cta__btn--neutral:hover { background: rgba(255, 255, 255, 0.18); }
@media (max-width: 700px) {
    .cta__inner { flex-direction: column; align-items: flex-start; }
}

/* Sponsored banner (home midpage) */
.sponsored { max-width: 1200px; margin: 0 auto var(--jb-space-lg, 24px); padding: 0 var(--jb-space-md, 16px); }
.sponsored__link { position: relative; display: block; border-radius: 12px; overflow: hidden; box-shadow: 0 6px 16px rgba(0,0,0,.06); }
.sponsored__img { width: 100%; height: auto; display: block; }
.sponsored__tag { position: absolute; top: 8px; right: 8px; background: rgba(0,0,0,.6); color: #fff; font-size: .7em; padding: 2px 8px; border-radius: 999px; text-transform: uppercase; letter-spacing: .04em; }

/* Validated-input accent — paired with the <ValidationHint> component
   to give the user visual confirmation that a length / non-empty gate
   has lifted before they reach the submit button. */
.jb-input--valid {
    border-color: #10b981 !important;
    box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.15);
}

/* Auth-state shim — see App.razor in JobBoardAdmin.Public. The inline
   head script tags <html> with .jb-role-candidate when localStorage
   shows a candidate session; we use it to hide employer-only CTAs on
   SSR pages without an FOUC. */
html.jb-role-candidate .jb-hide-candidate { display: none !important; }

/* Clickable data-table rows — the canonical rules for these classes
   live next to the <DataTable> component (DataTable.razor.css) and
   are therefore SCOPED: Blazor rewrites the selectors with a
   generated [b-xyz] attribute so they only match elements rendered
   INSIDE that component. Pages that hand-roll their own <table> with
   the same class names (EmployerApplications, EmployerJobEdit's
   applicants tab, etc.) sit outside that scope, so the cursor +
   hover affordance never applies. Mirror the rules globally so the
   cursor changes everywhere `.jb-datatable__row--clickable` is
   used. */
.jb-datatable__row--clickable,
.jb-datatable__row--clickable td,
.jb-datatable__row--clickable td * {
    cursor: pointer;
}
.jb-datatable__row--clickable:hover {
    background: var(--jb-color-neutral-50, #f9fafb);
}

/* gh #1338 — keyword-highlight colour palette. Each distinct search keyword
   is assigned one of these colours (cycled) by KeywordHighlighter, both for
   client-rendered fields (names/headlines) and recoloured server CV/profile
   snippets. Selector uses two classes (`mark.kw.kw-N`) so it out-specifies the
   single amber `mark` rules scoped inside the search pages — a server snippet
   that matched no keyword keeps that amber fallback. Backgrounds are soft so
   the dark CV text stays legible. */
mark.kw {
    padding: 0 1px;
    border-radius: 2px;
    font-weight: 600;
    color: inherit;
}
mark.kw.kw-0 { background: rgba(250, 204, 21, .45); }   /* amber  */
mark.kw.kw-1 { background: rgba(134, 239, 172, .55); }  /* green  */
mark.kw.kw-2 { background: rgba(125, 211, 252, .55); }  /* sky    */
mark.kw.kw-3 { background: rgba(249, 168, 212, .55); }  /* pink   */
mark.kw.kw-4 { background: rgba(196, 181, 253, .60); }  /* violet */
mark.kw.kw-5 { background: rgba(253, 186, 116, .60); }  /* orange */
