.editorconfig 🔗
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
Amolith created
.editorconfig | 12 ++
.gitignore | 1
.prettierignore | 2
.prettierrc | 4
package-lock.json | 55 +++++++++++
package.json | 6 +
ws/static/dashboard.html.tmpl | 147 ++++++++++++++++++++-----------
ws/static/head.html.tmpl | 35 ++++---
ws/static/header.html.tmpl | 18 +-
ws/static/login.html.tmpl | 36 +++---
ws/static/new.html.tmpl | 96 ++++++++++----------
ws/static/select-release.html.tmpl | 99 +++++++++++++--------
ws/static/styles.css | 84 ++++++++++-------
13 files changed, 378 insertions(+), 217 deletions(-)
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
@@ -11,3 +11,4 @@
/.idea/
/website/public
+/node_modules/
@@ -0,0 +1,2 @@
+/ws/static/head.html.tmpl
+/ws/static/footer.html.tmpl
@@ -0,0 +1,4 @@
+---
+goTemplateBracketSpacing: true
+plugins:
+ - prettier-plugin-go-template
@@ -0,0 +1,55 @@
+{
+ "name": "main-willow",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "prettier": "^3.3.3",
+ "prettier-plugin-go-template": "^0.0.15"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-plugin-go-template": {
+ "version": "0.0.15",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-go-template/-/prettier-plugin-go-template-0.0.15.tgz",
+ "integrity": "sha512-WqU92E1NokWYNZ9mLE6ijoRg6LtIGdLMePt2C7UBDjXeDH9okcRI3zRqtnWR4s5AloiqyvZ66jNBAa9tmRY5EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ulid": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "prettier": "^3.0.0"
+ }
+ },
+ "node_modules/ulid": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz",
+ "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "ulid": "bin/cli.js"
+ }
+ }
+ }
+}
@@ -0,0 +1,6 @@
+{
+ "devDependencies": {
+ "prettier": "^3.3.3",
+ "prettier-plugin-go-template": "^0.0.15"
+ }
+}
@@ -1,59 +1,98 @@
{{- template "head" }}
{{- template "header" .IsDashboard }}
- <main>
- <div class="wrapper two_column">
- <div class="projects">
- <!-- Range through projects that aren't yet up-to-date -->
- {{- range .Projects -}}
- {{- if ne .Running (index .Releases 0).Tag -}}
- <h2>Outdated projects</h2>
- {{- break -}}
- {{- end -}}
- {{- end -}}
- {{- range .Projects -}}
- {{- if ne .Running (index .Releases 0).Tag -}}
- <div id="{{ .ID }}" class="project card">
- <h3><a href="{{ .URL }}">{{ .Name }}</a> <span class="delete"><a href="/new?action=delete&id={{ .ID }}">Delete?</a></span></h3>
- <p>You've selected {{ .Running }}. <a href="/new?action=update&url={{ .URL }}&forge={{ .Forge }}&name={{ .Name }}">Modify?</a></p>
- <p>Latest: <a href="{{ (index .Releases 0).URL }}">{{ (index .Releases 0).Tag }}</a></p>
- <p><a href="#{{ (index .Releases 0).ID }}">View release notes</a></p>
- </div>
- {{- end -}}
- {{- end -}}
+<main>
+ <div class="wrapper two_column">
+ <div class="projects">
+ <!-- Range through projects that aren't yet up-to-date -->
+ {{- range .Projects -}}
+ {{- if ne .Running (index .Releases 0).Tag -}}
+ <h2>Outdated projects</h2>
+ {{- break -}}
+ {{- end -}}
+ {{- end -}}
+ {{- range .Projects -}}
+ {{- if ne .Running (index .Releases 0).Tag -}}
+ <div id="{{ .ID }}" class="project card">
+ <h3>
+ <a href="{{ .URL }}">{{ .Name }}</a> <span
+ class="delete"
+ ><a href="/new?action=delete&id={{ .ID }}">Delete?</a></span
+ >
+ </h3>
+ <p>
+ You've selected {{ .Running }}.
+ <a
+ href="/new?action=update&url={{ .URL }}&forge={{ .Forge }}&name={{ .Name }}"
+ >Modify?</a
+ >
+ </p>
+ <p>
+ Latest:
+ <a href="{{ (index .Releases 0).URL }}"
+ >{{ (index .Releases 0).Tag }}</a
+ >
+ </p>
+ <p>
+ <a href="#{{ (index .Releases 0).ID }}">View release notes</a>
+ </p>
+ </div>
+ {{- end -}}
+ {{- end -}}
- <!-- Range through projects that _are_ up-to-date -->
- {{- range .Projects -}}
- {{- if eq .Running (index .Releases 0).Tag -}}
- <h2>Up-to-date projects</h2>
- {{- break -}}
- {{- end -}}
- {{- end -}}
- {{- range .Projects -}}
- {{- if eq .Running (index .Releases 0).Tag -}}
- <div class="project card">
- <h3><a href="{{ .URL }}">{{ .Name }}</a> <span class="delete"><a href="/new?action=delete&id={{ .ID }}">Delete?</a></span></h3>
- <p>You've selected <a href="#{{ (index .Releases 0).ID }}">{{ .Running }}</a>. <a href="/new?action=update&url={{ .URL }}&forge={{ .Forge }}&name={{ .Name }}">Modify?</a></p>
- </div>
- {{- end -}}
- {{- end -}}
- </div>
- <div class="release_notes">
- <h2>Release notes</h2>
- {{- range .Projects -}}
- <div id="{{ (index .Releases 0).ID }}" class="release_note card">
- <h3>{{ .Name }}: release notes for <a href="{{ (index .Releases 0).URL }}">{{ (index .Releases 0).Tag }}</a></h3>
- {{- if eq .Forge "github" "gitea" "forgejo" -}}
- {{- (index .Releases 0).Content -}}
- {{- else -}}
- <pre>
+
+ <!-- Range through projects that _are_ up-to-date -->
+ {{- range .Projects -}}
+ {{- if eq .Running (index .Releases 0).Tag -}}
+ <h2>Up-to-date projects</h2>
+ {{- break -}}
+ {{- end -}}
+ {{- end -}}
+ {{- range .Projects -}}
+ {{- if eq .Running (index .Releases 0).Tag -}}
+ <div class="project card">
+ <h3>
+ <a href="{{ .URL }}">{{ .Name }}</a> <span
+ class="delete"
+ ><a href="/new?action=delete&id={{ .ID }}">Delete?</a></span
+ >
+ </h3>
+ <p>
+ You've selected
+ <a href="#{{ (index .Releases 0).ID }}">{{ .Running }}</a>.
+ <a
+ href="/new?action=update&url={{ .URL }}&forge={{ .Forge }}&name={{ .Name }}"
+ >Modify?</a
+ >
+ </p>
+ </div>
+ {{- end -}}
+ {{- end -}}
+ </div>
+ <div class="release_notes">
+ <h2>Release notes</h2>
+ {{- range .Projects -}}
+ <div id="{{ (index .Releases 0).ID }}" class="release_note card">
+ <h3>
+ {{ .Name }}: release notes for
+ <a href="{{ (index .Releases 0).URL }}"
+ >{{ (index .Releases 0).Tag }}</a
+ >
+ </h3>
+ {{- if eq .Forge "github" "gitea" "forgejo" -}}
+ {{- (index .Releases 0).Content -}}
+ {{- else -}}
+ <pre>
{{- (index .Releases 0).Content -}}
- </pre>
- {{- end -}}
- <p><a class="return_to_project" href="#{{ .ID }}">Back to project</a></p>
- <div class="close"><a href="#">✖</a></div>
- </div>
- {{- end -}}
- </div>
- </div>
- </main>
+ </pre
+ >
+ {{- end -}}
+ <p>
+ <a class="return_to_project" href="#{{ .ID }}">Back to project</a>
+ </p>
+ <div class="close"><a href="#">✖</a></div>
+ </div>
+ {{- end -}}
+ </div>
+ </div>
+</main>
{{- template "footer" .Version }}
@@ -1,24 +1,27 @@
{{- define "head" }}
-<!DOCTYPE html>
-<html lang="en-GB">
+ <!doctype html>
+ <html lang="en-GB">
<head>
- <title>Willow</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="title" content="Willow">
- <meta name="description" content="Forge-agnostic software release tracker">
+ <title>Willow</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="title" content="Willow" />
+ <meta
+ name="description"
+ content="Forge-agnostic software release tracker"
+ />
- <!-- Indicate that we support both light and dark mode, and that we prefer light -->
- <meta name="color-scheme" content="light dark">
+ <!-- Indicate that we support both light and dark mode, and that we prefer light -->
+ <meta name="color-scheme" content="light dark" />
- <!-- Preload CSS reset -->
- <link rel="preload" href="/static/reset.css" as="style" />
- <link rel="stylesheet" href="/static/reset.css" />
+ <!-- Preload CSS reset -->
+ <link rel="preload" href="/static/reset.css" as="style" />
+ <link rel="stylesheet" href="/static/reset.css" />
- <!-- Preload CSS styles -->
- <link rel="preload" href="/static/colours.css" as="style" />
- <link rel="stylesheet" href="/static/colours.css" />
- <link rel="preload" href="/static/styles.css" as="style" />
- <link rel="stylesheet" href="/static/styles.css" />
+ <!-- Preload CSS styles -->
+ <link rel="preload" href="/static/colours.css" as="style" />
+ <link rel="stylesheet" href="/static/colours.css" />
+ <link rel="preload" href="/static/styles.css" as="style" />
+ <link rel="stylesheet" href="/static/styles.css" />
</head>
<body>
{{- end -}}
@@ -1,11 +1,11 @@
{{- define "header" }}
- <header>
- <div class="wrapper">
- <h1>{{ if eq . true }}Willow{{ else }}<a href="/">Willow</a>{{ end }}</h1>
- <nav>
- <a href="/new">Track a new project</a>
- <a href="/logout">Log out</a>
- </nav>
- </div>
- </header>
+ <header>
+ <div class="wrapper">
+ <h1>{{ if eq . true }}Willow{{ else }}<a href="/">Willow</a>{{ end }}</h1>
+ <nav>
+ <a href="/new">Track a new project</a>
+ <a href="/logout">Log out</a>
+ </nav>
+ </div>
+ </header>
{{- end -}}
@@ -1,20 +1,20 @@
{{- template "head" -}}
- <header>
- <div class="wrapper">
- <h1>Willow</h1>
- </div>
- </header>
- <div class="wrapper">
- <form method="post" class="login">
- <div class="input">
- <label for="username">Username</label>
- <input type="text" id="username" name="username">
- </div>
- <div class="input">
- <label for="password">Password</label>
- <input type="password" id="password" name="password">
- </div>
- <button class="button" type="submit" formaction="/login">Login</button>
- </form>
- </div>
+<header>
+ <div class="wrapper">
+ <h1>Willow</h1>
+ </div>
+</header>
+<div class="wrapper">
+ <form method="post" class="login">
+ <div class="input">
+ <label for="username">Username</label>
+ <input type="text" id="username" name="username" />
+ </div>
+ <div class="input">
+ <label for="password">Password</label>
+ <input type="password" id="password" name="password" />
+ </div>
+ <button class="button" type="submit" formaction="/login">Login</button>
+ </form>
+</div>
{{- template "footer" .Version -}}
@@ -1,52 +1,52 @@
{{- template "head" }}
{{- template "header" }}
- <div class="wrapper">
- <form method="post" class="new-project">
- <h2>New project</h2>
- <div class="input">
- <label for="url">Project URL</label>
- <input type="text" id="url" name="url">
- </div>
- <div class="input">
- <label for="name">Project name</label>
- <input type="text" id="name" name="name">
- </div>
- <div class="input">
- <fieldset>
- <legend>Forge Type</legend>
- <h4>RSS</h4>
- <div class="input-wrapper">
- <input type="radio" id="github" name="forge" value="github">
- <label for="github">Github</label>
- </div>
- <div class="input-wrapper">
- <input type="radio" id="gitea" name="forge" value="gitea">
- <label for="gitea">Gitea</label>
- </div>
- <div class="input-wrapper">
- <input type="radio" id="forgejo" name="forge" value="forgejo">
- <label for="forgejo">Forgejo</label>
- </div>
- <h4>Raw git</h4>
- <div class="input-wrapper">
- <input type="radio" id="gitlab" name="forge" value="gitlab">
- <label for="gitlab">GitLab</label>
- </div>
- <div class="input-wrapper">
- <input type="radio" id="sourcehut" name="forge" value="sourcehut">
- <label for="sourcehut">Sourcehut</label>
- </div>
- <div class="input-wrapper">
- <input type="radio" id="bitbucket" name="forge" value="bitbucket">
- <label for="bitbucket">Bitbucket</label>
- </div>
- <div class="input-wrapper">
- <input type="radio" id="other" name="forge" value="other">
- <label for="other">Other</label>
- </div>
- </fieldset>
- </div>
- <button class="button" type="submit" formaction="/new">Next</button>
- </form>
+<div class="wrapper">
+ <form method="post" class="new-project">
+ <h2>New project</h2>
+ <div class="input">
+ <label for="url">Project URL</label>
+ <input type="text" id="url" name="url" />
+ </div>
+ <div class="input">
+ <label for="name">Project name</label>
+ <input type="text" id="name" name="name" />
+ </div>
+ <div class="input">
+ <fieldset>
+ <legend>Forge Type</legend>
+ <h4>RSS</h4>
+ <div class="input-wrapper">
+ <input type="radio" id="github" name="forge" value="github" />
+ <label for="github">Github</label>
</div>
+ <div class="input-wrapper">
+ <input type="radio" id="gitea" name="forge" value="gitea" />
+ <label for="gitea">Gitea</label>
+ </div>
+ <div class="input-wrapper">
+ <input type="radio" id="forgejo" name="forge" value="forgejo" />
+ <label for="forgejo">Forgejo</label>
+ </div>
+ <h4>Raw git</h4>
+ <div class="input-wrapper">
+ <input type="radio" id="gitlab" name="forge" value="gitlab" />
+ <label for="gitlab">GitLab</label>
+ </div>
+ <div class="input-wrapper">
+ <input type="radio" id="sourcehut" name="forge" value="sourcehut" />
+ <label for="sourcehut">Sourcehut</label>
+ </div>
+ <div class="input-wrapper">
+ <input type="radio" id="bitbucket" name="forge" value="bitbucket" />
+ <label for="bitbucket">Bitbucket</label>
+ </div>
+ <div class="input-wrapper">
+ <input type="radio" id="other" name="forge" value="other" />
+ <label for="other">Other</label>
+ </div>
+ </fieldset>
+ </div>
+ <button class="button" type="submit" formaction="/new">Next</button>
+ </form>
+</div>
{{- template "footer" .Version }}
@@ -1,44 +1,69 @@
{{- template "head" }}
{{- template "header" }}
{{- with .Project }}
- <div class="wrapper">
- <form method="post" class="select-release">
- <h2>Select release</h2>
- <div class="input">
- <p>Which release of {{ .Name }} are you currently running?</p>
- {{- $url := .URL -}}
- {{- $forge := .Forge -}}
- {{- $running := .Running -}}
- {{- range .Releases -}}
- <div class="input-wrapper">
- <input type="radio" id="{{ .Tag }}" name="release" value="{{ .Tag }}" {{- if eq $running .Tag }} checked {{- end -}}>
- {{- if ne .URL "" -}}
- <label for="{{ .Tag }}"><a href="{{ .URL }}">{{ .Tag }}</a></label>
- </div>
- {{- else -}}
- {{- if eq $forge "sourcehut" -}}
- <label for="{{ .Tag }}"><a href="{{ $url }}/refs/{{ .Tag }}">{{ .Tag }}</a></label>
- </div>
- {{- else if eq $forge "gitlab" -}}
- <label for="{{ .Tag }}"><a href="{{ $url }}/-releases/{{ .Tag }}">{{ .Tag }}</a></label>
- </div>
- {{- else -}}
+ <div class="wrapper">
+ <form method="post" class="select-release">
+ <h2>Select release</h2>
+ <div class="input">
+ <p>Which release of {{ .Name }} are you currently running?</p>
+ {{- $url := .URL -}}
+ {{- $forge := .Forge -}}
+ {{- $running := .Running -}}
+ {{- range .Releases -}}
+ <div class="input-wrapper">
+ <input
+ type="radio"
+ id="{{ .Tag }}"
+ name="release"
+ value="{{ .Tag }}"
+ {{- if
+ eq
+ $running
+ .Tag
+ }}
+ checked
+ {{- end -}}
+ />
+ {{- if ne .URL "" -}}
+ <label for="{{ .Tag }}"
+ ><a href="{{ .URL }}">{{ .Tag }}</a></label
+ >
+ {{- else -}}
+ {{- if eq $forge "sourcehut" -}}
+ <label for="{{ .Tag }}"
+ ><a href="{{ $url }}/refs/{{ .Tag }}">{{ .Tag }}</a></label
+ >
+ {{- else if eq $forge "gitlab" -}}
+ <label for="{{ .Tag }}"
+ ><a href="{{ $url }}/-releases/{{ .Tag }}"
+ >{{ .Tag }}</a
+ ></label
+ >
+ {{- else -}}
<label for="{{ .Tag }}">{{ .Tag }}</label>
- </div>
- {{- end -}}
- {{- end -}}
- {{- end -}}
- </div>
- <!-- Append these if they ever start limiting RSS entries: `(eq $forge "gitea") (eq $forge "forgejo")` -->
- {{- if or (eq $forge "github") -}}
- <p><small>Some RSS feeds (notably GitHub's) include a limited number of releases. If you don't see your version, please change the forge type to "Other".</small></p>
+ {{- end -}}
{{- end -}}
- <input type="hidden" name="url" value="{{ .URL }}">
- <input type="hidden" name="name" value="{{ .Name }}">
- <input type="hidden" name="forge" value="{{ .Forge }}">
- <input type="hidden" name="id" value="{{ .ID }}">
- <button class="button" type="submit" formaction="/new">Track releases</button>
- </form>
- </div>
+ </div>
+ {{- end -}}
+ </div>
+ <!-- Append these if they ever start limiting RSS entries: `(eq $forge "gitea") (eq $forge "forgejo")` -->
+ {{- if or (eq $forge "github") -}}
+ <p>
+ <small
+ >Some RSS feeds (notably GitHub's) include a limited number of
+ releases. If you don't see your version, please change the forge
+ type to "Other".</small
+ >
+ </p>
+ {{- end -}}
+ <input type="hidden" name="url" value="{{ .URL }}" />
+ <input type="hidden" name="name" value="{{ .Name }}" />
+ <input type="hidden" name="forge" value="{{ .Forge }}" />
+ <input type="hidden" name="id" value="{{ .ID }}" />
+ <button class="button" type="submit" formaction="/new">
+ Track releases
+ </button>
+ </form>
+ </div>
{{- end }}
{{- template "footer" .Version -}}
@@ -64,23 +64,23 @@ body {
grid-template-rows: [header] auto [main] 1fr [footer] auto;
}
- body > header,
- body > main,
- body > footer {
+ body>header,
+ body>main,
+ body>footer {
display: grid;
grid-template-columns:
[page-start] minmax(1em, 1fr) [content] minmax(240px, 100ch) [page-end] minmax(1em, 1fr);
}
- body > main {
+ body>main {
grid-template-rows: [top-gutter] 1em [content] 1fr [bottom-gutter] 1em;
}
- body > footer {
+ body>footer {
grid-template-rows: [top-gutter] 2em [content] 1fr [bottom-gutter] 0.5em;
}
- body > header {
+ body>header {
grid-template-rows: [top-gutter] 0.5em [content] 1fr [bottom-gutter] 0.5em;
}
@@ -110,16 +110,22 @@ p {
flex-direction: row;
}
-.two_column > * > * {
+.two_column>*>* {
margin: 20px 0;
}
-.projects, .release_notes {
+.projects,
+.release_notes {
flex: 1 1 50%;
}
-.release_note.card:not(:target) { display: none; }
-.release_note.card:target { display: block; }
+.release_note.card:not(:target) {
+ display: none;
+}
+
+.release_note.card:target {
+ display: block;
+}
.return_to_project {
display: none;
@@ -132,45 +138,48 @@ p {
border-radius: 5px;
margin: 20px 0;
padding: 20px 20px 0 20px;
- box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
+ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
-.card > h3 {
+.card>h3 {
margin-top: 0;
}
-.card > p:first-of-type {
+.card>p:first-of-type {
margin-bottom: 16px;
}
-.card > p:last-of-type {
+.card>p:last-of-type {
margin-bottom: 16px;
}
.delete {
- float: right;
- font-size: 12px;
+ float: right;
+ font-size: 12px;
}
.close {
- position: absolute;
- top: 2px;
- right: 3px;
+ position: absolute;
+ top: 2px;
+ right: 3px;
}
-.close > a {
- font-size: 1em;
- text-decoration: none;
- color: var(--card-border);
+.close>a {
+ font-size: 1em;
+ text-decoration: none;
+ color: var(--card-border);
}
@media (prefers-color-scheme: dark) {
- .close > a {
+ .close>a {
color: var(--text);
}
}
-.card > pre, .card > div > pre { overflow: scroll; }
+.card>pre,
+.card>div>pre {
+ overflow: scroll;
+}
header .wrapper {
display: flex;
@@ -212,7 +221,7 @@ header nav a:visited {
padding: 0.6rem 0.5rem 0.4rem;
}
-header nav a + a {
+header nav a+a {
margin-inline-start: 1rem;
}
@@ -246,7 +255,8 @@ footer .wrapper {
flex-direction: column;
}
- .projects, .release_notes {
+ .projects,
+ .release_notes {
overflow: visible;
flex: 1 1 100%;
}
@@ -279,7 +289,8 @@ fieldset {
position: relative;
border: 0 none;
background-color: var(--card-background);
- margin-inline: -1px; /* Line up with input boxes */
+ margin-inline: -1px;
+ /* Line up with input boxes */
margin-block-start: 1rem;
padding-inline: 1rem;
}
@@ -309,7 +320,7 @@ fieldset h4 {
}
.select-release .input {
- display: block;
+ display: block;
}
.button {
@@ -331,9 +342,12 @@ form.login .button {
/* End Forms */
@media (prefers-reduced-motion) {
- *, *::before, *::after {
- animation-duration: 0s !important;
- transition: none !important;
- scroll-behavior: auto !important;
- }
-}
+
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0s !important;
+ transition: none !important;
+ scroll-behavior: auto !important;
+ }
+}