feat: finish Stitch skills and authentication screens
This commit is contained in:
@@ -66,6 +66,83 @@
|
||||
.command-panel { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; }
|
||||
.command-panel pre { margin: 6px 0 0; padding: 10px; background: var(--surface-lowest); color: var(--emerald); }
|
||||
.auth-card .stack label { color: var(--text); font-size: 13px; }
|
||||
.login-cockpit { display: grid; width: min(1120px, 100%); min-height: min(720px, calc(100vh - 48px)); grid-template-columns: minmax(0, 1.15fr) minmax(380px, .85fr); overflow: hidden; border: 1px solid color-mix(in srgb, var(--outline) 58%, transparent); background: var(--surface-low); box-shadow: 0 38px 120px rgba(0,0,0,.42), var(--shadow-signal); }
|
||||
.login-intelligence { position: relative; display: flex; overflow: hidden; flex-direction: column; justify-content: space-between; padding: clamp(28px, 4vw, 58px); border-right: 1px solid color-mix(in srgb, var(--cyan) 20%, var(--outline)); background: radial-gradient(circle at 72% 35%, color-mix(in srgb, var(--cyan) 9%, transparent), transparent 15rem), linear-gradient(145deg, color-mix(in srgb, var(--surface-container) 90%, var(--indigo)), var(--surface-lowest)); }
|
||||
.login-brandline { position: relative; z-index: 2; display: flex; align-items: center; gap: 12px; }
|
||||
.login-brandline strong, .login-brandline small { display: block; }
|
||||
.login-brandline strong { color: var(--text-strong); font: 700 19px var(--font-headline); }
|
||||
.login-brandline small { margin-top: 4px; font: 10px var(--font-mono); letter-spacing: .13em; text-transform: uppercase; }
|
||||
.login-radar { position: absolute; top: 18%; right: -6%; width: min(31vw, 390px); aspect-ratio: 1; border: 1px solid color-mix(in srgb, var(--cyan) 22%, transparent); border-radius: 50%; opacity: .75; }
|
||||
.login-radar::before, .login-radar::after, .login-radar span { position: absolute; inset: 15%; content: ""; border: 1px solid color-mix(in srgb, var(--cyan) 18%, transparent); border-radius: 50%; }
|
||||
.login-radar::after { inset: 31%; }
|
||||
.login-radar span:nth-child(1) { inset: 46% 0 auto 0; border: 0; border-top: 1px solid color-mix(in srgb, var(--cyan) 22%, transparent); border-radius: 0; transform: rotate(-24deg); transform-origin: center; }
|
||||
.login-radar span:nth-child(2) { inset: 0 auto 0 50%; border: 0; border-left: 1px solid color-mix(in srgb, var(--cyan) 18%, transparent); border-radius: 0; }
|
||||
.login-radar i { position: absolute; top: 38%; left: 32%; width: 9px; height: 9px; border-radius: 50%; background: var(--cyan); box-shadow: 0 0 0 6px color-mix(in srgb, var(--cyan) 10%, transparent), 0 0 22px var(--cyan); }
|
||||
.login-intro { position: relative; z-index: 2; max-width: 570px; margin-top: auto; }
|
||||
.login-intro h1 { max-width: 560px; margin-bottom: 18px; font-size: clamp(35px, 4.3vw, 62px); line-height: .98; }
|
||||
.login-intro > p:last-child { max-width: 520px; color: var(--text-muted); font-size: 16px; line-height: 1.6; }
|
||||
.login-signals { position: relative; z-index: 2; display: flex; flex-wrap: wrap; gap: 10px 18px; margin: 28px 0 0; padding: 22px 0 0; border-top: 1px solid color-mix(in srgb, var(--outline) 36%, transparent); list-style: none; color: var(--text-muted); font: 10px var(--font-mono); text-transform: uppercase; }
|
||||
.login-signals li { display: flex; align-items: center; gap: 7px; }
|
||||
.login-signals .icon { width: 14px; color: var(--emerald); }
|
||||
.login-cockpit .auth-card { align-self: center; width: auto; margin: clamp(24px, 4vw, 52px); padding: 0; border: 0; background: transparent; box-shadow: none; }
|
||||
.login-cockpit .auth-brand { margin-bottom: 30px; }
|
||||
.login-cockpit .auth-brand h2 { margin: 4px 0 6px; font-size: 30px; }
|
||||
.login-cockpit .stack { gap: 9px; margin-top: 22px; }
|
||||
.login-cockpit .stack input { margin-bottom: 9px; }
|
||||
.login-cockpit .stack .button { margin-top: 12px; }
|
||||
.auth-trust { display: flex; align-items: center; gap: 10px; margin-top: 30px; padding-top: 20px; border-top: 1px solid color-mix(in srgb, var(--outline) 38%, transparent); }
|
||||
.auth-trust strong, .auth-trust small { display: block; }
|
||||
.auth-trust strong { color: var(--text); font-size: 12px; }
|
||||
.auth-trust small { margin-top: 3px; font: 10px var(--font-mono); }
|
||||
.insight-hero { position: relative; display: grid; min-height: 210px; grid-template-columns: 130px minmax(0, 1fr) auto; align-items: center; gap: 28px; overflow: hidden; margin-bottom: 12px; padding: 28px; border: 1px solid color-mix(in srgb, var(--cyan) 32%, var(--outline)); background: linear-gradient(135deg, color-mix(in srgb, var(--surface-container) 92%, var(--cyan)), var(--surface-low)); box-shadow: var(--shadow-signal); }
|
||||
.insight-hero::after { position: absolute; z-index: 0; right: -80px; bottom: -120px; width: 330px; height: 330px; content: ""; border: 1px solid color-mix(in srgb, var(--cyan) 10%, transparent); border-radius: 50%; }
|
||||
.insight-hero > * { position: relative; z-index: 1; }
|
||||
.insight-hero h2 { max-width: 800px; margin: 7px 0; font-size: clamp(23px, 2.2vw, 34px); }
|
||||
.insight-hero p { margin: 0; color: var(--text-muted); }
|
||||
.insight-orbit { position: relative; display: grid; width: 122px; height: 122px; place-items: center; border: 1px solid color-mix(in srgb, var(--cyan) 44%, var(--outline)); border-radius: 50%; box-shadow: inset 0 0 28px color-mix(in srgb, var(--cyan) 6%, transparent), 0 0 24px color-mix(in srgb, var(--cyan) 8%, transparent); }
|
||||
.insight-orbit::before, .insight-orbit span { position: absolute; content: ""; border: 1px solid color-mix(in srgb, var(--cyan) 22%, transparent); border-radius: 50%; }
|
||||
.insight-orbit::before { inset: 16px; }
|
||||
.insight-orbit span:nth-child(1) { inset: 42px; }
|
||||
.insight-orbit span:nth-child(2) { top: 19px; left: 76px; width: 6px; height: 6px; border: 0; background: var(--cyan); box-shadow: 0 0 10px var(--cyan); }
|
||||
.insight-orbit strong { color: var(--cyan); font: 650 25px var(--font-headline); }
|
||||
.skill-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin-bottom: 22px; border: solid color-mix(in srgb, var(--outline) 42%, transparent); border-width: 0 1px 1px; background: var(--surface-low); }
|
||||
.skill-metrics article { min-height: 104px; padding: 17px; border-right: 1px solid color-mix(in srgb, var(--outline) 32%, transparent); }
|
||||
.skill-metrics article:last-child { border-right: 0; }
|
||||
.skill-metrics span, .skill-metrics strong, .skill-metrics small { display: block; }
|
||||
.skill-metrics span { color: var(--text-faint); font: 9px var(--font-mono); letter-spacing: .08em; text-transform: uppercase; }
|
||||
.skill-metrics strong { margin: 10px 0 3px; color: var(--text-strong); font: 650 27px var(--font-headline); }
|
||||
.skill-metrics small { font: 10px var(--font-mono); }
|
||||
.skill-metrics .metric-accent strong { color: var(--amber); }
|
||||
.skills-filter-console { grid-template-columns: minmax(180px, 1fr) minmax(180px, 1fr) auto auto; }
|
||||
.skills-insight-layout { display: grid; grid-template-columns: minmax(0, 1fr) 330px; align-items: start; gap: 16px; }
|
||||
.skill-demand-list, .skills-method-rail { display: grid; gap: 10px; }
|
||||
.skills-method-rail { position: sticky; top: calc(var(--topbar-height) + 18px); }
|
||||
.skill-demand-card { display: grid; grid-template-columns: minmax(0, 1fr) auto; overflow: hidden; border: 1px solid color-mix(in srgb, var(--outline) 43%, transparent); background: var(--surface-container); }
|
||||
.skill-demand-card.is-gap { border-left: 2px solid var(--amber); }
|
||||
.skill-demand-main { padding: 18px; }
|
||||
.skill-demand-action { display: flex; min-width: 160px; align-items: center; padding: 16px; border-left: 1px solid color-mix(in srgb, var(--outline) 34%, transparent); background: var(--surface-low); }
|
||||
.skill-card-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; }
|
||||
.skill-card-heading h3 { margin: 4px 0 0; }
|
||||
.skill-category { color: var(--cyan-dim); font: 9px var(--font-mono); letter-spacing: .09em; text-transform: uppercase; }
|
||||
.demand-meter { height: 5px; overflow: hidden; margin: 15px 0 8px; background: var(--surface-highest); }
|
||||
.demand-meter span { display: block; height: 100%; background: linear-gradient(90deg, var(--indigo), var(--cyan)); }
|
||||
.skill-demand-stats { display: flex; flex-wrap: wrap; gap: 5px 16px; color: var(--text-faint); font: 10px var(--font-mono); }
|
||||
.skill-demand-stats strong { color: var(--text); }
|
||||
.learning-focus { margin: 13px 0; padding: 10px 12px; border-left: 2px solid var(--amber); background: color-mix(in srgb, var(--amber) 5%, var(--surface-high)); color: var(--text-muted); }
|
||||
.learning-focus strong { display: block; margin-bottom: 4px; color: var(--amber); font: 9px var(--font-mono); letter-spacing: .08em; text-transform: uppercase; }
|
||||
.skill-job-examples { display: grid; gap: 0; margin: 13px 0 0; padding: 0; list-style: none; }
|
||||
.skill-job-examples li { display: flex; min-height: 36px; align-items: center; justify-content: space-between; gap: 15px; border-top: 1px solid color-mix(in srgb, var(--outline) 28%, transparent); }
|
||||
.skill-job-examples a { color: var(--text); }
|
||||
.skill-job-examples span { color: var(--text-faint); font: 9px var(--font-mono); }
|
||||
.legend-list, .radar-steps { display: grid; gap: 10px; margin: 14px 0 0; padding: 0; list-style: none; }
|
||||
.legend-list li, .radar-steps li { display: flex; align-items: flex-start; gap: 9px; }
|
||||
.legend-list strong, .legend-list small, .radar-steps strong, .radar-steps span { display: block; }
|
||||
.legend-list small, .radar-steps span { margin-top: 3px; }
|
||||
.legend-dot { width: 8px; height: 8px; flex: 0 0 auto; margin-top: 4px; border-radius: 50%; background: var(--cyan); box-shadow: 0 0 8px color-mix(in srgb, var(--cyan) 50%, transparent); }
|
||||
.legend-dot.inferred { background: var(--indigo); box-shadow: 0 0 8px color-mix(in srgb, var(--indigo) 50%, transparent); }
|
||||
.radar-steps { counter-reset: radar-step; }
|
||||
.radar-steps li { counter-increment: radar-step; }
|
||||
.radar-steps li::before { display: grid; width: 24px; height: 24px; flex: 0 0 auto; place-items: center; content: counter(radar-step, decimal-leading-zero); border: 1px solid var(--outline); color: var(--cyan); font: 9px var(--font-mono); }
|
||||
.mini-timeline { display: grid; gap: 4px; }
|
||||
.mini-event { display: flex; align-items: flex-start; gap: 10px; padding: 9px 0; border-top: 1px solid color-mix(in srgb, var(--outline) 30%, transparent); }
|
||||
.mini-event strong, .mini-event small { display: block; }
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
.employer-radar-layout, .employer-detail-grid, .automation-layout { grid-template-columns: 1fr; }
|
||||
.employer-intelligence-rail { position: static; border-top: 1px solid var(--outline); border-left: 0; }
|
||||
.automation-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.skills-insight-layout { grid-template-columns: 1fr; }
|
||||
.skills-method-rail { position: static; grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
||||
}
|
||||
|
||||
@media (max-width: 820px) {
|
||||
@@ -66,6 +68,17 @@
|
||||
.automation-status dl { display: grid; grid-template-columns: repeat(3, 1fr); width: 100%; }
|
||||
.automation-status dl > div { min-width: 0; border-top: 1px solid var(--outline); border-left: 0; padding: 11px 4px; }
|
||||
.employer-job-grid { grid-template-columns: 1fr; }
|
||||
.login-cockpit { min-height: 0; grid-template-columns: 1fr; }
|
||||
.login-intelligence { min-height: 360px; border-right: 0; border-bottom: 1px solid var(--outline); }
|
||||
.login-radar { width: 310px; }
|
||||
.login-cockpit .auth-card { margin: 34px; }
|
||||
.insight-hero { grid-template-columns: 96px minmax(0, 1fr); }
|
||||
.insight-hero .button { grid-column: 1 / -1; width: fit-content; }
|
||||
.insight-orbit { width: 92px; height: 92px; }
|
||||
.skill-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.skill-metrics article:nth-child(2) { border-right: 0; }
|
||||
.skill-metrics article:nth-child(-n+2) { border-bottom: 1px solid color-mix(in srgb, var(--outline) 32%, transparent); }
|
||||
.skills-method-rail { grid-template-columns: 1fr; }
|
||||
}
|
||||
|
||||
@media (max-width: 560px) {
|
||||
@@ -108,6 +121,19 @@
|
||||
.match-history a { grid-column: 1 / -1; }
|
||||
.auth-shell { padding: 14px; }
|
||||
.auth-card { padding: 22px 18px; }
|
||||
.login-intelligence { min-height: 310px; padding: 24px; }
|
||||
.login-intro h1 { font-size: 34px; }
|
||||
.login-signals { display: none; }
|
||||
.login-radar { top: 3%; right: -34%; width: 290px; }
|
||||
.login-cockpit .auth-card { margin: 28px 20px; padding: 0; }
|
||||
.insight-hero { min-height: 0; grid-template-columns: 1fr; padding: 20px; }
|
||||
.insight-orbit { width: 82px; height: 82px; }
|
||||
.skill-metrics { grid-template-columns: 1fr; }
|
||||
.skill-metrics article { border-right: 0; border-bottom: 1px solid color-mix(in srgb, var(--outline) 32%, transparent); }
|
||||
.skill-demand-card { grid-template-columns: 1fr; }
|
||||
.skill-demand-action { min-width: 0; border-top: 1px solid color-mix(in srgb, var(--outline) 34%, transparent); border-left: 0; }
|
||||
.skill-demand-action .button { width: 100%; }
|
||||
.skill-card-heading, .skill-job-examples li { align-items: flex-start; flex-direction: column; }
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
|
||||
@@ -1,10 +1,19 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Aanmelden · VacatureRadar{% endblock %}
|
||||
{% block body_class %}login-page{% endblock %}
|
||||
{% block content %}
|
||||
<section class="auth-card">
|
||||
<div class="auth-brand"><span class="brand-mark"><svg class="icon"><use href="#icon-radar"></use></svg></span><div><p class="eyebrow">Intelligence cockpit</p><h1>Welkom terug</h1><p>Open je persoonlijke vacatureselectie.</p></div></div>
|
||||
{% if form.errors %}<div class="message error">Gebruikersnaam of wachtwoord klopt niet.</div>{% endif %}
|
||||
<form method="post" class="stack">{% csrf_token %}<label>Gebruikersnaam {{ form.username }}</label><label>Wachtwoord {{ form.password }}</label><button class="button button-primary button-block" type="submit">Aanmelden</button></form>
|
||||
<p class="muted small">Beveiligde lokale toegang via je eigen netwerk, VPN of reverse proxy.</p>
|
||||
</section>
|
||||
<div class="login-cockpit">
|
||||
<section class="login-intelligence" aria-labelledby="login-brand-title">
|
||||
<div class="login-brandline"><span class="brand-radar"><svg class="icon"><use href="#icon-radar"></use></svg></span><span><strong>VacatureRadar</strong><small>Intelligence cockpit</small></span></div>
|
||||
<div class="login-radar" aria-hidden="true"><span></span><span></span><span></span><i></i></div>
|
||||
<div class="login-intro"><p class="eyebrow">Persoonlijke vacature-intelligence</p><h1 id="login-brand-title">Van bronruis naar beslisbare IT-matches.</h1><p>Breng vacatures, werkgevers, skillsvraag en opvolging samen in één betrouwbare radar.</p></div>
|
||||
<ul class="login-signals" aria-label="Platformmogelijkheden"><li><svg class="icon"><use href="#icon-check"></use></svg>Deterministische IT-selectie</li><li><svg class="icon"><use href="#icon-check"></use></svg>Herleidbare matchonderbouwing</li><li><svg class="icon"><use href="#icon-check"></use></svg>Bron- en automatiseringscontrole</li></ul>
|
||||
</section>
|
||||
<section class="auth-card" aria-labelledby="login-title">
|
||||
<div class="auth-brand"><span class="brand-mark"><svg class="icon"><use href="#icon-profile"></use></svg></span><div><p class="eyebrow">Beveiligde toegang</p><h2 id="login-title">Welkom terug</h2><p>Open je persoonlijke intelligence cockpit.</p></div></div>
|
||||
{% if form.errors %}<div class="message error" role="alert">Gebruikersnaam of wachtwoord klopt niet.</div>{% endif %}
|
||||
<form method="post" class="stack">{% csrf_token %}<label for="{{ form.username.id_for_label }}">Gebruikersnaam</label>{{ form.username }}<label for="{{ form.password.id_for_label }}">Wachtwoord</label>{{ form.password }}{% if next %}<input type="hidden" name="next" value="{{ next }}">{% endif %}<button class="button button-primary button-block" type="submit">Cockpit openen <svg class="icon"><use href="#icon-arrow"></use></svg></button></form>
|
||||
<div class="auth-trust"><span class="status-beacon is-live" aria-hidden="true"></span><span><strong>Lokale, afgeschermde sessie</strong><small>Je gegevens blijven binnen de geconfigureerde omgeving.</small></span></div>
|
||||
</section>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user