Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/frontend/src
diff options
context:
space:
mode:
authorLeitwolf112026-09-07 21:30:40 +0300
committerLeitwolf112026-09-07 21:30:40 +0300
commitc0cd5f4699e44899956c19176ca47ede27a21a8f (patch)
treedc10ba78fde4c4dfaa91f4d43ffaee7bcb6c78b7 /frontend/src
parente77f4585d3a1be272fe83d5a06b1d2a32fa8f7b5 (diff)
downloadwebsite-c0cd5f4699e44899956c19176ca47ede27a21a8f.tar.gz
Separate ViGet from Progmasoft Account infrastructure
Move the Progmasoft mail operations baseline to its owning Progmaweb repository, remove the retired Astro account UI and duplicate identity backend, keep only the ViGet health boundary, add canonical sitemap signals, strengthen dependency CI, and adopt Patent Grant 1.1 across project-owned files.
Diffstat (limited to 'frontend/src')
-rw-r--r--frontend/src/components/AuthPanel.astro178
-rw-r--r--frontend/src/components/Icon.astro2
-rw-r--r--frontend/src/components/RepositoryFooter.astro2
-rw-r--r--frontend/src/components/RepositoryHeader.astro2
-rw-r--r--frontend/src/layouts/SiteLayout.astro7
-rw-r--r--frontend/src/pages/index.astro3
-rw-r--r--frontend/src/pages/repo/dashboard/index.astro169
-rw-r--r--frontend/src/pages/repo/dslplugins/index.astro3
-rw-r--r--frontend/src/pages/repo/index.astro3
-rw-r--r--frontend/src/pages/repo/login/index.astro15
-rw-r--r--frontend/src/pages/repo/recover/index.astro15
-rw-r--r--frontend/src/pages/repo/register/index.astro15
-rw-r--r--frontend/src/styles/global.css603
-rw-r--r--frontend/src/styles/registry.css2
14 files changed, 16 insertions, 1003 deletions
diff --git a/frontend/src/components/AuthPanel.astro b/frontend/src/components/AuthPanel.astro
deleted file mode 100644
index dd7f46f..0000000
--- a/frontend/src/components/AuthPanel.astro
+++ /dev/null
@@ -1,178 +0,0 @@
----
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
-
-interface Props {
- mode: "login" | "register" | "recover";
-}
-
-const { mode } = Astro.props;
-const copy = {
- login: {
- title: "Sign in",
- description: "Use your Visual X# registry account.",
- submit: "Next",
- switchText: "New to the registry?",
- switchLabel: "Create an account",
- switchHref: "https://account.progmasoft.com/register",
- },
- register: {
- title: "Create account",
- description: "Publish and manage Visual X# packages.",
- submit: "Next",
- switchText: "Already have an account?",
- switchLabel: "Sign in",
- switchHref: "https://account.progmasoft.com/login",
- },
- recover: {
- title: "Recover account",
- description: "Reset your password securely.",
- submit: "Send code",
- switchText: "Remembered your password?",
- switchLabel: "Sign in",
- switchHref: "https://account.progmasoft.com/login",
- },
-} as const;
-const content = copy[mode];
----
-
-<main class="auth-main" data-auth-flow data-mode={mode}>
- <section class="auth-card glass-panel">
- <a class="auth-brand" href="https://viget.progmasoft.com/" aria-label="Visual X# package registry">
- <img src="/xsharp-logo.webp" width="44" height="44" alt="" />
- <span>Visual X# Registry</span>
- </a>
-
- <div class="auth-heading">
- <p class="eyebrow">Visual X# package registry</p>
- <h1>{content.title}</h1>
- <p>{content.description}</p>
- </div>
-
- <div class="auth-alert" data-auth-alert hidden aria-live="polite"></div>
-
- <button class="oauth-button" type="button" data-google>
- <span class="google-mark" aria-hidden="true">G</span>
- Continue with Google
- </button>
-
- <div class="auth-divider"><span>or continue with email</span></div>
-
- <noscript>
- <p class="auth-alert" data-kind="error">
- JavaScript is required for the secure account flow. Enable it and reload this page.
- </p>
- </noscript>
-
- <form class="auth-form" data-auth-form method="post" novalidate>
- <div class="auth-step" data-step="email">
- <label for="auth-email">Email address</label>
- <input
- id="auth-email"
- name="email"
- type="email"
- autocomplete="email"
- inputmode="email"
- placeholder="name@example.com"
- required
- />
- <button class="auth-submit" type="submit">{content.submit}</button>
- </div>
-
- <div class="auth-step" data-step="password" hidden>
- <button class="auth-back" type="button" data-back>← Change email</button>
- <span class="auth-email-value" data-email-value></span>
- <label for="auth-password">Password</label>
- <input
- id="auth-password"
- name="password"
- type="password"
- autocomplete={mode === "register" ? "new-password" : "current-password"}
- minlength="8"
- required
- />
- {
- mode === "register" && (
- <p class="field-hint">Use at least 8 characters. Passwordless accounts are not created.</p>
- )
- }
- <button class="auth-submit" type="submit">{mode === "register" ? "Create account" : "Sign in"}</button>
- {
- mode === "login" && (
- <a class="auth-recovery" href="https://account.progmasoft.com/recover">Forgot password?</a>
- )
- }
- </div>
-
- {
- mode === "register" && (
- <div class="auth-step" data-step="publisher" hidden>
- <button class="auth-back" type="button" data-publisher-back>← Change password</button>
- <span class="auth-email-value" data-email-value></span>
- <label for="auth-publisher-name">Username</label>
- <input
- id="auth-publisher-name"
- name="publisher-name"
- type="text"
- autocomplete="username"
- autocapitalize="none"
- spellcheck="false"
- pattern="[A-Z][A-Za-z0-9]{7,127}"
- minlength="8"
- maxlength="128"
- placeholder="MyPublisher"
- required
- />
- <p class="field-hint">
- Use 8–128 ASCII letters or digits and start with an uppercase letter. <code>Progmasoft</code> and{" "}
- <code>Leitwolf</code> are reserved.
- </p>
- <button class="auth-submit" type="submit">Continue</button>
- </div>
- )
- }
-
- <div class="auth-step" data-step="code" hidden>
- <span class="auth-email-value" data-code-email></span>
- <label for="auth-code">Verification code</label>
- <input
- id="auth-code"
- name="code"
- type="text"
- autocomplete="one-time-code"
- inputmode="text"
- pattern="[A-Za-z0-9]{8}"
- minlength="8"
- maxlength="8"
- placeholder="Enter the code from your email"
- required
- />
- <p class="field-hint">
- The code is sent by <code>noreply@progmasoft.com</code>. It expires and can only be used once. If it does not
- appear in your inbox, check your spam or junk folder.
- </p>
- <button class="auth-submit" type="submit">Verify email</button>
- <button class="auth-resend" type="button" data-resend>Send another code</button>
- </div>
-
- <div class="auth-step" data-step="new-password" hidden>
- <label for="auth-new-password">New password</label>
- <input
- id="auth-new-password"
- name="new-password"
- type="password"
- autocomplete="new-password"
- minlength="8"
- required
- />
- <button class="auth-submit" type="submit">Set new password</button>
- </div>
- </form>
-
- <p class="auth-switch">
- {content.switchText} <a href={content.switchHref}>{content.switchLabel}</a>
- </p>
- </section>
-</main>
-
-<script is:inline type="module" src="/scripts/auth-flow.v3.js"></script>
diff --git a/frontend/src/components/Icon.astro b/frontend/src/components/Icon.astro
index 9787db2..6231dbb 100644
--- a/frontend/src/components/Icon.astro
+++ b/frontend/src/components/Icon.astro
@@ -1,6 +1,6 @@
---
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
interface Props {
name:
diff --git a/frontend/src/components/RepositoryFooter.astro b/frontend/src/components/RepositoryFooter.astro
index 58b82af..cdb2c1f 100644
--- a/frontend/src/components/RepositoryFooter.astro
+++ b/frontend/src/components/RepositoryFooter.astro
@@ -1,6 +1,6 @@
---
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
---
<footer class="registry-footer">
diff --git a/frontend/src/components/RepositoryHeader.astro b/frontend/src/components/RepositoryHeader.astro
index 3fbc8f9..9755869 100644
--- a/frontend/src/components/RepositoryHeader.astro
+++ b/frontend/src/components/RepositoryHeader.astro
@@ -1,6 +1,6 @@
---
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
interface Props {
authenticated?: boolean;
diff --git a/frontend/src/layouts/SiteLayout.astro b/frontend/src/layouts/SiteLayout.astro
index ee29aae..482038b 100644
--- a/frontend/src/layouts/SiteLayout.astro
+++ b/frontend/src/layouts/SiteLayout.astro
@@ -1,6 +1,6 @@
---
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
import "../styles/global.css";
import "../styles/registry.css";
@@ -8,10 +8,11 @@ import "../styles/registry.css";
interface Props {
title: string;
description: string;
+ canonical: string;
theme?: "visual-xsharp" | "progmasoft";
}
-const { title, description, theme = "visual-xsharp" } = Astro.props;
+const { title, description, canonical, theme = "visual-xsharp" } = Astro.props;
---
<!doctype html>
@@ -19,11 +20,13 @@ const { title, description, theme = "visual-xsharp" } = Astro.props;
<head>
<meta charset="UTF-8" />
<meta name="description" content={description} />
+ <meta name="robots" content="index, follow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content={theme === "progmasoft" ? "#ffffff" : "#0c111b"} />
<link rel="icon" type={theme === "progmasoft" ? "image/svg+xml" : "image/png"} href={theme === "progmasoft" ? "/progmasoft-mark.svg" : "/xsharp-logo.png"} />
<link rel="preload" href="/fonts/AlfaSlabOne-Regular.woff2" as="font" type="font/woff2" crossorigin />
<link rel="preload" href="/fonts/FiraSans-Regular.woff2" as="font" type="font/woff2" crossorigin />
+ <link rel="canonical" href={canonical} />
<title>{title}</title>
</head>
<body class:list={{ "registry-theme": theme === "progmasoft" }}>
diff --git a/frontend/src/pages/index.astro b/frontend/src/pages/index.astro
index 742fdf5..00e7034 100644
--- a/frontend/src/pages/index.astro
+++ b/frontend/src/pages/index.astro
@@ -1,6 +1,6 @@
---
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
import SiteLayout from "../layouts/SiteLayout.astro";
import Icon from "../components/Icon.astro";
@@ -47,6 +47,7 @@ const capabilities = [
<SiteLayout
title="Visual X# programming language"
description="The official home of Visual X#, a native programming language with inspectable compiler layers."
+ canonical="https://xsharp-lang.xyz/"
>
<div class="ambient" aria-hidden="true">
<span class="ambient-orb ambient-orb-a"></span>
diff --git a/frontend/src/pages/repo/dashboard/index.astro b/frontend/src/pages/repo/dashboard/index.astro
deleted file mode 100644
index 1c8a09f..0000000
--- a/frontend/src/pages/repo/dashboard/index.astro
+++ /dev/null
@@ -1,169 +0,0 @@
----
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
-
-import RepositoryHeader from "../../../components/RepositoryHeader.astro";
-import SiteLayout from "../../../layouts/SiteLayout.astro";
----
-
-<SiteLayout title="Dashboard · Visual X# Registry" description="Manage Visual X# packages and registry API tokens.">
- <div class="ambient" aria-hidden="true">
- <span class="ambient-orb ambient-orb-a"></span>
- <span class="ambient-orb ambient-orb-b"></span>
- </div>
- <section class="repository-surface dashboard-surface" data-dashboard>
- <RepositoryHeader authenticated />
- <main class="dashboard-main">
- <aside class="dashboard-sidebar glass-panel">
- <div class="dashboard-account">
- <span class="account-avatar" data-account-avatar>?</span>
- <div>
- <strong data-account-name>Loading account…</strong>
- <span data-account-email></span>
- </div>
- </div>
- <nav aria-label="Dashboard sections">
- <a class="active" href="#overview">Overview</a>
- <a href="#packages">My packages</a>
- <a href="#tokens">API tokens</a>
- <a href="#security">Security</a>
- </nav>
- <button class="dashboard-signout" type="button" data-signout>Sign out</button>
- </aside>
-
- <div class="dashboard-content">
- <section id="overview" class="dashboard-heading">
- <p class="eyebrow">Registry dashboard</p>
- <h1>Welcome back.</h1>
- <p>Manage package ownership, publishing access, and account security.</p>
- </section>
-
- <div class="dashboard-alert" data-dashboard-alert hidden aria-live="polite"></div>
-
- <section class="dashboard-stats" aria-label="Account summary">
- <article class="dashboard-panel glass-panel">
- <span>Published packages</span>
- <strong>0</strong>
- <small>The registry does not contain public .vipkg releases yet.</small>
- </article>
- <article class="dashboard-panel glass-panel">
- <span>Email status</span>
- <strong data-email-status>Checking…</strong>
- <small>Publishing requires a verified email address.</small>
- </article>
- <article class="dashboard-panel glass-panel">
- <span>Active tokens</span>
- <strong data-token-count>0</strong>
- <small>Tokens are shown only once when created.</small>
- </article>
- </section>
-
- <section id="packages" class="dashboard-section">
- <div class="dashboard-section-heading">
- <div>
- <p class="eyebrow">Packages</p>
- <h2>My packages</h2>
- </div>
- </div>
- <div class="dashboard-empty glass-panel">
- <strong>No packages yet</strong>
- <p>Once publishing opens, owned and delegated packages will appear here.</p>
- </div>
- </section>
-
- <section id="tokens" class="dashboard-section">
- <div class="dashboard-section-heading">
- <div>
- <p class="eyebrow">CLI access</p>
- <h2>API tokens</h2>
- </div>
- <button class="button primary dashboard-create" type="button" data-token-open>New token</button>
- </div>
- <p class="dashboard-copy">
- Use a registry token with <code>vxs login</code>. Store it like a password; only its digest is retained.
- </p>
- <div class="token-list glass-panel" data-token-list>
- <p class="token-list-empty">No API tokens have been created.</p>
- </div>
- </section>
-
- <section id="security" class="dashboard-section">
- <div class="dashboard-section-heading">
- <div>
- <p class="eyebrow">Account</p>
- <h2>Security</h2>
- </div>
- </div>
- <div class="security-row security-row-danger glass-panel">
- <div>
- <strong>Delete account</strong>
- <span>Permanently delete this account, its API tokens, and its registry credentials.</span>
- </div>
- <button class="button danger" type="button" data-delete-open>Delete account</button>
- </div>
- <div class="security-row glass-panel">
- <div>
- <strong>Password</strong>
- <span>Change your password through a verified recovery email.</span>
- </div>
- <a class="button secondary glass-panel" href="https://account.progmasoft.com/recover">Reset password</a>
- </div>
- </section>
- </div>
- </main>
- </section>
-
- <dialog class="token-dialog glass-panel" data-token-dialog>
- <form method="dialog" data-token-form>
- <div class="dialog-heading">
- <div>
- <p class="eyebrow">CLI authentication</p>
- <h2>Create API token</h2>
- </div>
- <button type="button" class="dialog-close" data-token-close aria-label="Close">×</button>
- </div>
- <label for="token-name">Token name</label>
- <input id="token-name" name="name" maxlength="80" placeholder="Laptop publishing" required />
- <fieldset>
- <legend>Permissions</legend>
- <label><input type="checkbox" name="scope" value="read" checked /> Read package metadata</label>
- <label><input type="checkbox" name="scope" value="publish" /> Publish package versions</label>
- <label><input type="checkbox" name="scope" value="yank" /> Yank and restore owned versions</label>
- </fieldset>
- <button class="auth-submit" type="submit">Create token</button>
- <div class="token-secret" data-token-secret hidden>
- <strong>Copy this token now</strong>
- <code data-token-value></code>
- <button type="button" data-token-copy>Copy token</button>
- <span>It cannot be displayed again.</span>
- </div>
- </form>
- </dialog>
-
- <dialog class="token-dialog glass-panel" data-delete-dialog>
- <form method="dialog" data-delete-form>
- <div class="dialog-heading">
- <div>
- <p class="eyebrow">Permanent action</p>
- <h2>Delete account</h2>
- </div>
- <button type="button" class="dialog-close" data-delete-close aria-label="Close">×</button>
- </div>
- <p class="dashboard-copy">
- This cannot be undone. Enter <strong data-delete-email></strong> to confirm.
- </p>
- <label for="delete-confirmation">Account email</label>
- <input
- id="delete-confirmation"
- name="confirmation"
- type="email"
- autocomplete="off"
- data-delete-confirmation
- required
- />
- <button class="auth-submit danger" type="submit">Permanently delete account</button>
- </form>
- </dialog>
-
- <script is:inline type="module" src="/scripts/dashboard.v1.js"></script>
-</SiteLayout>
diff --git a/frontend/src/pages/repo/dslplugins/index.astro b/frontend/src/pages/repo/dslplugins/index.astro
index 52e3ce3..f0b55a3 100644
--- a/frontend/src/pages/repo/dslplugins/index.astro
+++ b/frontend/src/pages/repo/dslplugins/index.astro
@@ -1,6 +1,6 @@
---
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
import RepositoryFooter from "../../../components/RepositoryFooter.astro";
import RepositoryHeader from "../../../components/RepositoryHeader.astro";
@@ -10,6 +10,7 @@ import SiteLayout from "../../../layouts/SiteLayout.astro";
<SiteLayout
title="DSL Plugins · ViGet Package Registry by Progmasoft"
description="The ViGet Kotlin DSL plugin catalog is online, but no plugins have been published yet."
+ canonical="https://viget.progmasoft.com/dslplugins/"
theme="progmasoft"
>
<section class="registry-surface">
diff --git a/frontend/src/pages/repo/index.astro b/frontend/src/pages/repo/index.astro
index 5871a36..8d691d4 100644
--- a/frontend/src/pages/repo/index.astro
+++ b/frontend/src/pages/repo/index.astro
@@ -1,6 +1,6 @@
---
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
+// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1
import RepositoryFooter from "../../components/RepositoryFooter.astro";
import RepositoryHeader from "../../components/RepositoryHeader.astro";
@@ -10,6 +10,7 @@ import SiteLayout from "../../layouts/SiteLayout.astro";
<SiteLayout
title="ViGet Package Registry by Progmasoft"
description="The Visual X# package registry is online, but no packages have been published yet."
+ canonical="https://viget.progmasoft.com/"
theme="progmasoft"
>
<section class="registry-surface">
diff --git a/frontend/src/pages/repo/login/index.astro b/frontend/src/pages/repo/login/index.astro
deleted file mode 100644
index 8cc6ec5..0000000
--- a/frontend/src/pages/repo/login/index.astro
+++ /dev/null
@@ -1,15 +0,0 @@
----
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
-
-import AuthPanel from "../../../components/AuthPanel.astro";
-import SiteLayout from "../../../layouts/SiteLayout.astro";
----
-
-<SiteLayout title="Log in · Visual X# Registry" description="Sign in to the Visual X# package registry.">
- <div class="ambient" aria-hidden="true">
- <span class="ambient-orb ambient-orb-a"></span>
- <span class="ambient-orb ambient-orb-b"></span>
- </div>
- <AuthPanel mode="login" />
-</SiteLayout>
diff --git a/frontend/src/pages/repo/recover/index.astro b/frontend/src/pages/repo/recover/index.astro
deleted file mode 100644
index 4a8f2b7..0000000
--- a/frontend/src/pages/repo/recover/index.astro
+++ /dev/null
@@ -1,15 +0,0 @@
----
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
-
-import AuthPanel from "../../../components/AuthPanel.astro";
-import SiteLayout from "../../../layouts/SiteLayout.astro";
----
-
-<SiteLayout title="Recover account · Visual X# Registry" description="Reset a Visual X# registry account password.">
- <div class="ambient" aria-hidden="true">
- <span class="ambient-orb ambient-orb-a"></span>
- <span class="ambient-orb ambient-orb-b"></span>
- </div>
- <AuthPanel mode="recover" />
-</SiteLayout>
diff --git a/frontend/src/pages/repo/register/index.astro b/frontend/src/pages/repo/register/index.astro
deleted file mode 100644
index b03d640..0000000
--- a/frontend/src/pages/repo/register/index.astro
+++ /dev/null
@@ -1,15 +0,0 @@
----
-// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
-// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0
-
-import AuthPanel from "../../../components/AuthPanel.astro";
-import SiteLayout from "../../../layouts/SiteLayout.astro";
----
-
-<SiteLayout title="Register · Visual X# Registry" description="Create a Visual X# package registry account.">
- <div class="ambient" aria-hidden="true">
- <span class="ambient-orb ambient-orb-a"></span>
- <span class="ambient-orb ambient-orb-b"></span>
- </div>
- <AuthPanel mode="register" />
-</SiteLayout>
diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css
index e0e84e4..ce5509b 100644
--- a/frontend/src/styles/global.css
+++ b/frontend/src/styles/global.css
@@ -1,5 +1,5 @@
/* SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com> */
-/* SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0 */
+/* SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1 */
@font-face {
font-family: "Alfa Slab One";
@@ -1587,607 +1587,6 @@ footer a {
background: rgb(169 112 255 / 13%);
}
-.auth-main {
- display: grid;
- width: 100%;
- min-height: 100vh;
- place-items: center;
- padding: 2rem 1rem;
-}
-
-.auth-card {
- width: min(27rem, 100%);
- padding: clamp(1.6rem, 5vw, 2.5rem);
- border-radius: 1.15rem;
- animation: rise-in 500ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
-}
-
-.auth-brand {
- display: inline-flex;
- gap: 0.75rem;
- align-items: center;
- color: var(--ink);
- font-family: var(--font-display);
- text-decoration: none;
-}
-
-.auth-brand img {
- width: 2.75rem;
- height: 2.75rem;
- border-radius: 0.75rem;
-}
-
-.auth-heading {
- margin: 2.2rem 0 1.6rem;
-}
-
-.auth-heading .eyebrow {
- margin-bottom: 0.55rem;
-}
-
-.auth-heading h1 {
- max-width: none;
- margin: 0;
- font-family: var(--font-body);
- font-size: 2rem;
- font-weight: 600;
- letter-spacing: -0.025em;
-}
-
-.auth-heading > p:last-child {
- margin: 0.55rem 0 0;
- color: var(--muted);
- line-height: 1.5;
-}
-
-.auth-alert,
-.dashboard-alert {
- margin-bottom: 1rem;
- padding: 0.8rem 0.9rem;
- border: 1px solid rgb(109 231 221 / 28%);
- border-radius: 0.65rem;
- color: var(--cyan);
- background: rgb(109 231 221 / 8%);
- font-size: 0.82rem;
- line-height: 1.5;
-}
-
-.auth-alert[data-kind="error"],
-.dashboard-alert[data-kind="error"] {
- border-color: rgb(255 120 190 / 35%);
- color: #ffafd5;
- background: rgb(255 120 190 / 8%);
-}
-
-.oauth-button,
-.auth-submit {
- width: 100%;
- min-height: 3rem;
- border: 1px solid rgb(255 255 255 / 17%);
- border-radius: 0.45rem;
- color: var(--ink);
- background: rgb(255 255 255 / 7%);
- font: 600 0.92rem var(--font-body);
- cursor: pointer;
- transition: border-color 160ms ease, background 160ms ease, transform 160ms ease;
-}
-
-.oauth-button:hover,
-.auth-submit:hover {
- border-color: rgb(198 156 255 / 48%);
- background: rgb(255 255 255 / 11%);
- transform: translateY(-1px);
-}
-
-.oauth-button:disabled {
- color: var(--quiet);
- cursor: not-allowed;
- filter: saturate(0.2);
- opacity: 0.62;
- transform: none;
-}
-
-.oauth-button {
- display: flex;
- gap: 0.8rem;
- align-items: center;
- justify-content: center;
-}
-
-.google-mark {
- display: grid;
- width: 1.45rem;
- height: 1.45rem;
- place-items: center;
- border-radius: 50%;
- color: #4285f4;
- background: #fff;
- font: 700 0.92rem Arial, sans-serif;
-}
-
-.auth-divider {
- display: flex;
- gap: 0.85rem;
- align-items: center;
- margin: 1.35rem 0;
- color: var(--quiet);
- font-size: 0.72rem;
-}
-
-.auth-divider::before,
-.auth-divider::after {
- height: 1px;
- flex: 1;
- background: rgb(255 255 255 / 10%);
- content: "";
-}
-
-.auth-step {
- animation: auth-step-in 220ms ease both;
-}
-
-.auth-step label,
-.token-dialog label,
-.token-dialog legend {
- display: block;
- margin-bottom: 0.5rem;
- color: #e8e0f2;
- font-size: 0.8rem;
- font-weight: 600;
-}
-
-.auth-step input,
-.token-dialog > form > input {
- width: 100%;
- min-height: 3rem;
- margin-bottom: 1rem;
- padding: 0.75rem 0.85rem;
- border: 1px solid rgb(255 255 255 / 18%);
- border-radius: 0.4rem;
- outline: none;
- color: var(--ink);
- background: rgb(4 3 9 / 52%);
- font: 0.93rem var(--font-body);
-}
-
-.auth-step input:focus,
-.token-dialog input:focus {
- border-color: var(--violet-bright);
- box-shadow: 0 0 0 3px rgb(169 112 255 / 14%);
-}
-
-.auth-submit {
- border-color: #a970ff;
- color: #130a1d;
- background: linear-gradient(110deg, var(--violet-bright), #dd8dce);
-}
-
-.auth-back {
- margin: 0 0 0.7rem;
- padding: 0;
- border: 0;
- color: var(--cyan);
- background: none;
- font: 0.75rem var(--font-body);
- cursor: pointer;
-}
-
-.auth-email-value {
- display: block;
- margin-bottom: 1rem;
- color: var(--muted);
- font-size: 0.82rem;
-}
-
-.field-hint {
- margin: -0.35rem 0 1rem;
- color: var(--quiet);
- font-size: 0.72rem;
- line-height: 1.45;
-}
-
-.field-hint code {
- color: var(--muted);
- font-family: var(--font-code);
-}
-
-.auth-recovery {
- display: block;
- margin-top: 1rem;
- color: var(--cyan);
- font-size: 0.78rem;
- text-align: center;
- text-decoration: none;
-}
-
-.auth-resend {
- display: block;
- margin: 0.9rem auto 0;
- padding: 0.3rem;
- border: 0;
- color: var(--cyan);
- background: none;
- font: 0.76rem var(--font-body);
- cursor: pointer;
-}
-
-.auth-switch {
- margin: 1.7rem 0 0;
- color: var(--quiet);
- font-size: 0.78rem;
- text-align: center;
-}
-
-.auth-switch a {
- color: var(--cyan);
- text-decoration: none;
-}
-
-.dashboard-main {
- display: grid;
- width: min(72rem, calc(100% - 2rem));
- grid-template-columns: 15rem minmax(0, 1fr);
- gap: 2rem;
- margin: 2rem auto 6rem;
-}
-
-.dashboard-sidebar {
- position: sticky;
- top: 1rem;
- display: flex;
- height: fit-content;
- flex-direction: column;
- padding: 1rem;
- border-radius: 1rem;
-}