Big changes

This commit is contained in:
Justin Visser 2026-02-21 17:33:05 +01:00
parent 4240ad38e2
commit e3f0d63fec
99 changed files with 8804 additions and 1731 deletions

View file

@ -3,9 +3,11 @@ import { computed, ref } from "vue";
import { useRouter } from "vue-router";
import AppAlert from "@/components/ui/AppAlert.vue";
import AppBrandMark from "@/components/ui/AppBrandMark.vue";
import AppButton from "@/components/ui/AppButton.vue";
import AppCard from "@/components/ui/AppCard.vue";
import AppInput from "@/components/ui/AppInput.vue";
import AppThemePicker from "@/components/ui/AppThemePicker.vue";
import { ApiRequestError } from "@/lib/api/errors";
import { useAuthStore } from "@/stores/auth";
@ -54,46 +56,22 @@ async function onSubmit(): Promise<void> {
</script>
<template>
<div class="relative h-[100dvh] max-h-[100dvh] overflow-y-auto overflow-x-hidden bg-surface-app">
<div class="pointer-events-none absolute inset-0">
<div class="absolute -top-20 left-[-8rem] h-72 w-72 rounded-full bg-brand-300/30 blur-3xl" />
<div class="absolute bottom-[-7rem] right-[-6rem] h-80 w-80 rounded-full bg-success-300/25 blur-3xl" />
<div class="absolute left-1/3 top-1/3 h-52 w-52 rounded-full bg-warning-300/20 blur-3xl" />
<div class="relative h-[100dvh] max-h-[100dvh] overflow-hidden bg-surface-app">
<div class="absolute right-4 top-4 z-10 sm:right-6 sm:top-6">
<AppThemePicker compact id-prefix="login-theme" />
</div>
<div
class="relative mx-auto grid min-h-full w-full max-w-6xl items-center gap-8 px-4 py-6 sm:px-6 lg:grid-cols-[minmax(0,1fr)_26rem] lg:px-8"
>
<section class="hidden space-y-5 lg:block">
<p class="inline-flex items-center rounded-full border border-stroke-strong bg-surface-card/70 px-3 py-1 text-xs font-medium uppercase tracking-[0.12em] text-ink-muted">
Scholarr Control Center
</p>
<h1 class="max-w-xl font-display text-4xl font-semibold tracking-tight text-ink-primary">
Scholar tracking with reliable operational controls.
</h1>
<p class="max-w-xl text-base leading-relaxed text-ink-muted">
Use your account to review ingestion runs, publication changes, and continuation queue diagnostics from a
single workspace.
</p>
<ul class="grid max-w-xl gap-2 text-sm text-ink-muted">
<li class="rounded-lg border border-stroke-default bg-surface-card/60 px-3 py-2">
Session-based authentication with CSRF enforcement.
</li>
<li class="rounded-lg border border-stroke-default bg-surface-card/60 px-3 py-2">
Run and queue diagnostics are available for support workflows.
</li>
<li class="rounded-lg border border-stroke-default bg-surface-card/60 px-3 py-2">
Theme-aware interface with light and dark mode support.
</li>
</ul>
</section>
<div class="pointer-events-none absolute inset-0">
<div class="absolute -top-28 right-[-8rem] h-72 w-72 rounded-full bg-brand-300/25 blur-3xl" />
<div class="absolute bottom-[-8rem] left-[-7rem] h-80 w-80 rounded-full bg-info-300/20 blur-3xl" />
</div>
<AppCard class="w-full max-w-md justify-self-end space-y-6 border-stroke-default/80 bg-surface-card/90 backdrop-blur">
<div class="space-y-2">
<h1 class="font-display text-3xl font-semibold tracking-tight text-ink-primary">Sign In</h1>
<p class="text-sm text-secondary">
Sign in to access scholar tracking, publication updates, and run diagnostics.
</p>
<div class="relative mx-auto grid h-full w-full max-w-md items-center px-4 py-8 sm:px-6">
<AppCard class="space-y-6 border-stroke-default/80 bg-surface-card/90 p-6 backdrop-blur sm:p-7">
<div class="grid justify-items-center gap-2 text-center">
<AppBrandMark size="xl" />
<p class="font-display text-2xl font-semibold tracking-tight text-ink-primary">scholarr</p>
<h1 class="text-sm font-medium uppercase tracking-[0.12em] text-ink-secondary">Sign in</h1>
</div>
<AppAlert v-if="errorMessage" tone="danger">
@ -106,7 +84,7 @@ async function onSubmit(): Promise<void> {
<form class="grid gap-4" @submit.prevent="onSubmit">
<label class="grid gap-2 text-sm font-medium text-ink-secondary">
<span>Email</span>
<AppInput id="login-email" v-model="email" type="email" autocomplete="email" />
<AppInput id="login-email" v-model="email" type="email" autocomplete="email" autofocus />
</label>
<label class="grid gap-2 text-sm font-medium text-ink-secondary">
@ -123,6 +101,10 @@ async function onSubmit(): Promise<void> {
{{ pending ? "Signing in..." : "Sign in" }}
</AppButton>
</form>
<p class="text-center text-xs text-secondary">
Use your assigned account credentials.
</p>
</AppCard>
</div>
</div>