aboutsummaryrefslogtreecommitdiff
path: root/web/index.templ
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2025-04-23 08:07:53 -0400
committerGitHub <noreply@github.com>2025-04-23 12:07:53 +0000
commitcfbe16f2d0037b179624f692acd2276a8733e2fd (patch)
tree4bb7a6b769135fb95143ffa7fa85f1f23608aea5 /web/index.templ
parent1b206175f83926801d0b65953a85e8a5ea27d73d (diff)
downloadanubis-cfbe16f2d0037b179624f692acd2276a8733e2fd.tar.xz
anubis-cfbe16f2d0037b179624f692acd2276a8733e2fd.zip
feat(xess): move CSS color definitions to CSS variables (#339)
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'web/index.templ')
-rw-r--r--web/index.templ345
1 files changed, 161 insertions, 184 deletions
diff --git a/web/index.templ b/web/index.templ
index 989d717..818c6a5 100644
--- a/web/index.templ
+++ b/web/index.templ
@@ -1,203 +1,180 @@
package web
import (
-"github.com/TecharoHQ/anubis"
-"github.com/TecharoHQ/anubis/xess"
+ "github.com/TecharoHQ/anubis"
+ "github.com/TecharoHQ/anubis/xess"
)
templ base(title string, body templ.Component, challenge any, ogTags map[string]string) {
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <title>{ title }</title>
- <link rel="stylesheet" href={ xess.URL }/>
- <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
- <meta name="robots" content="noindex,nofollow"/>
- for key, value := range ogTags {
- <meta property={ key } content={ value }/>
- }
- <style>
- body,
- html {
- height: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- margin-left: auto;
- margin-right: auto;
- }
-
- .centered-div {
- text-align: center;
- }
-
- #status {
- font-variant-numeric: tabular-nums;
- }
-
- #progress {
- display: none;
- width: min(20rem, 90%);
- height: 2rem;
- border-radius: 1rem;
- overflow: hidden;
- margin: 1rem 0 2rem;
- outline-offset: 2px;
- outline: #b16286 solid 4px;
- }
-
- .bar-inner {
- background-color: #b16286;
- height: 100%;
- width: 0;
- transition: width 0.25s ease-in;
- }
- </style>
- @templ.JSONScript("anubis_version", anubis.Version)
- if challenge != nil {
- @templ.JSONScript("anubis_challenge", challenge)
- }
-
-</head>
-<body id="top">
-<main>
- <center>
- <h1 id="title" class=".centered-div">{ title }</h1>
- </center>
- @body
- <footer>
- <center>
- <p>
- Protected by <a href="https://github.com/TecharoHQ/anubis">Anubis</a> from <a
- href="https://techaro.lol"
- >Techaro</a>. Made with ❤️ in 🇨🇦.
- </p>
- <p>Mascot design by <a href="https://bsky.app/profile/celphase.bsky.social">CELPHASE</a>.</p>
- </center>
- </footer>
-</main>
-</body>
-</html>
+ <!DOCTYPE html>
+ <html lang="en">
+ <head>
+ <title>{ title }</title>
+ <link rel="stylesheet" href={ xess.URL }/>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+ <meta name="robots" content="noindex,nofollow"/>
+ for key, value := range ogTags {
+ <meta property={ key } content={ value }/>
+ }
+ @templ.JSONScript("anubis_version", anubis.Version)
+ if challenge != nil {
+ @templ.JSONScript("anubis_challenge", challenge)
+ }
+ </head>
+ <body id="top">
+ <main>
+ <center>
+ <h1 id="title" class=".centered-div">{ title }</h1>
+ </center>
+ @body
+ <footer>
+ <center>
+ <p>
+ Protected by <a href="https://github.com/TecharoHQ/anubis">Anubis</a> from <a
+ href="https://techaro.lol"
+>Techaro</a>. Made with ❤️ in 🇨🇦.
+ </p>
+ <p>Mascot design by <a href="https://bsky.app/profile/celphase.bsky.social">CELPHASE</a>.</p>
+ </center>
+ </footer>
+ </main>
+ </body>
+ </html>
}
templ index() {
-<div class="centered-div">
- <img
- id="image"
- style="width:100%;max-width:256px;"
- src={ "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" +
+ <div class="centered-div">
+ <img
+ id="image"
+ style="width:100%;max-width:256px;"
+ src={ "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" +
anubis.Version }
- />
- <img
- style="display:none;"
- style="width:100%;max-width:256px;"
- src={ "/.within.website/x/cmd/anubis/static/img/happy.webp?cacheBuster=" +
+ />
+ <img
+ style="display:none;"
+ style="width:100%;max-width:256px;"
+ src={ "/.within.website/x/cmd/anubis/static/img/happy.webp?cacheBuster=" +
anubis.Version }
- />
- <p id="status">Loading...</p>
- <script async type="module" src={
- "/.within.website/x/cmd/anubis/static/js/main.mjs?cacheBuster=" + anubis.Version }></script>
- <div id="progress" role="progressbar" aria-labelledby="status">
- <div class="bar-inner"></div>
- </div>
- <details>
- <summary>Why am I seeing this?</summary>
- <p>You are seeing this because the administrator of this website has set up <a
- href="https://github.com/TecharoHQ/anubis">Anubis</a> to protect the server against the scourge of
- <a href="https://thelibre.news/foss-infrastructure-is-under-attack-by-ai-companies/">AI companies
- aggressively scraping websites</a>. This can and does cause downtime for the websites, which makes their
- resources inaccessible for everyone.</p>
- <p>Anubis is a compromise. Anubis uses a <a href="https://anubis.techaro.lol/docs/design/why-proof-of-work">Proof-of-Work</a>
- scheme in the vein of <a href="https://en.wikipedia.org/wiki/Hashcash">Hashcash</a>, a proposed
- proof-of-work scheme for reducing email spam. The idea is that at individual scales the additional load is
- ignorable, but at mass scraper levels it adds up and makes scraping much more expensive.</p>
- <p>Ultimately, this is a hack whose real purpose is to give a "good enough" placeholder solution so that more
- time can be spent on fingerprinting and identifying headless browsers (EG: via how they do font rendering)
- so that the challenge proof of work page doesn't need to be presented to users that are much more likely to
- be legitimate.</p>
- <p>Please note that Anubis requires the use of modern JavaScript features that plugins like <a
- href="https://jshelter.org/">JShelter</a> will disable. Please disable JShelter or other such
- plugins for this domain.</p>
- </details>
- <noscript>
- <p>
- Sadly, you must enable JavaScript to get past this challenge. This is required because AI companies have
- changed
- the social contract around how website hosting works. A no-JS solution is a work-in-progress.
- </p>
- </noscript>
- <div id="testarea"></div>
-</div>
+ />
+ <p id="status">Loading...</p>
+ <script async type="module" src={ "/.within.website/x/cmd/anubis/static/js/main.mjs?cacheBuster=" + anubis.Version }></script>
+ <div id="progress" role="progressbar" aria-labelledby="status">
+ <div class="bar-inner"></div>
+ </div>
+ <details>
+ <summary>Why am I seeing this?</summary>
+ <p>
+ You are seeing this because the administrator of this website has set up <a
+ href="https://github.com/TecharoHQ/anubis"
+>Anubis</a> to protect the server against the scourge of
+ <a href="https://thelibre.news/foss-infrastructure-is-under-attack-by-ai-companies/">
+ AI companies
+ aggressively scraping websites
+ </a>. This can and does cause downtime for the websites, which makes their
+ resources inaccessible for everyone.
+ </p>
+ <p>
+ Anubis is a compromise. Anubis uses a <a href="https://anubis.techaro.lol/docs/design/why-proof-of-work">Proof-of-Work</a>
+ scheme in the vein of <a href="https://en.wikipedia.org/wiki/Hashcash">Hashcash</a>, a proposed
+ proof-of-work scheme for reducing email spam. The idea is that at individual scales the additional load is
+ ignorable, but at mass scraper levels it adds up and makes scraping much more expensive.
+ </p>
+ <p>
+ Ultimately, this is a hack whose real purpose is to give a "good enough" placeholder solution so that more
+ time can be spent on fingerprinting and identifying headless browsers (EG: via how they do font rendering)
+ so that the challenge proof of work page doesn't need to be presented to users that are much more likely to
+ be legitimate.
+ </p>
+ <p>
+ Please note that Anubis requires the use of modern JavaScript features that plugins like <a
+ href="https://jshelter.org/"
+>JShelter</a> will disable. Please disable JShelter or other such
+ plugins for this domain.
+ </p>
+ </details>
+ <noscript>
+ <p>
+ Sadly, you must enable JavaScript to get past this challenge. This is required because AI companies have
+ changed
+ the social contract around how website hosting works. A no-JS solution is a work-in-progress.
+ </p>
+ </noscript>
+ <div id="testarea"></div>
+ </div>
}
templ errorPage(message string, mail string) {
-<div class="centered-div">
- <img
- id="image"
- alt="Sad Anubis"
- style="width:100%;max-width:256px;"
- src={ "/.within.website/x/cmd/anubis/static/img/reject.webp?cacheBuster=" + anubis.Version }
- />
- <p>{ message }.</p>
- <button onClick="window.location.reload();">Try again</button>
- if mail != "" {
- <p><a href="/">Go home</a> or if you believe you should not be blocked, please contact the webmaster at <a href={"mailto:" + templ.SafeURL(mail) }>
- { mail }</a>
- </p>
- } else {
- <p><a href="/">Go home</a></p>
- }
-</div>
+ <div class="centered-div">
+ <img
+ id="image"
+ alt="Sad Anubis"
+ style="width:100%;max-width:256px;"
+ src={ "/.within.website/x/cmd/anubis/static/img/reject.webp?cacheBuster=" + anubis.Version }
+ />
+ <p>{ message }.</p>
+ <button onClick="window.location.reload();">Try again</button>
+ if mail != "" {
+ <p>
+ <a href="/">Go home</a> or if you believe you should not be blocked, please contact the webmaster at
+ <a href={ "mailto:" + templ.SafeURL(mail) }>
+ { mail }
+ </a>
+ </p>
+ } else {
+ <p><a href="/">Go home</a></p>
+ }
+ </div>
}
templ bench() {
-<div style="height:20rem;display:flex">
- <table style="margin-top:1rem;display:grid;grid-template:auto 1fr/auto auto;gap:0 0.5rem">
- <thead style="border-bottom:1px solid black;padding:0.25rem 0;display:grid;grid-template:1fr/subgrid;grid-column:1/-1">
- <tr id="table-header" style="display:contents">
- <th style="width:4.5rem">Time</th>
- <th style="width:4rem">Iters</th>
- </tr>
- <tr id="table-header-compare" style="display:none">
- <th style="width:4.5rem">Time A</th>
- <th style="width:4rem">Iters A</th>
- <th style="width:4.5rem">Time B</th>
- <th style="width:4rem">Iters B</th>
- </tr>
- </thead>
- <tbody id="results"
- style="padding-top:0.25rem;display:grid;grid-template-columns:subgrid;grid-auto-rows:min-content;grid-column:1/-1;row-gap:0.25rem;overflow-y:auto;font-variant-numeric:tabular-nums"></tbody>
- </table>
- <div class="centered-div">
- <img
- id="image"
- style="width:100%;max-width:256px;"
- src={ "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" +
+ <div style="height:20rem;display:flex">
+ <table style="margin-top:1rem;display:grid;grid-template:auto 1fr/auto auto;gap:0 0.5rem">
+ <thead style="border-bottom:1px solid black;padding:0.25rem 0;display:grid;grid-template:1fr/subgrid;grid-column:1/-1">
+ <tr id="table-header" style="display:contents">
+ <th style="width:4.5rem">Time</th>
+ <th style="width:4rem">Iters</th>
+ </tr>
+ <tr id="table-header-compare" style="display:none">
+ <th style="width:4.5rem">Time A</th>
+ <th style="width:4rem">Iters A</th>
+ <th style="width:4.5rem">Time B</th>
+ <th style="width:4rem">Iters B</th>
+ </tr>
+ </thead>
+ <tbody
+ id="results"
+ style="padding-top:0.25rem;display:grid;grid-template-columns:subgrid;grid-auto-rows:min-content;grid-column:1/-1;row-gap:0.25rem;overflow-y:auto;font-variant-numeric:tabular-nums"
+ ></tbody>
+ </table>
+ <div class="centered-div">
+ <img
+ id="image"
+ style="width:100%;max-width:256px;"
+ src={ "/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" +
anubis.Version }
- />
- <p id="status" style="max-width:256px">Loading...</p>
- <script async type="module" src={
- "/.within.website/x/cmd/anubis/static/js/bench.mjs?cacheBuster=" + anubis.Version }></script>
- <div id="sparkline"></div>
- <noscript>
- <p>Running the benchmark tool requires JavaScript to be enabled.</p>
- </noscript>
- </div>
-</div>
-<form id="controls" style="position:fixed;top:0.5rem;right:0.5rem">
- <div style="display:flex;justify-content:end">
- <label for="difficulty-input" style="margin-right:0.5rem">Difficulty:</label>
- <input id="difficulty-input" type="number" name="difficulty" style="width:3rem"/>
- </div>
- <div style="margin-top:0.25rem;display:flex;justify-content:end">
- <label for="algorithm-select" style="margin-right:0.5rem">Algorithm:</label>
- <select id="algorithm-select" name="algorithm"></select>
- </div>
- <div style="margin-top:0.25rem;display:flex;justify-content:end">
- <label for="compare-select" style="margin-right:0.5rem">Compare:</label>
- <select id="compare-select" name="compare">
- <option value="NONE">-</option>
- </select>
- </div>
-</form>
+ />
+ <p id="status" style="max-width:256px">Loading...</p>
+ <script async type="module" src={ "/.within.website/x/cmd/anubis/static/js/bench.mjs?cacheBuster=" + anubis.Version }></script>
+ <div id="sparkline"></div>
+ <noscript>
+ <p>Running the benchmark tool requires JavaScript to be enabled.</p>
+ </noscript>
+ </div>
+ </div>
+ <form id="controls" style="position:fixed;top:0.5rem;right:0.5rem">
+ <div style="display:flex;justify-content:end">
+ <label for="difficulty-input" style="margin-right:0.5rem">Difficulty:</label>
+ <input id="difficulty-input" type="number" name="difficulty" style="width:3rem"/>
+ </div>
+ <div style="margin-top:0.25rem;display:flex;justify-content:end">
+ <label for="algorithm-select" style="margin-right:0.5rem">Algorithm:</label>
+ <select id="algorithm-select" name="algorithm"></select>
+ </div>
+ <div style="margin-top:0.25rem;display:flex;justify-content:end">
+ <label for="compare-select" style="margin-right:0.5rem">Compare:</label>
+ <select id="compare-select" name="compare">
+ <option value="NONE">-</option>
+ </select>
+ </div>
+ </form>
}