diff --git a/.gitignore b/.gitignore
index 18d87f6..309295c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,6 @@ venv
.env
public
*.swp
+argos-config.yaml
config.yaml
dist
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 07afde1..d7116d5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -58,6 +58,7 @@ pages:
- pwd
- ls
- make docs
+ - echo "https://framasoft.frama.io/framaspace/argos/* https://argos-monitoring.framasoft.org/:splat 301" > public/_redirects
artifacts:
paths:
- public/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 608f214..b2a8d02 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,17 @@
## [Unreleased]
+- ššÆ ā Improve notifications and result(s) pages
+- š ā Add level of log before the log message
+ā š ā Add a warning messages in the logs if there is no tasks in database. (fix #41)
+- ⨠ā Add command to generate example configuration (fix #38)
+- š ā Improve documentation
+- ⨠ā Add command to warn if itās been long since last viewing an agent (fix #49)
+- š„ ā Change default config file path to argos-config.yaml (fix #36)
+- š ā New documentation URL: doc is now on https://argos-monitoring.framasoft.org/
+- š„ ā Remove env vars and only use the configuration file
+- ⨠ā Add built-in authentication for human interface
+
## 0.1.1
Date: 2024-04-30
diff --git a/README.md b/README.md
index e88108a..cd8651a 100644
--- a/README.md
+++ b/README.md
@@ -2,13 +2,15 @@
A monitoring and status board for your websites.
+
+
1. Define a list of websites to monitor
2. Specify a list of checks to run on these websites.
3. Argos will run the checks periodically and alert you if something goes wrong.
Internally, a HTTP API is exposed, and a job queue is used to distribute the checks to the agents.
-- [Online documentation](http://framasoft.frama.io/framaspace/argos)
+- [Online documentation](https://argos-monitoring.framasoft.org/)
- [Issue tracker](https://framagit.org/framasoft/framaspace/argos/-/issues)
## Requirements
diff --git a/argos/commands.py b/argos/commands.py
index 2b822b7..0fc1491 100644
--- a/argos/commands.py
+++ b/argos/commands.py
@@ -1,6 +1,8 @@
import asyncio
import os
from functools import wraps
+from pathlib import Path
+from sys import exit as sysexit
from uuid import uuid4
import click
@@ -32,13 +34,24 @@ def coroutine(f):
def validate_config_access(ctx, param, value):
- if os.path.isfile(value) and os.access(value, os.R_OK):
- return value
+ for file in list(
+ dict.fromkeys([value, "argos-config.yaml", "/etc/argos/config.yaml"])
+ ):
+ path = Path(file)
- if os.path.isfile(value):
- raise click.BadParameter(f"the file {value} is not readabale.")
+ if path.is_file() and os.access(path, os.R_OK):
+ return file
- raise click.BadParameter(f"the file {value} does not exists or is not reachable.")
+ if value == "argos-config.yaml":
+ raise click.BadParameter(
+ f"the file {value} does not exists or is not reachable, "
+ "nor does /etc/argos/config.yaml."
+ )
+
+ raise click.BadParameter(
+ f"the file {value} does not exists or is not reachable, "
+ "nor does argos-config.yaml or /etc/argos/config.yaml."
+ )
@click.group()
@@ -48,11 +61,17 @@ def cli():
@cli.group()
def server():
- pass
+ """Commands for managing server, serverās configuration and users"""
+
+
+@server.group()
+def user():
+ """User management"""
@cli.command()
def version():
+ """Prints Argosā version and exits"""
click.echo(VERSION)
@@ -75,7 +94,7 @@ def version():
type=click.Choice(logging.LOG_LEVELS, case_sensitive=False),
)
def agent(server_url, auth, max_tasks, wait_time, log_level):
- """Get and run tasks to the provided server. Will wait for new tasks.
+ """Get and run tasks for the provided server. Will wait for new tasks.
Usage: argos agent https://argos.example.org "auth-token-here"
@@ -99,9 +118,10 @@ def agent(server_url, auth, max_tasks, wait_time, log_level):
@click.option("--port", default=8000, type=int, help="Port to bind")
@click.option(
"--config",
- default="config.yaml",
+ default="argos-config.yaml",
help="Path of the configuration file. "
- "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead. "
+ "Default value: argos-config.yaml and /etc/argos/config.yaml as fallback.",
envvar="ARGOS_YAML_FILE",
callback=validate_config_access,
)
@@ -109,7 +129,7 @@ def agent(server_url, auth, max_tasks, wait_time, log_level):
def start(host, port, config, reload):
"""Starts the server (use only for testing or development!)
- See https://framasoft.frama.io/framaspace/argos/deployment/systemd.html#server
+ See https://argos-monitoring.framasoft.org/deployment/systemd.html#server
for advices on how to start the server for production.
"""
os.environ["ARGOS_YAML_FILE"] = config
@@ -147,9 +167,10 @@ def validate_max_results(ctx, param, value):
)
@click.option(
"--config",
- default="config.yaml",
+ default="argos-config.yaml",
help="Path of the configuration file. "
- "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead. "
+ "Default value: argos-config.yaml and /etc/argos/config.yaml as fallback.",
envvar="ARGOS_YAML_FILE",
callback=validate_config_access,
)
@@ -175,12 +196,48 @@ async def cleandb(max_results, max_lock_seconds, config):
click.echo(f"{updated} locks released")
+@server.command()
+@click.option(
+ "--time-without-agent",
+ default=5,
+ help="Time without seeing an agent after which a warning will be issued, in minutes. "
+ "Default is 5 minutes.",
+ callback=validate_max_results,
+)
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@coroutine
+async def watch_agents(time_without_agent, config):
+ """Watch agents (to run routinely)
+
+ Issues a warning if no agent has been seen by the server for a given time.
+ """
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+
+ db = await get_db()
+ agents = await queries.get_recent_agents_count(db, time_without_agent)
+ if agents == 0:
+ click.echo(f"No agent has been seen in the last {time_without_agent} minutes.")
+ sysexit(1)
+
+
@server.command(short_help="Load or reload tasksā configuration")
@click.option(
"--config",
- default="config.yaml",
+ default="argos-config.yaml",
help="Path of the configuration file. "
- "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead. "
+ "Default value: argos-config.yaml and /etc/argos/config.yaml as fallback.",
envvar="ARGOS_YAML_FILE",
callback=validate_config_access,
)
@@ -192,15 +249,12 @@ async def reload_config(config):
# The imports are made here otherwise the agent will need server configuration files.
from argos.server import queries
- from argos.server.main import get_application, read_config
- from argos.server.settings import get_app_settings
+ from argos.server.main import read_config
- appli = get_application()
- settings = get_app_settings()
- config = read_config(appli, settings)
+ _config = read_config(config)
db = await get_db()
- changed = await queries.update_from_config(db, config)
+ changed = await queries.update_from_config(db, _config)
click.echo(f"{changed['added']} tasks added")
click.echo(f"{changed['vanished']} tasks deleted")
@@ -209,9 +263,10 @@ async def reload_config(config):
@server.command()
@click.option(
"--config",
- default="config.yaml",
+ default="argos-config.yaml",
help="Path of the configuration file. "
- "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead. "
+ "Default value: argos-config.yaml and /etc/argos/config.yaml as fallback.",
envvar="ARGOS_YAML_FILE",
callback=validate_config_access,
)
@@ -222,16 +277,253 @@ async def migrate(config):
os.environ["ARGOS_YAML_FILE"] = config
# The imports are made here otherwise the agent will need server configuration files.
- from argos.server.settings import get_app_settings
+ from argos.server.settings import read_yaml_config
- settings = get_app_settings()
+ settings = read_yaml_config(config)
- current_dir = os.path.dirname(__file__)
- alembic_cfg = Config(os.path.join(current_dir, "server/migrations/alembic.ini"))
- alembic_cfg.set_main_option("sqlalchemy.url", settings.database_url)
+ current_dir = Path(__file__).resolve().parent
+ alembic_cfg = Config(current_dir / "server" / "migrations" / "alembic.ini")
+ alembic_cfg.set_main_option("sqlalchemy.url", str(settings.general.db.url))
command.upgrade(alembic_cfg, "head")
+@user.command()
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@click.option("--name", prompt=True, help="Name of the user to create.")
+@click.password_option()
+@coroutine
+async def add(config, name, password):
+ """Add new user"""
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+ from passlib.context import CryptContext
+
+ db = await get_db()
+ _user = await queries.get_user(db, name)
+ if _user is not None:
+ click.echo(f"User {name} already exists.")
+ sysexit(1)
+
+ pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+ await queries.add_user(db, name, pwd_context.hash(password))
+ click.echo(f"User {name} added.")
+
+
+@user.command()
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@click.option(
+ "--name", prompt=True, help="Name of the user you want to change the password."
+)
+@click.password_option()
+@coroutine
+async def change_password(config, name, password):
+ """Change userās password"""
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+ from passlib.context import CryptContext
+
+ db = await get_db()
+ _user = await queries.get_user(db, name)
+ if _user is None:
+ click.echo(f"User {name} does not exist.")
+ sysexit(1)
+
+ pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+ _user.password = pwd_context.hash(password)
+ db.commit()
+ click.echo(f"Password of user {name} changed.")
+
+
+@user.command()
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@click.option(
+ "--name", required=True, help="Name of the user you want to test the password for."
+)
+@click.option("--password", prompt=True, hide_input=True)
+@coroutine
+async def verify_password(config, name, password):
+ """Test userās password"""
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+ from passlib.context import CryptContext
+
+ db = await get_db()
+ _user = await queries.get_user(db, name)
+ if _user is None:
+ click.echo(f"User {name} does not exist.")
+ sysexit(1)
+
+ pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+ if not pwd_context.verify(password, _user.password):
+ click.echo("Wrong password!")
+ sysexit(2)
+
+ click.echo("The provided password is correct.")
+
+
+@user.command()
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@click.option("--name", required=True, help="Name of the user to disable.")
+@coroutine
+async def disable(config, name):
+ """Disable user"""
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+
+ db = await get_db()
+ _user = await queries.get_user(db, name)
+ if _user is None:
+ click.echo(f"User {name} does not exist.")
+ sysexit(1)
+ if _user.disabled:
+ click.echo(f"User {name} is already disabled.")
+ sysexit(2)
+
+ _user.disabled = True
+ db.commit()
+
+ click.echo(f"User {name} disabled.")
+
+
+@user.command()
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@click.option("--name", required=True, help="Name of the user to reenable")
+@coroutine
+async def enable(config, name):
+ """Enable user"""
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+
+ db = await get_db()
+ _user = await queries.get_user(db, name)
+ if _user is None:
+ click.echo(f"User {name} does not exist.")
+ sysexit(1)
+ if not _user.disabled:
+ click.echo(f"User {name} is already enabled.")
+ sysexit(2)
+
+ _user.disabled = False
+ db.commit()
+
+ click.echo(f"User {name} enabled.")
+
+
+@user.command()
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@click.option("--name", required=True, help="Name of the user to delete.")
+@coroutine
+async def delete(config, name):
+ """Delete user"""
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+
+ db = await get_db()
+ _user = await queries.get_user(db, name)
+ if _user is None:
+ click.echo(f"User {name} does not exist.")
+ sysexit(1)
+
+ db.delete(_user)
+ db.commit()
+
+ click.echo(f"User {name} deleted.")
+
+
+@user.command()
+@click.option(
+ "--config",
+ default="argos-config.yaml",
+ help="Path of the configuration file. "
+ "If ARGOS_YAML_FILE environment variable is set, its value will be used instead.",
+ envvar="ARGOS_YAML_FILE",
+ callback=validate_config_access,
+)
+@coroutine
+async def show(config):
+ """List all users"""
+ # Itās mandatory to do it before the imports
+ os.environ["ARGOS_YAML_FILE"] = config
+
+ # The imports are made here otherwise the agent will need server configuration files.
+ from argos.server import queries
+
+ db = await get_db()
+ users = await queries.list_users(db)
+ if users.count() == 0:
+ click.echo("There is no users in database.")
+ sysexit(1)
+
+ click.echo("ā
means that the user is enabled.")
+ click.echo("ā means that the user is disabled.")
+
+ for _user in users.all():
+ status = "ā
"
+ if _user.disabled:
+ status = "ā"
+ click.echo(f"{status} {_user.username}, last login: {_user.last_login_at}")
+
+
@server.command(short_help="Generate a token for agents")
@coroutine
async def generate_token():
@@ -242,5 +534,19 @@ async def generate_token():
click.echo(uuid4())
+@server.command()
+@coroutine
+async def generate_config():
+ """Output a self-documented example config file.
+
+ \b
+ Redirect the output to a file to save it:
+ argos server generate-config > /etc/argos/config.yaml
+ """
+ config_example = Path(__file__).resolve().parent / "config-example.yaml"
+ with config_example.open("r", encoding="utf-8") as f:
+ print(f.read())
+
+
if __name__ == "__main__":
cli()
diff --git a/argos/config-example.yaml b/argos/config-example.yaml
new file mode 100644
index 0000000..41f00d6
--- /dev/null
+++ b/argos/config-example.yaml
@@ -0,0 +1,88 @@
+general:
+ db:
+ # The database URL, as defined in SQLAlchemy docsĀ : https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls
+ # Example for SQLite: "sqlite:////tmp/argos.db"
+ url: "postgresql://argos:argos@localhost/argos"
+ # You configure the size of the database pool of connection, and the max overflow (until when new connections are accepted ?)
+ # See https://docs.sqlalchemy.org/en/20/core/pooling.html#sqlalchemy.pool.QueuePool.params.pool_size for details
+ pool_size: 10
+ max_overflow: 20
+ # Can be "production", "dev", "test".
+ # If not present, default value is "production"
+ env: "production"
+ # to get a good string for cookie_secret, run:
+ # openssl rand -hex 32
+ cookie_secret: "foo_bar_baz"
+ # Default delay for checks.
+ # Can be superseeded in domain configuration.
+ # For ex., to run checks every minute:
+ frequency: "1m"
+ # Which way do you want to be warned when a check goes to that severity?
+ # "local" emits a message in the server log
+ # Youāll need to configure mail and gotify below to be able to use them here.
+ alerts:
+ ok:
+ - local
+ warning:
+ - local
+ critical:
+ - local
+ unknown:
+ - local
+ # Mail configuration is quite straight-forward
+ # mail:
+ # mailfrom: no-reply@example.org
+ # host: 127.0.0.1
+ # port: 25
+ # ssl: False
+ # starttls: False
+ # auth:
+ # login: foo
+ # password: bar
+ # addresses:
+ # - foo@admin.example.org
+ # - bar@admin.example.org
+ # Create an app on your Gotify server and put its token here
+ # See https://gotify.net/ for details about Gotify
+ # gotify:
+ # - url: https://example.org
+ # tokens:
+ # - foo
+ # - bar
+
+service:
+ secrets:
+ # Secrets can be generated using `argos server generate-token`.
+ # You need at least one. Write them as a list, like:
+ # - secret_token
+
+ssl:
+ thresholds:
+ - "1d": critical
+ - "5d": warning
+
+# It's also possible to define the checks in another file
+# with the include syntax:
+#
+# websites: !include websites.yaml
+#
+websites:
+ - domain: "https://mypads.example.org"
+ paths:
+ - path: "/mypads/"
+ checks:
+ - status-is: 200
+ - body-contains: '
'
+ - ssl-certificate-expiration: "on-check"
+ - path: "/admin/"
+ checks:
+ - status-is: 401
+ - domain: "https://munin.example.org"
+ frequency: "20m"
+ paths:
+ - path: "/"
+ checks:
+ - status-is: 301
+ - path: "/munin/"
+ checks:
+ - status-is: 401
diff --git a/argos/logging.py b/argos/logging.py
index 74de43c..5aba551 100644
--- a/argos/logging.py
+++ b/argos/logging.py
@@ -1,7 +1,14 @@
import logging
+
+logging.getLogger("passlib").setLevel(logging.ERROR)
+
+
LOG_LEVELS = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
+# Print level before message
+logging.basicConfig(format="%(levelname)-9s %(message)s")
+
# XXX We probably want different loggers for client and server.
logger = logging.getLogger(__name__)
diff --git a/argos/schemas/config.py b/argos/schemas/config.py
index de69a05..be90f7b 100644
--- a/argos/schemas/config.py
+++ b/argos/schemas/config.py
@@ -8,17 +8,27 @@ from pydantic import (
BaseModel,
ConfigDict,
HttpUrl,
+ PostgresDsn,
StrictBool,
EmailStr,
PositiveInt,
field_validator,
)
from pydantic.functional_validators import BeforeValidator
+from pydantic.networks import UrlConstraints
+from pydantic_core import Url
from typing_extensions import Annotated
from argos.schemas.utils import string_to_duration
Severity = Literal["warning", "error", "critical", "unknown"]
+Environment = Literal["dev", "test", "production"]
+SQLiteDsn = Annotated[
+ Url,
+ UrlConstraints(
+ allowed_schemes=["sqlite"],
+ ),
+]
def parse_threshold(value):
@@ -134,10 +144,19 @@ class GotifyUrl(BaseModel):
tokens: List[str]
+class DbSettings(BaseModel):
+ url: PostgresDsn | SQLiteDsn
+ pool_size: int = 10
+ max_overflow: int = 20
+
+
class General(BaseModel):
"""Frequency for the checks and alerts"""
+ cookie_secret: str
frequency: int
+ db: DbSettings
+ env: Environment = "production"
alerts: Alert
mail: Optional[Mail] = None
gotify: Optional[List[GotifyUrl]] = None
diff --git a/argos/server/alerting.py b/argos/server/alerting.py
index 96f7965..bb833a2 100644
--- a/argos/server/alerting.py
+++ b/argos/server/alerting.py
@@ -52,7 +52,9 @@ Status: {severity}
Time: {result.submitted_at}
Previous status: {old_severity}
-See results of task on {request.url_for('get_task_results_view', task_id=task.id)}
+See result on {request.url_for('get_result_view', result_id=result.id)}
+
+See results of task on {request.url_for('get_task_results_view', task_id=task.id)}#{result.id}
"""
mail = f"""\
@@ -107,7 +109,9 @@ Status: {severity}
Time: {result.submitted_at}
Previous status: {old_severity}
-See results of task on {request.url_for('get_task_results_view', task_id=task.id)}
+See result on {request.url_for('get_result_view', result_id=result.id)}
+
+See results of task on {request.url_for('get_task_results_view', task_id=task.id)}#{result.id}
"""
payload = {"title": subject, "message": msg, "priority": priority}
diff --git a/argos/server/exceptions.py b/argos/server/exceptions.py
new file mode 100644
index 0000000..0261e98
--- /dev/null
+++ b/argos/server/exceptions.py
@@ -0,0 +1,13 @@
+from fastapi import Request
+from fastapi.responses import RedirectResponse
+
+
+class NotAuthenticatedException(Exception):
+ pass
+
+
+def auth_exception_handler(request: Request, exc: NotAuthenticatedException):
+ """
+ Redirect the user to the login page if not logged in
+ """
+ return RedirectResponse(url=request.url_for("login_view"))
diff --git a/argos/server/main.py b/argos/server/main.py
index 856a116..898b202 100644
--- a/argos/server/main.py
+++ b/argos/server/main.py
@@ -1,79 +1,59 @@
import os
import sys
+from contextlib import asynccontextmanager
+from pathlib import Path
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
+from fastapi_login import LoginManager
from pydantic import ValidationError
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker
from argos.logging import logger
-from argos.server import models, routes
-from argos.server.settings import get_app_settings, read_yaml_config
+from argos.server import models, routes, queries
+from argos.server.exceptions import NotAuthenticatedException, auth_exception_handler
+from argos.server.settings import read_yaml_config
def get_application() -> FastAPI:
"""Spawn Argos FastAPI server"""
- settings = get_app_settings()
- appli = FastAPI()
+ appli = FastAPI(lifespan=lifespan)
+ config_file = os.environ["ARGOS_YAML_FILE"]
- config = read_config(appli, settings)
+ config = read_config(config_file)
- # Settings is the pydantic settings object
# Config is the argos config object (built from yaml)
appli.state.config = config
- appli.state.settings = settings
+ appli.add_exception_handler(NotAuthenticatedException, auth_exception_handler)
+ appli.state.manager = create_manager(config.general.cookie_secret)
+
+ @appli.state.manager.user_loader()
+ async def query_user(user: str) -> None | models.User:
+ """
+ Get a user from the db
+ :param user: name of the user
+ :return: None or the user object
+ """
+ return await queries.get_user(appli.state.db, user)
- appli.add_event_handler(
- "startup",
- create_start_app_handler(appli),
- )
- appli.add_event_handler(
- "shutdown",
- create_stop_app_handler(appli),
- )
appli.include_router(routes.api, prefix="/api")
appli.include_router(routes.views)
- static_dir = os.path.join(os.path.dirname(__file__), "static")
+ static_dir = Path(__file__).resolve().parent / "static"
appli.mount("/static", StaticFiles(directory=static_dir), name="static")
return appli
-def create_start_app_handler(appli):
- """Warmup the server:
- setup database connection
- """
-
- async def _get_db():
- setup_database(appli)
-
- return await connect_to_db(appli)
-
- return _get_db
-
-
async def connect_to_db(appli):
appli.state.db = appli.state.SessionLocal()
return appli.state.db
-def create_stop_app_handler(appli):
- """Gracefully shutdown the server:
- close database connection.
- """
-
- async def stop_app():
- appli.state.db.close()
-
- return stop_app
-
-
-def read_config(appli, settings):
+def read_config(yaml_file):
try:
- config = read_yaml_config(settings.yaml_file)
- appli.state.config = config
+ config = read_yaml_config(yaml_file)
return config
except ValidationError as err:
logger.error("Errors where found while reading configuration:")
@@ -83,25 +63,26 @@ def read_config(appli, settings):
def setup_database(appli):
- settings = appli.state.settings
+ config = appli.state.config
+ db_url = str(config.general.db.url)
+ logger.debug("Using database URL %s", db_url)
# For sqlite, we need to add connect_args={"check_same_thread": False}
- logger.debug("Using database URL %s", settings.database_url)
- if settings.database_url.startswith("sqlite:////tmp"):
+ if config.general.env == "production" and db_url.startswith("sqlite:////tmp"):
logger.warning("Using sqlite in /tmp is not recommended for production")
extra_settings = {}
- if settings.db_pool_size:
- extra_settings.setdefault("pool_size", settings.db_pool_size)
+ if config.general.db.pool_size:
+ extra_settings.setdefault("pool_size", config.general.db.pool_size)
- if settings.db_max_overflow:
- extra_settings.setdefault("max_overflow", settings.db_max_overflow)
+ if config.general.db.max_overflow:
+ extra_settings.setdefault("max_overflow", config.general.db.max_overflow)
- engine = create_engine(settings.database_url, **extra_settings)
+ engine = create_engine(db_url, **extra_settings)
def _fk_pragma_on_connect(dbapi_con, con_record):
dbapi_con.execute("pragma foreign_keys=ON")
- if settings.database_url.startswith("sqlite:////"):
+ if db_url.startswith("sqlite:///"):
event.listen(engine, "connect", _fk_pragma_on_connect)
appli.state.SessionLocal = sessionmaker(
@@ -111,4 +92,40 @@ def setup_database(appli):
models.Base.metadata.create_all(bind=engine)
+def create_manager(cookie_secret):
+ if cookie_secret == "foo_bar_baz":
+ logger.warning(
+ "You should change the cookie_secret secret in your configuration file."
+ )
+ return LoginManager(
+ cookie_secret,
+ "/login",
+ use_cookie=True,
+ use_header=False,
+ not_authenticated_exception=NotAuthenticatedException,
+ )
+
+
+@asynccontextmanager
+async def lifespan(appli):
+ """Server start and stop actions
+
+ Setup database connection then close it at shutdown.
+ """
+ setup_database(appli)
+
+ db = await connect_to_db(appli)
+
+ tasks_count = await queries.count_tasks(db)
+ if tasks_count == 0:
+ logger.warning(
+ "There is no tasks in the database. "
+ 'Please launch the command "argos server reload-config"'
+ )
+
+ yield
+
+ appli.state.db.close()
+
+
app = get_application()
diff --git a/argos/server/migrations/versions/c780864dc407_add_users_table.py b/argos/server/migrations/versions/c780864dc407_add_users_table.py
new file mode 100644
index 0000000..e01b898
--- /dev/null
+++ b/argos/server/migrations/versions/c780864dc407_add_users_table.py
@@ -0,0 +1,35 @@
+"""Add users table
+
+Revision ID: c780864dc407
+Revises: defda3f2952d
+Create Date: 2024-06-10 16:31:17.296983
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = "c780864dc407"
+down_revision: Union[str, None] = "defda3f2952d"
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+ op.create_table(
+ "users",
+ sa.Column("username", sa.String(), nullable=False),
+ sa.Column("password", sa.String(), nullable=False),
+ sa.Column("disabled", sa.Boolean(), nullable=False),
+ sa.Column("created_at", sa.DateTime(), nullable=False),
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
+ sa.Column("last_login_at", sa.DateTime(), nullable=True),
+ sa.PrimaryKeyConstraint("username"),
+ )
+
+
+def downgrade() -> None:
+ op.drop_table("users")
diff --git a/argos/server/models.py b/argos/server/models.py
index 065fc33..5a03399 100644
--- a/argos/server/models.py
+++ b/argos/server/models.py
@@ -138,3 +138,18 @@ class ConfigCache(Base):
name: Mapped[str] = mapped_column(primary_key=True)
val: Mapped[str] = mapped_column()
updated_at: Mapped[datetime] = mapped_column()
+
+
+class User(Base):
+ """Database model for user authentication"""
+
+ __tablename__ = "users"
+ username: Mapped[str] = mapped_column(primary_key=True)
+ password: Mapped[str] = mapped_column()
+ disabled: Mapped[bool] = mapped_column()
+ created_at: Mapped[datetime] = mapped_column(default=datetime.now())
+ updated_at: Mapped[datetime] = mapped_column(nullable=True)
+ last_login_at: Mapped[datetime] = mapped_column(nullable=True)
+
+ def update_last_login_at(self):
+ self.last_login_at = datetime.now()
diff --git a/argos/server/queries.py b/argos/server/queries.py
index cfb3f68..b0bf979 100644
--- a/argos/server/queries.py
+++ b/argos/server/queries.py
@@ -4,12 +4,12 @@ from hashlib import sha256
from typing import List
from urllib.parse import urljoin
-from sqlalchemy import desc, func
+from sqlalchemy import asc, desc, func
from sqlalchemy.orm import Session
from argos import schemas
from argos.logging import logger
-from argos.server.models import Result, Task, ConfigCache
+from argos.server.models import Result, Task, ConfigCache, User
async def list_tasks(db: Session, agent_id: str, limit: int = 100):
@@ -32,6 +32,25 @@ async def list_tasks(db: Session, agent_id: str, limit: int = 100):
return tasks
+async def add_user(db: Session, name: str, password: str) -> User:
+ user = User(
+ username=name,
+ password=password,
+ disabled=False,
+ )
+ db.add(user)
+ db.commit()
+ return user
+
+
+async def get_user(db: Session, username: str) -> None | User:
+ return db.get(User, username)
+
+
+async def list_users(db: Session):
+ return db.query(User).order_by(asc(User.username))
+
+
async def get_task(db: Session, task_id: int) -> Task:
return db.get(Task, task_id)
@@ -48,12 +67,13 @@ async def create_result(db: Session, agent_result: schemas.AgentResult, agent_id
return result
-async def count_tasks(db: Session, selected=False):
+async def count_tasks(db: Session, selected: None | bool = None):
query = db.query(Task)
- if selected:
- query = query.filter(Task.selected_by is not None)
- else:
- query = query.filter(Task.selected_by is None)
+ if selected is not None:
+ if selected:
+ query = query.filter(Task.selected_by is not None)
+ else:
+ query = query.filter(Task.selected_by is None)
return query.count()
@@ -240,3 +260,11 @@ async def release_old_locks(db: Session, max_lock_seconds: int):
)
db.commit()
return updated
+
+
+async def get_recent_agents_count(db: Session, minutes: int):
+ """Get agents seen less than ago"""
+ max_time = datetime.now() - timedelta(minutes=minutes)
+
+ agents = db.query(Result.agent_id).filter(Result.submitted_at > max_time).distinct()
+ return agents.count()
diff --git a/argos/server/routes/dependencies.py b/argos/server/routes/dependencies.py
index e543eea..938d7a6 100644
--- a/argos/server/routes/dependencies.py
+++ b/argos/server/routes/dependencies.py
@@ -16,6 +16,10 @@ def get_config(request: Request):
return request.app.state.config
+async def get_manager(request: Request):
+ return await request.app.state.manager(request)
+
+
async def verify_token(
request: Request, token: HTTPAuthorizationCredentials = Depends(auth_scheme)
):
diff --git a/argos/server/routes/views.py b/argos/server/routes/views.py
index 4029c0e..0ca9f87 100644
--- a/argos/server/routes/views.py
+++ b/argos/server/routes/views.py
@@ -1,31 +1,99 @@
"""Web interface for humans"""
from collections import defaultdict
+from datetime import datetime, timedelta
from functools import cmp_to_key
-from os import path
+from pathlib import Path
from typing import Annotated
from urllib.parse import urlparse
from fastapi import APIRouter, Cookie, Depends, Form, Request, status
from fastapi.responses import RedirectResponse
+from fastapi.security import OAuth2PasswordRequestForm
from fastapi.templating import Jinja2Templates
+from passlib.context import CryptContext
from sqlalchemy import func
from sqlalchemy.orm import Session
from argos.schemas import Config
from argos.server import queries
-from argos.server.models import Result, Task
-from argos.server.routes.dependencies import get_config, get_db
+from argos.server.models import Result, Task, User
+from argos.server.routes.dependencies import get_config, get_db, get_manager
route = APIRouter()
-current_dir = path.dirname(__file__)
-templates = Jinja2Templates(directory=path.join(current_dir, "../templates"))
+current_dir = Path(__file__).resolve().parent
+templates = Jinja2Templates(directory=current_dir / ".." / "templates")
SEVERITY_LEVELS = {"ok": 1, "warning": 2, "critical": 3, "unknown": 4}
+@route.get("/login")
+async def login_view(request: Request, msg: str | None = None):
+ token = request.cookies.get("access-token")
+ if token is not None:
+ manager = get_manager(request)
+ user = await manager.get_current_user(token)
+ if user is not None:
+ return RedirectResponse(
+ request.url_for("get_severity_counts_view"),
+ status_code=status.HTTP_303_SEE_OTHER,
+ )
+
+ if msg == "logout":
+ msg = "You have been successfully disconnected."
+ else:
+ msg = None
+
+ return templates.TemplateResponse("login.html", {"request": request, "msg": msg})
+
+
+@route.post("/login")
+async def post_login(
+ request: Request,
+ db: Session = Depends(get_db),
+ data: OAuth2PasswordRequestForm = Depends(),
+):
+ username = data.username
+ user = await queries.get_user(db, username)
+ invalid_credentials = templates.TemplateResponse(
+ "login.html",
+ {"request": request, "msg": "Sorry, invalid username or bad password."},
+ )
+ if user is None:
+ return invalid_credentials
+
+ pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+ if not pwd_context.verify(data.password, user.password):
+ return invalid_credentials
+
+ user.last_login_at = datetime.now()
+ db.commit()
+
+ manager = request.app.state.manager
+ token = manager.create_access_token(
+ data={"sub": username}, expires=timedelta(days=7)
+ )
+ response = RedirectResponse(
+ request.url_for("get_severity_counts_view"),
+ status_code=status.HTTP_303_SEE_OTHER,
+ )
+ manager.set_cookie(response, token)
+ return response
+
+
+@route.get("/logout")
+async def logout_view(request: Request, user: User | None = Depends(get_manager)):
+ response = RedirectResponse(
+ request.url_for("login_view").include_query_params(msg="logout"),
+ status_code=status.HTTP_303_SEE_OTHER,
+ )
+ response.delete_cookie(key="access-token")
+ return response
+
+
@route.get("/")
async def get_severity_counts_view(
request: Request,
+ user: User | None = Depends(get_manager),
db: Session = Depends(get_db),
auto_refresh_enabled: Annotated[bool, Cookie()] = False,
auto_refresh_seconds: Annotated[int, Cookie()] = 15,
@@ -48,7 +116,11 @@ async def get_severity_counts_view(
@route.get("/domains")
-async def get_domains_view(request: Request, db: Session = Depends(get_db)):
+async def get_domains_view(
+ request: Request,
+ user: User | None = Depends(get_manager),
+ db: Session = Depends(get_db),
+):
"""Show all tasks and their current state"""
tasks = db.query(Task).all()
@@ -96,7 +168,10 @@ async def get_domains_view(request: Request, db: Session = Depends(get_db)):
@route.get("/domain/{domain}")
async def get_domain_tasks_view(
- request: Request, domain: str, db: Session = Depends(get_db)
+ request: Request,
+ domain: str,
+ user: User | None = Depends(get_manager),
+ db: Session = Depends(get_db),
):
"""Show all tasks attached to a domain"""
tasks = db.query(Task).filter(Task.domain.contains(f"//{domain}")).all()
@@ -107,7 +182,10 @@ async def get_domain_tasks_view(
@route.get("/result/{result_id}")
async def get_result_view(
- request: Request, result_id: int, db: Session = Depends(get_db)
+ request: Request,
+ result_id: int,
+ user: User | None = Depends(get_manager),
+ db: Session = Depends(get_db),
):
"""Show the details of a result"""
result = db.query(Result).get(result_id)
@@ -120,6 +198,7 @@ async def get_result_view(
async def get_task_results_view(
request: Request,
task_id: int,
+ user: User | None = Depends(get_manager),
db: Session = Depends(get_db),
config: Config = Depends(get_config),
):
@@ -144,7 +223,11 @@ async def get_task_results_view(
@route.get("/agents")
-async def get_agents_view(request: Request, db: Session = Depends(get_db)):
+async def get_agents_view(
+ request: Request,
+ user: User | None = Depends(get_manager),
+ db: Session = Depends(get_db),
+):
"""Show argos agents and the last time the server saw them"""
last_seen = (
db.query(Result.agent_id, func.max(Result.submitted_at).label("submitted_at"))
@@ -160,6 +243,7 @@ async def get_agents_view(request: Request, db: Session = Depends(get_db)):
@route.post("/refresh")
async def set_refresh_cookies_view(
request: Request,
+ user: User | None = Depends(get_manager),
auto_refresh_enabled: Annotated[bool, Form()] = False,
auto_refresh_seconds: Annotated[int, Form()] = 15,
):
@@ -168,5 +252,7 @@ async def set_refresh_cookies_view(
status_code=status.HTTP_303_SEE_OTHER,
)
response.set_cookie(key="auto_refresh_enabled", value=auto_refresh_enabled)
- response.set_cookie(key="auto_refresh_seconds", value=int(auto_refresh_seconds))
+ response.set_cookie(
+ key="auto_refresh_seconds", value=max(5, int(auto_refresh_seconds))
+ )
return response
diff --git a/argos/server/settings.py b/argos/server/settings.py
index 501cae9..160e609 100644
--- a/argos/server/settings.py
+++ b/argos/server/settings.py
@@ -1,85 +1,21 @@
"""Pydantic schemas for server"""
-import os
-from functools import lru_cache
-from os import environ
-from typing import Optional, Union
+from pathlib import Path
import yaml
-from pydantic_settings import BaseSettings, SettingsConfigDict
from yamlinclude import YamlIncludeConstructor
from argos.schemas.config import Config
-class Settings(BaseSettings):
- model_config = SettingsConfigDict(env_prefix="argos_", env_file=".env")
- app_env: str
- database_url: str
- yaml_file: str
- db_pool_size: Optional[int]
- db_max_overflow: Optional[int]
-
-
-class DevSettings(Settings):
- """Settings for dev environment.
-
- Uses config.yaml as config file.
- Uses a SQLite database."""
-
- app_env: str = "dev"
- yaml_file: str = "config.yaml"
- db_pool_size: Optional[int] = None
- db_max_overflow: Optional[int] = None
- database_url: str = "sqlite:////tmp/argos.db"
-
-
-class TestSettings(Settings):
- """Settings for test environment.
-
- Uses tests/config.yaml as config file.
- Uses a SQLite database."""
-
- app_env: str = "test"
- yaml_file: str = "tests/config.yaml"
- database_url: str = "sqlite:////tmp/test-argos.db"
- db_pool_size: Optional[int] = None
- db_max_overflow: Optional[int] = None
-
-
-class ProdSettings(Settings):
- """Settings for prod environment."""
-
- app_env: str = "prod"
- db_pool_size: Optional[int] = 10
- db_max_overflow: Optional[int] = 20
-
-
-environments = {
- "dev": DevSettings,
- "prod": ProdSettings,
- "test": TestSettings,
-}
-
-
-@lru_cache()
-def get_app_settings() -> Union[None, Settings]:
- """Load settings depending on the environment"""
- app_env = environ.get("ARGOS_APP_ENV", "dev")
- settings = environments.get(app_env)
- if settings is not None:
- return settings()
- return None
-
-
def read_yaml_config(filename):
parsed = _load_yaml(filename)
return Config(**parsed)
def _load_yaml(filename):
- base_dir = os.path.dirname(filename)
+ base_dir = Path(filename).resolve().parent
YamlIncludeConstructor.add_to_loader_class(
- loader_class=yaml.FullLoader, base_dir=base_dir
+ loader_class=yaml.FullLoader, base_dir=str(base_dir)
)
with open(filename, "r", encoding="utf-8") as stream:
diff --git a/argos/server/static/pico.min.css b/argos/server/static/pico.min.css
index 4971b2d..5928ed7 100644
--- a/argos/server/static/pico.min.css
+++ b/argos/server/static/pico.min.css
@@ -1,5 +1,4 @@
@charset "UTF-8";/*!
- * Pico CSS v1.5.10 (https://picocss.com)
- * Copyright 2019-2023 - Licensed under MIT
- */:root{--font-family:system-ui,-apple-system,"Segoe UI","Roboto","Ubuntu","Cantarell","Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--line-height:1.5;--font-weight:400;--font-size:16px;--border-radius:0.25rem;--border-width:1px;--outline-width:3px;--spacing:1rem;--typography-spacing-vertical:1.5rem;--block-spacing-vertical:calc(var(--spacing) * 2);--block-spacing-horizontal:var(--spacing);--grid-spacing-vertical:0;--grid-spacing-horizontal:var(--spacing);--form-element-spacing-vertical:0.75rem;--form-element-spacing-horizontal:1rem;--nav-element-spacing-vertical:1rem;--nav-element-spacing-horizontal:0.5rem;--nav-link-spacing-vertical:0.5rem;--nav-link-spacing-horizontal:0.5rem;--form-label-font-weight:var(--font-weight);--transition:0.2s ease-in-out;--modal-overlay-backdrop-filter:blur(0.25rem)}@media (min-width:576px){:root{--font-size:17px}}@media (min-width:768px){:root{--font-size:18px}}@media (min-width:992px){:root{--font-size:19px}}@media (min-width:1200px){:root{--font-size:20px}}@media (min-width:576px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 2.5)}}@media (min-width:768px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 3)}}@media (min-width:992px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 3.5)}}@media (min-width:1200px){body>footer,body>header,body>main,section{--block-spacing-vertical:calc(var(--spacing) * 4)}}@media (min-width:576px){article{--block-spacing-horizontal:calc(var(--spacing) * 1.25)}}@media (min-width:768px){article{--block-spacing-horizontal:calc(var(--spacing) * 1.5)}}@media (min-width:992px){article{--block-spacing-horizontal:calc(var(--spacing) * 1.75)}}@media (min-width:1200px){article{--block-spacing-horizontal:calc(var(--spacing) * 2)}}dialog>article{--block-spacing-vertical:calc(var(--spacing) * 2);--block-spacing-horizontal:var(--spacing)}@media (min-width:576px){dialog>article{--block-spacing-vertical:calc(var(--spacing) * 2.5);--block-spacing-horizontal:calc(var(--spacing) * 1.25)}}@media (min-width:768px){dialog>article{--block-spacing-vertical:calc(var(--spacing) * 3);--block-spacing-horizontal:calc(var(--spacing) * 1.5)}}a{--text-decoration:none}a.contrast,a.secondary{--text-decoration:underline}small{--font-size:0.875em}h1,h2,h3,h4,h5,h6{--font-weight:700}h1{--font-size:2rem;--typography-spacing-vertical:3rem}h2{--font-size:1.75rem;--typography-spacing-vertical:2.625rem}h3{--font-size:1.5rem;--typography-spacing-vertical:2.25rem}h4{--font-size:1.25rem;--typography-spacing-vertical:1.874rem}h5{--font-size:1.125rem;--typography-spacing-vertical:1.6875rem}[type=checkbox],[type=radio]{--border-width:2px}[type=checkbox][role=switch]{--border-width:3px}tfoot td,tfoot th,thead td,thead th{--border-width:3px}:not(thead,tfoot)>*>td{--font-size:0.875em}code,kbd,pre,samp{--font-family:"Menlo","Consolas","Roboto Mono","Ubuntu Monospace","Noto Mono","Oxygen Mono","Liberation Mono",monospace,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}kbd{--font-weight:bolder}:root:not([data-theme=dark]),[data-theme=light]{--background-color:#fff;--color:hsl(205, 20%, 32%);--h1-color:hsl(205, 30%, 15%);--h2-color:#24333e;--h3-color:hsl(205, 25%, 23%);--h4-color:#374956;--h5-color:hsl(205, 20%, 32%);--h6-color:#4d606d;--muted-color:hsl(205, 10%, 50%);--muted-border-color:hsl(205, 20%, 94%);--primary:hsl(195, 85%, 41%);--primary-hover:hsl(195, 90%, 32%);--primary-focus:rgba(16, 149, 193, 0.125);--primary-inverse:#fff;--secondary:hsl(205, 15%, 41%);--secondary-hover:hsl(205, 20%, 32%);--secondary-focus:rgba(89, 107, 120, 0.125);--secondary-inverse:#fff;--contrast:hsl(205, 30%, 15%);--contrast-hover:#000;--contrast-focus:rgba(89, 107, 120, 0.125);--contrast-inverse:#fff;--mark-background-color:#fff2ca;--mark-color:#543a26;--ins-color:#388e3c;--del-color:#c62828;--blockquote-border-color:var(--muted-border-color);--blockquote-footer-color:var(--muted-color);--button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--form-element-background-color:transparent;--form-element-border-color:hsl(205, 14%, 68%);--form-element-color:var(--color);--form-element-placeholder-color:var(--muted-color);--form-element-active-background-color:transparent;--form-element-active-border-color:var(--primary);--form-element-focus-color:var(--primary-focus);--form-element-disabled-background-color:hsl(205, 18%, 86%);--form-element-disabled-border-color:hsl(205, 14%, 68%);--form-element-disabled-opacity:0.5;--form-element-invalid-border-color:#c62828;--form-element-invalid-active-border-color:#d32f2f;--form-element-invalid-focus-color:rgba(211, 47, 47, 0.125);--form-element-valid-border-color:#388e3c;--form-element-valid-active-border-color:#43a047;--form-element-valid-focus-color:rgba(67, 160, 71, 0.125);--switch-background-color:hsl(205, 16%, 77%);--switch-color:var(--primary-inverse);--switch-checked-background-color:var(--primary);--range-border-color:hsl(205, 18%, 86%);--range-active-border-color:hsl(205, 16%, 77%);--range-thumb-border-color:var(--background-color);--range-thumb-color:var(--secondary);--range-thumb-hover-color:var(--secondary-hover);--range-thumb-active-color:var(--primary);--table-border-color:var(--muted-border-color);--table-row-stripped-background-color:#f6f8f9;--code-background-color:hsl(205, 20%, 94%);--code-color:var(--muted-color);--code-kbd-background-color:var(--contrast);--code-kbd-color:var(--contrast-inverse);--code-tag-color:hsl(330, 40%, 50%);--code-property-color:hsl(185, 40%, 40%);--code-value-color:hsl(40, 20%, 50%);--code-comment-color:hsl(205, 14%, 68%);--accordion-border-color:var(--muted-border-color);--accordion-close-summary-color:var(--color);--accordion-open-summary-color:var(--muted-color);--card-background-color:var(--background-color);--card-border-color:var(--muted-border-color);--card-box-shadow:0.0145rem 0.029rem 0.174rem rgba(27, 40, 50, 0.01698),0.0335rem 0.067rem 0.402rem rgba(27, 40, 50, 0.024),0.0625rem 0.125rem 0.75rem rgba(27, 40, 50, 0.03),0.1125rem 0.225rem 1.35rem rgba(27, 40, 50, 0.036),0.2085rem 0.417rem 2.502rem rgba(27, 40, 50, 0.04302),0.5rem 1rem 6rem rgba(27, 40, 50, 0.06),0 0 0 0.0625rem rgba(27, 40, 50, 0.015);--card-sectionning-background-color:#fbfbfc;--dropdown-background-color:#fbfbfc;--dropdown-border-color:#e1e6eb;--dropdown-box-shadow:var(--card-box-shadow);--dropdown-color:var(--color);--dropdown-hover-background-color:hsl(205, 20%, 94%);--modal-overlay-background-color:rgba(213, 220, 226, 0.7);--progress-background-color:hsl(205, 18%, 86%);--progress-color:var(--primary);--loading-spinner-opacity:0.5;--tooltip-background-color:var(--contrast);--tooltip-color:var(--contrast-inverse);--icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button-inverse:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(198, 40, 40)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");--icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(56, 142, 60)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");color-scheme:light}@media only screen and (prefers-color-scheme:dark){:root:not([data-theme]){--background-color:#11191f;--color:hsl(205, 16%, 77%);--h1-color:hsl(205, 20%, 94%);--h2-color:#e1e6eb;--h3-color:hsl(205, 18%, 86%);--h4-color:#c8d1d8;--h5-color:hsl(205, 16%, 77%);--h6-color:#afbbc4;--muted-color:hsl(205, 10%, 50%);--muted-border-color:#1f2d38;--primary:hsl(195, 85%, 41%);--primary-hover:hsl(195, 80%, 50%);--primary-focus:rgba(16, 149, 193, 0.25);--primary-inverse:#fff;--secondary:hsl(205, 15%, 41%);--secondary-hover:hsl(205, 10%, 50%);--secondary-focus:rgba(115, 130, 140, 0.25);--secondary-inverse:#fff;--contrast:hsl(205, 20%, 94%);--contrast-hover:#fff;--contrast-focus:rgba(115, 130, 140, 0.25);--contrast-inverse:#000;--mark-background-color:#d1c284;--mark-color:#11191f;--ins-color:#388e3c;--del-color:#c62828;--blockquote-border-color:var(--muted-border-color);--blockquote-footer-color:var(--muted-color);--button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--form-element-background-color:#11191f;--form-element-border-color:#374956;--form-element-color:var(--color);--form-element-placeholder-color:var(--muted-color);--form-element-active-background-color:var(--form-element-background-color);--form-element-active-border-color:var(--primary);--form-element-focus-color:var(--primary-focus);--form-element-disabled-background-color:hsl(205, 25%, 23%);--form-element-disabled-border-color:hsl(205, 20%, 32%);--form-element-disabled-opacity:0.5;--form-element-invalid-border-color:#b71c1c;--form-element-invalid-active-border-color:#c62828;--form-element-invalid-focus-color:rgba(198, 40, 40, 0.25);--form-element-valid-border-color:#2e7d32;--form-element-valid-active-border-color:#388e3c;--form-element-valid-focus-color:rgba(56, 142, 60, 0.25);--switch-background-color:#374956;--switch-color:var(--primary-inverse);--switch-checked-background-color:var(--primary);--range-border-color:#24333e;--range-active-border-color:hsl(205, 25%, 23%);--range-thumb-border-color:var(--background-color);--range-thumb-color:var(--secondary);--range-thumb-hover-color:var(--secondary-hover);--range-thumb-active-color:var(--primary);--table-border-color:var(--muted-border-color);--table-row-stripped-background-color:rgba(115, 130, 140, 0.05);--code-background-color:#18232c;--code-color:var(--muted-color);--code-kbd-background-color:var(--contrast);--code-kbd-color:var(--contrast-inverse);--code-tag-color:hsl(330, 30%, 50%);--code-property-color:hsl(185, 30%, 50%);--code-value-color:hsl(40, 10%, 50%);--code-comment-color:#4d606d;--accordion-border-color:var(--muted-border-color);--accordion-active-summary-color:var(--primary);--accordion-close-summary-color:var(--color);--accordion-open-summary-color:var(--muted-color);--card-background-color:#141e26;--card-border-color:var(--card-background-color);--card-box-shadow:0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698),0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024),0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03),0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036),0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302),0.5rem 1rem 6rem rgba(0, 0, 0, 0.06),0 0 0 0.0625rem rgba(0, 0, 0, 0.015);--card-sectionning-background-color:#18232c;--dropdown-background-color:hsl(205, 30%, 15%);--dropdown-border-color:#24333e;--dropdown-box-shadow:var(--card-box-shadow);--dropdown-color:var(--color);--dropdown-hover-background-color:rgba(36, 51, 62, 0.75);--modal-overlay-background-color:rgba(36, 51, 62, 0.8);--progress-background-color:#24333e;--progress-color:var(--primary);--loading-spinner-opacity:0.5;--tooltip-background-color:var(--contrast);--tooltip-color:var(--contrast-inverse);--icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button-inverse:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");--icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");color-scheme:dark}}[data-theme=dark]{--background-color:#11191f;--color:hsl(205, 16%, 77%);--h1-color:hsl(205, 20%, 94%);--h2-color:#e1e6eb;--h3-color:hsl(205, 18%, 86%);--h4-color:#c8d1d8;--h5-color:hsl(205, 16%, 77%);--h6-color:#afbbc4;--muted-color:hsl(205, 10%, 50%);--muted-border-color:#1f2d38;--primary:hsl(195, 85%, 41%);--primary-hover:hsl(195, 80%, 50%);--primary-focus:rgba(16, 149, 193, 0.25);--primary-inverse:#fff;--secondary:hsl(205, 15%, 41%);--secondary-hover:hsl(205, 10%, 50%);--secondary-focus:rgba(115, 130, 140, 0.25);--secondary-inverse:#fff;--contrast:hsl(205, 20%, 94%);--contrast-hover:#fff;--contrast-focus:rgba(115, 130, 140, 0.25);--contrast-inverse:#000;--mark-background-color:#d1c284;--mark-color:#11191f;--ins-color:#388e3c;--del-color:#c62828;--blockquote-border-color:var(--muted-border-color);--blockquote-footer-color:var(--muted-color);--button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--form-element-background-color:#11191f;--form-element-border-color:#374956;--form-element-color:var(--color);--form-element-placeholder-color:var(--muted-color);--form-element-active-background-color:var(--form-element-background-color);--form-element-active-border-color:var(--primary);--form-element-focus-color:var(--primary-focus);--form-element-disabled-background-color:hsl(205, 25%, 23%);--form-element-disabled-border-color:hsl(205, 20%, 32%);--form-element-disabled-opacity:0.5;--form-element-invalid-border-color:#b71c1c;--form-element-invalid-active-border-color:#c62828;--form-element-invalid-focus-color:rgba(198, 40, 40, 0.25);--form-element-valid-border-color:#2e7d32;--form-element-valid-active-border-color:#388e3c;--form-element-valid-focus-color:rgba(56, 142, 60, 0.25);--switch-background-color:#374956;--switch-color:var(--primary-inverse);--switch-checked-background-color:var(--primary);--range-border-color:#24333e;--range-active-border-color:hsl(205, 25%, 23%);--range-thumb-border-color:var(--background-color);--range-thumb-color:var(--secondary);--range-thumb-hover-color:var(--secondary-hover);--range-thumb-active-color:var(--primary);--table-border-color:var(--muted-border-color);--table-row-stripped-background-color:rgba(115, 130, 140, 0.05);--code-background-color:#18232c;--code-color:var(--muted-color);--code-kbd-background-color:var(--contrast);--code-kbd-color:var(--contrast-inverse);--code-tag-color:hsl(330, 30%, 50%);--code-property-color:hsl(185, 30%, 50%);--code-value-color:hsl(40, 10%, 50%);--code-comment-color:#4d606d;--accordion-border-color:var(--muted-border-color);--accordion-active-summary-color:var(--primary);--accordion-close-summary-color:var(--color);--accordion-open-summary-color:var(--muted-color);--card-background-color:#141e26;--card-border-color:var(--card-background-color);--card-box-shadow:0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698),0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024),0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03),0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036),0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302),0.5rem 1rem 6rem rgba(0, 0, 0, 0.06),0 0 0 0.0625rem rgba(0, 0, 0, 0.015);--card-sectionning-background-color:#18232c;--dropdown-background-color:hsl(205, 30%, 15%);--dropdown-border-color:#24333e;--dropdown-box-shadow:var(--card-box-shadow);--dropdown-color:var(--color);--dropdown-hover-background-color:rgba(36, 51, 62, 0.75);--modal-overlay-background-color:rgba(36, 51, 62, 0.8);--progress-background-color:#24333e;--progress-color:var(--primary);--loading-spinner-opacity:0.5;--tooltip-background-color:var(--contrast);--tooltip-color:var(--contrast-inverse);--icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-chevron-button-inverse:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");--icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");color-scheme:dark}[type=checkbox],[type=radio],[type=range],progress{accent-color:var(--primary)}*,::after,::before{box-sizing:border-box;background-repeat:no-repeat}::after,::before{text-decoration:inherit;vertical-align:inherit}:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--background-color);color:var(--color);font-weight:var(--font-weight);font-size:var(--font-size);line-height:var(--line-height);font-family:var(--font-family);text-rendering:optimizeLegibility;overflow-wrap:break-word;cursor:default;-moz-tab-size:4;-o-tab-size:4;tab-size:4}main{display:block}body{width:100%;margin:0}body>footer,body>header,body>main{width:100%;margin-right:auto;margin-left:auto;padding:var(--block-spacing-vertical) 0}.container,.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:var(--spacing);padding-left:var(--spacing)}@media (min-width:576px){.container{max-width:510px;padding-right:0;padding-left:0}}@media (min-width:768px){.container{max-width:700px}}@media (min-width:992px){.container{max-width:920px}}@media (min-width:1200px){.container{max-width:1130px}}section{margin-bottom:var(--block-spacing-vertical)}.grid{grid-column-gap:var(--grid-spacing-horizontal);grid-row-gap:var(--grid-spacing-vertical);display:grid;grid-template-columns:1fr;margin:0}@media (min-width:992px){.grid{grid-template-columns:repeat(auto-fit,minmax(0%,1fr))}}.grid>*{min-width:0}figure{display:block;margin:0;padding:0;overflow-x:auto}figure figcaption{padding:calc(var(--spacing) * .5) 0;color:var(--muted-color)}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,figure,form,ol,p,pre,table,ul{margin-top:0;margin-bottom:var(--typography-spacing-vertical);color:var(--color);font-style:normal;font-weight:var(--font-weight);font-size:var(--font-size)}[role=link],a{--color:var(--primary);--background-color:transparent;outline:0;background-color:var(--background-color);color:var(--color);-webkit-text-decoration:var(--text-decoration);text-decoration:var(--text-decoration);transition:background-color var(--transition),color var(--transition),box-shadow var(--transition),-webkit-text-decoration var(--transition);transition:background-color var(--transition),color var(--transition),text-decoration var(--transition),box-shadow var(--transition);transition:background-color var(--transition),color var(--transition),text-decoration var(--transition),box-shadow var(--transition),-webkit-text-decoration var(--transition)}[role=link]:is([aria-current],:hover,:active,:focus),a:is([aria-current],:hover,:active,:focus){--color:var(--primary-hover);--text-decoration:underline}[role=link]:focus,a:focus{--background-color:var(--primary-focus)}[role=link].secondary,a.secondary{--color:var(--secondary)}[role=link].secondary:is([aria-current],:hover,:active,:focus),a.secondary:is([aria-current],:hover,:active,:focus){--color:var(--secondary-hover)}[role=link].secondary:focus,a.secondary:focus{--background-color:var(--secondary-focus)}[role=link].contrast,a.contrast{--color:var(--contrast)}[role=link].contrast:is([aria-current],:hover,:active,:focus),a.contrast:is([aria-current],:hover,:active,:focus){--color:var(--contrast-hover)}[role=link].contrast:focus,a.contrast:focus{--background-color:var(--contrast-focus)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:var(--typography-spacing-vertical);color:var(--color);font-weight:var(--font-weight);font-size:var(--font-size);font-family:var(--font-family)}h1{--color:var(--h1-color)}h2{--color:var(--h2-color)}h3{--color:var(--h3-color)}h4{--color:var(--h4-color)}h5{--color:var(--h5-color)}h6{--color:var(--h6-color)}:where(address,blockquote,dl,figure,form,ol,p,pre,table,ul)~:is(h1,h2,h3,h4,h5,h6){margin-top:var(--typography-spacing-vertical)}.headings,hgroup{margin-bottom:var(--typography-spacing-vertical)}.headings>*,hgroup>*{margin-bottom:0}.headings>:last-child,hgroup>:last-child{--color:var(--muted-color);--font-weight:unset;font-size:1rem;font-family:unset}p{margin-bottom:var(--typography-spacing-vertical)}small{font-size:var(--font-size)}:where(dl,ol,ul){padding-right:0;padding-left:var(--spacing);-webkit-padding-start:var(--spacing);padding-inline-start:var(--spacing);-webkit-padding-end:0;padding-inline-end:0}:where(dl,ol,ul) li{margin-bottom:calc(var(--typography-spacing-vertical) * .25)}:where(dl,ol,ul) :is(dl,ol,ul){margin:0;margin-top:calc(var(--typography-spacing-vertical) * .25)}ul li{list-style:square}mark{padding:.125rem .25rem;background-color:var(--mark-background-color);color:var(--mark-color);vertical-align:baseline}blockquote{display:block;margin:var(--typography-spacing-vertical) 0;padding:var(--spacing);border-right:none;border-left:.25rem solid var(--blockquote-border-color);-webkit-border-start:0.25rem solid var(--blockquote-border-color);border-inline-start:0.25rem solid var(--blockquote-border-color);-webkit-border-end:none;border-inline-end:none}blockquote footer{margin-top:calc(var(--typography-spacing-vertical) * .5);color:var(--blockquote-footer-color)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--ins-color);text-decoration:none}del{color:var(--del-color)}::-moz-selection{background-color:var(--primary-focus)}::selection{background-color:var(--primary-focus)}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}:where(iframe){border-style:none}img{max-width:100%;height:auto;border-style:none}:where(svg:not([fill])){fill:currentColor}svg:not(:root){overflow:hidden}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}button{display:block;width:100%;margin-bottom:var(--spacing)}[role=button]{display:inline-block;text-decoration:none}[role=button],button,input[type=button],input[type=reset],input[type=submit]{--background-color:var(--primary);--border-color:var(--primary);--color:var(--primary-inverse);--box-shadow:var(--button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));padding:var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[role=button]:is([aria-current],:hover,:active,:focus),button:is([aria-current],:hover,:active,:focus),input[type=button]:is([aria-current],:hover,:active,:focus),input[type=reset]:is([aria-current],:hover,:active,:focus),input[type=submit]:is([aria-current],:hover,:active,:focus){--background-color:var(--primary-hover);--border-color:var(--primary-hover);--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));--color:var(--primary-inverse)}[role=button]:focus,button:focus,input[type=button]:focus,input[type=reset]:focus,input[type=submit]:focus{--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--outline-width) var(--primary-focus)}:is(button,input[type=submit],input[type=button],[role=button]).secondary,input[type=reset]{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);cursor:pointer}:is(button,input[type=submit],input[type=button],[role=button]).secondary:is([aria-current],:hover,:active,:focus),input[type=reset]:is([aria-current],:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover);--color:var(--secondary-inverse)}:is(button,input[type=submit],input[type=button],[role=button]).secondary:focus,input[type=reset]:focus{--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--outline-width) var(--secondary-focus)}:is(button,input[type=submit],input[type=button],[role=button]).contrast{--background-color:var(--contrast);--border-color:var(--contrast);--color:var(--contrast-inverse)}:is(button,input[type=submit],input[type=button],[role=button]).contrast:is([aria-current],:hover,:active,:focus){--background-color:var(--contrast-hover);--border-color:var(--contrast-hover);--color:var(--contrast-inverse)}:is(button,input[type=submit],input[type=button],[role=button]).contrast:focus{--box-shadow:var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--outline-width) var(--contrast-focus)}:is(button,input[type=submit],input[type=button],[role=button]).outline,input[type=reset].outline{--background-color:transparent;--color:var(--primary)}:is(button,input[type=submit],input[type=button],[role=button]).outline:is([aria-current],:hover,:active,:focus),input[type=reset].outline:is([aria-current],:hover,:active,:focus){--background-color:transparent;--color:var(--primary-hover)}:is(button,input[type=submit],input[type=button],[role=button]).outline.secondary,input[type=reset].outline{--color:var(--secondary)}:is(button,input[type=submit],input[type=button],[role=button]).outline.secondary:is([aria-current],:hover,:active,:focus),input[type=reset].outline:is([aria-current],:hover,:active,:focus){--color:var(--secondary-hover)}:is(button,input[type=submit],input[type=button],[role=button]).outline.contrast{--color:var(--contrast)}:is(button,input[type=submit],input[type=button],[role=button]).outline.contrast:is([aria-current],:hover,:active,:focus){--color:var(--contrast-hover)}:where(button,[type=submit],[type=button],[type=reset],[role=button])[disabled],:where(fieldset[disabled]) :is(button,[type=submit],[type=button],[type=reset],[role=button]),a[role=button]:not([href]){opacity:.5;pointer-events:none}input,optgroup,select,textarea{margin:0;font-size:1rem;line-height:var(--line-height);font-family:inherit;letter-spacing:inherit}input{overflow:visible}select{text-transform:none}legend{max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{padding:0;border-style:none}:-moz-focusring{outline:0}:-moz-ui-invalid{box-shadow:none}::-ms-expand{display:none}[type=file],[type=range]{padding:0;border-width:0}input:not([type=checkbox],[type=radio],[type=range]){height:calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2)}fieldset{margin:0;margin-bottom:var(--spacing);padding:0;border:0}fieldset legend,label{display:block;margin-bottom:calc(var(--spacing) * .25);font-weight:var(--form-label-font-weight,var(--font-weight))}input:not([type=checkbox],[type=radio]),select,textarea{width:100%}input:not([type=checkbox],[type=radio],[type=range],[type=file]),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal)}input,select,textarea{--background-color:var(--form-element-background-color);--border-color:var(--form-element-border-color);--color:var(--form-element-color);--box-shadow:none;border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}:where(select,textarea):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[readonly]):is(:active,:focus){--background-color:var(--form-element-active-background-color)}:where(select,textarea):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[role=switch],[readonly]):is(:active,:focus){--border-color:var(--form-element-active-border-color)}input:not([type=submit],[type=button],[type=reset],[type=range],[type=file],[readonly]):focus,select:focus,textarea:focus{--box-shadow:0 0 0 var(--outline-width) var(--form-element-focus-color)}:where(fieldset[disabled]) :is(input:not([type=submit],[type=button],[type=reset]),select,textarea),input:not([type=submit],[type=button],[type=reset])[disabled],select[disabled],textarea[disabled]{--background-color:var(--form-element-disabled-background-color);--border-color:var(--form-element-disabled-border-color);opacity:var(--form-element-disabled-opacity);pointer-events:none}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])[aria-invalid]{padding-right:calc(var(--form-element-spacing-horizontal) + 1.5rem)!important;padding-left:var(--form-element-spacing-horizontal);-webkit-padding-start:var(--form-element-spacing-horizontal)!important;padding-inline-start:var(--form-element-spacing-horizontal)!important;-webkit-padding-end:calc(var(--form-element-spacing-horizontal) + 1.5rem)!important;padding-inline-end:calc(var(--form-element-spacing-horizontal) + 1.5rem)!important;background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])[aria-invalid=false]{background-image:var(--icon-valid)}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week])[aria-invalid=true]{background-image:var(--icon-invalid)}:where(input,select,textarea)[aria-invalid=false]{--border-color:var(--form-element-valid-border-color)}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus){--border-color:var(--form-element-valid-active-border-color)!important;--box-shadow:0 0 0 var(--outline-width) var(--form-element-valid-focus-color)!important}:where(input,select,textarea)[aria-invalid=true]{--border-color:var(--form-element-invalid-border-color)}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus){--border-color:var(--form-element-invalid-active-border-color)!important;--box-shadow:0 0 0 var(--outline-width) var(--form-element-invalid-focus-color)!important}[dir=rtl] :where(input,select,textarea):not([type=checkbox],[type=radio]):is([aria-invalid],[aria-invalid=true],[aria-invalid=false]){background-position:center left .75rem}input::-webkit-input-placeholder,input::placeholder,select:invalid,textarea::-webkit-input-placeholder,textarea::placeholder{color:var(--form-element-placeholder-color);opacity:1}input:not([type=checkbox],[type=radio]),select,textarea{margin-bottom:var(--spacing)}select::-ms-expand{border:0;background-color:transparent}select:not([multiple],[size]){padding-right:calc(var(--form-element-spacing-horizontal) + 1.5rem);padding-left:var(--form-element-spacing-horizontal);-webkit-padding-start:var(--form-element-spacing-horizontal);padding-inline-start:var(--form-element-spacing-horizontal);-webkit-padding-end:calc(var(--form-element-spacing-horizontal) + 1.5rem);padding-inline-end:calc(var(--form-element-spacing-horizontal) + 1.5rem);background-image:var(--icon-chevron);background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}[dir=rtl] select:not([multiple],[size]){background-position:center left .75rem}:where(input,select,textarea,.grid)+small{display:block;width:100%;margin-top:calc(var(--spacing) * -.75);margin-bottom:var(--spacing);color:var(--muted-color)}label>:where(input,select,textarea){margin-top:calc(var(--spacing) * .25)}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.25em;height:1.25em;margin-top:-.125em;margin-right:.375em;margin-left:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:.375em;margin-inline-end:.375em;border-width:var(--border-width);font-size:inherit;vertical-align:middle;cursor:pointer}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=checkbox]:checked:active,[type=checkbox]:checked:focus,[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--background-color:var(--primary);--border-color:var(--primary);background-image:var(--icon-checkbox);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-right:.375em;margin-bottom:0;cursor:pointer}[type=checkbox]:indeterminate{--background-color:var(--primary);--border-color:var(--primary);background-image:var(--icon-minus);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=radio]{border-radius:50%}[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--background-color:var(--primary-inverse);border-width:.35em;background-image:none}[type=checkbox][role=switch]{--background-color:var(--switch-background-color);--border-color:var(--switch-background-color);--color:var(--switch-color);width:2.25em;height:1.25em;border:var(--border-width) solid var(--border-color);border-radius:1.25em;background-color:var(--background-color);line-height:1.25em}[type=checkbox][role=switch]:focus{--background-color:var(--switch-background-color);--border-color:var(--switch-background-color)}[type=checkbox][role=switch]:checked{--background-color:var(--switch-checked-background-color);--border-color:var(--switch-checked-background-color)}[type=checkbox][role=switch]:before{display:block;width:calc(1.25em - (var(--border-width) * 2));height:100%;border-radius:50%;background-color:var(--color);content:"";transition:margin .1s ease-in-out}[type=checkbox][role=switch]:checked{background-image:none}[type=checkbox][role=switch]:checked::before{margin-left:calc(1.125em - var(--border-width));-webkit-margin-start:calc(1.125em - var(--border-width));margin-inline-start:calc(1.125em - var(--border-width))}[type=checkbox]:checked[aria-invalid=false],[type=checkbox][aria-invalid=false],[type=checkbox][role=switch]:checked[aria-invalid=false],[type=checkbox][role=switch][aria-invalid=false],[type=radio]:checked[aria-invalid=false],[type=radio][aria-invalid=false]{--border-color:var(--form-element-valid-border-color)}[type=checkbox]:checked[aria-invalid=true],[type=checkbox][aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true],[type=checkbox][role=switch][aria-invalid=true],[type=radio]:checked[aria-invalid=true],[type=radio][aria-invalid=true]{--border-color:var(--form-element-invalid-border-color)}[type=color]::-webkit-color-swatch-wrapper{padding:0}[type=color]::-moz-focus-inner{padding:0}[type=color]::-webkit-color-swatch{border:0;border-radius:calc(var(--border-radius) * .5)}[type=color]::-moz-color-swatch{border:0;border-radius:calc(var(--border-radius) * .5)}input:not([type=checkbox],[type=radio],[type=range],[type=file]):is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){--icon-position:0.75rem;--icon-width:1rem;padding-right:calc(var(--icon-width) + var(--icon-position));background-image:var(--icon-date);background-position:center right var(--icon-position);background-size:var(--icon-width) auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=time]{background-image:var(--icon-time)}[type=date]::-webkit-calendar-picker-indicator,[type=datetime-local]::-webkit-calendar-picker-indicator,[type=month]::-webkit-calendar-picker-indicator,[type=time]::-webkit-calendar-picker-indicator,[type=week]::-webkit-calendar-picker-indicator{width:var(--icon-width);margin-right:calc(var(--icon-width) * -1);margin-left:var(--icon-position);opacity:0}[dir=rtl] :is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){text-align:right}@-moz-document url-prefix(){[type=date],[type=datetime-local],[type=month],[type=time],[type=week]{padding-right:var(--form-element-spacing-horizontal)!important;background-image:none!important}}[type=file]{--color:var(--muted-color);padding:calc(var(--form-element-spacing-vertical) * .5) 0;border:0;border-radius:0;background:0 0}[type=file]::file-selector-button{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);margin-right:calc(var(--spacing)/ 2);margin-left:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:calc(var(--spacing)/ 2);margin-inline-end:calc(var(--spacing)/ 2);padding:calc(var(--form-element-spacing-vertical) * .5) calc(var(--form-element-spacing-horizontal) * .5);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[type=file]::file-selector-button:is(:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover)}[type=file]::-webkit-file-upload-button{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);margin-right:calc(var(--spacing)/ 2);margin-left:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:calc(var(--spacing)/ 2);margin-inline-end:calc(var(--spacing)/ 2);padding:calc(var(--form-element-spacing-vertical) * .5) calc(var(--form-element-spacing-horizontal) * .5);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;-webkit-transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[type=file]::-webkit-file-upload-button:is(:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover)}[type=file]::-ms-browse{--background-color:var(--secondary);--border-color:var(--secondary);--color:var(--secondary-inverse);margin-right:calc(var(--spacing)/ 2);margin-left:0;margin-inline-start:0;margin-inline-end:calc(var(--spacing)/ 2);padding:calc(var(--form-element-spacing-vertical) * .5) calc(var(--form-element-spacing-horizontal) * .5);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);outline:0;background-color:var(--background-color);box-shadow:var(--box-shadow);color:var(--color);font-weight:var(--font-weight);font-size:1rem;line-height:var(--line-height);text-align:center;cursor:pointer;-ms-transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}[type=file]::-ms-browse:is(:hover,:active,:focus){--background-color:var(--secondary-hover);--border-color:var(--secondary-hover)}[type=range]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:1.25rem;background:0 0}[type=range]::-webkit-slider-runnable-track{width:100%;height:.25rem;border-radius:var(--border-radius);background-color:var(--range-border-color);-webkit-transition:background-color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),box-shadow var(--transition)}[type=range]::-moz-range-track{width:100%;height:.25rem;border-radius:var(--border-radius);background-color:var(--range-border-color);-moz-transition:background-color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),box-shadow var(--transition)}[type=range]::-ms-track{width:100%;height:.25rem;border-radius:var(--border-radius);background-color:var(--range-border-color);-ms-transition:background-color var(--transition),box-shadow var(--transition);transition:background-color var(--transition),box-shadow var(--transition)}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.5rem;border:2px solid var(--range-thumb-border-color);border-radius:50%;background-color:var(--range-thumb-color);cursor:pointer;-webkit-transition:background-color var(--transition),transform var(--transition);transition:background-color var(--transition),transform var(--transition)}[type=range]::-moz-range-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.5rem;border:2px solid var(--range-thumb-border-color);border-radius:50%;background-color:var(--range-thumb-color);cursor:pointer;-moz-transition:background-color var(--transition),transform var(--transition);transition:background-color var(--transition),transform var(--transition)}[type=range]::-ms-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.5rem;border:2px solid var(--range-thumb-border-color);border-radius:50%;background-color:var(--range-thumb-color);cursor:pointer;-ms-transition:background-color var(--transition),transform var(--transition);transition:background-color var(--transition),transform var(--transition)}[type=range]:focus,[type=range]:hover{--range-border-color:var(--range-active-border-color);--range-thumb-color:var(--range-thumb-hover-color)}[type=range]:active{--range-thumb-color:var(--range-thumb-active-color)}[type=range]:active::-webkit-slider-thumb{transform:scale(1.25)}[type=range]:active::-moz-range-thumb{transform:scale(1.25)}[type=range]:active::-ms-thumb{transform:scale(1.25)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{-webkit-padding-start:calc(var(--form-element-spacing-horizontal) + 1.75rem);padding-inline-start:calc(var(--form-element-spacing-horizontal) + 1.75rem);border-radius:5rem;background-image:var(--icon-search);background-position:center left 1.125rem;background-size:1rem auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{-webkit-padding-start:calc(var(--form-element-spacing-horizontal) + 1.75rem)!important;padding-inline-start:calc(var(--form-element-spacing-horizontal) + 1.75rem)!important;background-position:center left 1.125rem,center right .75rem}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=false]{background-image:var(--icon-search),var(--icon-valid)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=true]{background-image:var(--icon-search),var(--icon-invalid)}[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;display:none}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{background-position:center right 1.125rem}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{background-position:center right 1.125rem,center left .75rem}:where(table){width:100%;border-collapse:collapse;border-spacing:0;text-indent:0}td,th{padding:calc(var(--spacing)/ 2) var(--spacing);border-bottom:var(--border-width) solid var(--table-border-color);color:var(--color);font-weight:var(--font-weight);font-size:var(--font-size);text-align:left;text-align:start}tfoot td,tfoot th{border-top:var(--border-width) solid var(--table-border-color);border-bottom:0}table[role=grid] tbody tr:nth-child(odd){background-color:var(--table-row-stripped-background-color)}code,kbd,pre,samp{font-size:.875em;font-family:var(--font-family)}pre{-ms-overflow-style:scrollbar;overflow:auto}code,kbd,pre{border-radius:var(--border-radius);background:var(--code-background-color);color:var(--code-color);font-weight:var(--font-weight);line-height:initial}code,kbd{display:inline-block;padding:.375rem .5rem}pre{display:block;margin-bottom:var(--spacing);overflow-x:auto}pre>code{display:block;padding:var(--spacing);background:0 0;font-size:14px;line-height:var(--line-height)}code b{color:var(--code-tag-color);font-weight:var(--font-weight)}code i{color:var(--code-property-color);font-style:normal}code u{color:var(--code-value-color);text-decoration:none}code em{color:var(--code-comment-color);font-style:normal}kbd{background-color:var(--code-kbd-background-color);color:var(--code-kbd-color);vertical-align:baseline}hr{height:0;border:0;border-top:1px solid var(--muted-border-color);color:inherit}[hidden],template{display:none!important}canvas{display:inline-block}details{display:block;margin-bottom:var(--spacing);padding-bottom:var(--spacing);border-bottom:var(--border-width) solid var(--accordion-border-color)}details summary{line-height:1rem;list-style-type:none;cursor:pointer;transition:color var(--transition)}details summary:not([role]){color:var(--accordion-close-summary-color)}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:block;width:1rem;height:1rem;-webkit-margin-start:calc(var(--spacing,1rem) * 0.5);margin-inline-start:calc(var(--spacing,1rem) * .5);float:right;transform:rotate(-90deg);background-image:var(--icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:"";transition:transform var(--transition)}details summary:focus{outline:0}details summary:focus:not([role=button]){color:var(--accordion-active-summary-color)}details summary[role=button]{width:100%;text-align:left}details summary[role=button]::after{height:calc(1rem * var(--line-height,1.5));background-image:var(--icon-chevron-button)}details summary[role=button]:not(.outline).contrast::after{background-image:var(--icon-chevron-button-inverse)}details[open]>summary{margin-bottom:calc(var(--spacing))}details[open]>summary:not([role]):not(:focus){color:var(--accordion-open-summary-color)}details[open]>summary::after{transform:rotate(0)}[dir=rtl] details summary{text-align:right}[dir=rtl] details summary::after{float:left;background-position:left center}article{margin:var(--block-spacing-vertical) 0;padding:var(--block-spacing-vertical) var(--block-spacing-horizontal);border-radius:var(--border-radius);background:var(--card-background-color);box-shadow:var(--card-box-shadow)}article>footer,article>header{margin-right:calc(var(--block-spacing-horizontal) * -1);margin-left:calc(var(--block-spacing-horizontal) * -1);padding:calc(var(--block-spacing-vertical) * .66) var(--block-spacing-horizontal);background-color:var(--card-sectionning-background-color)}article>header{margin-top:calc(var(--block-spacing-vertical) * -1);margin-bottom:var(--block-spacing-vertical);border-bottom:var(--border-width) solid var(--card-border-color);border-top-right-radius:var(--border-radius);border-top-left-radius:var(--border-radius)}article>footer{margin-top:var(--block-spacing-vertical);margin-bottom:calc(var(--block-spacing-vertical) * -1);border-top:var(--border-width) solid var(--card-border-color);border-bottom-right-radius:var(--border-radius);border-bottom-left-radius:var(--border-radius)}:root{--scrollbar-width:0px}dialog{display:flex;z-index:999;position:fixed;top:0;right:0;bottom:0;left:0;align-items:center;justify-content:center;width:inherit;min-width:100%;height:inherit;min-height:100%;padding:var(--spacing);border:0;-webkit-backdrop-filter:var(--modal-overlay-backdrop-filter);backdrop-filter:var(--modal-overlay-backdrop-filter);background-color:var(--modal-overlay-background-color);color:var(--color)}dialog article{max-height:calc(100vh - var(--spacing) * 2);overflow:auto}@media (min-width:576px){dialog article{max-width:510px}}@media (min-width:768px){dialog article{max-width:700px}}dialog article>footer,dialog article>header{padding:calc(var(--block-spacing-vertical) * .5) var(--block-spacing-horizontal)}dialog article>header .close{margin:0;margin-left:var(--spacing);float:right}dialog article>footer{text-align:right}dialog article>footer [role=button]{margin-bottom:0}dialog article>footer [role=button]:not(:first-of-type){margin-left:calc(var(--spacing) * .5)}dialog article p:last-of-type{margin:0}dialog article .close{display:block;width:1rem;height:1rem;margin-top:calc(var(--block-spacing-vertical) * -.5);margin-bottom:var(--typography-spacing-vertical);margin-left:auto;background-image:var(--icon-close);background-position:center;background-size:auto 1rem;background-repeat:no-repeat;opacity:.5;transition:opacity var(--transition)}dialog article .close:is([aria-current],:hover,:active,:focus){opacity:1}dialog:not([open]),dialog[open=false]{display:none}.modal-is-open{padding-right:var(--scrollbar-width,0);overflow:hidden;pointer-events:none;touch-action:none}.modal-is-open dialog{pointer-events:auto}:where(.modal-is-opening,.modal-is-closing) dialog,:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-duration:.2s;animation-timing-function:ease-in-out;animation-fill-mode:both}:where(.modal-is-opening,.modal-is-closing) dialog{animation-duration:.8s;animation-name:modal-overlay}:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-delay:.2s;animation-name:modal}.modal-is-closing dialog,.modal-is-closing dialog>article{animation-delay:0s;animation-direction:reverse}@keyframes modal-overlay{from{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}}@keyframes modal{from{transform:translateY(-100%);opacity:0}}:where(nav li)::before{float:left;content:"ā"}nav,nav ul{display:flex}nav{justify-content:space-between}nav ol,nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ol:first-of-type,nav ul:first-of-type{margin-left:calc(var(--nav-element-spacing-horizontal) * -1)}nav ol:last-of-type,nav ul:last-of-type{margin-right:calc(var(--nav-element-spacing-horizontal) * -1)}nav li{display:inline-block;margin:0;padding:var(--nav-element-spacing-vertical) var(--nav-element-spacing-horizontal)}nav li>*{--spacing:0}nav :where(a,[role=link]){display:inline-block;margin:calc(var(--nav-link-spacing-vertical) * -1) calc(var(--nav-link-spacing-horizontal) * -1);padding:var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);border-radius:var(--border-radius);text-decoration:none}nav :where(a,[role=link]):is([aria-current],:hover,:active,:focus){text-decoration:none}nav[aria-label=breadcrumb]{align-items:center;justify-content:start}nav[aria-label=breadcrumb] ul li:not(:first-child){-webkit-margin-start:var(--nav-link-spacing-horizontal);margin-inline-start:var(--nav-link-spacing-horizontal)}nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{position:absolute;width:calc(var(--nav-link-spacing-horizontal) * 2);-webkit-margin-start:calc(var(--nav-link-spacing-horizontal)/ 2);margin-inline-start:calc(var(--nav-link-spacing-horizontal)/ 2);content:"/";color:var(--muted-color);text-align:center}nav[aria-label=breadcrumb] a[aria-current]{background-color:transparent;color:inherit;text-decoration:none;pointer-events:none}nav [role=button]{margin-right:inherit;margin-left:inherit;padding:var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal)}aside li,aside nav,aside ol,aside ul{display:block}aside li{padding:calc(var(--nav-element-spacing-vertical) * .5) var(--nav-element-spacing-horizontal)}aside li a{display:block}aside li [role=button]{margin:inherit}[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{content:"\\"}progress{display:inline-block;vertical-align:baseline}progress{-webkit-appearance:none;-moz-appearance:none;display:inline-block;appearance:none;width:100%;height:.5rem;margin-bottom:calc(var(--spacing) * .5);overflow:hidden;border:0;border-radius:var(--border-radius);background-color:var(--progress-background-color);color:var(--progress-color)}progress::-webkit-progress-bar{border-radius:var(--border-radius);background:0 0}progress[value]::-webkit-progress-value{background-color:var(--progress-color)}progress::-moz-progress-bar{background-color:var(--progress-color)}@media (prefers-reduced-motion:no-preference){progress:indeterminate{background:var(--progress-background-color) linear-gradient(to right,var(--progress-color) 30%,var(--progress-background-color) 30%) top left/150% 150% no-repeat;animation:progress-indeterminate 1s linear infinite}progress:indeterminate[value]::-webkit-progress-value{background-color:transparent}progress:indeterminate::-moz-progress-bar{background-color:transparent}}@media (prefers-reduced-motion:no-preference){[dir=rtl] progress:indeterminate{animation-direction:reverse}}@keyframes progress-indeterminate{0%{background-position:200% 0}100%{background-position:-200% 0}}details[role=list],li[role=list]{position:relative}details[role=list] summary+ul,li[role=list]>ul{display:flex;z-index:99;position:absolute;top:auto;right:0;left:0;flex-direction:column;margin:0;padding:0;border:var(--border-width) solid var(--dropdown-border-color);border-radius:var(--border-radius);border-top-right-radius:0;border-top-left-radius:0;background-color:var(--dropdown-background-color);box-shadow:var(--card-box-shadow);color:var(--dropdown-color);white-space:nowrap}details[role=list] summary+ul li,li[role=list]>ul li{width:100%;margin-bottom:0;padding:calc(var(--form-element-spacing-vertical) * .5) var(--form-element-spacing-horizontal);list-style:none}details[role=list] summary+ul li:first-of-type,li[role=list]>ul li:first-of-type{margin-top:calc(var(--form-element-spacing-vertical) * .5)}details[role=list] summary+ul li:last-of-type,li[role=list]>ul li:last-of-type{margin-bottom:calc(var(--form-element-spacing-vertical) * .5)}details[role=list] summary+ul li a,li[role=list]>ul li a{display:block;margin:calc(var(--form-element-spacing-vertical) * -.5) calc(var(--form-element-spacing-horizontal) * -1);padding:calc(var(--form-element-spacing-vertical) * .5) var(--form-element-spacing-horizontal);overflow:hidden;color:var(--dropdown-color);text-decoration:none;text-overflow:ellipsis}details[role=list] summary+ul li a:hover,li[role=list]>ul li a:hover{background-color:var(--dropdown-hover-background-color)}details[role=list] summary::after,li[role=list]>a::after{display:block;width:1rem;height:calc(1rem * var(--line-height,1.5));-webkit-margin-start:0.5rem;margin-inline-start:.5rem;float:right;transform:rotate(0);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:""}details[role=list]{padding:0;border-bottom:none}details[role=list] summary{margin-bottom:0}details[role=list] summary:not([role]){height:calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2);padding:var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);border:var(--border-width) solid var(--form-element-border-color);border-radius:var(--border-radius);background-color:var(--form-element-background-color);color:var(--form-element-placeholder-color);line-height:inherit;cursor:pointer;transition:background-color var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition)}details[role=list] summary:not([role]):active,details[role=list] summary:not([role]):focus{border-color:var(--form-element-active-border-color);background-color:var(--form-element-active-background-color)}details[role=list] summary:not([role]):focus{box-shadow:0 0 0 var(--outline-width) var(--form-element-focus-color)}details[role=list][open] summary{border-bottom-right-radius:0;border-bottom-left-radius:0}details[role=list][open] summary::before{display:block;z-index:1;position:fixed;top:0;right:0;bottom:0;left:0;background:0 0;content:"";cursor:default}nav details[role=list] summary,nav li[role=list] a{display:flex;direction:ltr}nav details[role=list] summary+ul,nav li[role=list]>ul{min-width:-moz-fit-content;min-width:fit-content;border-radius:var(--border-radius)}nav details[role=list] summary+ul li a,nav li[role=list]>ul li a{border-radius:0}nav details[role=list] summary,nav details[role=list] summary:not([role]){height:auto;padding:var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal)}nav details[role=list][open] summary{border-radius:var(--border-radius)}nav details[role=list] summary+ul{margin-top:var(--outline-width);-webkit-margin-start:0;margin-inline-start:0}nav details[role=list] summary[role=link]{margin-bottom:calc(var(--nav-link-spacing-vertical) * -1);line-height:var(--line-height)}nav details[role=list] summary[role=link]+ul{margin-top:calc(var(--nav-link-spacing-vertical) + var(--outline-width));-webkit-margin-start:calc(var(--nav-link-spacing-horizontal) * -1);margin-inline-start:calc(var(--nav-link-spacing-horizontal) * -1)}li[role=list] a:active~ul,li[role=list] a:focus~ul,li[role=list]:hover>ul{display:flex}li[role=list]>ul{display:none;margin-top:calc(var(--nav-link-spacing-vertical) + var(--outline-width));-webkit-margin-start:calc(var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal));margin-inline-start:calc(var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal))}li[role=list]>a::after{background-image:var(--icon-chevron)}label>details[role=list]{margin-top:calc(var(--spacing) * .25);margin-bottom:var(--spacing)}[aria-busy=true]{cursor:progress}[aria-busy=true]:not(input,select,textarea,html)::before{display:inline-block;width:1em;height:1em;border:.1875em solid currentColor;border-radius:1em;border-right-color:transparent;content:"";vertical-align:text-bottom;vertical-align:-.125em;animation:spinner .75s linear infinite;opacity:var(--loading-spinner-opacity)}[aria-busy=true]:not(input,select,textarea,html):not(:empty)::before{margin-right:calc(var(--spacing) * .5);margin-left:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:calc(var(--spacing) * .5);margin-inline-end:calc(var(--spacing) * .5)}[aria-busy=true]:not(input,select,textarea,html):empty{text-align:center}a[aria-busy=true],button[aria-busy=true],input[type=button][aria-busy=true],input[type=reset][aria-busy=true],input[type=submit][aria-busy=true]{pointer-events:none}@keyframes spinner{to{transform:rotate(360deg)}}[data-tooltip]{position:relative}[data-tooltip]:not(a,button,input){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::after,[data-tooltip]::before,[data-tooltip][data-placement=top]::after,[data-tooltip][data-placement=top]::before{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:var(--border-radius);background:var(--tooltip-background-color);content:attr(data-tooltip);color:var(--tooltip-color);font-style:normal;font-weight:var(--font-weight);font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none}[data-tooltip]::after,[data-tooltip][data-placement=top]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:transparent;content:"";color:var(--tooltip-background-color)}[data-tooltip][data-placement=bottom]::after,[data-tooltip][data-placement=bottom]::before{top:100%;bottom:auto;transform:translate(-50%,.25rem)}[data-tooltip][data-placement=bottom]:after{transform:translate(-50%,-.3rem);border:.3rem solid transparent;border-bottom:.3rem solid}[data-tooltip][data-placement=left]::after,[data-tooltip][data-placement=left]::before{top:50%;right:100%;bottom:auto;left:auto;transform:translate(-.25rem,-50%)}[data-tooltip][data-placement=left]:after{transform:translate(.3rem,-50%);border:.3rem solid transparent;border-left:.3rem solid}[data-tooltip][data-placement=right]::after,[data-tooltip][data-placement=right]::before{top:50%;right:auto;bottom:auto;left:100%;transform:translate(.25rem,-50%)}[data-tooltip][data-placement=right]:after{transform:translate(-.3rem,-50%);border:.3rem solid transparent;border-right:.3rem solid}[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{opacity:1}@media (hover:hover) and (pointer:fine){[data-tooltip]:hover::after,[data-tooltip]:hover::before,[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after,[data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::before{animation-duration:.2s;animation-name:tooltip-slide-top}[data-tooltip]:hover::after,[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after{animation-name:tooltip-caret-slide-top}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover::after,[data-tooltip][data-placement=bottom]:hover::before{animation-duration:.2s;animation-name:tooltip-slide-bottom}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover::after{animation-name:tooltip-caret-slide-bottom}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:focus::before,[data-tooltip][data-placement=left]:hover::after,[data-tooltip][data-placement=left]:hover::before{animation-duration:.2s;animation-name:tooltip-slide-left}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:hover::after{animation-name:tooltip-caret-slide-left}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:focus::before,[data-tooltip][data-placement=right]:hover::after,[data-tooltip][data-placement=right]:hover::before{animation-duration:.2s;animation-name:tooltip-slide-right}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:hover::after{animation-name:tooltip-caret-slide-right}}@keyframes tooltip-slide-top{from{transform:translate(-50%,.75rem);opacity:0}to{transform:translate(-50%,-.25rem);opacity:1}}@keyframes tooltip-caret-slide-top{from{opacity:0}50%{transform:translate(-50%,-.25rem);opacity:0}to{transform:translate(-50%,0);opacity:1}}@keyframes tooltip-slide-bottom{from{transform:translate(-50%,-.75rem);opacity:0}to{transform:translate(-50%,.25rem);opacity:1}}@keyframes tooltip-caret-slide-bottom{from{opacity:0}50%{transform:translate(-50%,-.5rem);opacity:0}to{transform:translate(-50%,-.3rem);opacity:1}}@keyframes tooltip-slide-left{from{transform:translate(.75rem,-50%);opacity:0}to{transform:translate(-.25rem,-50%);opacity:1}}@keyframes tooltip-caret-slide-left{from{opacity:0}50%{transform:translate(.05rem,-50%);opacity:0}to{transform:translate(.3rem,-50%);opacity:1}}@keyframes tooltip-slide-right{from{transform:translate(-.75rem,-50%);opacity:0}to{transform:translate(.25rem,-50%);opacity:1}}@keyframes tooltip-caret-slide-right{from{opacity:0}50%{transform:translate(-.05rem,-50%);opacity:0}to{transform:translate(-.3rem,-50%);opacity:1}}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation}[dir=rtl]{direction:rtl}@media (prefers-reduced-motion:reduce){:not([aria-busy=true]),:not([aria-busy=true])::after,:not([aria-busy=true])::before{background-attachment:initial!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important}}
-/*# sourceMappingURL=pico.min.css.map */
\ No newline at end of file
+ * Pico CSS ⨠v2.0.6 (https://picocss.com)
+ * Copyright 2019-2024 - Licensed under MIT
+ */:root{--pico-font-family-emoji:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--pico-font-family-sans-serif:system-ui,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,Helvetica,Arial,"Helvetica Neue",sans-serif,var(--pico-font-family-emoji);--pico-font-family-monospace:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace,var(--pico-font-family-emoji);--pico-font-family:var(--pico-font-family-sans-serif);--pico-line-height:1.5;--pico-font-weight:400;--pico-font-size:100%;--pico-text-underline-offset:0.1rem;--pico-border-radius:0.25rem;--pico-border-width:0.0625rem;--pico-outline-width:0.125rem;--pico-transition:0.2s ease-in-out;--pico-spacing:1rem;--pico-typography-spacing-vertical:1rem;--pico-block-spacing-vertical:var(--pico-spacing);--pico-block-spacing-horizontal:var(--pico-spacing);--pico-grid-column-gap:var(--pico-spacing);--pico-grid-row-gap:var(--pico-spacing);--pico-form-element-spacing-vertical:0.75rem;--pico-form-element-spacing-horizontal:1rem;--pico-group-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-primary-focus);--pico-group-box-shadow-focus-with-input:0 0 0 0.0625rem var(--pico-form-element-border-color);--pico-modal-overlay-backdrop-filter:blur(0.375rem);--pico-nav-element-spacing-vertical:1rem;--pico-nav-element-spacing-horizontal:0.5rem;--pico-nav-link-spacing-vertical:0.5rem;--pico-nav-link-spacing-horizontal:0.5rem;--pico-nav-breadcrumb-divider:">";--pico-icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--pico-icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--pico-icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--pico-icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--pico-icon-loading:url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='rgb(136, 145, 164)' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E")}@media (min-width:576px){:root{--pico-font-size:106.25%}}@media (min-width:768px){:root{--pico-font-size:112.5%}}@media (min-width:1024px){:root{--pico-font-size:118.75%}}@media (min-width:1280px){:root{--pico-font-size:125%}}@media (min-width:1536px){:root{--pico-font-size:131.25%}}a{--pico-text-decoration:underline}a.contrast,a.secondary{--pico-text-decoration:underline}small{--pico-font-size:0.875em}h1,h2,h3,h4,h5,h6{--pico-font-weight:700}h1{--pico-font-size:2rem;--pico-line-height:1.125;--pico-typography-spacing-top:3rem}h2{--pico-font-size:1.75rem;--pico-line-height:1.15;--pico-typography-spacing-top:2.625rem}h3{--pico-font-size:1.5rem;--pico-line-height:1.175;--pico-typography-spacing-top:2.25rem}h4{--pico-font-size:1.25rem;--pico-line-height:1.2;--pico-typography-spacing-top:1.874rem}h5{--pico-font-size:1.125rem;--pico-line-height:1.225;--pico-typography-spacing-top:1.6875rem}h6{--pico-font-size:1rem;--pico-line-height:1.25;--pico-typography-spacing-top:1.5rem}tfoot td,tfoot th,thead td,thead th{--pico-font-weight:600;--pico-border-width:0.1875rem}code,kbd,pre,samp{--pico-font-family:var(--pico-font-family-monospace)}kbd{--pico-font-weight:bolder}:where(select,textarea),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-outline-width:0.0625rem}[type=search]{--pico-border-radius:5rem}[type=checkbox],[type=radio]{--pico-border-width:0.125rem}[type=checkbox][role=switch]{--pico-border-width:0.1875rem}details.dropdown summary:not([role=button]){--pico-outline-width:0.0625rem}nav details.dropdown summary:focus-visible{--pico-outline-width:0.125rem}[role=search]{--pico-border-radius:5rem}[role=group]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus),[role=search]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[role=group]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus),[role=search]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=submit],[role=search] button{--pico-form-element-spacing-horizontal:2rem}details summary[role=button]:not(.outline)::after{filter:brightness(0) invert(1)}[aria-busy=true]:not(input,select,textarea):is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0) invert(1)}:root:not([data-theme=dark]),[data-theme=light]{--pico-background-color:#fff;--pico-color:#373c44;--pico-text-selection-color:rgba(2, 154, 232, 0.25);--pico-muted-color:#646b79;--pico-muted-border-color:#e7eaf0;--pico-primary:#0172ad;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 114, 173, 0.5);--pico-primary-hover:#015887;--pico-primary-hover-background:#02659a;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(2, 154, 232, 0.5);--pico-primary-inverse:#fff;--pico-secondary:#5d6b89;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(93, 107, 137, 0.5);--pico-secondary-hover:#48536b;--pico-secondary-hover-background:#48536b;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(93, 107, 137, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#181c25;--pico-contrast-background:#181c25;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(24, 28, 37, 0.5);--pico-contrast-hover:#000;--pico-contrast-hover-background:#000;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-secondary-hover);--pico-contrast-focus:rgba(93, 107, 137, 0.25);--pico-contrast-inverse:#fff;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(129, 145, 181, 0.01698),0.0335rem 0.067rem 0.402rem rgba(129, 145, 181, 0.024),0.0625rem 0.125rem 0.75rem rgba(129, 145, 181, 0.03),0.1125rem 0.225rem 1.35rem rgba(129, 145, 181, 0.036),0.2085rem 0.417rem 2.502rem rgba(129, 145, 181, 0.04302),0.5rem 1rem 6rem rgba(129, 145, 181, 0.06),0 0 0 0.0625rem rgba(129, 145, 181, 0.015);--pico-h1-color:#2d3138;--pico-h2-color:#373c44;--pico-h3-color:#424751;--pico-h4-color:#4d535e;--pico-h5-color:#5c6370;--pico-h6-color:#646b79;--pico-mark-background-color:#fde7c0;--pico-mark-color:#0f1114;--pico-ins-color:#1d6a54;--pico-del-color:#883935;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#f3f5f7;--pico-code-color:#646b79;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#fbfcfc;--pico-form-element-selected-background-color:#dfe3eb;--pico-form-element-border-color:#cfd5e2;--pico-form-element-color:#23262c;--pico-form-element-placeholder-color:var(--pico-muted-color);--pico-form-element-active-background-color:#fff;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#b86a6b;--pico-form-element-invalid-active-border-color:#c84f48;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#4c9b8a;--pico-form-element-valid-active-border-color:#279977;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#bfc7d9;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#dfe3eb;--pico-range-active-border-color:#bfc7d9;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:var(--pico-background-color);--pico-card-border-color:var(--pico-muted-border-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#fbfcfc;--pico-dropdown-background-color:#fff;--pico-dropdown-border-color:#eff1f4;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#eff1f4;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(232, 234, 237, 0.75);--pico-progress-background-color:#dfe3eb;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(76, 155, 138)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(200, 79, 72)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:light}:root:not([data-theme=dark]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]),[data-theme=light] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}@media only screen and (prefers-color-scheme:dark){:root:not([data-theme]){--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}:root:not([data-theme]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}:root:not([data-theme]) details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}:root:not([data-theme]) [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}}[data-theme=dark]{--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}[data-theme=dark] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}[data-theme=dark] details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}[data-theme=dark] [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}[type=checkbox],[type=radio],[type=range],progress{accent-color:var(--pico-primary)}*,::after,::before{box-sizing:border-box;background-repeat:no-repeat}::after,::before{text-decoration:inherit;vertical-align:inherit}:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family);text-underline-offset:var(--pico-text-underline-offset);text-rendering:optimizeLegibility;overflow-wrap:break-word;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{width:100%;margin:0}main{display:block}body>footer,body>header,body>main{padding-block:var(--pico-block-spacing-vertical)}section{margin-bottom:var(--pico-block-spacing-vertical)}.container,.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:var(--pico-spacing);padding-left:var(--pico-spacing)}@media (min-width:576px){.container{max-width:510px;padding-right:0;padding-left:0}}@media (min-width:768px){.container{max-width:700px}}@media (min-width:1024px){.container{max-width:950px}}@media (min-width:1280px){.container{max-width:1200px}}@media (min-width:1536px){.container{max-width:1450px}}.grid{grid-column-gap:var(--pico-grid-column-gap);grid-row-gap:var(--pico-grid-row-gap);display:grid;grid-template-columns:1fr}@media (min-width:768px){.grid{grid-template-columns:repeat(auto-fit,minmax(0%,1fr))}}.grid>*{min-width:0}.overflow-auto{overflow:auto}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,ol,p,pre,table,ul{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-style:normal;font-weight:var(--pico-font-weight)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family)}h1{--pico-color:var(--pico-h1-color)}h2{--pico-color:var(--pico-h2-color)}h3{--pico-color:var(--pico-h3-color)}h4{--pico-color:var(--pico-h4-color)}h5{--pico-color:var(--pico-h5-color)}h6{--pico-color:var(--pico-h6-color)}:where(article,address,blockquote,dl,figure,form,ol,p,pre,table,ul)~:is(h1,h2,h3,h4,h5,h6){margin-top:var(--pico-typography-spacing-top)}p{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup>*{margin-top:0;margin-bottom:0}hgroup>:not(:first-child):last-child{--pico-color:var(--pico-muted-color);--pico-font-weight:unset;font-size:1rem}:where(ol,ul) li{margin-bottom:calc(var(--pico-typography-spacing-vertical) * .25)}:where(dl,ol,ul) :where(dl,ol,ul){margin:0;margin-top:calc(var(--pico-typography-spacing-vertical) * .25)}ul li{list-style:square}mark{padding:.125rem .25rem;background-color:var(--pico-mark-background-color);color:var(--pico-mark-color);vertical-align:baseline}blockquote{display:block;margin:var(--pico-typography-spacing-vertical) 0;padding:var(--pico-spacing);border-right:none;border-left:.25rem solid var(--pico-blockquote-border-color);border-inline-start:0.25rem solid var(--pico-blockquote-border-color);border-inline-end:none}blockquote footer{margin-top:calc(var(--pico-typography-spacing-vertical) * .5);color:var(--pico-blockquote-footer-color)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--pico-ins-color);text-decoration:none}del{color:var(--pico-del-color)}::-moz-selection{background-color:var(--pico-text-selection-color)}::selection{background-color:var(--pico-text-selection-color)}:where(a:not([role=button])),[role=link]{--pico-color:var(--pico-primary);--pico-background-color:transparent;--pico-underline:var(--pico-primary-underline);outline:0;background-color:var(--pico-background-color);color:var(--pico-color);-webkit-text-decoration:var(--pico-text-decoration);text-decoration:var(--pico-text-decoration);text-decoration-color:var(--pico-underline);text-underline-offset:0.125em;transition:background-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition)}:where(a:not([role=button])):is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-primary-hover);--pico-underline:var(--pico-primary-hover-underline);--pico-text-decoration:underline}:where(a:not([role=button])):focus-visible,[role=link]:focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}:where(a:not([role=button])).secondary,[role=link].secondary{--pico-color:var(--pico-secondary);--pico-underline:var(--pico-secondary-underline)}:where(a:not([role=button])).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-underline:var(--pico-secondary-hover-underline)}:where(a:not([role=button])).contrast,[role=link].contrast{--pico-color:var(--pico-contrast);--pico-underline:var(--pico-contrast-underline)}:where(a:not([role=button])).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-underline:var(--pico-contrast-hover-underline)}a[role=button]{display:inline-block}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[role=button],[type=button],[type=file]::file-selector-button,[type=reset],[type=submit],button{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);--pico-color:var(--pico-primary-inverse);--pico-box-shadow:var(--pico-button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:1rem;line-height:var(--pico-line-height);text-align:center;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}[role=button]:is(:hover,:active,:focus),[role=button]:is([aria-current]:not([aria-current=false])),[type=button]:is(:hover,:active,:focus),[type=button]:is([aria-current]:not([aria-current=false])),[type=file]::file-selector-button:is(:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])),[type=reset]:is(:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false])),[type=submit]:is(:hover,:active,:focus),[type=submit]:is([aria-current]:not([aria-current=false])),button:is(:hover,:active,:focus),button:is([aria-current]:not([aria-current=false])){--pico-background-color:var(--pico-primary-hover-background);--pico-border-color:var(--pico-primary-hover-border);--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));--pico-color:var(--pico-primary-inverse)}[role=button]:focus,[role=button]:is([aria-current]:not([aria-current=false])):focus,[type=button]:focus,[type=button]:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus,[type=submit]:focus,[type=submit]:is([aria-current]:not([aria-current=false])):focus,button:focus,button:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}[type=button],[type=reset],[type=submit]{margin-bottom:var(--pico-spacing)}:is(button,[type=submit],[type=button],[role=button]).secondary,[type=file]::file-selector-button,[type=reset]{--pico-background-color:var(--pico-secondary-background);--pico-border-color:var(--pico-secondary-border);--pico-color:var(--pico-secondary-inverse);cursor:pointer}:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border);--pico-color:var(--pico-secondary-inverse)}:is(button,[type=submit],[type=button],[role=button]).secondary:focus,:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}:is(button,[type=submit],[type=button],[role=button]).contrast{--pico-background-color:var(--pico-contrast-background);--pico-border-color:var(--pico-contrast-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-contrast-hover-background);--pico-border-color:var(--pico-contrast-hover-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:focus,:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}:is(button,[type=submit],[type=button],[role=button]).outline,[type=reset].outline{--pico-background-color:transparent;--pico-color:var(--pico-primary);--pico-border-color:var(--pico-primary)}:is(button,[type=submit],[type=button],[role=button]).outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:transparent;--pico-color:var(--pico-primary-hover);--pico-border-color:var(--pico-primary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary,[type=reset].outline{--pico-color:var(--pico-secondary);--pico-border-color:var(--pico-secondary)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-border-color:var(--pico-secondary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast{--pico-color:var(--pico-contrast);--pico-border-color:var(--pico-contrast)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-border-color:var(--pico-contrast-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button])[disabled],:where(fieldset[disabled]) :is(button,[type=submit],[type=button],[type=reset],[role=button]){opacity:.5;pointer-events:none}:where(table){width:100%;border-collapse:collapse;border-spacing:0;text-indent:0}td,th{padding:calc(var(--pico-spacing)/ 2) var(--pico-spacing);border-bottom:var(--pico-border-width) solid var(--pico-table-border-color);background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);text-align:left;text-align:start}tfoot td,tfoot th{border-top:var(--pico-border-width) solid var(--pico-table-border-color);border-bottom:0}table.striped tbody tr:nth-child(odd) td,table.striped tbody tr:nth-child(odd) th{background-color:var(--pico-table-row-stripped-background-color)}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}:where(iframe){border-style:none}img{max-width:100%;height:auto;border-style:none}:where(svg:not([fill])){fill:currentColor}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-size:.875em;font-family:var(--pico-font-family)}pre code{font-size:inherit;font-family:inherit}pre{-ms-overflow-style:scrollbar;overflow:auto}code,kbd,pre{border-radius:var(--pico-border-radius);background:var(--pico-code-background-color);color:var(--pico-code-color);font-weight:var(--pico-font-weight);line-height:initial}code,kbd{display:inline-block;padding:.375rem}pre{display:block;margin-bottom:var(--pico-spacing);overflow-x:auto}pre>code{display:block;padding:var(--pico-spacing);background:0 0;line-height:var(--pico-line-height)}kbd{background-color:var(--pico-code-kbd-background-color);color:var(--pico-code-kbd-color);vertical-align:baseline}figure{display:block;margin:0;padding:0}figure figcaption{padding:calc(var(--pico-spacing) * .5) 0;color:var(--pico-muted-color)}hr{height:0;margin:var(--pico-typography-spacing-vertical) 0;border:0;border-top:1px solid var(--pico-muted-border-color);color:inherit}[hidden],template{display:none!important}canvas{display:inline-block}input,optgroup,select,textarea{margin:0;font-size:1rem;line-height:var(--pico-line-height);font-family:inherit;letter-spacing:inherit}input{overflow:visible}select{text-transform:none}legend{max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{padding:0;border-style:none}:-moz-focusring{outline:0}:-moz-ui-invalid{box-shadow:none}::-ms-expand{display:none}[type=file],[type=range]{padding:0;border-width:0}input:not([type=checkbox],[type=radio],[type=range]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2)}fieldset{width:100%;margin:0;margin-bottom:var(--pico-spacing);padding:0;border:0}fieldset legend,label{display:block;margin-bottom:calc(var(--pico-spacing) * .375);color:var(--pico-color);font-weight:var(--pico-form-label-font-weight,var(--pico-font-weight))}fieldset legend{margin-bottom:calc(var(--pico-spacing) * .5)}button[type=submit],input:not([type=checkbox],[type=radio]),select,textarea{width:100%}input:not([type=checkbox],[type=radio],[type=range],[type=file]),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal)}input,select,textarea{--pico-background-color:var(--pico-form-element-background-color);--pico-border-color:var(--pico-form-element-border-color);--pico-color:var(--pico-form-element-color);--pico-box-shadow:none;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[readonly]):is(:active,:focus){--pico-background-color:var(--pico-form-element-active-background-color)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[role=switch],[readonly]):is(:active,:focus){--pico-border-color:var(--pico-form-element-active-border-color)}:where(select,textarea):not([readonly]):focus,input:not([type=submit],[type=button],[type=reset],[type=range],[type=file],[readonly]):focus{--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}:where(fieldset[disabled]) :is(input:not([type=submit],[type=button],[type=reset]),select,textarea),input:not([type=submit],[type=button],[type=reset])[disabled],label[aria-disabled=true],select[disabled],textarea[disabled]{opacity:var(--pico-form-element-disabled-opacity);pointer-events:none}label[aria-disabled=true] input[disabled]{opacity:1}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid]{padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal)!important;padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=false]:not(select){background-image:var(--pico-icon-valid)}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=true]:not(select){background-image:var(--pico-icon-invalid)}:where(input,select,textarea)[aria-invalid=false]{--pico-border-color:var(--pico-form-element-valid-border-color)}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus){--pico-border-color:var(--pico-form-element-valid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-valid-focus-color)!important}:where(input,select,textarea)[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus){--pico-border-color:var(--pico-form-element-invalid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-invalid-focus-color)!important}[dir=rtl] :where(input,select,textarea):not([type=checkbox],[type=radio]):is([aria-invalid],[aria-invalid=true],[aria-invalid=false]){background-position:center left .75rem}input::-webkit-input-placeholder,input::placeholder,select:invalid,textarea::-webkit-input-placeholder,textarea::placeholder{color:var(--pico-form-element-placeholder-color);opacity:1}input:not([type=checkbox],[type=radio]),select,textarea{margin-bottom:var(--pico-spacing)}select::-ms-expand{border:0;background-color:transparent}select:not([multiple],[size]){padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal);padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);background-image:var(--pico-icon-chevron);background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}select[multiple] option:checked{background:var(--pico-form-element-selected-background-color);color:var(--pico-form-element-color)}[dir=rtl] select:not([multiple],[size]){background-position:center left .75rem}textarea{display:block;resize:vertical}textarea[aria-invalid]{--pico-icon-height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);background-position:top right .75rem!important;background-size:1rem var(--pico-icon-height)!important}:where(input,select,textarea,fieldset,.grid)+small{display:block;width:100%;margin-top:calc(var(--pico-spacing) * -.75);margin-bottom:var(--pico-spacing);color:var(--pico-muted-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=false]+small{color:var(--pico-ins-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=true]+small{color:var(--pico-del-color)}label>:where(input,select,textarea){margin-top:calc(var(--pico-spacing) * .25)}label:has([type=checkbox],[type=radio]){width:-moz-fit-content;width:fit-content;cursor:pointer}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.25em;height:1.25em;margin-top:-.125em;margin-inline-end:.5em;border-width:var(--pico-border-width);vertical-align:middle;cursor:pointer}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=checkbox]:checked:active,[type=checkbox]:checked:focus,[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-checkbox);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-bottom:0;cursor:pointer}[type=checkbox]~label:not(:last-of-type),[type=radio]~label:not(:last-of-type){margin-inline-end:1em}[type=checkbox]:indeterminate{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-minus);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=radio]{border-radius:50%}[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-inverse);border-width:.35em;background-image:none}[type=checkbox][role=switch]{--pico-background-color:var(--pico-switch-background-color);--pico-color:var(--pico-switch-color);width:2.25em;height:1.25em;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:1.25em;background-color:var(--pico-background-color);line-height:1.25em}[type=checkbox][role=switch]:not([aria-invalid]){--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:before{display:block;aspect-ratio:1;height:100%;border-radius:50%;background-color:var(--pico-color);box-shadow:var(--pico-switch-thumb-box-shadow);content:"";transition:margin .1s ease-in-out}[type=checkbox][role=switch]:focus{--pico-background-color:var(--pico-switch-background-color);--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:checked{--pico-background-color:var(--pico-switch-checked-background-color);--pico-border-color:var(--pico-switch-checked-background-color);background-image:none}[type=checkbox][role=switch]:checked::before{margin-inline-start:calc(2.25em - 1.25em)}[type=checkbox][role=switch][disabled]{--pico-background-color:var(--pico-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus{--pico-background-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true]{--pico-background-color:var(--pico-form-element-invalid-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus,[type=radio][aria-invalid=false]:checked,[type=radio][aria-invalid=false]:checked:active,[type=radio][aria-invalid=false]:checked:focus{--pico-border-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true],[type=radio]:checked:active[aria-invalid=true],[type=radio]:checked:focus[aria-invalid=true],[type=radio]:checked[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}[type=color]::-webkit-color-swatch-wrapper{padding:0}[type=color]::-moz-focus-inner{padding:0}[type=color]::-webkit-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}[type=color]::-moz-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}input:not([type=checkbox],[type=radio],[type=range],[type=file]):is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){--pico-icon-position:0.75rem;--pico-icon-width:1rem;padding-right:calc(var(--pico-icon-width) + var(--pico-icon-position));background-image:var(--pico-icon-date);background-position:center right var(--pico-icon-position);background-size:var(--pico-icon-width) auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=time]{background-image:var(--pico-icon-time)}[type=date]::-webkit-calendar-picker-indicator,[type=datetime-local]::-webkit-calendar-picker-indicator,[type=month]::-webkit-calendar-picker-indicator,[type=time]::-webkit-calendar-picker-indicator,[type=week]::-webkit-calendar-picker-indicator{width:var(--pico-icon-width);margin-right:calc(var(--pico-icon-width) * -1);margin-left:var(--pico-icon-position);opacity:0}@-moz-document url-prefix(){[type=date],[type=datetime-local],[type=month],[type=time],[type=week]{padding-right:var(--pico-form-element-spacing-horizontal)!important;background-image:none!important}}[dir=rtl] :is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){text-align:right}[type=file]{--pico-color:var(--pico-muted-color);margin-left:calc(var(--pico-outline-width) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) 0;padding-left:var(--pico-outline-width);border:0;border-radius:0;background:0 0}[type=file]::file-selector-button{margin-right:calc(var(--pico-spacing)/ 2);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal)}[type=file]:is(:hover,:active,:focus)::file-selector-button{--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border)}[type=file]:focus::file-selector-button{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[type=range]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:1.25rem;background:0 0}[type=range]::-webkit-slider-runnable-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-webkit-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-moz-range-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-moz-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-ms-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-ms-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-webkit-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-moz-range-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-moz-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-ms-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-ms-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]:active,[type=range]:focus-within{--pico-range-border-color:var(--pico-range-active-border-color);--pico-range-thumb-color:var(--pico-range-thumb-active-color)}[type=range]:active::-webkit-slider-thumb{transform:scale(1.25)}[type=range]:active::-moz-range-thumb{transform:scale(1.25)}[type=range]:active::-ms-thumb{transform:scale(1.25)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem);background-image:var(--pico-icon-search);background-position:center left calc(var(--pico-form-element-spacing-horizontal) + .125rem);background-size:1rem auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem)!important;background-position:center left 1.125rem,center right .75rem}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=false]{background-image:var(--pico-icon-search),var(--pico-icon-valid)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=true]{background-image:var(--pico-icon-search),var(--pico-icon-invalid)}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{background-position:center right 1.125rem}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{background-position:center right 1.125rem,center left .75rem}details{display:block;margin-bottom:var(--pico-spacing)}details summary{line-height:1rem;list-style-type:none;cursor:pointer;transition:color var(--pico-transition)}details summary:not([role]){color:var(--pico-accordion-close-summary-color)}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:block;width:1rem;height:1rem;margin-inline-start:calc(var(--pico-spacing,1rem) * .5);float:right;transform:rotate(-90deg);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:"";transition:transform var(--pico-transition)}details summary:focus{outline:0}details summary:focus:not([role]){color:var(--pico-accordion-active-summary-color)}details summary:focus-visible:not([role]){outline:var(--pico-outline-width) solid var(--pico-primary-focus);outline-offset:calc(var(--pico-spacing,1rem) * 0.5);color:var(--pico-primary)}details summary[role=button]{width:100%;text-align:left}details summary[role=button]::after{height:calc(1rem * var(--pico-line-height,1.5))}details[open]>summary{margin-bottom:var(--pico-spacing)}details[open]>summary:not([role]):not(:focus){color:var(--pico-accordion-open-summary-color)}details[open]>summary::after{transform:rotate(0)}[dir=rtl] details summary{text-align:right}[dir=rtl] details summary::after{float:left;background-position:left center}article{margin-bottom:var(--pico-block-spacing-vertical);padding:var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal);border-radius:var(--pico-border-radius);background:var(--pico-card-background-color);box-shadow:var(--pico-card-box-shadow)}article>footer,article>header{margin-right:calc(var(--pico-block-spacing-horizontal) * -1);margin-left:calc(var(--pico-block-spacing-horizontal) * -1);padding:calc(var(--pico-block-spacing-vertical) * .66) var(--pico-block-spacing-horizontal);background-color:var(--pico-card-sectioning-background-color)}article>header{margin-top:calc(var(--pico-block-spacing-vertical) * -1);margin-bottom:var(--pico-block-spacing-vertical);border-bottom:var(--pico-border-width) solid var(--pico-card-border-color);border-top-right-radius:var(--pico-border-radius);border-top-left-radius:var(--pico-border-radius)}article>footer{margin-top:var(--pico-block-spacing-vertical);margin-bottom:calc(var(--pico-block-spacing-vertical) * -1);border-top:var(--pico-border-width) solid var(--pico-card-border-color);border-bottom-right-radius:var(--pico-border-radius);border-bottom-left-radius:var(--pico-border-radius)}details.dropdown{position:relative;border-bottom:none}details.dropdown summary::after,details.dropdown>a::after,details.dropdown>button::after{display:block;width:1rem;height:calc(1rem * var(--pico-line-height,1.5));margin-inline-start:.25rem;float:right;transform:rotate(0) translateX(.2rem);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:""}nav details.dropdown{margin-bottom:0}details.dropdown summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-form-element-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-form-element-background-color);color:var(--pico-form-element-placeholder-color);line-height:inherit;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}details.dropdown summary:not([role]):active,details.dropdown summary:not([role]):focus{border-color:var(--pico-form-element-active-border-color);background-color:var(--pico-form-element-active-background-color)}details.dropdown summary:not([role]):focus{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}details.dropdown summary:not([role]):focus-visible{outline:0}details.dropdown summary:not([role])[aria-invalid=false]{--pico-form-element-border-color:var(--pico-form-element-valid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-valid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-valid-focus-color)}details.dropdown summary:not([role])[aria-invalid=true]{--pico-form-element-border-color:var(--pico-form-element-invalid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-invalid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-invalid-focus-color)}nav details.dropdown{display:inline;margin:calc(var(--pico-nav-element-spacing-vertical) * -1) 0}nav details.dropdown summary::after{transform:rotate(0) translateX(0)}nav details.dropdown summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-nav-link-spacing-vertical) * 2);padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav details.dropdown summary:not([role]):focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}details.dropdown summary+ul{display:flex;z-index:99;position:absolute;left:0;flex-direction:column;width:100%;min-width:-moz-fit-content;min-width:fit-content;margin:0;margin-top:var(--pico-outline-width);padding:0;border:var(--pico-border-width) solid var(--pico-dropdown-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-dropdown-background-color);box-shadow:var(--pico-dropdown-box-shadow);color:var(--pico-dropdown-color);white-space:nowrap;opacity:0;transition:opacity var(--pico-transition),transform 0s ease-in-out 1s}details.dropdown summary+ul[dir=rtl]{right:0;left:auto}details.dropdown summary+ul li{width:100%;margin-bottom:0;padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);list-style:none}details.dropdown summary+ul li:first-of-type{margin-top:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown summary+ul li:last-of-type{margin-bottom:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown summary+ul li a{display:block;margin:calc(var(--pico-form-element-spacing-vertical) * -.5) calc(var(--pico-form-element-spacing-horizontal) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);overflow:hidden;border-radius:0;color:var(--pico-dropdown-color);text-decoration:none;text-overflow:ellipsis}details.dropdown summary+ul li a:active,details.dropdown summary+ul li a:focus,details.dropdown summary+ul li a:focus-visible,details.dropdown summary+ul li a:hover,details.dropdown summary+ul li a[aria-current]:not([aria-current=false]){background-color:var(--pico-dropdown-hover-background-color)}details.dropdown summary+ul li label{width:100%}details.dropdown summary+ul li:has(label):hover{background-color:var(--pico-dropdown-hover-background-color)}details.dropdown[open] summary{margin-bottom:0}details.dropdown[open] summary+ul{transform:scaleY(1);opacity:1;transition:opacity var(--pico-transition),transform 0s ease-in-out 0s}details.dropdown[open] summary::before{display:block;z-index:1;position:fixed;width:100vw;height:100vh;inset:0;background:0 0;content:"";cursor:default}label>details.dropdown{margin-top:calc(var(--pico-spacing) * .25)}[role=group],[role=search]{display:inline-flex;position:relative;width:100%;margin-bottom:var(--pico-spacing);border-radius:var(--pico-border-radius);box-shadow:var(--pico-group-box-shadow,0 0 0 transparent);vertical-align:middle;transition:box-shadow var(--pico-transition)}[role=group] input:not([type=checkbox],[type=radio]),[role=group] select,[role=group]>*,[role=search] input:not([type=checkbox],[type=radio]),[role=search] select,[role=search]>*{position:relative;flex:1 1 auto;margin-bottom:0}[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=group]>:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child),[role=search]>:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}[role=group] input:not([type=checkbox],[type=radio]):not(:last-child),[role=group] select:not(:last-child),[role=group]>:not(:last-child),[role=search] input:not([type=checkbox],[type=radio]):not(:last-child),[role=search] select:not(:last-child),[role=search]>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}[role=group] input:not([type=checkbox],[type=radio]):focus,[role=group] select:focus,[role=group]>:focus,[role=search] input:not([type=checkbox],[type=radio]):focus,[role=search] select:focus,[role=search]>:focus{z-index:2}[role=group] [role=button]:not(:first-child),[role=group] [type=button]:not(:first-child),[role=group] [type=reset]:not(:first-child),[role=group] [type=submit]:not(:first-child),[role=group] button:not(:first-child),[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=search] [role=button]:not(:first-child),[role=search] [type=button]:not(:first-child),[role=search] [type=reset]:not(:first-child),[role=search] [type=submit]:not(:first-child),[role=search] button:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child){margin-left:calc(var(--pico-border-width) * -1)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=reset],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=reset],[role=search] [type=submit],[role=search] button{width:auto}@supports selector(:has(*)){[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-button)}[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select,[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select{border-color:transparent}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus),[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-input)}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) button,[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) button{--pico-button-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-border);--pico-button-hover-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-hover-border)}[role=group] [role=button]:focus,[role=group] [type=button]:focus,[role=group] [type=reset]:focus,[role=group] [type=submit]:focus,[role=group] button:focus,[role=search] [role=button]:focus,[role=search] [type=button]:focus,[role=search] [type=reset]:focus,[role=search] [type=submit]:focus,[role=search] button:focus{box-shadow:none}}[role=search]>:first-child{border-top-left-radius:5rem;border-bottom-left-radius:5rem}[role=search]>:last-child{border-top-right-radius:5rem;border-bottom-right-radius:5rem}[aria-busy=true]:not(input,select,textarea,html){white-space:nowrap}[aria-busy=true]:not(input,select,textarea,html)::before{display:inline-block;width:1em;height:1em;background-image:var(--pico-icon-loading);background-size:1em auto;background-repeat:no-repeat;content:"";vertical-align:-.125em}[aria-busy=true]:not(input,select,textarea,html):not(:empty)::before{margin-inline-end:calc(var(--pico-spacing) * .5)}[aria-busy=true]:not(input,select,textarea,html):empty{text-align:center}[role=button][aria-busy=true],[type=button][aria-busy=true],[type=reset][aria-busy=true],[type=submit][aria-busy=true],a[aria-busy=true],button[aria-busy=true]{pointer-events:none}:root{--pico-scrollbar-width:0px}dialog{display:flex;z-index:999;position:fixed;top:0;right:0;bottom:0;left:0;align-items:center;justify-content:center;width:inherit;min-width:100%;height:inherit;min-height:100%;padding:0;border:0;-webkit-backdrop-filter:var(--pico-modal-overlay-backdrop-filter);backdrop-filter:var(--pico-modal-overlay-backdrop-filter);background-color:var(--pico-modal-overlay-background-color);color:var(--pico-color)}dialog article{width:100%;max-height:calc(100vh - var(--pico-spacing) * 2);margin:var(--pico-spacing);overflow:auto}@media (min-width:576px){dialog article{max-width:510px}}@media (min-width:768px){dialog article{max-width:700px}}dialog article>header>*{margin-bottom:0}dialog article>header .close,dialog article>header :is(a,button)[rel=prev]{margin:0;margin-left:var(--pico-spacing);padding:0;float:right}dialog article>footer{text-align:right}dialog article>footer [role=button],dialog article>footer button{margin-bottom:0}dialog article>footer [role=button]:not(:first-of-type),dialog article>footer button:not(:first-of-type){margin-left:calc(var(--pico-spacing) * .5)}dialog article .close,dialog article :is(a,button)[rel=prev]{display:block;width:1rem;height:1rem;margin-top:calc(var(--pico-spacing) * -1);margin-bottom:var(--pico-spacing);margin-left:auto;border:none;background-image:var(--pico-icon-close);background-position:center;background-size:auto 1rem;background-repeat:no-repeat;background-color:transparent;opacity:.5;transition:opacity var(--pico-transition)}dialog article .close:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),dialog article :is(a,button)[rel=prev]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){opacity:1}dialog:not([open]),dialog[open=false]{display:none}.modal-is-open{padding-right:var(--pico-scrollbar-width,0);overflow:hidden;pointer-events:none;touch-action:none}.modal-is-open dialog{pointer-events:auto;touch-action:auto}:where(.modal-is-opening,.modal-is-closing) dialog,:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-duration:.2s;animation-timing-function:ease-in-out;animation-fill-mode:both}:where(.modal-is-opening,.modal-is-closing) dialog{animation-duration:.8s;animation-name:modal-overlay}:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-delay:.2s;animation-name:modal}.modal-is-closing dialog,.modal-is-closing dialog>article{animation-delay:0s;animation-direction:reverse}@keyframes modal-overlay{from{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}}@keyframes modal{from{transform:translateY(-100%);opacity:0}}:where(nav li)::before{float:left;content:"ā"}nav,nav ul{display:flex}nav{justify-content:space-between;overflow:visible}nav ol,nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ol:first-of-type,nav ul:first-of-type{margin-left:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav ol:last-of-type,nav ul:last-of-type{margin-right:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav li{display:inline-block;margin:0;padding:var(--pico-nav-element-spacing-vertical) var(--pico-nav-element-spacing-horizontal)}nav li :where(a,[role=link]){display:inline-block;margin:calc(var(--pico-nav-link-spacing-vertical) * -1) calc(var(--pico-nav-link-spacing-horizontal) * -1);padding:var(--pico-nav-link-spacing-vertical) var(--pico-nav-link-spacing-horizontal);border-radius:var(--pico-border-radius)}nav li :where(a,[role=link]):not(:hover){text-decoration:none}nav li [role=button],nav li [type=button],nav li button,nav li input:not([type=checkbox],[type=radio],[type=range],[type=file]),nav li select{height:auto;margin-right:inherit;margin-bottom:0;margin-left:inherit;padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb]{align-items:center;justify-content:start}nav[aria-label=breadcrumb] ul li:not(:first-child){margin-inline-start:var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb] ul li a{margin:calc(var(--pico-nav-link-spacing-vertical) * -1) 0;margin-inline-start:calc(var(--pico-nav-link-spacing-horizontal) * -1)}nav[aria-label=breadcrumb] ul li:not(:last-child)::after{display:inline-block;position:absolute;width:calc(var(--pico-nav-link-spacing-horizontal) * 4);margin:0 calc(var(--pico-nav-link-spacing-horizontal) * -1);content:var(--pico-nav-breadcrumb-divider);color:var(--pico-muted-color);text-align:center;text-decoration:none;white-space:nowrap}nav[aria-label=breadcrumb] a[aria-current]:not([aria-current=false]){background-color:transparent;color:inherit;text-decoration:none;pointer-events:none}aside li,aside nav,aside ol,aside ul{display:block}aside li{padding:calc(var(--pico-nav-element-spacing-vertical) * .5) var(--pico-nav-element-spacing-horizontal)}aside li a{display:block}aside li [role=button]{margin:inherit}[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{content:"\\"}progress{display:inline-block;vertical-align:baseline}progress{-webkit-appearance:none;-moz-appearance:none;display:inline-block;appearance:none;width:100%;height:.5rem;margin-bottom:calc(var(--pico-spacing) * .5);overflow:hidden;border:0;border-radius:var(--pico-border-radius);background-color:var(--pico-progress-background-color);color:var(--pico-progress-color)}progress::-webkit-progress-bar{border-radius:var(--pico-border-radius);background:0 0}progress[value]::-webkit-progress-value{background-color:var(--pico-progress-color);-webkit-transition:inline-size var(--pico-transition);transition:inline-size var(--pico-transition)}progress::-moz-progress-bar{background-color:var(--pico-progress-color)}@media (prefers-reduced-motion:no-preference){progress:indeterminate{background:var(--pico-progress-background-color) linear-gradient(to right,var(--pico-progress-color) 30%,var(--pico-progress-background-color) 30%) top left/150% 150% no-repeat;animation:progress-indeterminate 1s linear infinite}progress:indeterminate[value]::-webkit-progress-value{background-color:transparent}progress:indeterminate::-moz-progress-bar{background-color:transparent}}@media (prefers-reduced-motion:no-preference){[dir=rtl] progress:indeterminate{animation-direction:reverse}}@keyframes progress-indeterminate{0%{background-position:200% 0}100%{background-position:-200% 0}}[data-tooltip]{position:relative}[data-tooltip]:not(a,button,input){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::after,[data-tooltip]::before,[data-tooltip][data-placement=top]::after,[data-tooltip][data-placement=top]::before{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:var(--pico-border-radius);background:var(--pico-tooltip-background-color);content:attr(data-tooltip);color:var(--pico-tooltip-color);font-style:normal;font-weight:var(--pico-font-weight);font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none}[data-tooltip]::after,[data-tooltip][data-placement=top]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:transparent;content:"";color:var(--pico-tooltip-background-color)}[data-tooltip][data-placement=bottom]::after,[data-tooltip][data-placement=bottom]::before{top:100%;bottom:auto;transform:translate(-50%,.25rem)}[data-tooltip][data-placement=bottom]:after{transform:translate(-50%,-.3rem);border:.3rem solid transparent;border-bottom:.3rem solid}[data-tooltip][data-placement=left]::after,[data-tooltip][data-placement=left]::before{top:50%;right:100%;bottom:auto;left:auto;transform:translate(-.25rem,-50%)}[data-tooltip][data-placement=left]:after{transform:translate(.3rem,-50%);border:.3rem solid transparent;border-left:.3rem solid}[data-tooltip][data-placement=right]::after,[data-tooltip][data-placement=right]::before{top:50%;right:auto;bottom:auto;left:100%;transform:translate(.25rem,-50%)}[data-tooltip][data-placement=right]:after{transform:translate(-.3rem,-50%);border:.3rem solid transparent;border-right:.3rem solid}[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{opacity:1}@media (hover:hover) and (pointer:fine){[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{--pico-tooltip-slide-to:translate(-50%, -0.25rem);transform:translate(-50%,.75rem);animation-duration:.2s;animation-fill-mode:forwards;animation-name:tooltip-slide;opacity:0}[data-tooltip]:focus::after,[data-tooltip]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, 0rem);transform:translate(-50%,-.25rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover::after,[data-tooltip][data-placement=bottom]:hover::before{--pico-tooltip-slide-to:translate(-50%, 0.25rem);transform:translate(-50%,-.75rem);animation-name:tooltip-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, -0.3rem);transform:translate(-50%,-.5rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:focus::before,[data-tooltip][data-placement=left]:hover::after,[data-tooltip][data-placement=left]:hover::before{--pico-tooltip-slide-to:translate(-0.25rem, -50%);transform:translate(.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:hover::after{--pico-tooltip-caret-slide-to:translate(0.3rem, -50%);transform:translate(.05rem,-50%);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:focus::before,[data-tooltip][data-placement=right]:hover::after,[data-tooltip][data-placement=right]:hover::before{--pico-tooltip-slide-to:translate(0.25rem, -50%);transform:translate(-.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:hover::after{--pico-tooltip-caret-slide-to:translate(-0.3rem, -50%);transform:translate(-.05rem,-50%);animation-name:tooltip-caret-slide}}@keyframes tooltip-slide{to{transform:var(--pico-tooltip-slide-to);opacity:1}}@keyframes tooltip-caret-slide{50%{opacity:0}to{transform:var(--pico-tooltip-caret-slide-to);opacity:1}}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation}[dir=rtl]{direction:rtl}@media (prefers-reduced-motion:reduce){:not([aria-busy=true]),:not([aria-busy=true])::after,:not([aria-busy=true])::before{background-attachment:initial!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important}}
\ No newline at end of file
diff --git a/argos/server/static/pico.min.css.map b/argos/server/static/pico.min.css.map
deleted file mode 100644
index 1977c71..0000000
--- a/argos/server/static/pico.min.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["scss/pico.scss","scss/themes/default/_styles.scss","css/pico.css","scss/themes/default/_light.scss","scss/themes/default.scss","scss/themes/default/_dark.scss","scss/layout/_document.scss","scss/layout/_sectioning.scss","scss/layout/_container.scss","scss/layout/_section.scss","scss/layout/_grid.scss","scss/layout/_scroller.scss","scss/content/_typography.scss","scss/content/_embedded.scss","scss/content/_button.scss","scss/content/_form.scss","scss/content/_form-checkbox-radio.scss","scss/content/_form-alt-input-types.scss","scss/content/_table.scss","scss/content/_code.scss","scss/content/_miscs.scss","scss/components/_accordion.scss","scss/components/_card.scss","scss/components/_modal.scss","scss/components/_nav.scss","scss/components/_progress.scss","scss/components/_dropdown.scss","scss/utilities/_loading.scss","scss/utilities/_tooltip.scss","scss/utilities/_accessibility.scss","scss/utilities/_reduce-motion.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Pico CSS v1.5.10 (https://picocss.com)\n * Copyright 2019-2023 - Licensed under MIT\n */\n\n// Config\n@import \"variables\";\n\n// Theming\n@import \"themes/default\";\n\n// Layout\n@import \"layout/document\"; // html\n@import \"layout/sectioning\"; // body, header, main, footer\n@import \"layout/container\"; // .container, .container-fluid\n@import \"layout/section\"; // section\n@import \"layout/grid\"; // .grid\n@import \"layout/scroller\"; // figure\n\n// Content\n@import \"content/typography\"; // a, headings, p, ul, blockquote, ...\n@import \"content/embedded\"; // audio, canvas, iframe, img, svg, video\n@import \"content/button\"; // button, a[role=button], type=button, type=submit ...\n@import \"content/form\"; // input, select, textarea, label, fieldset, legend\n@import \"content/form-checkbox-radio\"; // type=checkbox, type=radio, role=switch\n@import \"content/form-alt-input-types\"; // type=color, type=date, type=file, type=search, ...\n@import \"content/table\"; // table, tr, td, ...\n@import \"content/code\"; // pre, code, ...\n@import \"content/miscs\"; // hr, template, [hidden], dialog, canvas\n\n// Components\n@import \"components/accordion\"; // details, summary\n@import \"components/card\"; // article\n@import \"components/modal\"; // dialog\n@import \"components/nav\"; // nav\n@import \"components/progress\"; // progress\n@import \"components/dropdown\"; // dropdown\n\n// Utilities\n@import \"utilities/loading\"; // aria-busy=true\n@import \"utilities/tooltip\"; // data-tooltip\n@import \"utilities/accessibility\"; // -ms-touch-action, aria-*\n@import \"utilities/reduce-motion\"; // prefers-reduced-motion\n","// Commons Styles\n:root {\n // Typography\n --font-family: system-ui, -apple-system, \"Segoe UI\", \"Roboto\", \"Ubuntu\",\n \"Cantarell\", \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\",\n \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --line-height: 1.5;\n --font-weight: 400;\n --font-size: 16px;\n\n // Responsive typography\n @if $enable-responsive-typography {\n @if map-get($breakpoints, \"sm\") {\n @media (min-width: map-get($breakpoints, \"sm\")) {\n --font-size: 17px;\n }\n }\n\n @if map-get($breakpoints, \"md\") {\n @media (min-width: map-get($breakpoints, \"md\")) {\n --font-size: 18px;\n }\n }\n\n @if map-get($breakpoints, \"lg\") {\n @media (min-width: map-get($breakpoints, \"lg\")) {\n --font-size: 19px;\n }\n }\n\n @if map-get($breakpoints, \"xl\") {\n @media (min-width: map-get($breakpoints, \"xl\")) {\n --font-size: 20px;\n }\n }\n }\n\n // Borders\n --border-radius: 0.25rem;\n --border-width: 1px;\n --outline-width: 3px;\n\n // Spacings\n --spacing: 1rem;\n\n // Spacings for typography elements\n --typography-spacing-vertical: 1.5rem;\n\n // Spacings for body > header, body > main, body > footer, section, article\n --block-spacing-vertical: calc(var(--spacing) * 2);\n --block-spacing-horizontal: var(--spacing);\n\n @if ($enable-classes and $enable-grid) {\n --grid-spacing-vertical: 0;\n --grid-spacing-horizontal: var(--spacing);\n }\n\n // Spacings for form elements and button\n --form-element-spacing-vertical: 0.75rem;\n --form-element-spacing-horizontal: 1rem;\n\n // Spacings for nav component\n --nav-element-spacing-vertical: 1rem;\n --nav-element-spacing-horizontal: 0.5rem;\n --nav-link-spacing-vertical: 0.5rem;\n --nav-link-spacing-horizontal: 0.5rem;\n\n // Font weight for form labels & fieldsets legend\n --form-label-font-weight: var(--font-weight);\n\n // Transitions\n --transition: 0.2s ease-in-out;\n\n // Modal ()\n --modal-overlay-backdrop-filter: blur(0.25rem);\n}\n\n// Responsives spacings\n@if $enable-responsive-spacings {\n // Sectioning\n #{$semantic-root-element} > header,\n #{$semantic-root-element} > main,\n #{$semantic-root-element} > footer,\n section {\n @if map-get($breakpoints, \"sm\") {\n @media (min-width: map-get($breakpoints, \"sm\")) {\n --block-spacing-vertical: calc(var(--spacing) * 2.5);\n }\n }\n\n @if map-get($breakpoints, \"md\") {\n @media (min-width: map-get($breakpoints, \"md\")) {\n --block-spacing-vertical: calc(var(--spacing) * 3);\n }\n }\n\n @if map-get($breakpoints, \"lg\") {\n @media (min-width: map-get($breakpoints, \"lg\")) {\n --block-spacing-vertical: calc(var(--spacing) * 3.5);\n }\n }\n\n @if map-get($breakpoints, \"xl\") {\n @media (min-width: map-get($breakpoints, \"xl\")) {\n --block-spacing-vertical: calc(var(--spacing) * 4);\n }\n }\n }\n\n // Card ()\n article {\n @if map-get($breakpoints, \"sm\") {\n @media (min-width: map-get($breakpoints, \"sm\")) {\n --block-spacing-horizontal: calc(var(--spacing) * 1.25);\n }\n }\n\n @if map-get($breakpoints, \"md\") {\n @media (min-width: map-get($breakpoints, \"md\")) {\n --block-spacing-horizontal: calc(var(--spacing) * 1.5);\n }\n }\n\n @if map-get($breakpoints, \"lg\") {\n @media (min-width: map-get($breakpoints, \"lg\")) {\n --block-spacing-horizontal: calc(var(--spacing) * 1.75);\n }\n }\n\n @if map-get($breakpoints, \"xl\") {\n @media (min-width: map-get($breakpoints, \"xl\")) {\n --block-spacing-horizontal: calc(var(--spacing) * 2);\n }\n }\n }\n\n // Modal\n dialog > article {\n\n --block-spacing-vertical: calc(var(--spacing) * 2);\n --block-spacing-horizontal: var(--spacing);\n\n @if map-get($breakpoints, \"sm\") {\n @media (min-width: map-get($breakpoints, \"sm\")) {\n --block-spacing-vertical: calc(var(--spacing) * 2.5);\n --block-spacing-horizontal: calc(var(--spacing) * 1.25);\n }\n }\n\n @if map-get($breakpoints, \"md\") {\n @media (min-width: map-get($breakpoints, \"md\")) {\n --block-spacing-vertical: calc(var(--spacing) * 3);\n --block-spacing-horizontal: calc(var(--spacing) * 1.5);\n }\n }\n }\n}\n\n// Link\na {\n --text-decoration: none;\n\n // Secondary & Contrast\n @if $enable-classes {\n &.secondary,\n &.contrast {\n --text-decoration: underline;\n }\n }\n}\n\n// Small\nsmall {\n --font-size: 0.875em;\n}\n\n// Headings\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n --font-weight: 700;\n}\n\nh1 {\n --font-size: 2rem;\n --typography-spacing-vertical: 3rem;\n}\n\nh2 {\n --font-size: 1.75rem;\n --typography-spacing-vertical: 2.625rem;\n}\n\nh3 {\n --font-size: 1.5rem;\n --typography-spacing-vertical: 2.25rem;\n}\n\nh4 {\n --font-size: 1.25rem;\n --typography-spacing-vertical: 1.874rem;\n}\n\nh5 {\n --font-size: 1.125rem;\n --typography-spacing-vertical: 1.6875rem;\n}\n\n// Forms elements\n[type=\"checkbox\"],\n[type=\"radio\"] {\n --border-width: 2px;\n}\n\n[type=\"checkbox\"][role=\"switch\"] {\n --border-width: 3px;\n}\n\n// Table\nthead,\ntfoot {\n th,\n td {\n --border-width: 3px;\n }\n}\n\n:not(thead, tfoot) > * > td {\n --font-size: 0.875em;\n}\n\n// Code\npre,\ncode,\nkbd,\nsamp {\n --font-family: \"Menlo\", \"Consolas\", \"Roboto Mono\", \"Ubuntu Monospace\",\n \"Noto Mono\", \"Oxygen Mono\", \"Liberation Mono\", monospace,\n \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n}\n\nkbd {\n --font-weight: bolder;\n}\n","@charset \"UTF-8\";\n/*!\n * Pico CSS v1.5.10 (https://picocss.com)\n * Copyright 2019-2023 - Licensed under MIT\n */\n/**\n * Theme: default\n */\n:root {\n --font-family: system-ui, -apple-system, \"Segoe UI\", \"Roboto\", \"Ubuntu\",\n \"Cantarell\", \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\",\n \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --line-height: 1.5;\n --font-weight: 400;\n --font-size: 16px;\n --border-radius: 0.25rem;\n --border-width: 1px;\n --outline-width: 3px;\n --spacing: 1rem;\n --typography-spacing-vertical: 1.5rem;\n --block-spacing-vertical: calc(var(--spacing) * 2);\n --block-spacing-horizontal: var(--spacing);\n --grid-spacing-vertical: 0;\n --grid-spacing-horizontal: var(--spacing);\n --form-element-spacing-vertical: 0.75rem;\n --form-element-spacing-horizontal: 1rem;\n --nav-element-spacing-vertical: 1rem;\n --nav-element-spacing-horizontal: 0.5rem;\n --nav-link-spacing-vertical: 0.5rem;\n --nav-link-spacing-horizontal: 0.5rem;\n --form-label-font-weight: var(--font-weight);\n --transition: 0.2s ease-in-out;\n --modal-overlay-backdrop-filter: blur(0.25rem);\n}\n@media (min-width: 576px) {\n :root {\n --font-size: 17px;\n }\n}\n@media (min-width: 768px) {\n :root {\n --font-size: 18px;\n }\n}\n@media (min-width: 992px) {\n :root {\n --font-size: 19px;\n }\n}\n@media (min-width: 1200px) {\n :root {\n --font-size: 20px;\n }\n}\n\n@media (min-width: 576px) {\n body > header,\n body > main,\n body > footer,\n section {\n --block-spacing-vertical: calc(var(--spacing) * 2.5);\n }\n}\n@media (min-width: 768px) {\n body > header,\n body > main,\n body > footer,\n section {\n --block-spacing-vertical: calc(var(--spacing) * 3);\n }\n}\n@media (min-width: 992px) {\n body > header,\n body > main,\n body > footer,\n section {\n --block-spacing-vertical: calc(var(--spacing) * 3.5);\n }\n}\n@media (min-width: 1200px) {\n body > header,\n body > main,\n body > footer,\n section {\n --block-spacing-vertical: calc(var(--spacing) * 4);\n }\n}\n\n@media (min-width: 576px) {\n article {\n --block-spacing-horizontal: calc(var(--spacing) * 1.25);\n }\n}\n@media (min-width: 768px) {\n article {\n --block-spacing-horizontal: calc(var(--spacing) * 1.5);\n }\n}\n@media (min-width: 992px) {\n article {\n --block-spacing-horizontal: calc(var(--spacing) * 1.75);\n }\n}\n@media (min-width: 1200px) {\n article {\n --block-spacing-horizontal: calc(var(--spacing) * 2);\n }\n}\n\ndialog > article {\n --block-spacing-vertical: calc(var(--spacing) * 2);\n --block-spacing-horizontal: var(--spacing);\n}\n@media (min-width: 576px) {\n dialog > article {\n --block-spacing-vertical: calc(var(--spacing) * 2.5);\n --block-spacing-horizontal: calc(var(--spacing) * 1.25);\n }\n}\n@media (min-width: 768px) {\n dialog > article {\n --block-spacing-vertical: calc(var(--spacing) * 3);\n --block-spacing-horizontal: calc(var(--spacing) * 1.5);\n }\n}\n\na {\n --text-decoration: none;\n}\na.secondary, a.contrast {\n --text-decoration: underline;\n}\n\nsmall {\n --font-size: 0.875em;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n --font-weight: 700;\n}\n\nh1 {\n --font-size: 2rem;\n --typography-spacing-vertical: 3rem;\n}\n\nh2 {\n --font-size: 1.75rem;\n --typography-spacing-vertical: 2.625rem;\n}\n\nh3 {\n --font-size: 1.5rem;\n --typography-spacing-vertical: 2.25rem;\n}\n\nh4 {\n --font-size: 1.25rem;\n --typography-spacing-vertical: 1.874rem;\n}\n\nh5 {\n --font-size: 1.125rem;\n --typography-spacing-vertical: 1.6875rem;\n}\n\n[type=checkbox],\n[type=radio] {\n --border-width: 2px;\n}\n\n[type=checkbox][role=switch] {\n --border-width: 3px;\n}\n\nthead th,\nthead td,\ntfoot th,\ntfoot td {\n --border-width: 3px;\n}\n\n:not(thead, tfoot) > * > td {\n --font-size: 0.875em;\n}\n\npre,\ncode,\nkbd,\nsamp {\n --font-family: \"Menlo\", \"Consolas\", \"Roboto Mono\", \"Ubuntu Monospace\",\n \"Noto Mono\", \"Oxygen Mono\", \"Liberation Mono\", monospace,\n \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n}\n\nkbd {\n --font-weight: bolder;\n}\n\n[data-theme=light],\n:root:not([data-theme=dark]) {\n --background-color: #fff;\n --color: hsl(205, 20%, 32%);\n --h1-color: hsl(205, 30%, 15%);\n --h2-color: #24333e;\n --h3-color: hsl(205, 25%, 23%);\n --h4-color: #374956;\n --h5-color: hsl(205, 20%, 32%);\n --h6-color: #4d606d;\n --muted-color: hsl(205, 10%, 50%);\n --muted-border-color: hsl(205, 20%, 94%);\n --primary: hsl(195, 85%, 41%);\n --primary-hover: hsl(195, 90%, 32%);\n --primary-focus: rgba(16, 149, 193, 0.125);\n --primary-inverse: #fff;\n --secondary: hsl(205, 15%, 41%);\n --secondary-hover: hsl(205, 20%, 32%);\n --secondary-focus: rgba(89, 107, 120, 0.125);\n --secondary-inverse: #fff;\n --contrast: hsl(205, 30%, 15%);\n --contrast-hover: #000;\n --contrast-focus: rgba(89, 107, 120, 0.125);\n --contrast-inverse: #fff;\n --mark-background-color: #fff2ca;\n --mark-color: #543a26;\n --ins-color: #388e3c;\n --del-color: #c62828;\n --blockquote-border-color: var(--muted-border-color);\n --blockquote-footer-color: var(--muted-color);\n --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --form-element-background-color: transparent;\n --form-element-border-color: hsl(205, 14%, 68%);\n --form-element-color: var(--color);\n --form-element-placeholder-color: var(--muted-color);\n --form-element-active-background-color: transparent;\n --form-element-active-border-color: var(--primary);\n --form-element-focus-color: var(--primary-focus);\n --form-element-disabled-background-color: hsl(205, 18%, 86%);\n --form-element-disabled-border-color: hsl(205, 14%, 68%);\n --form-element-disabled-opacity: 0.5;\n --form-element-invalid-border-color: #c62828;\n --form-element-invalid-active-border-color: #d32f2f;\n --form-element-invalid-focus-color: rgba(211, 47, 47, 0.125);\n --form-element-valid-border-color: #388e3c;\n --form-element-valid-active-border-color: #43a047;\n --form-element-valid-focus-color: rgba(67, 160, 71, 0.125);\n --switch-background-color: hsl(205, 16%, 77%);\n --switch-color: var(--primary-inverse);\n --switch-checked-background-color: var(--primary);\n --range-border-color: hsl(205, 18%, 86%);\n --range-active-border-color: hsl(205, 16%, 77%);\n --range-thumb-border-color: var(--background-color);\n --range-thumb-color: var(--secondary);\n --range-thumb-hover-color: var(--secondary-hover);\n --range-thumb-active-color: var(--primary);\n --table-border-color: var(--muted-border-color);\n --table-row-stripped-background-color: #f6f8f9;\n --code-background-color: hsl(205, 20%, 94%);\n --code-color: var(--muted-color);\n --code-kbd-background-color: var(--contrast);\n --code-kbd-color: var(--contrast-inverse);\n --code-tag-color: hsl(330, 40%, 50%);\n --code-property-color: hsl(185, 40%, 40%);\n --code-value-color: hsl(40, 20%, 50%);\n --code-comment-color: hsl(205, 14%, 68%);\n --accordion-border-color: var(--muted-border-color);\n --accordion-close-summary-color: var(--color);\n --accordion-open-summary-color: var(--muted-color);\n --card-background-color: var(--background-color);\n --card-border-color: var(--muted-border-color);\n --card-box-shadow:\n 0.0145rem 0.029rem 0.174rem rgba(27, 40, 50, 0.01698),\n 0.0335rem 0.067rem 0.402rem rgba(27, 40, 50, 0.024),\n 0.0625rem 0.125rem 0.75rem rgba(27, 40, 50, 0.03),\n 0.1125rem 0.225rem 1.35rem rgba(27, 40, 50, 0.036),\n 0.2085rem 0.417rem 2.502rem rgba(27, 40, 50, 0.04302),\n 0.5rem 1rem 6rem rgba(27, 40, 50, 0.06),\n 0 0 0 0.0625rem rgba(27, 40, 50, 0.015);\n --card-sectionning-background-color: #fbfbfc;\n --dropdown-background-color: #fbfbfc;\n --dropdown-border-color: #e1e6eb;\n --dropdown-box-shadow: var(--card-box-shadow);\n --dropdown-color: var(--color);\n --dropdown-hover-background-color: hsl(205, 20%, 94%);\n --modal-overlay-background-color: rgba(213, 220, 226, 0.7);\n --progress-background-color: hsl(205, 18%, 86%);\n --progress-color: var(--primary);\n --loading-spinner-opacity: 0.5;\n --tooltip-background-color: var(--contrast);\n --tooltip-color: var(--contrast-inverse);\n --icon-checkbox: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button-inverse: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-close: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E\");\n --icon-date: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E\");\n --icon-invalid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(198, 40, 40)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E\");\n --icon-minus: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E\");\n --icon-search: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\");\n --icon-time: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-valid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(56, 142, 60)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n color-scheme: light;\n}\n\n@media only screen and (prefers-color-scheme: dark) {\n :root:not([data-theme]) {\n --background-color: #11191f;\n --color: hsl(205, 16%, 77%);\n --h1-color: hsl(205, 20%, 94%);\n --h2-color: #e1e6eb;\n --h3-color: hsl(205, 18%, 86%);\n --h4-color: #c8d1d8;\n --h5-color: hsl(205, 16%, 77%);\n --h6-color: #afbbc4;\n --muted-color: hsl(205, 10%, 50%);\n --muted-border-color: #1f2d38;\n --primary: hsl(195, 85%, 41%);\n --primary-hover: hsl(195, 80%, 50%);\n --primary-focus: rgba(16, 149, 193, 0.25);\n --primary-inverse: #fff;\n --secondary: hsl(205, 15%, 41%);\n --secondary-hover: hsl(205, 10%, 50%);\n --secondary-focus: rgba(115, 130, 140, 0.25);\n --secondary-inverse: #fff;\n --contrast: hsl(205, 20%, 94%);\n --contrast-hover: #fff;\n --contrast-focus: rgba(115, 130, 140, 0.25);\n --contrast-inverse: #000;\n --mark-background-color: #d1c284;\n --mark-color: #11191f;\n --ins-color: #388e3c;\n --del-color: #c62828;\n --blockquote-border-color: var(--muted-border-color);\n --blockquote-footer-color: var(--muted-color);\n --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --form-element-background-color: #11191f;\n --form-element-border-color: #374956;\n --form-element-color: var(--color);\n --form-element-placeholder-color: var(--muted-color);\n --form-element-active-background-color: var(--form-element-background-color);\n --form-element-active-border-color: var(--primary);\n --form-element-focus-color: var(--primary-focus);\n --form-element-disabled-background-color: hsl(205, 25%, 23%);\n --form-element-disabled-border-color: hsl(205, 20%, 32%);\n --form-element-disabled-opacity: 0.5;\n --form-element-invalid-border-color: #b71c1c;\n --form-element-invalid-active-border-color: #c62828;\n --form-element-invalid-focus-color: rgba(198, 40, 40, 0.25);\n --form-element-valid-border-color: #2e7d32;\n --form-element-valid-active-border-color: #388e3c;\n --form-element-valid-focus-color: rgba(56, 142, 60, 0.25);\n --switch-background-color: #374956;\n --switch-color: var(--primary-inverse);\n --switch-checked-background-color: var(--primary);\n --range-border-color: #24333e;\n --range-active-border-color: hsl(205, 25%, 23%);\n --range-thumb-border-color: var(--background-color);\n --range-thumb-color: var(--secondary);\n --range-thumb-hover-color: var(--secondary-hover);\n --range-thumb-active-color: var(--primary);\n --table-border-color: var(--muted-border-color);\n --table-row-stripped-background-color: rgba(115, 130, 140, 0.05);\n --code-background-color: #18232c;\n --code-color: var(--muted-color);\n --code-kbd-background-color: var(--contrast);\n --code-kbd-color: var(--contrast-inverse);\n --code-tag-color: hsl(330, 30%, 50%);\n --code-property-color: hsl(185, 30%, 50%);\n --code-value-color: hsl(40, 10%, 50%);\n --code-comment-color: #4d606d;\n --accordion-border-color: var(--muted-border-color);\n --accordion-active-summary-color: var(--primary);\n --accordion-close-summary-color: var(--color);\n --accordion-open-summary-color: var(--muted-color);\n --card-background-color: #141e26;\n --card-border-color: var(--card-background-color);\n --card-box-shadow:\n 0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698),\n 0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024),\n 0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03),\n 0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036),\n 0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302),\n 0.5rem 1rem 6rem rgba(0, 0, 0, 0.06),\n 0 0 0 0.0625rem rgba(0, 0, 0, 0.015);\n --card-sectionning-background-color: #18232c;\n --dropdown-background-color: hsl(205, 30%, 15%);\n --dropdown-border-color: #24333e;\n --dropdown-box-shadow: var(--card-box-shadow);\n --dropdown-color: var(--color);\n --dropdown-hover-background-color: rgba(36, 51, 62, 0.75);\n --modal-overlay-background-color: rgba(36, 51, 62, 0.8);\n --progress-background-color: #24333e;\n --progress-color: var(--primary);\n --loading-spinner-opacity: 0.5;\n --tooltip-background-color: var(--contrast);\n --tooltip-color: var(--contrast-inverse);\n --icon-checkbox: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button-inverse: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-close: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E\");\n --icon-date: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E\");\n --icon-invalid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E\");\n --icon-minus: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E\");\n --icon-search: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\");\n --icon-time: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-valid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n color-scheme: dark;\n }\n}\n[data-theme=dark] {\n --background-color: #11191f;\n --color: hsl(205, 16%, 77%);\n --h1-color: hsl(205, 20%, 94%);\n --h2-color: #e1e6eb;\n --h3-color: hsl(205, 18%, 86%);\n --h4-color: #c8d1d8;\n --h5-color: hsl(205, 16%, 77%);\n --h6-color: #afbbc4;\n --muted-color: hsl(205, 10%, 50%);\n --muted-border-color: #1f2d38;\n --primary: hsl(195, 85%, 41%);\n --primary-hover: hsl(195, 80%, 50%);\n --primary-focus: rgba(16, 149, 193, 0.25);\n --primary-inverse: #fff;\n --secondary: hsl(205, 15%, 41%);\n --secondary-hover: hsl(205, 10%, 50%);\n --secondary-focus: rgba(115, 130, 140, 0.25);\n --secondary-inverse: #fff;\n --contrast: hsl(205, 20%, 94%);\n --contrast-hover: #fff;\n --contrast-focus: rgba(115, 130, 140, 0.25);\n --contrast-inverse: #000;\n --mark-background-color: #d1c284;\n --mark-color: #11191f;\n --ins-color: #388e3c;\n --del-color: #c62828;\n --blockquote-border-color: var(--muted-border-color);\n --blockquote-footer-color: var(--muted-color);\n --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --form-element-background-color: #11191f;\n --form-element-border-color: #374956;\n --form-element-color: var(--color);\n --form-element-placeholder-color: var(--muted-color);\n --form-element-active-background-color: var(--form-element-background-color);\n --form-element-active-border-color: var(--primary);\n --form-element-focus-color: var(--primary-focus);\n --form-element-disabled-background-color: hsl(205, 25%, 23%);\n --form-element-disabled-border-color: hsl(205, 20%, 32%);\n --form-element-disabled-opacity: 0.5;\n --form-element-invalid-border-color: #b71c1c;\n --form-element-invalid-active-border-color: #c62828;\n --form-element-invalid-focus-color: rgba(198, 40, 40, 0.25);\n --form-element-valid-border-color: #2e7d32;\n --form-element-valid-active-border-color: #388e3c;\n --form-element-valid-focus-color: rgba(56, 142, 60, 0.25);\n --switch-background-color: #374956;\n --switch-color: var(--primary-inverse);\n --switch-checked-background-color: var(--primary);\n --range-border-color: #24333e;\n --range-active-border-color: hsl(205, 25%, 23%);\n --range-thumb-border-color: var(--background-color);\n --range-thumb-color: var(--secondary);\n --range-thumb-hover-color: var(--secondary-hover);\n --range-thumb-active-color: var(--primary);\n --table-border-color: var(--muted-border-color);\n --table-row-stripped-background-color: rgba(115, 130, 140, 0.05);\n --code-background-color: #18232c;\n --code-color: var(--muted-color);\n --code-kbd-background-color: var(--contrast);\n --code-kbd-color: var(--contrast-inverse);\n --code-tag-color: hsl(330, 30%, 50%);\n --code-property-color: hsl(185, 30%, 50%);\n --code-value-color: hsl(40, 10%, 50%);\n --code-comment-color: #4d606d;\n --accordion-border-color: var(--muted-border-color);\n --accordion-active-summary-color: var(--primary);\n --accordion-close-summary-color: var(--color);\n --accordion-open-summary-color: var(--muted-color);\n --card-background-color: #141e26;\n --card-border-color: var(--card-background-color);\n --card-box-shadow:\n 0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698),\n 0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024),\n 0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03),\n 0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036),\n 0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302),\n 0.5rem 1rem 6rem rgba(0, 0, 0, 0.06),\n 0 0 0 0.0625rem rgba(0, 0, 0, 0.015);\n --card-sectionning-background-color: #18232c;\n --dropdown-background-color: hsl(205, 30%, 15%);\n --dropdown-border-color: #24333e;\n --dropdown-box-shadow: var(--card-box-shadow);\n --dropdown-color: var(--color);\n --dropdown-hover-background-color: rgba(36, 51, 62, 0.75);\n --modal-overlay-background-color: rgba(36, 51, 62, 0.8);\n --progress-background-color: #24333e;\n --progress-color: var(--primary);\n --loading-spinner-opacity: 0.5;\n --tooltip-background-color: var(--contrast);\n --tooltip-color: var(--contrast-inverse);\n --icon-checkbox: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button-inverse: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-close: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E\");\n --icon-date: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E\");\n --icon-invalid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E\");\n --icon-minus: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E\");\n --icon-search: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\");\n --icon-time: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-valid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n color-scheme: dark;\n}\n\nprogress,\n[type=checkbox],\n[type=radio],\n[type=range] {\n accent-color: var(--primary);\n}\n\n/**\n * Document\n * Content-box & Responsive typography\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n background-repeat: no-repeat;\n}\n\n::before,\n::after {\n text-decoration: inherit;\n vertical-align: inherit;\n}\n\n:where(:root) {\n -webkit-tap-highlight-color: transparent;\n -webkit-text-size-adjust: 100%;\n text-size-adjust: 100%;\n background-color: var(--background-color);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n line-height: var(--line-height);\n font-family: var(--font-family);\n text-rendering: optimizeLegibility;\n overflow-wrap: break-word;\n cursor: default;\n tab-size: 4;\n}\n\n/**\n * Sectioning\n * Container and responsive spacings for header, main, footer\n */\nmain {\n display: block;\n}\n\nbody {\n width: 100%;\n margin: 0;\n}\nbody > header,\nbody > main,\nbody > footer {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding: var(--block-spacing-vertical) 0;\n}\n\n/**\n* Container\n*/\n.container,\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: var(--spacing);\n padding-left: var(--spacing);\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 510px;\n padding-right: 0;\n padding-left: 0;\n }\n}\n@media (min-width: 768px) {\n .container {\n max-width: 700px;\n }\n}\n@media (min-width: 992px) {\n .container {\n max-width: 920px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n max-width: 1130px;\n }\n}\n\n/**\n * Section\n * Responsive spacings for section\n */\nsection {\n margin-bottom: var(--block-spacing-vertical);\n}\n\n/**\n* Grid\n* Minimal grid system with auto-layout columns\n*/\n.grid {\n grid-column-gap: var(--grid-spacing-horizontal);\n grid-row-gap: var(--grid-spacing-vertical);\n display: grid;\n grid-template-columns: 1fr;\n margin: 0;\n}\n@media (min-width: 992px) {\n .grid {\n grid-template-columns: repeat(auto-fit, minmax(0%, 1fr));\n }\n}\n.grid > * {\n min-width: 0;\n}\n\n/**\n * Horizontal scroller ()\n */\nfigure {\n display: block;\n margin: 0;\n padding: 0;\n overflow-x: auto;\n}\nfigure figcaption {\n padding: calc(var(--spacing) * 0.5) 0;\n color: var(--muted-color);\n}\n\n/**\n * Typography\n */\nb,\nstrong {\n font-weight: bolder;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\naddress,\nblockquote,\ndl,\nfigure,\nform,\nol,\np,\npre,\ntable,\nul {\n margin-top: 0;\n margin-bottom: var(--typography-spacing-vertical);\n color: var(--color);\n font-style: normal;\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n}\n\na,\n[role=link] {\n --color: var(--primary);\n --background-color: transparent;\n outline: none;\n background-color: var(--background-color);\n color: var(--color);\n text-decoration: var(--text-decoration);\n transition: background-color var(--transition), color var(--transition), text-decoration var(--transition), box-shadow var(--transition);\n}\na:is([aria-current], :hover, :active, :focus),\n[role=link]:is([aria-current], :hover, :active, :focus) {\n --color: var(--primary-hover);\n --text-decoration: underline;\n}\na:focus,\n[role=link]:focus {\n --background-color: var(--primary-focus);\n}\na.secondary,\n[role=link].secondary {\n --color: var(--secondary);\n}\na.secondary:is([aria-current], :hover, :active, :focus),\n[role=link].secondary:is([aria-current], :hover, :active, :focus) {\n --color: var(--secondary-hover);\n}\na.secondary:focus,\n[role=link].secondary:focus {\n --background-color: var(--secondary-focus);\n}\na.contrast,\n[role=link].contrast {\n --color: var(--contrast);\n}\na.contrast:is([aria-current], :hover, :active, :focus),\n[role=link].contrast:is([aria-current], :hover, :active, :focus) {\n --color: var(--contrast-hover);\n}\na.contrast:focus,\n[role=link].contrast:focus {\n --background-color: var(--contrast-focus);\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n margin-bottom: var(--typography-spacing-vertical);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n font-family: var(--font-family);\n}\n\nh1 {\n --color: var(--h1-color);\n}\n\nh2 {\n --color: var(--h2-color);\n}\n\nh3 {\n --color: var(--h3-color);\n}\n\nh4 {\n --color: var(--h4-color);\n}\n\nh5 {\n --color: var(--h5-color);\n}\n\nh6 {\n --color: var(--h6-color);\n}\n\n:where(address, blockquote, dl, figure, form, ol, p, pre, table, ul) ~ :is(h1, h2, h3, h4, h5, h6) {\n margin-top: var(--typography-spacing-vertical);\n}\n\nhgroup,\n.headings {\n margin-bottom: var(--typography-spacing-vertical);\n}\nhgroup > *,\n.headings > * {\n margin-bottom: 0;\n}\nhgroup > *:last-child,\n.headings > *:last-child {\n --color: var(--muted-color);\n --font-weight: unset;\n font-size: 1rem;\n font-family: unset;\n}\n\np {\n margin-bottom: var(--typography-spacing-vertical);\n}\n\nsmall {\n font-size: var(--font-size);\n}\n\n:where(dl, ol, ul) {\n padding-right: 0;\n padding-left: var(--spacing);\n padding-inline-start: var(--spacing);\n padding-inline-end: 0;\n}\n:where(dl, ol, ul) li {\n margin-bottom: calc(var(--typography-spacing-vertical) * 0.25);\n}\n\n:where(dl, ol, ul) :is(dl, ol, ul) {\n margin: 0;\n margin-top: calc(var(--typography-spacing-vertical) * 0.25);\n}\n\nul li {\n list-style: square;\n}\n\nmark {\n padding: 0.125rem 0.25rem;\n background-color: var(--mark-background-color);\n color: var(--mark-color);\n vertical-align: baseline;\n}\n\nblockquote {\n display: block;\n margin: var(--typography-spacing-vertical) 0;\n padding: var(--spacing);\n border-right: none;\n border-left: 0.25rem solid var(--blockquote-border-color);\n border-inline-start: 0.25rem solid var(--blockquote-border-color);\n border-inline-end: none;\n}\nblockquote footer {\n margin-top: calc(var(--typography-spacing-vertical) * 0.5);\n color: var(--blockquote-footer-color);\n}\n\nabbr[title] {\n border-bottom: 1px dotted;\n text-decoration: none;\n cursor: help;\n}\n\nins {\n color: var(--ins-color);\n text-decoration: none;\n}\n\ndel {\n color: var(--del-color);\n}\n\n::selection {\n background-color: var(--primary-focus);\n}\n\n/**\n * Embedded content\n */\n:where(audio, canvas, iframe, img, svg, video) {\n vertical-align: middle;\n}\n\naudio,\nvideo {\n display: inline-block;\n}\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n:where(iframe) {\n border-style: none;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n border-style: none;\n}\n\n:where(svg:not([fill])) {\n fill: currentColor;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/**\n * Button\n */\nbutton {\n margin: 0;\n overflow: visible;\n font-family: inherit;\n text-transform: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\n\nbutton {\n display: block;\n width: 100%;\n margin-bottom: var(--spacing);\n}\n\n[role=button] {\n display: inline-block;\n text-decoration: none;\n}\n\nbutton,\ninput[type=submit],\ninput[type=button],\ninput[type=reset],\n[role=button] {\n --background-color: var(--primary);\n --border-color: var(--primary);\n --color: var(--primary-inverse);\n --box-shadow: var(--button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));\n padding: var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: 1rem;\n line-height: var(--line-height);\n text-align: center;\n cursor: pointer;\n transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition);\n}\nbutton:is([aria-current], :hover, :active, :focus),\ninput[type=submit]:is([aria-current], :hover, :active, :focus),\ninput[type=button]:is([aria-current], :hover, :active, :focus),\ninput[type=reset]:is([aria-current], :hover, :active, :focus),\n[role=button]:is([aria-current], :hover, :active, :focus) {\n --background-color: var(--primary-hover);\n --border-color: var(--primary-hover);\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));\n --color: var(--primary-inverse);\n}\nbutton:focus,\ninput[type=submit]:focus,\ninput[type=button]:focus,\ninput[type=reset]:focus,\n[role=button]:focus {\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),\n 0 0 0 var(--outline-width) var(--primary-focus);\n}\n\n:is(button, input[type=submit], input[type=button], [role=button]).secondary,\ninput[type=reset] {\n --background-color: var(--secondary);\n --border-color: var(--secondary);\n --color: var(--secondary-inverse);\n cursor: pointer;\n}\n:is(button, input[type=submit], input[type=button], [role=button]).secondary:is([aria-current], :hover, :active, :focus),\ninput[type=reset]:is([aria-current], :hover, :active, :focus) {\n --background-color: var(--secondary-hover);\n --border-color: var(--secondary-hover);\n --color: var(--secondary-inverse);\n}\n:is(button, input[type=submit], input[type=button], [role=button]).secondary:focus,\ninput[type=reset]:focus {\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),\n 0 0 0 var(--outline-width) var(--secondary-focus);\n}\n\n:is(button, input[type=submit], input[type=button], [role=button]).contrast {\n --background-color: var(--contrast);\n --border-color: var(--contrast);\n --color: var(--contrast-inverse);\n}\n:is(button, input[type=submit], input[type=button], [role=button]).contrast:is([aria-current], :hover, :active, :focus) {\n --background-color: var(--contrast-hover);\n --border-color: var(--contrast-hover);\n --color: var(--contrast-inverse);\n}\n:is(button, input[type=submit], input[type=button], [role=button]).contrast:focus {\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),\n 0 0 0 var(--outline-width) var(--contrast-focus);\n}\n\n:is(button, input[type=submit], input[type=button], [role=button]).outline,\ninput[type=reset].outline {\n --background-color: transparent;\n --color: var(--primary);\n}\n:is(button, input[type=submit], input[type=button], [role=button]).outline:is([aria-current], :hover, :active, :focus),\ninput[type=reset].outline:is([aria-current], :hover, :active, :focus) {\n --background-color: transparent;\n --color: var(--primary-hover);\n}\n\n:is(button, input[type=submit], input[type=button], [role=button]).outline.secondary,\ninput[type=reset].outline {\n --color: var(--secondary);\n}\n:is(button, input[type=submit], input[type=button], [role=button]).outline.secondary:is([aria-current], :hover, :active, :focus),\ninput[type=reset].outline:is([aria-current], :hover, :active, :focus) {\n --color: var(--secondary-hover);\n}\n\n:is(button, input[type=submit], input[type=button], [role=button]).outline.contrast {\n --color: var(--contrast);\n}\n:is(button, input[type=submit], input[type=button], [role=button]).outline.contrast:is([aria-current], :hover, :active, :focus) {\n --color: var(--contrast-hover);\n}\n\n:where(button, [type=submit], [type=button], [type=reset], [role=button])[disabled],\n:where(fieldset[disabled]) :is(button, [type=submit], [type=button], [type=reset], [role=button]),\na[role=button]:not([href]) {\n opacity: 0.5;\n pointer-events: none;\n}\n\n/**\n * Form elements\n */\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font-size: 1rem;\n line-height: var(--line-height);\n font-family: inherit;\n letter-spacing: inherit;\n}\n\ninput {\n overflow: visible;\n}\n\nselect {\n text-transform: none;\n}\n\nlegend {\n max-width: 100%;\n padding: 0;\n color: inherit;\n white-space: normal;\n}\n\ntextarea {\n overflow: auto;\n}\n\n[type=checkbox],\n[type=radio] {\n padding: 0;\n}\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n\n[type=search]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n:-moz-focusring {\n outline: none;\n}\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n::-ms-expand {\n display: none;\n}\n\n[type=file],\n[type=range] {\n padding: 0;\n border-width: 0;\n}\n\ninput:not([type=checkbox], [type=radio], [type=range]) {\n height: calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2);\n}\n\nfieldset {\n margin: 0;\n margin-bottom: var(--spacing);\n padding: 0;\n border: 0;\n}\n\nlabel,\nfieldset legend {\n display: block;\n margin-bottom: calc(var(--spacing) * 0.25);\n font-weight: var(--form-label-font-weight, var(--font-weight));\n}\n\ninput:not([type=checkbox], [type=radio]),\nselect,\ntextarea {\n width: 100%;\n}\n\ninput:not([type=checkbox], [type=radio], [type=range], [type=file]),\nselect,\ntextarea {\n appearance: none;\n padding: var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);\n}\n\ninput,\nselect,\ntextarea {\n --background-color: var(--form-element-background-color);\n --border-color: var(--form-element-border-color);\n --color: var(--form-element-color);\n --box-shadow: none;\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition);\n}\n\ninput:not([type=submit], [type=button], [type=reset], [type=checkbox], [type=radio], [readonly]):is(:active, :focus),\n:where(select, textarea):is(:active, :focus) {\n --background-color: var(--form-element-active-background-color);\n}\n\ninput:not([type=submit], [type=button], [type=reset], [role=switch], [readonly]):is(:active, :focus),\n:where(select, textarea):is(:active, :focus) {\n --border-color: var(--form-element-active-border-color);\n}\n\ninput:not([type=submit], [type=button], [type=reset], [type=range], [type=file], [readonly]):focus,\nselect:focus,\ntextarea:focus {\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);\n}\n\ninput:not([type=submit], [type=button], [type=reset])[disabled],\nselect[disabled],\ntextarea[disabled],\n:where(fieldset[disabled]) :is(input:not([type=submit], [type=button], [type=reset]), select, textarea) {\n --background-color: var(--form-element-disabled-background-color);\n --border-color: var(--form-element-disabled-border-color);\n opacity: var(--form-element-disabled-opacity);\n pointer-events: none;\n}\n\n:where(input, select, textarea):not([type=checkbox], [type=radio], [type=date], [type=datetime-local], [type=month], [type=time], [type=week])[aria-invalid] {\n padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem) !important;\n padding-left: var(--form-element-spacing-horizontal);\n padding-inline-start: var(--form-element-spacing-horizontal) !important;\n padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem) !important;\n background-position: center right 0.75rem;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n}\n:where(input, select, textarea):not([type=checkbox], [type=radio], [type=date], [type=datetime-local], [type=month], [type=time], [type=week])[aria-invalid=false] {\n background-image: var(--icon-valid);\n}\n:where(input, select, textarea):not([type=checkbox], [type=radio], [type=date], [type=datetime-local], [type=month], [type=time], [type=week])[aria-invalid=true] {\n background-image: var(--icon-invalid);\n}\n:where(input, select, textarea)[aria-invalid=false] {\n --border-color: var(--form-element-valid-border-color);\n}\n:where(input, select, textarea)[aria-invalid=false]:is(:active, :focus) {\n --border-color: var(--form-element-valid-active-border-color) !important;\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color) !important;\n}\n:where(input, select, textarea)[aria-invalid=true] {\n --border-color: var(--form-element-invalid-border-color);\n}\n:where(input, select, textarea)[aria-invalid=true]:is(:active, :focus) {\n --border-color: var(--form-element-invalid-active-border-color) !important;\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color) !important;\n}\n\n[dir=rtl] :where(input, select, textarea):not([type=checkbox], [type=radio]):is([aria-invalid], [aria-invalid=true], [aria-invalid=false]) {\n background-position: center left 0.75rem;\n}\n\ninput::placeholder,\ninput::-webkit-input-placeholder,\ntextarea::placeholder,\ntextarea::-webkit-input-placeholder,\nselect:invalid {\n color: var(--form-element-placeholder-color);\n opacity: 1;\n}\n\ninput:not([type=checkbox], [type=radio]),\nselect,\ntextarea {\n margin-bottom: var(--spacing);\n}\n\nselect::-ms-expand {\n border: 0;\n background-color: transparent;\n}\nselect:not([multiple], [size]) {\n padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem);\n padding-left: var(--form-element-spacing-horizontal);\n padding-inline-start: var(--form-element-spacing-horizontal);\n padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem);\n background-image: var(--icon-chevron);\n background-position: center right 0.75rem;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n}\n\n[dir=rtl] select:not([multiple], [size]) {\n background-position: center left 0.75rem;\n}\n\n:where(input, select, textarea, .grid) + small {\n display: block;\n width: 100%;\n margin-top: calc(var(--spacing) * -0.75);\n margin-bottom: var(--spacing);\n color: var(--muted-color);\n}\n\nlabel > :where(input, select, textarea) {\n margin-top: calc(var(--spacing) * 0.25);\n}\n\n/**\n * Form elements\n * Checkboxes & Radios\n */\n[type=checkbox],\n[type=radio] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n width: 1.25em;\n height: 1.25em;\n margin-top: -0.125em;\n margin-right: 0.375em;\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: 0.375em;\n border-width: var(--border-width);\n font-size: inherit;\n vertical-align: middle;\n cursor: pointer;\n}\n[type=checkbox]::-ms-check,\n[type=radio]::-ms-check {\n display: none;\n}\n[type=checkbox]:checked, [type=checkbox]:checked:active, [type=checkbox]:checked:focus,\n[type=radio]:checked,\n[type=radio]:checked:active,\n[type=radio]:checked:focus {\n --background-color: var(--primary);\n --border-color: var(--primary);\n background-image: var(--icon-checkbox);\n background-position: center;\n background-size: 0.75em auto;\n background-repeat: no-repeat;\n}\n[type=checkbox] ~ label,\n[type=radio] ~ label {\n display: inline-block;\n margin-right: 0.375em;\n margin-bottom: 0;\n cursor: pointer;\n}\n\n[type=checkbox]:indeterminate {\n --background-color: var(--primary);\n --border-color: var(--primary);\n background-image: var(--icon-minus);\n background-position: center;\n background-size: 0.75em auto;\n background-repeat: no-repeat;\n}\n\n[type=radio] {\n border-radius: 50%;\n}\n[type=radio]:checked, [type=radio]:checked:active, [type=radio]:checked:focus {\n --background-color: var(--primary-inverse);\n border-width: 0.35em;\n background-image: none;\n}\n\n[type=checkbox][role=switch] {\n --background-color: var(--switch-background-color);\n --border-color: var(--switch-background-color);\n --color: var(--switch-color);\n width: 2.25em;\n height: 1.25em;\n border: var(--border-width) solid var(--border-color);\n border-radius: 1.25em;\n background-color: var(--background-color);\n line-height: 1.25em;\n}\n[type=checkbox][role=switch]:focus {\n --background-color: var(--switch-background-color);\n --border-color: var(--switch-background-color);\n}\n[type=checkbox][role=switch]:checked {\n --background-color: var(--switch-checked-background-color);\n --border-color: var(--switch-checked-background-color);\n}\n[type=checkbox][role=switch]:before {\n display: block;\n width: calc(1.25em - (var(--border-width) * 2));\n height: 100%;\n border-radius: 50%;\n background-color: var(--color);\n content: \"\";\n transition: margin 0.1s ease-in-out;\n}\n[type=checkbox][role=switch]:checked {\n background-image: none;\n}\n[type=checkbox][role=switch]:checked::before {\n margin-left: calc(1.125em - var(--border-width));\n margin-inline-start: calc(1.125em - var(--border-width));\n}\n\n[type=checkbox][aria-invalid=false],\n[type=checkbox]:checked[aria-invalid=false],\n[type=radio][aria-invalid=false],\n[type=radio]:checked[aria-invalid=false],\n[type=checkbox][role=switch][aria-invalid=false],\n[type=checkbox][role=switch]:checked[aria-invalid=false] {\n --border-color: var(--form-element-valid-border-color);\n}\n[type=checkbox][aria-invalid=true],\n[type=checkbox]:checked[aria-invalid=true],\n[type=radio][aria-invalid=true],\n[type=radio]:checked[aria-invalid=true],\n[type=checkbox][role=switch][aria-invalid=true],\n[type=checkbox][role=switch]:checked[aria-invalid=true] {\n --border-color: var(--form-element-invalid-border-color);\n}\n\n/**\n * Form elements\n * Alternatives input types (Not Checkboxes & Radios)\n */\n[type=color]::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n[type=color]::-moz-focus-inner {\n padding: 0;\n}\n[type=color]::-webkit-color-swatch {\n border: 0;\n border-radius: calc(var(--border-radius) * 0.5);\n}\n[type=color]::-moz-color-swatch {\n border: 0;\n border-radius: calc(var(--border-radius) * 0.5);\n}\n\ninput:not([type=checkbox], [type=radio], [type=range], [type=file]):is([type=date], [type=datetime-local], [type=month], [type=time], [type=week]) {\n --icon-position: 0.75rem;\n --icon-width: 1rem;\n padding-right: calc(var(--icon-width) + var(--icon-position));\n background-image: var(--icon-date);\n background-position: center right var(--icon-position);\n background-size: var(--icon-width) auto;\n background-repeat: no-repeat;\n}\ninput:not([type=checkbox], [type=radio], [type=range], [type=file])[type=time] {\n background-image: var(--icon-time);\n}\n\n[type=date]::-webkit-calendar-picker-indicator,\n[type=datetime-local]::-webkit-calendar-picker-indicator,\n[type=month]::-webkit-calendar-picker-indicator,\n[type=time]::-webkit-calendar-picker-indicator,\n[type=week]::-webkit-calendar-picker-indicator {\n width: var(--icon-width);\n margin-right: calc(var(--icon-width) * -1);\n margin-left: var(--icon-position);\n opacity: 0;\n}\n\n[dir=rtl] :is([type=date], [type=datetime-local], [type=month], [type=time], [type=week]) {\n text-align: right;\n}\n\n@-moz-document url-prefix() {\n [type=date],\n [type=datetime-local],\n [type=month],\n [type=time],\n [type=week] {\n padding-right: var(--form-element-spacing-horizontal) !important;\n background-image: none !important;\n }\n}\n[type=file] {\n --color: var(--muted-color);\n padding: calc(var(--form-element-spacing-vertical) * 0.5) 0;\n border: 0;\n border-radius: 0;\n background: none;\n}\n[type=file]::file-selector-button {\n --background-color: var(--secondary);\n --border-color: var(--secondary);\n --color: var(--secondary-inverse);\n margin-right: calc(var(--spacing) / 2);\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: calc(var(--spacing) / 2);\n padding: calc(var(--form-element-spacing-vertical) * 0.5) calc(var(--form-element-spacing-horizontal) * 0.5);\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: 1rem;\n line-height: var(--line-height);\n text-align: center;\n cursor: pointer;\n transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition);\n}\n[type=file]::file-selector-button:is(:hover, :active, :focus) {\n --background-color: var(--secondary-hover);\n --border-color: var(--secondary-hover);\n}\n[type=file]::-webkit-file-upload-button {\n --background-color: var(--secondary);\n --border-color: var(--secondary);\n --color: var(--secondary-inverse);\n margin-right: calc(var(--spacing) / 2);\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: calc(var(--spacing) / 2);\n padding: calc(var(--form-element-spacing-vertical) * 0.5) calc(var(--form-element-spacing-horizontal) * 0.5);\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: 1rem;\n line-height: var(--line-height);\n text-align: center;\n cursor: pointer;\n transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition);\n}\n[type=file]::-webkit-file-upload-button:is(:hover, :active, :focus) {\n --background-color: var(--secondary-hover);\n --border-color: var(--secondary-hover);\n}\n[type=file]::-ms-browse {\n --background-color: var(--secondary);\n --border-color: var(--secondary);\n --color: var(--secondary-inverse);\n margin-right: calc(var(--spacing) / 2);\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: calc(var(--spacing) / 2);\n padding: calc(var(--form-element-spacing-vertical) * 0.5) calc(var(--form-element-spacing-horizontal) * 0.5);\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: 1rem;\n line-height: var(--line-height);\n text-align: center;\n cursor: pointer;\n transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition);\n}\n[type=file]::-ms-browse:is(:hover, :active, :focus) {\n --background-color: var(--secondary-hover);\n --border-color: var(--secondary-hover);\n}\n\n[type=range] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n width: 100%;\n height: 1.25rem;\n background: none;\n}\n[type=range]::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.25rem;\n border-radius: var(--border-radius);\n background-color: var(--range-border-color);\n transition: background-color var(--transition), box-shadow var(--transition);\n}\n[type=range]::-moz-range-track {\n width: 100%;\n height: 0.25rem;\n border-radius: var(--border-radius);\n background-color: var(--range-border-color);\n transition: background-color var(--transition), box-shadow var(--transition);\n}\n[type=range]::-ms-track {\n width: 100%;\n height: 0.25rem;\n border-radius: var(--border-radius);\n background-color: var(--range-border-color);\n transition: background-color var(--transition), box-shadow var(--transition);\n}\n[type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 1.25rem;\n height: 1.25rem;\n margin-top: -0.5rem;\n border: 2px solid var(--range-thumb-border-color);\n border-radius: 50%;\n background-color: var(--range-thumb-color);\n cursor: pointer;\n transition: background-color var(--transition), transform var(--transition);\n}\n[type=range]::-moz-range-thumb {\n -webkit-appearance: none;\n width: 1.25rem;\n height: 1.25rem;\n margin-top: -0.5rem;\n border: 2px solid var(--range-thumb-border-color);\n border-radius: 50%;\n background-color: var(--range-thumb-color);\n cursor: pointer;\n transition: background-color var(--transition), transform var(--transition);\n}\n[type=range]::-ms-thumb {\n -webkit-appearance: none;\n width: 1.25rem;\n height: 1.25rem;\n margin-top: -0.5rem;\n border: 2px solid var(--range-thumb-border-color);\n border-radius: 50%;\n background-color: var(--range-thumb-color);\n cursor: pointer;\n transition: background-color var(--transition), transform var(--transition);\n}\n[type=range]:hover, [type=range]:focus {\n --range-border-color: var(--range-active-border-color);\n --range-thumb-color: var(--range-thumb-hover-color);\n}\n[type=range]:active {\n --range-thumb-color: var(--range-thumb-active-color);\n}\n[type=range]:active::-webkit-slider-thumb {\n transform: scale(1.25);\n}\n[type=range]:active::-moz-range-thumb {\n transform: scale(1.25);\n}\n[type=range]:active::-ms-thumb {\n transform: scale(1.25);\n}\n\ninput:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search] {\n padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem);\n border-radius: 5rem;\n background-image: var(--icon-search);\n background-position: center left 1.125rem;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n}\ninput:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid] {\n padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem) !important;\n background-position: center left 1.125rem, center right 0.75rem;\n}\ninput:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid=false] {\n background-image: var(--icon-search), var(--icon-valid);\n}\ninput:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid=true] {\n background-image: var(--icon-search), var(--icon-invalid);\n}\n\n[type=search]::-webkit-search-cancel-button {\n -webkit-appearance: none;\n display: none;\n}\n\n[dir=rtl] :where(input):not([type=checkbox], [type=radio], [type=range], [type=file])[type=search] {\n background-position: center right 1.125rem;\n}\n[dir=rtl] :where(input):not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid] {\n background-position: center right 1.125rem, center left 0.75rem;\n}\n\n/**\n * Table\n */\n:where(table) {\n width: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n text-indent: 0;\n}\n\nth,\ntd {\n padding: calc(var(--spacing) / 2) var(--spacing);\n border-bottom: var(--border-width) solid var(--table-border-color);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n text-align: left;\n text-align: start;\n}\n\ntfoot th,\ntfoot td {\n border-top: var(--border-width) solid var(--table-border-color);\n border-bottom: 0;\n}\n\ntable[role=grid] tbody tr:nth-child(odd) {\n background-color: var(--table-row-stripped-background-color);\n}\n\n/**\n * Code\n */\npre,\ncode,\nkbd,\nsamp {\n font-size: 0.875em;\n font-family: var(--font-family);\n}\n\npre {\n -ms-overflow-style: scrollbar;\n overflow: auto;\n}\n\npre,\ncode,\nkbd {\n border-radius: var(--border-radius);\n background: var(--code-background-color);\n color: var(--code-color);\n font-weight: var(--font-weight);\n line-height: initial;\n}\n\ncode,\nkbd {\n display: inline-block;\n padding: 0.375rem 0.5rem;\n}\n\npre {\n display: block;\n margin-bottom: var(--spacing);\n overflow-x: auto;\n}\npre > code {\n display: block;\n padding: var(--spacing);\n background: none;\n font-size: 14px;\n line-height: var(--line-height);\n}\n\ncode b {\n color: var(--code-tag-color);\n font-weight: var(--font-weight);\n}\ncode i {\n color: var(--code-property-color);\n font-style: normal;\n}\ncode u {\n color: var(--code-value-color);\n text-decoration: none;\n}\ncode em {\n color: var(--code-comment-color);\n font-style: normal;\n}\n\nkbd {\n background-color: var(--code-kbd-background-color);\n color: var(--code-kbd-color);\n vertical-align: baseline;\n}\n\n/**\n * Miscs\n */\nhr {\n height: 0;\n border: 0;\n border-top: 1px solid var(--muted-border-color);\n color: inherit;\n}\n\n[hidden],\ntemplate {\n display: none !important;\n}\n\ncanvas {\n display: inline-block;\n}\n\n/**\n * Accordion ()\n */\ndetails {\n display: block;\n margin-bottom: var(--spacing);\n padding-bottom: var(--spacing);\n border-bottom: var(--border-width) solid var(--accordion-border-color);\n}\ndetails summary {\n line-height: 1rem;\n list-style-type: none;\n cursor: pointer;\n transition: color var(--transition);\n}\ndetails summary:not([role]) {\n color: var(--accordion-close-summary-color);\n}\ndetails summary::-webkit-details-marker {\n display: none;\n}\ndetails summary::marker {\n display: none;\n}\ndetails summary::-moz-list-bullet {\n list-style-type: none;\n}\ndetails summary::after {\n display: block;\n width: 1rem;\n height: 1rem;\n margin-inline-start: calc(var(--spacing, 1rem) * 0.5);\n float: right;\n transform: rotate(-90deg);\n background-image: var(--icon-chevron);\n background-position: right center;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n content: \"\";\n transition: transform var(--transition);\n}\ndetails summary:focus {\n outline: none;\n}\ndetails summary:focus:not([role=button]) {\n color: var(--accordion-active-summary-color);\n}\ndetails summary[role=button] {\n width: 100%;\n text-align: left;\n}\ndetails summary[role=button]::after {\n height: calc(1rem * var(--line-height, 1.5));\n background-image: var(--icon-chevron-button);\n}\ndetails summary[role=button]:not(.outline).contrast::after {\n background-image: var(--icon-chevron-button-inverse);\n}\ndetails[open] > summary {\n margin-bottom: calc(var(--spacing));\n}\ndetails[open] > summary:not([role]):not(:focus) {\n color: var(--accordion-open-summary-color);\n}\ndetails[open] > summary::after {\n transform: rotate(0);\n}\n\n[dir=rtl] details summary {\n text-align: right;\n}\n[dir=rtl] details summary::after {\n float: left;\n background-position: left center;\n}\n\n/**\n * Card ()\n */\narticle {\n margin: var(--block-spacing-vertical) 0;\n padding: var(--block-spacing-vertical) var(--block-spacing-horizontal);\n border-radius: var(--border-radius);\n background: var(--card-background-color);\n box-shadow: var(--card-box-shadow);\n}\narticle > header,\narticle > footer {\n margin-right: calc(var(--block-spacing-horizontal) * -1);\n margin-left: calc(var(--block-spacing-horizontal) * -1);\n padding: calc(var(--block-spacing-vertical) * 0.66) var(--block-spacing-horizontal);\n background-color: var(--card-sectionning-background-color);\n}\narticle > header {\n margin-top: calc(var(--block-spacing-vertical) * -1);\n margin-bottom: var(--block-spacing-vertical);\n border-bottom: var(--border-width) solid var(--card-border-color);\n border-top-right-radius: var(--border-radius);\n border-top-left-radius: var(--border-radius);\n}\narticle > footer {\n margin-top: var(--block-spacing-vertical);\n margin-bottom: calc(var(--block-spacing-vertical) * -1);\n border-top: var(--border-width) solid var(--card-border-color);\n border-bottom-right-radius: var(--border-radius);\n border-bottom-left-radius: var(--border-radius);\n}\n\n/**\n * Modal ()\n */\n:root {\n --scrollbar-width: 0px;\n}\n\ndialog {\n display: flex;\n z-index: 999;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n align-items: center;\n justify-content: center;\n width: inherit;\n min-width: 100%;\n height: inherit;\n min-height: 100%;\n padding: var(--spacing);\n border: 0;\n backdrop-filter: var(--modal-overlay-backdrop-filter);\n background-color: var(--modal-overlay-background-color);\n color: var(--color);\n}\ndialog article {\n max-height: calc(100vh - var(--spacing) * 2);\n overflow: auto;\n}\n@media (min-width: 576px) {\n dialog article {\n max-width: 510px;\n }\n}\n@media (min-width: 768px) {\n dialog article {\n max-width: 700px;\n }\n}\ndialog article > header,\ndialog article > footer {\n padding: calc(var(--block-spacing-vertical) * 0.5) var(--block-spacing-horizontal);\n}\ndialog article > header .close {\n margin: 0;\n margin-left: var(--spacing);\n float: right;\n}\ndialog article > footer {\n text-align: right;\n}\ndialog article > footer [role=button] {\n margin-bottom: 0;\n}\ndialog article > footer [role=button]:not(:first-of-type) {\n margin-left: calc(var(--spacing) * 0.5);\n}\ndialog article p:last-of-type {\n margin: 0;\n}\ndialog article .close {\n display: block;\n width: 1rem;\n height: 1rem;\n margin-top: calc(var(--block-spacing-vertical) * -0.5);\n margin-bottom: var(--typography-spacing-vertical);\n margin-left: auto;\n background-image: var(--icon-close);\n background-position: center;\n background-size: auto 1rem;\n background-repeat: no-repeat;\n opacity: 0.5;\n transition: opacity var(--transition);\n}\ndialog article .close:is([aria-current], :hover, :active, :focus) {\n opacity: 1;\n}\ndialog:not([open]), dialog[open=false] {\n display: none;\n}\n\n.modal-is-open {\n padding-right: var(--scrollbar-width, 0px);\n overflow: hidden;\n pointer-events: none;\n touch-action: none;\n}\n.modal-is-open dialog {\n pointer-events: auto;\n}\n\n:where(.modal-is-opening, .modal-is-closing) dialog,\n:where(.modal-is-opening, .modal-is-closing) dialog > article {\n animation-duration: 0.2s;\n animation-timing-function: ease-in-out;\n animation-fill-mode: both;\n}\n:where(.modal-is-opening, .modal-is-closing) dialog {\n animation-duration: 0.8s;\n animation-name: modal-overlay;\n}\n:where(.modal-is-opening, .modal-is-closing) dialog > article {\n animation-delay: 0.2s;\n animation-name: modal;\n}\n\n.modal-is-closing dialog,\n.modal-is-closing dialog > article {\n animation-delay: 0s;\n animation-direction: reverse;\n}\n\n@keyframes modal-overlay {\n from {\n backdrop-filter: none;\n background-color: transparent;\n }\n}\n@keyframes modal {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n}\n/**\n * Nav\n */\n:where(nav li)::before {\n float: left;\n content: \"ā\";\n}\n\nnav,\nnav ul {\n display: flex;\n}\n\nnav {\n justify-content: space-between;\n}\nnav ol,\nnav ul {\n align-items: center;\n margin-bottom: 0;\n padding: 0;\n list-style: none;\n}\nnav ol:first-of-type,\nnav ul:first-of-type {\n margin-left: calc(var(--nav-element-spacing-horizontal) * -1);\n}\nnav ol:last-of-type,\nnav ul:last-of-type {\n margin-right: calc(var(--nav-element-spacing-horizontal) * -1);\n}\nnav li {\n display: inline-block;\n margin: 0;\n padding: var(--nav-element-spacing-vertical) var(--nav-element-spacing-horizontal);\n}\nnav li > * {\n --spacing: 0;\n}\nnav :where(a, [role=link]) {\n display: inline-block;\n margin: calc(var(--nav-link-spacing-vertical) * -1) calc(var(--nav-link-spacing-horizontal) * -1);\n padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);\n border-radius: var(--border-radius);\n text-decoration: none;\n}\nnav :where(a, [role=link]):is([aria-current], :hover, :active, :focus) {\n text-decoration: none;\n}\nnav[aria-label=breadcrumb] {\n align-items: center;\n justify-content: start;\n}\nnav[aria-label=breadcrumb] ul li:not(:first-child) {\n margin-inline-start: var(--nav-link-spacing-horizontal);\n}\nnav[aria-label=breadcrumb] ul li:not(:last-child) ::after {\n position: absolute;\n width: calc(var(--nav-link-spacing-horizontal) * 2);\n margin-inline-start: calc(var(--nav-link-spacing-horizontal) / 2);\n content: \"/\";\n color: var(--muted-color);\n text-align: center;\n}\nnav[aria-label=breadcrumb] a[aria-current] {\n background-color: transparent;\n color: inherit;\n text-decoration: none;\n pointer-events: none;\n}\nnav [role=button] {\n margin-right: inherit;\n margin-left: inherit;\n padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);\n}\n\naside nav,\naside ol,\naside ul,\naside li {\n display: block;\n}\naside li {\n padding: calc(var(--nav-element-spacing-vertical) * 0.5) var(--nav-element-spacing-horizontal);\n}\naside li a {\n display: block;\n}\naside li [role=button] {\n margin: inherit;\n}\n\n[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after {\n content: \"\\\\\";\n}\n\n/**\n * Progress\n */\nprogress {\n display: inline-block;\n vertical-align: baseline;\n}\n\nprogress {\n -webkit-appearance: none;\n -moz-appearance: none;\n display: inline-block;\n appearance: none;\n width: 100%;\n height: 0.5rem;\n margin-bottom: calc(var(--spacing) * 0.5);\n overflow: hidden;\n border: 0;\n border-radius: var(--border-radius);\n background-color: var(--progress-background-color);\n color: var(--progress-color);\n}\nprogress::-webkit-progress-bar {\n border-radius: var(--border-radius);\n background: none;\n}\nprogress[value]::-webkit-progress-value {\n background-color: var(--progress-color);\n}\nprogress::-moz-progress-bar {\n background-color: var(--progress-color);\n}\n@media (prefers-reduced-motion: no-preference) {\n progress:indeterminate {\n background: var(--progress-background-color) linear-gradient(to right, var(--progress-color) 30%, var(--progress-background-color) 30%) top left/150% 150% no-repeat;\n animation: progress-indeterminate 1s linear infinite;\n }\n progress:indeterminate[value]::-webkit-progress-value {\n background-color: transparent;\n }\n progress:indeterminate::-moz-progress-bar {\n background-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: no-preference) {\n [dir=rtl] progress:indeterminate {\n animation-direction: reverse;\n }\n}\n\n@keyframes progress-indeterminate {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n/**\n * Dropdown ([role=\"list\"])\n */\ndetails[role=list],\nli[role=list] {\n position: relative;\n}\n\ndetails[role=list] summary + ul,\nli[role=list] > ul {\n display: flex;\n z-index: 99;\n position: absolute;\n top: auto;\n right: 0;\n left: 0;\n flex-direction: column;\n margin: 0;\n padding: 0;\n border: var(--border-width) solid var(--dropdown-border-color);\n border-radius: var(--border-radius);\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n background-color: var(--dropdown-background-color);\n box-shadow: var(--card-box-shadow);\n color: var(--dropdown-color);\n white-space: nowrap;\n}\ndetails[role=list] summary + ul li,\nli[role=list] > ul li {\n width: 100%;\n margin-bottom: 0;\n padding: calc(var(--form-element-spacing-vertical) * 0.5) var(--form-element-spacing-horizontal);\n list-style: none;\n}\ndetails[role=list] summary + ul li:first-of-type,\nli[role=list] > ul li:first-of-type {\n margin-top: calc(var(--form-element-spacing-vertical) * 0.5);\n}\ndetails[role=list] summary + ul li:last-of-type,\nli[role=list] > ul li:last-of-type {\n margin-bottom: calc(var(--form-element-spacing-vertical) * 0.5);\n}\ndetails[role=list] summary + ul li a,\nli[role=list] > ul li a {\n display: block;\n margin: calc(var(--form-element-spacing-vertical) * -0.5) calc(var(--form-element-spacing-horizontal) * -1);\n padding: calc(var(--form-element-spacing-vertical) * 0.5) var(--form-element-spacing-horizontal);\n overflow: hidden;\n color: var(--dropdown-color);\n text-decoration: none;\n text-overflow: ellipsis;\n}\ndetails[role=list] summary + ul li a:hover,\nli[role=list] > ul li a:hover {\n background-color: var(--dropdown-hover-background-color);\n}\n\ndetails[role=list] summary::after,\nli[role=list] > a::after {\n display: block;\n width: 1rem;\n height: calc(1rem * var(--line-height, 1.5));\n margin-inline-start: 0.5rem;\n float: right;\n transform: rotate(0deg);\n background-position: right center;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n content: \"\";\n}\n\ndetails[role=list] {\n padding: 0;\n border-bottom: none;\n}\ndetails[role=list] summary {\n margin-bottom: 0;\n}\ndetails[role=list] summary:not([role]) {\n height: calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2);\n padding: var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);\n border: var(--border-width) solid var(--form-element-border-color);\n border-radius: var(--border-radius);\n background-color: var(--form-element-background-color);\n color: var(--form-element-placeholder-color);\n line-height: inherit;\n cursor: pointer;\n transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition);\n}\ndetails[role=list] summary:not([role]):active, details[role=list] summary:not([role]):focus {\n border-color: var(--form-element-active-border-color);\n background-color: var(--form-element-active-background-color);\n}\ndetails[role=list] summary:not([role]):focus {\n box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);\n}\ndetails[role=list][open] summary {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\ndetails[role=list][open] summary::before {\n display: block;\n z-index: 1;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: none;\n content: \"\";\n cursor: default;\n}\n\nnav details[role=list] summary,\nnav li[role=list] a {\n display: flex;\n direction: ltr;\n}\n\nnav details[role=list] summary + ul,\nnav li[role=list] > ul {\n min-width: fit-content;\n border-radius: var(--border-radius);\n}\nnav details[role=list] summary + ul li a,\nnav li[role=list] > ul li a {\n border-radius: 0;\n}\n\nnav details[role=list] summary,\nnav details[role=list] summary:not([role]) {\n height: auto;\n padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);\n}\nnav details[role=list][open] summary {\n border-radius: var(--border-radius);\n}\nnav details[role=list] summary + ul {\n margin-top: var(--outline-width);\n margin-inline-start: 0;\n}\nnav details[role=list] summary[role=link] {\n margin-bottom: calc(var(--nav-link-spacing-vertical) * -1);\n line-height: var(--line-height);\n}\nnav details[role=list] summary[role=link] + ul {\n margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width));\n margin-inline-start: calc(var(--nav-link-spacing-horizontal) * -1);\n}\n\nli[role=list]:hover > ul,\nli[role=list] a:active ~ ul,\nli[role=list] a:focus ~ ul {\n display: flex;\n}\nli[role=list] > ul {\n display: none;\n margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width));\n margin-inline-start: calc(var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal));\n}\nli[role=list] > a::after {\n background-image: var(--icon-chevron);\n}\n\nlabel > details[role=list] {\n margin-top: calc(var(--spacing) * 0.25);\n margin-bottom: var(--spacing);\n}\n\n/**\n * Loading ([aria-busy=true])\n */\n[aria-busy=true] {\n cursor: progress;\n}\n\n[aria-busy=true]:not(input, select, textarea, html)::before {\n display: inline-block;\n width: 1em;\n height: 1em;\n border: 0.1875em solid currentColor;\n border-radius: 1em;\n border-right-color: transparent;\n content: \"\";\n vertical-align: text-bottom;\n vertical-align: -0.125em;\n animation: spinner 0.75s linear infinite;\n opacity: var(--loading-spinner-opacity);\n}\n[aria-busy=true]:not(input, select, textarea, html):not(:empty)::before {\n margin-right: calc(var(--spacing) * 0.5);\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: calc(var(--spacing) * 0.5);\n}\n[aria-busy=true]:not(input, select, textarea, html):empty {\n text-align: center;\n}\n\nbutton[aria-busy=true],\ninput[type=submit][aria-busy=true],\ninput[type=button][aria-busy=true],\ninput[type=reset][aria-busy=true],\na[aria-busy=true] {\n pointer-events: none;\n}\n\n@keyframes spinner {\n to {\n transform: rotate(360deg);\n }\n}\n/**\n * Tooltip ([data-tooltip])\n */\n[data-tooltip] {\n position: relative;\n}\n[data-tooltip]:not(a, button, input) {\n border-bottom: 1px dotted;\n text-decoration: none;\n cursor: help;\n}\n[data-tooltip][data-placement=top]::before, [data-tooltip][data-placement=top]::after, [data-tooltip]::before, [data-tooltip]::after {\n display: block;\n z-index: 99;\n position: absolute;\n bottom: 100%;\n left: 50%;\n padding: 0.25rem 0.5rem;\n overflow: hidden;\n transform: translate(-50%, -0.25rem);\n border-radius: var(--border-radius);\n background: var(--tooltip-background-color);\n content: attr(data-tooltip);\n color: var(--tooltip-color);\n font-style: normal;\n font-weight: var(--font-weight);\n font-size: 0.875rem;\n text-decoration: none;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0;\n pointer-events: none;\n}\n[data-tooltip][data-placement=top]::after, [data-tooltip]::after {\n padding: 0;\n transform: translate(-50%, 0rem);\n border-top: 0.3rem solid;\n border-right: 0.3rem solid transparent;\n border-left: 0.3rem solid transparent;\n border-radius: 0;\n background-color: transparent;\n content: \"\";\n color: var(--tooltip-background-color);\n}\n[data-tooltip][data-placement=bottom]::before, [data-tooltip][data-placement=bottom]::after {\n top: 100%;\n bottom: auto;\n transform: translate(-50%, 0.25rem);\n}\n[data-tooltip][data-placement=bottom]:after {\n transform: translate(-50%, -0.3rem);\n border: 0.3rem solid transparent;\n border-bottom: 0.3rem solid;\n}\n[data-tooltip][data-placement=left]::before, [data-tooltip][data-placement=left]::after {\n top: 50%;\n right: 100%;\n bottom: auto;\n left: auto;\n transform: translate(-0.25rem, -50%);\n}\n[data-tooltip][data-placement=left]:after {\n transform: translate(0.3rem, -50%);\n border: 0.3rem solid transparent;\n border-left: 0.3rem solid;\n}\n[data-tooltip][data-placement=right]::before, [data-tooltip][data-placement=right]::after {\n top: 50%;\n right: auto;\n bottom: auto;\n left: 100%;\n transform: translate(0.25rem, -50%);\n}\n[data-tooltip][data-placement=right]:after {\n transform: translate(-0.3rem, -50%);\n border: 0.3rem solid transparent;\n border-right: 0.3rem solid;\n}\n[data-tooltip]:focus::before, [data-tooltip]:focus::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after {\n opacity: 1;\n}\n@media (hover: hover) and (pointer: fine) {\n [data-tooltip][data-placement=bottom]:focus::before, [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::before, [data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after {\n animation-duration: 0.2s;\n animation-name: tooltip-slide-top;\n }\n [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after, [data-tooltip]:hover::after {\n animation-name: tooltip-caret-slide-top;\n }\n [data-tooltip][data-placement=bottom]:focus::before, [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover::before, [data-tooltip][data-placement=bottom]:hover::after {\n animation-duration: 0.2s;\n animation-name: tooltip-slide-bottom;\n }\n [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover::after {\n animation-name: tooltip-caret-slide-bottom;\n }\n [data-tooltip][data-placement=left]:focus::before, [data-tooltip][data-placement=left]:focus::after, [data-tooltip][data-placement=left]:hover::before, [data-tooltip][data-placement=left]:hover::after {\n animation-duration: 0.2s;\n animation-name: tooltip-slide-left;\n }\n [data-tooltip][data-placement=left]:focus::after, [data-tooltip][data-placement=left]:hover::after {\n animation-name: tooltip-caret-slide-left;\n }\n [data-tooltip][data-placement=right]:focus::before, [data-tooltip][data-placement=right]:focus::after, [data-tooltip][data-placement=right]:hover::before, [data-tooltip][data-placement=right]:hover::after {\n animation-duration: 0.2s;\n animation-name: tooltip-slide-right;\n }\n [data-tooltip][data-placement=right]:focus::after, [data-tooltip][data-placement=right]:hover::after {\n animation-name: tooltip-caret-slide-right;\n }\n}\n@keyframes tooltip-slide-top {\n from {\n transform: translate(-50%, 0.75rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, -0.25rem);\n opacity: 1;\n }\n}\n@keyframes tooltip-caret-slide-top {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(-50%, -0.25rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, 0rem);\n opacity: 1;\n }\n}\n@keyframes tooltip-slide-bottom {\n from {\n transform: translate(-50%, -0.75rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, 0.25rem);\n opacity: 1;\n }\n}\n@keyframes tooltip-caret-slide-bottom {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(-50%, -0.5rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, -0.3rem);\n opacity: 1;\n }\n}\n@keyframes tooltip-slide-left {\n from {\n transform: translate(0.75rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(-0.25rem, -50%);\n opacity: 1;\n }\n}\n@keyframes tooltip-caret-slide-left {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(0.05rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(0.3rem, -50%);\n opacity: 1;\n }\n}\n@keyframes tooltip-slide-right {\n from {\n transform: translate(-0.75rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(0.25rem, -50%);\n opacity: 1;\n }\n}\n@keyframes tooltip-caret-slide-right {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(-0.05rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(-0.3rem, -50%);\n opacity: 1;\n }\n}\n\n/**\n * Accessibility & User interaction\n */\n[aria-controls] {\n cursor: pointer;\n}\n\n[aria-disabled=true],\n[disabled] {\n cursor: not-allowed;\n}\n\n[aria-hidden=false][hidden] {\n display: initial;\n}\n\n[aria-hidden=false][hidden]:not(:focus) {\n clip: rect(0, 0, 0, 0);\n position: absolute;\n}\n\na,\narea,\nbutton,\ninput,\nlabel,\nselect,\nsummary,\ntextarea,\n[tabindex] {\n -ms-touch-action: manipulation;\n}\n\n[dir=rtl] {\n direction: rtl;\n}\n\n/**\n* Reduce Motion Features\n*/\n@media (prefers-reduced-motion: reduce) {\n *:not([aria-busy=true]),\n :not([aria-busy=true])::before,\n :not([aria-busy=true])::after {\n background-attachment: initial !important;\n animation-duration: 1ms !important;\n animation-delay: -1ms !important;\n animation-iteration-count: 1 !important;\n scroll-behavior: auto !important;\n transition-delay: 0s !important;\n transition-duration: 0s !important;\n }\n}\n\n/*# sourceMappingURL=pico.css.map */\n","@import \"../../functions\";\n\n// Default: Light theme\n[data-theme=\"light\"],\n:root:not([data-theme=\"dark\"]) {\n --background-color: #{$white};\n\n // Texts colors\n --color: #{$grey-700};\n --h1-color: #{$grey-900};\n --h2-color: #{mix($grey-900, $grey-800)};\n --h3-color: #{$grey-800};\n --h4-color: #{mix($grey-800, $grey-700)};\n --h5-color: #{$grey-700};\n --h6-color: #{mix($grey-700, $grey-600)};\n\n // Muted colors\n --muted-color: #{$grey-500};\n --muted-border-color: #{$grey-50};\n\n // Primary colors\n --primary: #{$primary-600};\n --primary-hover: #{$primary-700};\n --primary-focus: #{rgba($primary-600, 0.125)};\n --primary-inverse: #{$white};\n\n // Secondary colors\n --secondary: #{$grey-600};\n --secondary-hover: #{$grey-700};\n --secondary-focus: #{rgba($grey-600, 0.125)};\n --secondary-inverse: #{$white};\n\n // Contrast colors\n --contrast: #{$grey-900};\n --contrast-hover: #{$black};\n --contrast-focus: #{rgba($grey-600, 0.125)};\n --contrast-inverse: #{$white};\n\n // Highlighted text ()\n --mark-background-color: #{mix($amber-100, $amber-50)};\n --mark-color: #{mix($grey-900, $amber-900, 75%)};\n\n // Inserted () & Deleted ()\n --ins-color: #{$green-700};\n --del-color: #{$red-800};\n\n // Blockquote\n --blockquote-border-color: var(--muted-border-color);\n --blockquote-footer-color: var(--muted-color);\n\n // Button\n // To disable box-shadow, remove the var or set to '0 0 0 rgba(0, 0, 0, 0)'\n // Don't use, 'none, 'false, 'null', '0', etc.\n --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n\n // Form elements\n --form-element-background-color: transparent;\n --form-element-border-color: #{$grey-300};\n --form-element-color: var(--color);\n --form-element-placeholder-color: var(--muted-color);\n --form-element-active-background-color: transparent;\n --form-element-active-border-color: var(--primary);\n --form-element-focus-color: var(--primary-focus);\n --form-element-disabled-background-color: #{$grey-100};\n --form-element-disabled-border-color: #{$grey-300};\n --form-element-disabled-opacity: 0.5;\n --form-element-invalid-border-color: #{$red-800};\n --form-element-invalid-active-border-color: #{$red-700};\n --form-element-invalid-focus-color: #{rgba($red-700, 0.125)};\n --form-element-valid-border-color: #{$green-700};\n --form-element-valid-active-border-color: #{$green-600};\n --form-element-valid-focus-color: #{rgba($green-600, 0.125)};\n\n // Switch (input[type=\"checkbox\"][role=\"switch\"])\n --switch-background-color: #{$grey-200};\n --switch-color: var(--primary-inverse);\n --switch-checked-background-color: var(--primary);\n\n // Range (input[type=\"range\"])\n --range-border-color: #{$grey-100};\n --range-active-border-color: #{$grey-200};\n --range-thumb-border-color: var(--background-color);\n --range-thumb-color: var(--secondary);\n --range-thumb-hover-color: var(--secondary-hover);\n --range-thumb-active-color: var(--primary);\n\n // Table\n --table-border-color: var(--muted-border-color);\n --table-row-stripped-background-color: #{mix($grey-50, $white)};\n\n // Code\n --code-background-color: #{$grey-50};\n --code-color: var(--muted-color);\n --code-kbd-background-color: var(--contrast);\n --code-kbd-color: var(--contrast-inverse);\n --code-tag-color: #{hsl(330, 40%, 50%)};\n --code-property-color: #{hsl(185, 40%, 40%)};\n --code-value-color: #{hsl(40, 20%, 50%)};\n --code-comment-color: #{$grey-300};\n\n // Accordion ()\n --accordion-border-color: var(--muted-border-color);\n --accordion-close-summary-color: var(--color);\n --accordion-open-summary-color: var(--muted-color);\n\n // Card ()\n $box-shadow-elevation: 1rem;\n $box-shadow-blur-strengh: 6rem;\n $box-shadow-opacity: 0.06;\n --card-background-color: var(--background-color);\n --card-border-color: var(--muted-border-color);\n --card-box-shadow:\n #{($box-shadow-elevation * 0.5 * 0.029)} #{($box-shadow-elevation * 0.029)} #{($box-shadow-blur-strengh * 0.029)} #{rgba($grey-900, ($box-shadow-opacity * 0.283))},\n #{($box-shadow-elevation * 0.5 * 0.067)} #{($box-shadow-elevation * 0.067)} #{($box-shadow-blur-strengh * 0.067)} #{rgba($grey-900, ($box-shadow-opacity * 0.4))},\n #{($box-shadow-elevation * 0.5 * 0.125)} #{($box-shadow-elevation * 0.125)} #{($box-shadow-blur-strengh * 0.125)} #{rgba($grey-900, ($box-shadow-opacity * 0.5))},\n #{($box-shadow-elevation * 0.5 * 0.225)} #{($box-shadow-elevation * 0.225)} #{($box-shadow-blur-strengh * 0.225)} #{rgba($grey-900, ($box-shadow-opacity * 0.6))},\n #{($box-shadow-elevation * 0.5 * 0.417)} #{($box-shadow-elevation * 0.417)} #{($box-shadow-blur-strengh * 0.417)} #{rgba($grey-900, ($box-shadow-opacity * 0.717))},\n #{($box-shadow-elevation * 0.5)} #{$box-shadow-elevation} #{$box-shadow-blur-strengh} #{rgba($grey-900, $box-shadow-opacity)},\n 0 0 0 0.0625rem #{rgba($grey-900, ($box-shadow-opacity * 0.25) )};\n --card-sectionning-background-color: #{mix($grey-50, $white, 25%)};\n\n // Dropdown ()\n --dropdown-background-color: #{mix($grey-50, $white, 25%)};\n --dropdown-border-color: #{mix($grey-100, $grey-50)};\n --dropdown-box-shadow: var(--card-box-shadow);\n --dropdown-color: var(--color);\n --dropdown-hover-background-color: #{$grey-50};\n\n // Modal ()\n --modal-overlay-background-color: #{rgba($grey-100, 0.7)};\n\n // Progress\n --progress-background-color: #{$grey-100};\n --progress-color: var(--primary);\n\n // Loading ([aria-busy=true])\n --loading-spinner-opacity: 0.5;\n\n // Tooltip ([data-tooltip])\n --tooltip-background-color: var(--contrast);\n --tooltip-color: var(--contrast-inverse);\n\n // Icons\n --icon-checkbox: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button-inverse: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-close: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-500)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E\");\n --icon-date: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E\");\n --icon-invalid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($red-800)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E\");\n --icon-minus: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E\");\n --icon-search: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\");\n --icon-time: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E\"); \n --icon-valid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($green-700)}' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n \n // Document\n color-scheme: light;\n}\n","/**\n * Theme: default\n */\n\n// Variables\n@import \"../variables\";\n@import \"default/colors\";\n\n// Commons styles\n@import \"default/styles\";\n\n// Light theme (Default)\n// Can be forced with data-theme=\"light\"\n@import \"default/light\";\n\n// Dark theme (Auto)\n// Automatically enabled if user has Dark mode enabled\n@import \"default/dark\";\n@media only screen and (prefers-color-scheme: dark) {\n :root:not([data-theme]) {\n @include dark;\n }\n}\n\n// Dark theme (Forced)\n// Enabled if forced with data-theme=\"dark\"\n[data-theme=\"dark\"] {\n @include dark;\n}\n\n// Accent-color\nprogress,\n[type=\"checkbox\"],\n[type=\"radio\"],\n[type=\"range\"] {\n accent-color: var(--primary);\n}\n","@import \"../../functions\";\n\n// Default: Dark theme\n@mixin dark {\n --background-color: #{mix($black, $grey-900, 37.5%)};\n\n // Texts colors\n --color: #{$grey-200};\n --h1-color: #{$grey-50};\n --h2-color: #{mix($grey-100, $grey-50)};\n --h3-color: #{$grey-100};\n --h4-color: #{mix($grey-200, $grey-100)};\n --h5-color: #{$grey-200};\n --h6-color: #{mix($grey-300, $grey-200)};\n\n // Muted colors\n --muted-color: #{$grey-500};\n --muted-border-color: #{mix($grey-900, $grey-800, 75%)};\n\n // Primary colors\n --primary: #{$primary-600};\n --primary-hover: #{$primary-500};\n --primary-focus: #{rgba($primary-600, 0.25)};\n --primary-inverse: #{$white};\n\n // Secondary colors\n --secondary: #{$grey-600};\n --secondary-hover: #{$grey-500};\n --secondary-focus: #{rgba($grey-500, 0.25)};\n --secondary-inverse: #{$white};\n\n // Contrast colors\n --contrast: #{$grey-50};\n --contrast-hover: #{$white};\n --contrast-focus: #{rgba($grey-500, 0.25)};\n --contrast-inverse: #{$black};\n\n // Highlighted text ()\n --mark-background-color: #{mix($grey-300, $amber-300)};\n --mark-color: #{mix($black, $grey-900, 37.5%)};\n\n // Inserted () & Deleted ()\n --ins-color: #{$green-700};\n --del-color: #{$red-800};\n\n // Blockquote\n --blockquote-border-color: var(--muted-border-color);\n --blockquote-footer-color: var(--muted-color);\n\n // Button\n // To disable box-shadow, remove the var or set to '0 0 0 rgba(0, 0, 0, 0)'\n // Don't use, 'none, 'false, 'null', '0', etc.\n --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);\n\n // Form elements\n --form-element-background-color: #{mix($black, $grey-900, 37.5%)};\n --form-element-border-color: #{mix($grey-800, $grey-700)};\n --form-element-color: var(--color);\n --form-element-placeholder-color: var(--muted-color);\n --form-element-active-background-color: var(--form-element-background-color);\n --form-element-active-border-color: var(--primary);\n --form-element-focus-color: var(--primary-focus);\n --form-element-disabled-background-color: #{$grey-800};\n --form-element-disabled-border-color: #{$grey-700};\n --form-element-disabled-opacity: 0.5;\n --form-element-invalid-border-color: #{$red-900};\n --form-element-invalid-active-border-color: #{$red-800};\n --form-element-invalid-focus-color: #{rgba($red-800, 0.25)};\n --form-element-valid-border-color: #{$green-800};\n --form-element-valid-active-border-color: #{$green-700};\n --form-element-valid-focus-color: #{rgba($green-700, 0.25)};\n\n // Switch (input[type=\"checkbox\"][role=\"switch\"])\n --switch-background-color: #{mix($grey-800, $grey-700)};\n --switch-color: var(--primary-inverse);\n --switch-checked-background-color: var(--primary);\n\n // Range (input[type=\"range\"])\n --range-border-color: #{mix($grey-900, $grey-800)};\n --range-active-border-color: #{$grey-800};\n --range-thumb-border-color: var(--background-color);\n --range-thumb-color: var(--secondary);\n --range-thumb-hover-color: var(--secondary-hover);\n --range-thumb-active-color: var(--primary);\n\n // Table\n --table-border-color: var(--muted-border-color);\n --table-row-stripped-background-color: #{rgba($grey-500, 0.05)};\n\n // Code\n --code-background-color: #{mix($black, $grey-900, 12.5%)};\n --code-color: var(--muted-color);\n --code-kbd-background-color: var(--contrast);\n --code-kbd-color: var(--contrast-inverse);\n --code-tag-color: #{hsl(330, 30%, 50%)};\n --code-property-color: #{hsl(185, 30%, 50%)};\n --code-value-color: #{hsl(40, 10%, 50%)};\n --code-comment-color: #{mix($grey-700, $grey-600)};\n\n // Accordion ()\n --accordion-border-color: var(--muted-border-color);\n --accordion-active-summary-color: var(--primary);\n --accordion-close-summary-color: var(--color);\n --accordion-open-summary-color: var(--muted-color);\n\n // Card ()\n $box-shadow-elevation: 1rem;\n $box-shadow-blur-strengh: 6rem;\n $box-shadow-opacity: 0.06;\n --card-background-color: #{mix($black, $grey-900, 25%)};\n --card-border-color: var(--card-background-color);\n --card-box-shadow:\n #{($box-shadow-elevation * 0.5 * 0.029)} #{($box-shadow-elevation * 0.029)} #{($box-shadow-blur-strengh * 0.029)} #{rgba($black, ($box-shadow-opacity * 0.283))},\n #{($box-shadow-elevation * 0.5 * 0.067)} #{($box-shadow-elevation * 0.067)} #{($box-shadow-blur-strengh * 0.067)} #{rgba($black, ($box-shadow-opacity * 0.4))},\n #{($box-shadow-elevation * 0.5 * 0.125)} #{($box-shadow-elevation * 0.125)} #{($box-shadow-blur-strengh * 0.125)} #{rgba($black, ($box-shadow-opacity * 0.5))},\n #{($box-shadow-elevation * 0.5 * 0.225)} #{($box-shadow-elevation * 0.225)} #{($box-shadow-blur-strengh * 0.225)} #{rgba($black, ($box-shadow-opacity * 0.6))},\n #{($box-shadow-elevation * 0.5 * 0.417)} #{($box-shadow-elevation * 0.417)} #{($box-shadow-blur-strengh * 0.417)} #{rgba($black, ($box-shadow-opacity * 0.717))},\n #{($box-shadow-elevation * 0.5)} #{$box-shadow-elevation} #{$box-shadow-blur-strengh} #{rgba($black, $box-shadow-opacity)},\n 0 0 0 0.0625rem #{rgba($black, ($box-shadow-opacity * 0.25) )};\n --card-sectionning-background-color: #{mix($black, $grey-900, 12.5%)};\n\n // Dropdown ()\n --dropdown-background-color: #{$grey-900};\n --dropdown-border-color: #{mix($grey-900, $grey-800)};\n --dropdown-box-shadow: var(--card-box-shadow);\n --dropdown-color: var(--color);\n --dropdown-hover-background-color: #{rgba(mix($grey-900, $grey-800), 0.75)};\n\n // Modal ()\n --modal-overlay-background-color: #{rgba(mix($grey-900, $grey-800), 0.8)};\n\n // Progress\n --progress-background-color: #{mix($grey-900, $grey-800)};\n --progress-color: var(--primary);\n\n // Loading ([aria-busy=true])\n --loading-spinner-opacity: 0.5;\n\n // Tooltip ([data-tooltip])\n --tooltip-background-color: var(--contrast);\n --tooltip-color: var(--contrast-inverse);\n\n // Icons\n --icon-checkbox: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-chevron-button-inverse: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($black)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-close: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-500)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E\");\n --icon-date: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E\");\n --icon-invalid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($red-900)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E\");\n --icon-minus: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E\");\n --icon-search: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E\");\n --icon-time: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E\");\n --icon-valid: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($green-800)}' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n \n // Document\n color-scheme: dark;\n}\n","/**\n * Document\n * Content-box & Responsive typography\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Add border box sizing in all browsers (opinionated)\n// 2. Backgrounds do not repeat by default (opinionated)\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n background-repeat: no-repeat; // 2\n}\n\n// 1. Add text decoration inheritance in all browsers (opinionated)\n// 2. Add vertical alignment inheritance in all browsers (opinionated)\n::before,\n::after {\n text-decoration: inherit; // 1\n vertical-align: inherit; // 2\n}\n\n// 1. Use the default cursor in all browsers (opinionated)\n// 2. Change the line height in all browsers (opinionated)\n// 3. Breaks words to prevent overflow in all browsers (opinionated)\n// 4. Use a 4-space tab width in all browsers (opinionated)\n// 5. Remove the grey highlight on links in iOS (opinionated)\n// 6. Prevent adjustments of font size after orientation changes in iOS\n:where(:root) {\n -webkit-tap-highlight-color: transparent; // 5\n -webkit-text-size-adjust: 100%; // 6\n text-size-adjust: 100%; // 6\n background-color: var(--background-color);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n line-height: var(--line-height); // 2\n font-family: var(--font-family);\n text-rendering: optimizeLegibility;\n overflow-wrap: break-word; // 3\n cursor: default; // 1\n tab-size: 4; // 4\n}\n","/**\n * Sectioning\n * Container and responsive spacings for header, main, footer\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// Render the `main` element consistently in IE\nmain {\n display: block;\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Remove the margin in all browsers (opinionated)\n#{$semantic-root-element} {\n width: 100%;\n margin: 0; // 1\n\n > header,\n > main,\n > footer {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n\n // Semantic container\n @if $enable-semantic-container {\n padding: var(--block-spacing-vertical) var(--block-spacing-horizontal);\n\n // Centered viewport\n @if $enable-viewport {\n @if map-get($breakpoints, \"sm\") and $enable-viewport {\n @media (min-width: map-get($breakpoints, \"sm\")) {\n max-width: map-get($viewports, \"sm\");\n padding-right: 0;\n padding-left: 0;\n }\n }\n\n @if map-get($breakpoints, \"md\") and $enable-viewport {\n @media (min-width: map-get($breakpoints, \"md\")) {\n max-width: map-get($viewports, \"md\");\n }\n }\n\n @if map-get($breakpoints, \"lg\") and $enable-viewport {\n @media (min-width: map-get($breakpoints, \"lg\")) {\n max-width: map-get($viewports, \"lg\");\n }\n }\n\n @if map-get($breakpoints, \"xl\") and $enable-viewport {\n @media (min-width: map-get($breakpoints, \"xl\")) {\n max-width: map-get($viewports, \"xl\");\n }\n }\n }\n }\n\n // Semantic container\n @else {\n padding: var(--block-spacing-vertical) 0;\n }\n }\n}\n","@if ($enable-class-container and $enable-classes) {\n /**\n * Container\n */\n\n .container,\n .container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: var(--spacing);\n padding-left: var(--spacing);\n }\n\n .container {\n @if map-get($breakpoints, \"sm\") {\n @media (min-width: map-get($breakpoints, \"sm\")) {\n max-width: map-get($viewports, \"sm\");\n padding-right: 0;\n padding-left: 0;\n }\n }\n\n @if map-get($breakpoints, \"md\") {\n @media (min-width: map-get($breakpoints, \"md\")) {\n max-width: map-get($viewports, \"md\");\n }\n }\n\n @if map-get($breakpoints, \"lg\") {\n @media (min-width: map-get($breakpoints, \"lg\")) {\n max-width: map-get($viewports, \"lg\");\n }\n }\n\n @if map-get($breakpoints, \"xl\") {\n @media (min-width: map-get($breakpoints, \"xl\")) {\n max-width: map-get($viewports, \"xl\");\n }\n }\n }\n}\n","/**\n * Section\n * Responsive spacings for section\n */\n\nsection {\n margin-bottom: var(--block-spacing-vertical);\n}\n","@if ($enable-classes and $enable-grid) {\n /**\n * Grid\n * Minimal grid system with auto-layout columns\n */\n\n .grid {\n grid-column-gap: var(--grid-spacing-horizontal);\n grid-row-gap: var(--grid-spacing-vertical);\n display: grid;\n grid-template-columns: 1fr;\n margin: 0;\n\n @if map-get($breakpoints, \"lg\") {\n @media (min-width: map-get($breakpoints, \"lg\")) {\n grid-template-columns: repeat(auto-fit, minmax(0%, 1fr));\n }\n }\n\n & > * {\n min-width: 0; // HACK for childs in overflow\n }\n }\n}\n","/**\n * Horizontal scroller ()\n */\n\n// Wrapper to make any content responsive across all viewports\nfigure {\n display: block;\n margin: 0;\n padding: 0;\n overflow-x: auto;\n\n figcaption {\n padding: calc(var(--spacing) * 0.5) 0;\n color: var(--muted-color);\n }\n}\n","/**\n * Typography\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// Add the correct font weight in Chrome, Edge, and Safari\nb,\nstrong {\n font-weight: bolder;\n}\n\n// Prevent `sub` and `sup` elements from affecting the line height in all browsers\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\naddress,\nblockquote,\ndl,\nfigure,\nform,\nol,\np,\npre,\ntable,\nul {\n margin-top: 0;\n margin-bottom: var(--typography-spacing-vertical);\n color: var(--color);\n font-style: normal;\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n}\n\n// Links\n// 1. Remove the gray background on active links in IE 10\na,\n[role=\"link\"] {\n --color: var(--primary);\n --background-color: transparent;\n outline: none;\n background-color: var(--background-color); // 1\n color: var(--color);\n text-decoration: var(--text-decoration);\n\n @if $enable-transitions {\n transition: background-color var(--transition), color var(--transition),\n text-decoration var(--transition), box-shadow var(--transition);\n }\n\n &:is([aria-current], :hover, :active, :focus) {\n --color: var(--primary-hover);\n --text-decoration: underline;\n }\n\n &:focus {\n --background-color: var(--primary-focus);\n }\n\n @if $enable-classes {\n // Secondary\n &.secondary {\n --color: var(--secondary);\n\n &:is([aria-current], :hover, :active, :focus) {\n --color: var(--secondary-hover);\n }\n\n &:focus {\n --background-color: var(--secondary-focus);\n }\n }\n\n // Contrast\n &.contrast {\n --color: var(--contrast);\n\n &:is([aria-current], :hover, :active, :focus) {\n --color: var(--contrast-hover);\n }\n\n &:focus {\n --background-color: var(--contrast-focus);\n }\n }\n }\n}\n\n// Headings\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n margin-bottom: var(--typography-spacing-vertical);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n font-family: var(--font-family);\n}\n\nh1 {\n --color: var(--h1-color);\n}\nh2 {\n --color: var(--h2-color);\n}\nh3 {\n --color: var(--h3-color);\n}\nh4 {\n --color: var(--h4-color);\n}\nh5 {\n --color: var(--h5-color);\n}\nh6 {\n --color: var(--h6-color);\n}\n\n// Margin-top for headings after a typography block\n:where(address, blockquote, dl, figure, form, ol, p, pre, table, ul) {\n ~ :is(h1, h2, h3, h4, h5, h6) {\n margin-top: var(--typography-spacing-vertical);\n }\n}\n\n// Heading group\n@if $enable-classes == false {\n hgroup {\n margin-bottom: var(--typography-spacing-vertical);\n\n > * {\n margin-bottom: 0;\n }\n\n > *:last-child {\n --color: var(--muted-color);\n --font-weight: unset;\n font-size: 1rem;\n font-family: unset;\n }\n }\n}\n\n@if $enable-classes {\n hgroup,\n .headings {\n margin-bottom: var(--typography-spacing-vertical);\n\n > * {\n margin-bottom: 0;\n }\n\n > *:last-child {\n --color: var(--muted-color);\n --font-weight: unset;\n font-size: 1rem;\n font-family: unset;\n }\n }\n}\n\n// Paragraphs\np {\n margin-bottom: var(--typography-spacing-vertical);\n}\n\n// Small\nsmall {\n font-size: var(--font-size);\n}\n\n// Lists\n:where(dl, ol, ul) {\n padding-right: 0;\n padding-left: var(--spacing);\n padding-inline-start: var(--spacing);\n padding-inline-end: 0;\n\n li {\n margin-bottom: calc(var(--typography-spacing-vertical) * 0.25);\n }\n}\n\n// Margin-top for nested lists\n// 1. Remove the margin on nested lists in Chrome, Edge, IE, and Safari\n:where(dl, ol, ul) {\n :is(dl, ol, ul) {\n margin: 0; // 1\n margin-top: calc(var(--typography-spacing-vertical) * 0.25);\n }\n}\n\nul li {\n list-style: square;\n}\n\n// Highlighted text\nmark {\n padding: 0.125rem 0.25rem;\n background-color: var(--mark-background-color);\n color: var(--mark-color);\n vertical-align: baseline;\n}\n\n// Blockquote\nblockquote {\n display: block;\n margin: var(--typography-spacing-vertical) 0;\n padding: var(--spacing);\n border-right: none;\n border-left: 0.25rem solid var(--blockquote-border-color);\n border-inline-start: 0.25rem solid var(--blockquote-border-color);\n border-inline-end: none;\n\n footer {\n margin-top: calc(var(--typography-spacing-vertical) * 0.5);\n color: var(--blockquote-footer-color);\n }\n}\n\n// Abbreviations\n// 1. Remove underline decoration in Chrome, Edge, IE, Opera, and Safari\nabbr[title] {\n border-bottom: 1px dotted;\n text-decoration: none; // 1\n cursor: help;\n}\n\n// Ins\nins {\n color: var(--ins-color);\n text-decoration: none;\n}\n\n// del\ndel {\n color: var(--del-color);\n}\n\n// selection\n::selection {\n background-color: var(--primary-focus);\n}\n","/**\n * Embedded content\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// Change the alignment on media elements in all browsers (opinionated)\n:where(audio, canvas, iframe, img, svg, video) {\n vertical-align: middle;\n}\n\n// Add the correct display in IE 9-\naudio,\nvideo {\n display: inline-block;\n}\n\n// Add the correct display in iOS 4-7\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n// Remove the border on iframes in all browsers (opinionated)\n:where(iframe) {\n border-style: none;\n}\n\n// 1. Remove the border on images inside links in IE 10.\n// 2. Responsive by default\nimg {\n max-width: 100%; // 2\n height: auto; // 2\n border-style: none; // 1\n}\n\n// Change the fill color to match the text color in all browsers (opinionated)\n:where(svg:not([fill])) {\n fill: currentColor;\n}\n\n// Hide the overflow in IE\nsvg:not(:root) {\n overflow: hidden;\n}\n","/**\n * Button\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Change the font styles in all browsers\n// 2. Remove the margin on controls in Safari\n// 3. Show the overflow in Edge\nbutton {\n margin: 0; // 2\n overflow: visible; // 3\n font-family: inherit; // 1\n text-transform: none; // 1\n}\n\n// Correct the inability to style buttons in iOS and Safari\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\nbutton {\n display: block;\n width: 100%;\n margin-bottom: var(--spacing);\n}\n\n[role=\"button\"] {\n display: inline-block;\n text-decoration: none;\n}\n\nbutton,\ninput[type=\"submit\"],\ninput[type=\"button\"],\ninput[type=\"reset\"],\n[role=\"button\"] {\n --background-color: var(--primary);\n --border-color: var(--primary);\n --color: var(--primary-inverse);\n --box-shadow: var(--button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));\n padding: var(--form-element-spacing-vertical)\n var(--form-element-spacing-horizontal);\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: 1rem;\n line-height: var(--line-height);\n text-align: center;\n cursor: pointer;\n\n @if $enable-transitions {\n transition: background-color var(--transition),\n border-color var(--transition), color var(--transition),\n box-shadow var(--transition);\n }\n\n &:is([aria-current], :hover, :active, :focus) {\n --background-color: var(--primary-hover);\n --border-color: var(--primary-hover);\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));\n --color: var(--primary-inverse);\n }\n\n &:focus {\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),\n 0 0 0 var(--outline-width) var(--primary-focus);\n }\n}\n\n// .secondary, .contrast & .outline\n@if $enable-classes {\n\n // Secondary\n :is(button, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"]).secondary,\n input[type=\"reset\"] {\n --background-color: var(--secondary);\n --border-color: var(--secondary);\n --color: var(--secondary-inverse);\n cursor: pointer;\n\n &:is([aria-current], :hover, :active, :focus) {\n --background-color: var(--secondary-hover);\n --border-color: var(--secondary-hover);\n --color: var(--secondary-inverse);\n }\n\n &:focus {\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),\n 0 0 0 var(--outline-width) var(--secondary-focus);\n }\n }\n\n // Contrast\n :is(button, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"]).contrast {\n --background-color: var(--contrast);\n --border-color: var(--contrast);\n --color: var(--contrast-inverse);\n\n &:is([aria-current], :hover, :active, :focus) {\n --background-color: var(--contrast-hover);\n --border-color: var(--contrast-hover);\n --color: var(--contrast-inverse);\n }\n\n &:focus {\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),\n 0 0 0 var(--outline-width) var(--contrast-focus);\n }\n }\n\n // Outline (primary)\n :is(button, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"]).outline,\n input[type=\"reset\"].outline {\n --background-color: transparent;\n --color: var(--primary);\n\n &:is([aria-current], :hover, :active, :focus) {\n --background-color: transparent;\n --color: var(--primary-hover);\n }\n }\n\n // Outline (secondary)\n :is(button, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"]).outline.secondary,\n input[type=\"reset\"].outline {\n --color: var(--secondary);\n\n &:is([aria-current], :hover, :active, :focus) {\n --color: var(--secondary-hover);\n }\n }\n\n // Outline (contrast)\n :is(button, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"]).outline.contrast {\n --color: var(--contrast);\n\n &:is([aria-current], :hover, :active, :focus) {\n --color: var(--contrast-hover);\n }\n }\n} \n@else {\n // Secondary button without .class\n input[type=\"reset\"] {\n --background-color: var(--secondary);\n --border-color: var(--secondary);\n --color: var(--secondary-inverse);\n cursor: pointer;\n\n &:is([aria-current], :hover, :active, :focus) {\n --background-color: var(--secondary-hover);\n --border-color: var(--secondary-hover);\n }\n\n &:focus {\n --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),\n 0 0 0 var(--outline-width) var(--secondary-focus);\n }\n }\n}\n\n// Button [disabled]\n// Links without href are disabled by default\n:where(button, [type=\"submit\"], [type=\"button\"], [type=\"reset\"], [role=\"button\"])[disabled],\n:where(fieldset[disabled]) :is(button, [type=\"submit\"], [type=\"button\"], [type=\"reset\"], [role=\"button\"]),\na[role=\"button\"]:not([href]) {\n opacity: 0.5;\n pointer-events: none;\n}\n","/**\n * Form elements\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Change the font styles in all browsers\n// 2. Remove the margin in Firefox and Safari\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0; // 2\n font-size: 1rem; // 1\n line-height: var(--line-height); // 1\n font-family: inherit; // 1\n letter-spacing: inherit; // 2\n}\n\n// Show the overflow in IE.\ninput {\n overflow: visible;\n}\n\n// Remove the inheritance of text transform in Edge, Firefox, and IE\nselect {\n text-transform: none;\n}\n\n// 1. Correct the text wrapping in Edge and IE\n// 2. Correct the color inheritance from `fieldset` elements in IE\n// 3. Remove the padding so developers are not caught out when they zero out\n// `fieldset` elements in all browsers\nlegend {\n max-width: 100%; // 1\n padding: 0; // 3\n color: inherit; // 2\n white-space: normal; // 1\n}\n\n// 1. Remove the default vertical scrollbar in IE\ntextarea {\n overflow: auto; // 1\n}\n\n// Remove the padding in IE 10\n[type=\"checkbox\"],\n[type=\"radio\"] {\n padding: 0;\n}\n\n// Correct the cursor style of increment and decrement buttons in Safari\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n// 1. Correct the odd appearance in Chrome and Safari\n// 2. Correct the outline style in Safari\n[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n outline-offset: -2px; // 2\n}\n\n// Remove the inner padding in Chrome and Safari on macOS\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// 1. Correct the inability to style clickable types in iOS and Safari\n// 2. Change font properties to `inherit` in Safari\n::-webkit-file-upload-button {\n -webkit-appearance: button; // 1\n font: inherit; // 2\n}\n\n// Remove the inner border and padding of focus outlines in Firefox\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// Remove the focus outline in Firefox\n:-moz-focusring {\n outline: none;\n}\n\n// Remove the additional :invalid styles in Firefox\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n// Change the inconsistent appearance in IE (opinionated)\n::-ms-expand {\n display: none;\n}\n\n// Remove the border and padding in all browsers (opinionated)\n[type=\"file\"],\n[type=\"range\"] {\n padding: 0;\n border-width: 0;\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\n// Force height for alternatives input types\ninput:not([type=\"checkbox\"], [type=\"radio\"], [type=\"range\"]) {\n height: calc(\n (1rem * var(--line-height)) + (var(--form-element-spacing-vertical) * 2) +\n (var(--border-width) * 2)\n );\n}\n\n// Fieldset\nfieldset {\n margin: 0;\n margin-bottom: var(--spacing);\n padding: 0;\n border: 0;\n}\n\n// Label & legend\nlabel,\nfieldset legend {\n display: block;\n margin-bottom: calc(var(--spacing) * 0.25);\n font-weight: var(--form-label-font-weight, var(--font-weight));\n}\n\n// Blocks, 100%\ninput:not([type=\"checkbox\"], [type=\"radio\"]),\nselect,\ntextarea {\n width: 100%;\n}\n\n// Reset appearance (Not Checkboxes, Radios, Range and File)\ninput:not([type=\"checkbox\"], [type=\"radio\"], [type=\"range\"], [type=\"file\"]),\nselect,\ntextarea {\n appearance: none;\n padding: var(--form-element-spacing-vertical)\n var(--form-element-spacing-horizontal);\n}\n\n// Commons styles\ninput,\nselect,\ntextarea {\n --background-color: var(--form-element-background-color);\n --border-color: var(--form-element-border-color);\n --color: var(--form-element-color);\n --box-shadow: none;\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n\n @if $enable-transitions {\n transition: background-color var(--transition),\n border-color var(--transition), color var(--transition),\n box-shadow var(--transition);\n }\n}\n\n// Active & Focus\ninput:not([type=\"submit\"], [type=\"button\"], [type=\"reset\"], [type=\"checkbox\"], [type=\"radio\"], [readonly]),\n:where(select, textarea) {\n &:is(:active, :focus) {\n --background-color: var(--form-element-active-background-color);\n }\n}\n\n// Active & Focus\ninput:not([type=\"submit\"], [type=\"button\"], [type=\"reset\"], [role=\"switch\"], [readonly]),\n:where(select, textarea) {\n &:is(:active, :focus) {\n --border-color: var(--form-element-active-border-color);\n }\n}\n\n// Focus\ninput:not([type=\"submit\"], [type=\"button\"], [type=\"reset\"], [type=\"range\"], [type=\"file\"], [readonly]),\nselect,\ntextarea {\n &:focus {\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);\n }\n}\n\n// Disabled\ninput:not([type=\"submit\"], [type=\"button\"], [type=\"reset\"])[disabled],\nselect[disabled],\ntextarea[disabled],\n:where(fieldset[disabled]) :is(input:not([type=\"submit\"], [type=\"button\"], [type=\"reset\"]), select, textarea) {\n --background-color: var(--form-element-disabled-background-color);\n --border-color: var(--form-element-disabled-border-color);\n opacity: var(--form-element-disabled-opacity);\n pointer-events: none;\n}\n\n// Aria-invalid\n:where(input, select, textarea) {\n &:not([type=\"checkbox\"], [type=\"radio\"], [type=\"date\"], [type=\"datetime-local\"], [type=\"month\"], [type=\"time\"], [type=\"week\"]) {\n &[aria-invalid] {\n @if $enable-important {\n padding-right: calc(\n var(--form-element-spacing-horizontal) + 1.5rem\n ) !important;\n padding-left: var(--form-element-spacing-horizontal);\n padding-inline-start: var(--form-element-spacing-horizontal) !important;\n padding-inline-end: calc(\n var(--form-element-spacing-horizontal) + 1.5rem\n ) !important;\n }\n @else {\n padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem);\n padding-left: var(--form-element-spacing-horizontal);\n padding-inline-start: var(--form-element-spacing-horizontal);\n padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem);\n }\n background-position: center right 0.75rem;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n }\n\n &[aria-invalid=\"false\"] {\n background-image: var(--icon-valid);\n }\n\n &[aria-invalid=\"true\"] {\n background-image: var(--icon-invalid);\n }\n }\n\n &[aria-invalid=\"false\"] {\n --border-color: var(--form-element-valid-border-color);\n\n &:is(:active, :focus) {\n @if $enable-important {\n --border-color: var(--form-element-valid-active-border-color) !important;\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color) !important;\n }\n @else {\n --border-color: var(--form-element-valid-active-border-color);\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color);\n }\n }\n }\n\n &[aria-invalid=\"true\"] {\n --border-color: var(--form-element-invalid-border-color);\n\n &:is(:active, :focus) {\n @if $enable-important {\n --border-color: var(--form-element-invalid-active-border-color) !important;\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color) !important;\n }\n @else {\n --border-color: var(--form-element-invalid-active-border-color);\n --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color);\n }\n }\n }\n}\n\n[dir=\"rtl\"] {\n :where(input, select, textarea) {\n &:not([type=\"checkbox\"], [type=\"radio\"]) {\n &:is([aria-invalid], [aria-invalid=\"true\"], [aria-invalid=\"false\"] ){\n background-position: center left 0.75rem;\n }\n }\n }\n}\n\n// Placeholder\ninput::placeholder,\ninput::-webkit-input-placeholder,\ntextarea::placeholder,\ntextarea::-webkit-input-placeholder,\nselect:invalid {\n color: var(--form-element-placeholder-color);\n opacity: 1;\n}\n\n// Margin bottom (Not Checkboxes and Radios)\ninput:not([type=\"checkbox\"], [type=\"radio\"]),\nselect,\ntextarea {\n margin-bottom: var(--spacing);\n}\n\n// Select\nselect {\n // Unstyle the caret on ``s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n &:not([multiple], [size]) {\n padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem);\n padding-left: var(--form-element-spacing-horizontal);\n padding-inline-start: var(--form-element-spacing-horizontal);\n padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem);\n background-image: var(--icon-chevron);\n background-position: center right 0.75rem;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n }\n}\n\n[dir=\"rtl\"] {\n select {\n &:not([multiple], [size]) {\n background-position: center left 0.75rem;\n }\n }\n}\n\n// Helper\n$inputs: \"input, select, textarea\";\n\n@if ($enable-classes and $enable-grid) {\n $inputs: $inputs + \", .grid\";\n}\n\n:where(#{$inputs}) {\n + small {\n display: block;\n width: 100%;\n margin-top: calc(var(--spacing) * -0.75);\n margin-bottom: var(--spacing);\n color: var(--muted-color);\n }\n}\n\n// Styles for Input inside a label\nlabel {\n > :where(input, select, textarea) {\n margin-top: calc(var(--spacing) * 0.25);\n }\n}\n","/**\n * Form elements\n * Checkboxes & Radios\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n width: 1.25em;\n height: 1.25em;\n margin-top: -0.125em;\n margin-right: 0.375em;\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: 0.375em;\n border-width: var(--border-width);\n font-size: inherit;\n vertical-align: middle;\n cursor: pointer;\n\n &::-ms-check {\n display: none; // unstyle IE checkboxes\n }\n\n &:checked,\n &:checked:active,\n &:checked:focus {\n --background-color: var(--primary);\n --border-color: var(--primary);\n background-image: var(--icon-checkbox);\n background-position: center;\n background-size: 0.75em auto;\n background-repeat: no-repeat;\n }\n\n & ~ label {\n display: inline-block;\n margin-right: 0.375em;\n margin-bottom: 0;\n cursor: pointer;\n }\n}\n\n// Checkboxes\n[type=\"checkbox\"] {\n &:indeterminate {\n --background-color: var(--primary);\n --border-color: var(--primary);\n background-image: var(--icon-minus);\n background-position: center;\n background-size: 0.75em auto;\n background-repeat: no-repeat;\n }\n}\n\n// Radios\n[type=\"radio\"] {\n border-radius: 50%;\n\n &:checked,\n &:checked:active,\n &:checked:focus {\n --background-color: var(--primary-inverse);\n border-width: 0.35em;\n background-image: none;\n }\n}\n\n// Switchs\n[type=\"checkbox\"][role=\"switch\"] {\n --background-color: var(--switch-background-color);\n --border-color: var(--switch-background-color);\n --color: var(--switch-color);\n\n // Config\n $switch-height: 1.25em;\n $switch-width: 2.25em;\n $switch-transition: 0.1s ease-in-out;\n\n // Styles\n width: $switch-width;\n height: $switch-height;\n border: var(--border-width) solid var(--border-color);\n border-radius: $switch-height;\n background-color: var(--background-color);\n line-height: $switch-height;\n\n &:focus {\n --background-color: var(--switch-background-color);\n --border-color: var(--switch-background-color);\n }\n\n &:checked {\n --background-color: var(--switch-checked-background-color);\n --border-color: var(--switch-checked-background-color);\n }\n\n &:before {\n display: block;\n width: calc(#{$switch-height} - (var(--border-width) * 2));\n height: 100%;\n border-radius: 50%;\n background-color: var(--color);\n content: \"\";\n\n @if $enable-transitions {\n transition: margin $switch-transition;\n }\n }\n\n &:checked {\n background-image: none;\n\n &::before {\n margin-left: calc(#{$switch-width * 0.5} - var(--border-width));\n margin-inline-start: calc(#{$switch-width * 0.5} - var(--border-width));\n }\n }\n}\n\n// Aria-invalid\n[type=\"checkbox\"],\n[type=\"checkbox\"]:checked,\n[type=\"radio\"],\n[type=\"radio\"]:checked,\n[type=\"checkbox\"][role=\"switch\"],\n[type=\"checkbox\"][role=\"switch\"]:checked {\n \n &[aria-invalid=\"false\"] {\n --border-color: var(--form-element-valid-border-color);\n }\n\n &[aria-invalid=\"true\"] {\n --border-color: var(--form-element-invalid-border-color);\n }\n}","/**\n * Form elements\n * Alternatives input types (Not Checkboxes & Radios)\n */\n\n// Color\n[type=\"color\"] {\n // Wrapper\n @mixin color-wrapper {\n padding: 0;\n }\n\n &::-webkit-color-swatch-wrapper {\n @include color-wrapper;\n }\n\n &::-moz-focus-inner {\n @include color-wrapper;\n }\n\n // Swatch\n @mixin color-swatch {\n border: 0;\n border-radius: calc(var(--border-radius) * 0.5);\n }\n\n &::-webkit-color-swatch {\n @include color-swatch;\n }\n\n &::-moz-color-swatch {\n @include color-swatch;\n }\n}\n\n// Date & Time\n// :not() are needed to add Specificity and avoid !important on padding\ninput:not([type=\"checkbox\"], [type=\"radio\"], [type=\"range\"], [type=\"file\"]) {\n &:is([type=\"date\"], [type=\"datetime-local\"], [type=\"month\"], [type=\"time\"], [type=\"week\"]) {\n --icon-position: 0.75rem;\n --icon-width: 1rem;\n padding-right: calc(var(--icon-width) + var(--icon-position));\n background-image: var(--icon-date);\n background-position: center right var(--icon-position);\n background-size: var(--icon-width) auto;\n background-repeat: no-repeat;\n }\n\n // Time\n &[type=\"time\"] {\n background-image: var(--icon-time);\n }\n}\n\n// Calendar picker\n[type=\"date\"],\n[type=\"datetime-local\"],\n[type=\"month\"],\n[type=\"time\"],\n[type=\"week\"] {\n &::-webkit-calendar-picker-indicator {\n width: var(--icon-width);\n margin-right: calc(var(--icon-width) * -1);\n margin-left: var(--icon-position);\n opacity: 0;\n }\n}\n\n[dir=\"rtl\"]\n :is([type=\"date\"], [type=\"datetime-local\"], [type=\"month\"], [type=\"time\"], [type=\"week\"]) {\n text-align: right;\n}\n\n// Calendar icons are hidden in Firefox\n@if $enable-important {\n @-moz-document url-prefix() {\n [type=\"date\"],\n [type=\"datetime-local\"],\n [type=\"month\"],\n [type=\"time\"],\n [type=\"week\"] {\n padding-right: var(--form-element-spacing-horizontal) !important;\n background-image: none !important;\n }\n }\n}\n\n// File\n[type=\"file\"] {\n --color: var(--muted-color);\n padding: calc(var(--form-element-spacing-vertical) * 0.5) 0;\n border: 0;\n border-radius: 0;\n background: none;\n\n @mixin file-selector-button {\n --background-color: var(--secondary);\n --border-color: var(--secondary);\n --color: var(--secondary-inverse);\n margin-right: calc(var(--spacing) / 2);\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: calc(var(--spacing) / 2);\n padding: calc(var(--form-element-spacing-vertical) * 0.5)\n calc(var(--form-element-spacing-horizontal) * 0.5);\n border: var(--border-width) solid var(--border-color);\n border-radius: var(--border-radius);\n outline: none;\n background-color: var(--background-color);\n box-shadow: var(--box-shadow);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: 1rem;\n line-height: var(--line-height);\n text-align: center;\n cursor: pointer;\n\n @if $enable-transitions {\n transition: background-color var(--transition),\n border-color var(--transition), color var(--transition),\n box-shadow var(--transition);\n }\n\n &:is(:hover, :active, :focus) {\n --background-color: var(--secondary-hover);\n --border-color: var(--secondary-hover);\n }\n }\n\n &::file-selector-button {\n @include file-selector-button;\n }\n\n &::-webkit-file-upload-button {\n @include file-selector-button;\n }\n\n &::-ms-browse {\n @include file-selector-button;\n }\n}\n\n// Range\n[type=\"range\"] {\n // Config\n $height-track: 0.25rem;\n $height-thumb: 1.25rem;\n $border-thumb: 2px;\n\n // Styles\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n width: 100%;\n height: $height-thumb;\n background: none;\n\n // Slider Track\n @mixin slider-track {\n width: 100%;\n height: $height-track;\n border-radius: var(--border-radius);\n background-color: var(--range-border-color);\n\n @if $enable-transitions {\n transition: background-color var(--transition),\n box-shadow var(--transition);\n }\n }\n\n &::-webkit-slider-runnable-track {\n @include slider-track;\n }\n\n &::-moz-range-track {\n @include slider-track;\n }\n\n &::-ms-track {\n @include slider-track;\n }\n\n // Slider Thumb\n @mixin slider-thumb {\n -webkit-appearance: none;\n width: $height-thumb;\n height: $height-thumb;\n margin-top: #{(-($height-thumb * 0.5) + ($height-track * 0.5))};\n border: $border-thumb solid var(--range-thumb-border-color);\n border-radius: 50%;\n background-color: var(--range-thumb-color);\n cursor: pointer;\n\n @if $enable-transitions {\n transition: background-color var(--transition),\n transform var(--transition);\n }\n }\n &::-webkit-slider-thumb {\n @include slider-thumb;\n }\n\n &::-moz-range-thumb {\n @include slider-thumb;\n }\n\n &::-ms-thumb {\n @include slider-thumb;\n }\n\n &:hover,\n &:focus {\n --range-border-color: var(--range-active-border-color);\n --range-thumb-color: var(--range-thumb-hover-color);\n }\n\n &:active {\n --range-thumb-color: var(--range-thumb-active-color);\n\n // Slider Thumb\n &::-webkit-slider-thumb {\n transform: scale(1.25);\n }\n\n &::-moz-range-thumb {\n transform: scale(1.25);\n }\n\n &::-ms-thumb {\n transform: scale(1.25);\n }\n }\n}\n\n// Search\n// :not() are needed to add Specificity and avoid !important on padding\ninput:not([type=\"checkbox\"], [type=\"radio\"], [type=\"range\"], [type=\"file\"]) {\n &[type=\"search\"] {\n padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem);\n border-radius: 5rem;\n background-image: var(--icon-search);\n background-position: center left 1.125rem;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n \n &[aria-invalid] {\n @if $enable-important {\n padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem) !important;\n } \n @else {\n padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem);\n }\n background-position: center left 1.125rem, center right 0.75rem;\n }\n\n &[aria-invalid=\"false\"] {\n background-image: var(--icon-search), var(--icon-valid);\n }\n\n &[aria-invalid=\"true\"] {\n background-image: var(--icon-search), var(--icon-invalid);\n }\n }\n}\n\n// Cancel button\n[type=\"search\"] {\n &::-webkit-search-cancel-button {\n -webkit-appearance: none;\n display: none;\n }\n}\n\n[dir=\"rtl\"] {\n :where(input) {\n &:not([type=\"checkbox\"], [type=\"radio\"], [type=\"range\"], [type=\"file\"]) {\n &[type=\"search\"] {\n background-position: center right 1.125rem;\n \n &[aria-invalid] {\n background-position: center right 1.125rem, center left 0.75rem;\n }\n }\n }\n }\n}\n","/**\n * Table\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Collapse border spacing in all browsers (opinionated)\n// 2. Remove text indentation from table contents in Chrome, Edge, and Safari\n:where(table) {\n width: 100%;\n border-collapse: collapse; // 1\n border-spacing: 0;\n text-indent: 0; // 2\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\n// Cells\nth,\ntd {\n padding: calc(var(--spacing) / 2) var(--spacing);\n border-bottom: var(--border-width) solid var(--table-border-color);\n color: var(--color);\n font-weight: var(--font-weight);\n font-size: var(--font-size);\n text-align: left;\n text-align: start;\n}\n\n// Footer\ntfoot {\n th,\n td {\n border-top: var(--border-width) solid var(--table-border-color);\n border-bottom: 0;\n }\n}\n\n// Striped\ntable {\n &[role=\"grid\"] {\n tbody tr:nth-child(odd) {\n background-color: var(--table-row-stripped-background-color);\n }\n }\n}\n","/**\n * Code\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Correct the inheritance and scaling of font size in all browsers\n// 2. Correct the odd `em` font sizing in all browsers\npre,\ncode,\nkbd,\nsamp {\n font-size: 0.875em; // 2\n font-family: var(--font-family); // 1\n}\n\n// Prevent overflow of the container in all browsers (opinionated)\npre {\n -ms-overflow-style: scrollbar;\n overflow: auto;\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\npre,\ncode,\nkbd {\n border-radius: var(--border-radius);\n background: var(--code-background-color);\n color: var(--code-color);\n font-weight: var(--font-weight);\n line-height: initial;\n}\n\ncode,\nkbd {\n display: inline-block;\n padding: 0.375rem 0.5rem;\n}\n\npre {\n display: block;\n margin-bottom: var(--spacing);\n overflow-x: auto;\n\n > code {\n display: block;\n padding: var(--spacing);\n background: none;\n font-size: 14px;\n line-height: var(--line-height);\n }\n}\n\n// Code Syntax\ncode {\n // Tags\n b {\n color: var(--code-tag-color);\n font-weight: var(--font-weight);\n }\n\n // Properties\n i {\n color: var(--code-property-color);\n font-style: normal;\n }\n\n // Values\n u {\n color: var(--code-value-color);\n text-decoration: none;\n }\n\n // Comments\n em {\n color: var(--code-comment-color);\n font-style: normal;\n }\n}\n\n// kbd\nkbd {\n background-color: var(--code-kbd-background-color);\n color: var(--code-kbd-color);\n vertical-align: baseline;\n}\n","/**\n * Miscs\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Correct the inheritance of border color in Firefox\n// 2. Add the correct box sizing in Firefox\nhr {\n height: 0; // 2\n border: 0;\n border-top: 1px solid var(--muted-border-color);\n color: inherit; // 1\n}\n\n// Add the correct display in IE 10+\n[hidden],\ntemplate {\n @if $enable-important {\n display: none !important;\n } \n @else {\n display: none;\n }\n}\n\n// Add the correct display in IE 9-\ncanvas {\n display: inline-block;\n}\n","/**\n * Accordion ()\n */\n\ndetails {\n display: block;\n margin-bottom: var(--spacing);\n padding-bottom: var(--spacing);\n border-bottom: var(--border-width) solid var(--accordion-border-color);\n\n summary {\n line-height: 1rem;\n list-style-type: none;\n cursor: pointer;\n\n &:not([role]) {\n color: var(--accordion-close-summary-color);\n }\n\n @if $enable-transitions {\n transition: color var(--transition);\n }\n\n // Reset marker\n &::-webkit-details-marker {\n display: none;\n }\n\n &::marker {\n display: none;\n }\n\n &::-moz-list-bullet {\n list-style-type: none;\n }\n\n // Marker\n &::after {\n display: block;\n width: 1rem;\n height: 1rem;\n margin-inline-start: calc(var(--spacing, 1rem) * 0.5);\n float: right;\n transform: rotate(-90deg);\n background-image: var(--icon-chevron);\n background-position: right center;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n content: \"\";\n\n @if $enable-transitions {\n transition: transform var(--transition);\n }\n }\n\n &:focus {\n outline: none;\n\n &:not([role=\"button\"]) {\n color: var(--accordion-active-summary-color);\n }\n }\n\n // Type button\n &[role=\"button\"] {\n width: 100%;\n text-align: left;\n\n // Marker\n &::after {\n height: calc(1rem * var(--line-height, 1.5));\n background-image: var(--icon-chevron-button);\n }\n\n @if $enable-classes {\n // .contrast\n &:not(.outline).contrast {\n // Marker\n &::after {\n background-image: var(--icon-chevron-button-inverse);\n }\n }\n }\n }\n }\n\n // Open\n &[open] {\n > summary {\n margin-bottom: calc(var(--spacing));\n\n &:not([role]) {\n &:not(:focus) {\n color: var(--accordion-open-summary-color);\n }\n }\n\n &::after {\n transform: rotate(0);\n }\n }\n }\n}\n\n[dir=\"rtl\"] {\n details {\n summary {\n text-align: right;\n\n &::after {\n float: left;\n background-position: left center;\n }\n }\n }\n}\n","/**\n * Card ()\n */\n\narticle {\n margin: var(--block-spacing-vertical) 0;\n padding: var(--block-spacing-vertical) var(--block-spacing-horizontal);\n border-radius: var(--border-radius);\n background: var(--card-background-color);\n box-shadow: var(--card-box-shadow);\n\n > header,\n > footer {\n margin-right: calc(var(--block-spacing-horizontal) * -1);\n margin-left: calc(var(--block-spacing-horizontal) * -1);\n padding: calc(var(--block-spacing-vertical) * 0.66)\n var(--block-spacing-horizontal);\n background-color: var(--card-sectionning-background-color);\n }\n\n > header {\n margin-top: calc(var(--block-spacing-vertical) * -1);\n margin-bottom: var(--block-spacing-vertical);\n border-bottom: var(--border-width) solid var(--card-border-color);\n border-top-right-radius: var(--border-radius);\n border-top-left-radius: var(--border-radius);\n }\n\n > footer {\n margin-top: var(--block-spacing-vertical);\n margin-bottom: calc(var(--block-spacing-vertical) * -1);\n border-top: var(--border-width) solid var(--card-border-color);\n border-bottom-right-radius: var(--border-radius);\n border-bottom-left-radius: var(--border-radius);\n }\n}\n","/**\n * Modal ()\n */\n\n:root {\n --scrollbar-width: 0px;\n}\n\ndialog {\n display: flex;\n z-index: 999;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n align-items: center;\n justify-content: center;\n width: inherit;\n min-width: 100%;\n height: inherit;\n min-height: 100%;\n padding: var(--spacing);\n border: 0;\n backdrop-filter: var(--modal-overlay-backdrop-filter);\n background-color: var(--modal-overlay-background-color);\n color: var(--color);\n\n // Content\n article {\n max-height: calc(100vh - var(--spacing) * 2);\n overflow: auto;\n\n @if map-get($breakpoints, \"sm\") {\n @media (min-width: map-get($breakpoints, \"sm\")) {\n max-width: map-get($viewports, \"sm\");\n }\n }\n\n @if map-get($breakpoints, \"md\") {\n @media (min-width: map-get($breakpoints, \"md\")) {\n max-width: map-get($viewports, \"md\");\n }\n }\n\n > header,\n > footer {\n padding: calc(var(--block-spacing-vertical) * 0.5)\n var(--block-spacing-horizontal);\n }\n\n > header {\n .close {\n margin: 0;\n margin-left: var(--spacing);\n float: right;\n }\n }\n\n > footer {\n text-align: right;\n\n [role=\"button\"] {\n margin-bottom: 0;\n\n &:not(:first-of-type) {\n margin-left: calc(var(--spacing) * 0.5);\n }\n }\n }\n\n p {\n &:last-of-type {\n margin: 0;\n }\n }\n\n // Close icon\n @if $enable-classes {\n .close {\n display: block;\n width: 1rem;\n height: 1rem;\n margin-top: calc(var(--block-spacing-vertical) * -0.5);\n margin-bottom: var(--typography-spacing-vertical);\n margin-left: auto;\n background-image: var(--icon-close);\n background-position: center;\n background-size: auto 1rem;\n background-repeat: no-repeat;\n opacity: 0.5;\n\n @if $enable-transitions {\n transition: opacity var(--transition);\n }\n\n &:is([aria-current], :hover, :active, :focus) {\n opacity: 1;\n }\n }\n }\n }\n\n // Closed state\n &:not([open]),\n &[open=\"false\"] {\n display: none;\n }\n}\n\n// Utilities\n@if $enable-classes {\n .modal-is-open {\n padding-right: var(--scrollbar-width, 0px);\n overflow: hidden;\n pointer-events: none;\n touch-action: none;\n\n dialog {\n pointer-events: auto;\n }\n }\n}\n\n// Animations\n@if ($enable-classes and $enable-transitions) {\n $animation-duration: 0.2s;\n\n :where(.modal-is-opening, .modal-is-closing) {\n dialog,\n dialog > article {\n animation-duration: $animation-duration;\n animation-timing-function: ease-in-out;\n animation-fill-mode: both;\n }\n\n dialog {\n animation-duration: ($animation-duration * 4);\n animation-name: modal-overlay ;\n\n > article {\n animation-delay: $animation-duration;\n animation-name: modal;\n }\n }\n }\n\n .modal-is-closing {\n dialog,\n dialog > article {\n animation-delay: 0s;\n animation-direction: reverse;\n }\n }\n\n @keyframes modal-overlay {\n from {\n backdrop-filter: none;\n background-color: transparent;\n }\n }\n\n @keyframes modal {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n }\n}\n","/**\n * Nav\n */\n\n// Reboot based on :\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n\n// Prevent VoiceOver from ignoring list semantics in Safari (opinionated)\n:where(nav li)::before {\n float: left;\n content: \"\\200B\";\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\n// Horizontal Nav\nnav,\nnav ul {\n display: flex;\n}\n\nnav {\n justify-content: space-between;\n\n ol,\n ul {\n align-items: center;\n margin-bottom: 0;\n padding: 0;\n list-style: none;\n\n &:first-of-type {\n margin-left: calc(var(--nav-element-spacing-horizontal) * -1);\n }\n &:last-of-type {\n margin-right: calc(var(--nav-element-spacing-horizontal) * -1);\n }\n }\n\n li {\n display: inline-block;\n margin: 0;\n padding: var(--nav-element-spacing-vertical)\n var(--nav-element-spacing-horizontal);\n\n // Minimal support for buttons and forms elements\n > * {\n --spacing: 0;\n }\n }\n\n :where(a, [role=\"link\"]) {\n display: inline-block;\n margin: calc(var(--nav-link-spacing-vertical) * -1)\n calc(var(--nav-link-spacing-horizontal) * -1);\n padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);\n border-radius: var(--border-radius);\n text-decoration: none;\n\n &:is([aria-current], :hover, :active, :focus) {\n text-decoration: none;\n }\n }\n\n // Breadcrumb\n &[aria-label=\"breadcrumb\"] {\n align-items: center;\n justify-content: start;\n\n & ul li {\n &:not(:first-child) {\n margin-inline-start: var(--nav-link-spacing-horizontal);\n }\n\n &:not(:last-child) {\n ::after {\n position: absolute;\n width: calc(var(--nav-link-spacing-horizontal) * 2);\n margin-inline-start: calc(var(--nav-link-spacing-horizontal) / 2);\n content: \"/\";\n color: var(--muted-color);\n text-align: center;\n }\n }\n }\n\n & a[aria-current] {\n background-color: transparent;\n color: inherit;\n text-decoration: none;\n pointer-events: none;\n }\n }\n\n // Minimal support for role=\"button\"\n [role=\"button\"] {\n margin-right: inherit;\n margin-left: inherit;\n padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);\n }\n}\n\n// Vertical Nav\naside {\n nav,\n ol,\n ul,\n li {\n display: block;\n }\n\n li {\n padding: calc(var(--nav-element-spacing-vertical) * 0.5)\n var(--nav-element-spacing-horizontal);\n\n a {\n display: block;\n }\n\n // Minimal support for links as buttons\n [role=\"button\"] {\n margin: inherit;\n }\n }\n}\n\n// Breadcrumb RTL\n[dir=\"rtl\"] {\n nav {\n &[aria-label=\"breadcrumb\"] {\n & ul li {\n &:not(:last-child) {\n ::after {\n content: \"\\\\\";\n }\n }\n }\n }\n }\n}\n","/**\n * Progress\n */\n\n// Reboot based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// 1. Add the correct display in Edge 18- and IE\n// 2. Add the correct vertical alignment in Chrome, Edge, and Firefox\nprogress {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\nprogress {\n // Reset the default appearance\n -webkit-appearance: none;\n -moz-appearance: none;\n\n // Styles\n display: inline-block;\n appearance: none;\n width: 100%;\n height: 0.5rem;\n margin-bottom: calc(var(--spacing) * 0.5);\n overflow: hidden;\n\n // Remove Firefox and Opera border\n border: 0;\n border-radius: var(--border-radius);\n background-color: var(--progress-background-color);\n\n // IE10 uses `color` to set the bar background-color\n color: var(--progress-color);\n\n &::-webkit-progress-bar {\n border-radius: var(--border-radius);\n background: none;\n }\n &[value]::-webkit-progress-value {\n background-color: var(--progress-color);\n }\n &::-moz-progress-bar {\n background-color: var(--progress-color);\n }\n\n // Indeterminate state\n @media (prefers-reduced-motion: no-preference) {\n &:indeterminate {\n background: var(--progress-background-color)\n linear-gradient(\n to right,\n var(--progress-color) 30%,\n var(--progress-background-color) 30%\n )\n top left / 150% 150% no-repeat;\n animation: progress-indeterminate 1s linear infinite;\n\n &[value]::-webkit-progress-value {\n background-color: transparent;\n }\n &::-moz-progress-bar {\n background-color: transparent;\n }\n }\n }\n}\n\n[dir=\"rtl\"] {\n @media (prefers-reduced-motion: no-preference) {\n progress:indeterminate {\n animation-direction: reverse;\n }\n }\n}\n\n@keyframes progress-indeterminate {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n","/**\n * Dropdown ([role=\"list\"])\n */\n\n// Menu\ndetails[role=\"list\"],\nli[role=\"list\"] {\n position: relative;\n}\n\ndetails[role=\"list\"] summary + ul,\nli[role=\"list\"] > ul {\n display: flex;\n z-index: 99;\n position: absolute;\n top: auto;\n right: 0;\n left: 0;\n flex-direction: column;\n margin: 0;\n padding: 0;\n border: var(--border-width) solid var(--dropdown-border-color);\n border-radius: var(--border-radius);\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n background-color: var(--dropdown-background-color);\n box-shadow: var(--card-box-shadow);\n color: var(--dropdown-color);\n white-space: nowrap;\n\n li {\n width: 100%;\n margin-bottom: 0;\n padding: calc(var(--form-element-spacing-vertical) * 0.5)\n var(--form-element-spacing-horizontal);\n list-style: none;\n\n &:first-of-type {\n margin-top: calc(var(--form-element-spacing-vertical) * 0.5);\n }\n\n &:last-of-type {\n margin-bottom: calc(var(--form-element-spacing-vertical) * 0.5);\n }\n\n a {\n display: block;\n margin: calc(var(--form-element-spacing-vertical) * -0.5)\n calc(var(--form-element-spacing-horizontal) * -1);\n padding: calc(var(--form-element-spacing-vertical) * 0.5)\n var(--form-element-spacing-horizontal);\n overflow: hidden;\n color: var(--dropdown-color);\n text-decoration: none;\n text-overflow: ellipsis;\n\n &:hover {\n background-color: var(--dropdown-hover-background-color);\n }\n }\n }\n}\n\n// Marker\ndetails[role=\"list\"] summary,\nli[role=\"list\"] > a {\n &::after {\n display: block;\n width: 1rem;\n height: calc(1rem * var(--line-height, 1.5));\n margin-inline-start: 0.5rem;\n float: right;\n transform: rotate(0deg);\n background-position: right center;\n background-size: 1rem auto;\n background-repeat: no-repeat;\n content: \"\";\n }\n}\n\n// Global dropdown only\ndetails[role=\"list\"] {\n padding: 0;\n border-bottom: none;\n\n // Style as \n summary {\n margin-bottom: 0;\n\n &:not([role]) {\n height: calc(\n 1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 +\n var(--border-width) * 2\n );\n padding: var(--form-element-spacing-vertical)\n var(--form-element-spacing-horizontal);\n border: var(--border-width) solid var(--form-element-border-color);\n border-radius: var(--border-radius);\n background-color: var(--form-element-background-color);\n color: var(--form-element-placeholder-color);\n line-height: inherit;\n cursor: pointer;\n\n @if $enable-transitions {\n transition: background-color var(--transition),\n border-color var(--transition), color var(--transition),\n box-shadow var(--transition);\n }\n\n &:active,\n &:focus {\n border-color: var(--form-element-active-border-color);\n background-color: var(--form-element-active-background-color);\n }\n\n &:focus {\n box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);\n }\n }\n }\n\n // Close for details[role=\"list\"]\n &[open] summary {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n\n &::before {\n display: block;\n z-index: 1;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: none;\n content: \"\";\n cursor: default;\n }\n }\n}\n\n// All Dropdowns inside \nnav details[role=\"list\"] summary,\nnav li[role=\"list\"] a {\n display: flex;\n direction: ltr;\n}\n\nnav details[role=\"list\"] summary + ul,\nnav li[role=\"list\"] > ul {\n min-width: fit-content;\n border-radius: var(--border-radius);\n\n li a {\n border-radius: 0;\n }\n}\n\n// Dropdowns inside as nested \nnav details[role=\"list\"] {\n summary,\n summary:not([role]) {\n height: auto;\n padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal);\n }\n\n &[open] summary {\n border-radius: var(--border-radius);\n }\n\n summary + ul {\n margin-top: var(--outline-width);\n margin-inline-start: 0;\n }\n\n summary[role=\"link\"] {\n margin-bottom: calc(var(--nav-link-spacing-vertical) * -1);\n line-height: var(--line-height);\n\n + ul {\n margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width));\n margin-inline-start: calc(var(--nav-link-spacing-horizontal) * -1);\n }\n }\n}\n\n// Dropdowns inside a without using \nli[role=\"list\"] {\n // Open on hover (for mobile)\n // or on active/focus (for keyboard navigation)\n &:hover > ul,\n a:active ~ ul,\n a:focus ~ ul {\n display: flex;\n }\n\n > ul {\n display: none;\n margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width));\n margin-inline-start: calc(\n var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal)\n );\n }\n\n > a::after {\n background-image: var(--icon-chevron);\n }\n}\n\nlabel > details[role=\"list\"] {\n margin-top: calc(var(--spacing) * .25);\n margin-bottom: var(--spacing);\n}\n","/**\n * Loading ([aria-busy=true])\n */\n\n\n// Cursor\n[aria-busy=\"true\"] {\n cursor: progress;\n}\n\n// Everyting except form elements\n[aria-busy=\"true\"]:not(input, select, textarea, html) {\n\n &::before {\n display: inline-block;\n width: 1em;\n height: 1em;\n border: 0.1875em solid currentColor;\n border-radius: 1em;\n border-right-color: transparent;\n content: \"\";\n vertical-align: text-bottom;\n vertical-align: -.125em; // Visual alignment\n animation: spinner 0.75s linear infinite;\n opacity: var(--loading-spinner-opacity);\n }\n\n &:not(:empty) {\n &::before {\n margin-right: calc(var(--spacing) * 0.5);\n margin-left: 0;\n margin-inline-start: 0;\n margin-inline-end: calc(var(--spacing) * 0.5);\n }\n }\n\n &:empty {\n text-align: center;\n }\n}\n\n// Buttons and links\nbutton,\ninput[type=\"submit\"],\ninput[type=\"button\"],\ninput[type=\"reset\"],\na {\n &[aria-busy=\"true\"] {\n pointer-events: none;\n }\n}\n\n// Animation: rotate\n@keyframes spinner {\n to {\n transform: rotate(360deg);\n }\n}\n","/**\n * Tooltip ([data-tooltip])\n */\n\n[data-tooltip] {\n position: relative;\n\n &:not(a, button, input) {\n border-bottom: 1px dotted;\n text-decoration: none;\n cursor: help;\n }\n\n &[data-placement=\"top\"]::before,\n &[data-placement=\"top\"]::after,\n &::before,\n &::after {\n display: block;\n z-index: 99;\n position: absolute;\n bottom: 100%;\n left: 50%;\n padding: .25rem .5rem;\n overflow: hidden;\n transform: translate(-50%, -.25rem);\n border-radius: var(--border-radius);\n background: var(--tooltip-background-color);\n content: attr(data-tooltip);\n color: var(--tooltip-color);\n font-style: normal;\n font-weight: var(--font-weight);\n font-size: .875rem;\n text-decoration: none;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0;\n pointer-events: none;\n }\n \n // Caret\n &[data-placement=\"top\"]::after,\n &::after {\n padding: 0;\n transform: translate(-50%, 0rem);\n border-top: .3rem solid;\n border-right: .3rem solid transparent;\n border-left: .3rem solid transparent;\n border-radius: 0;\n background-color: transparent;\n content: \"\";\n color: var(--tooltip-background-color);\n }\n\n &[data-placement=\"bottom\"] {\n &::before,\n &::after {\n top: 100%;\n bottom: auto;\n transform: translate(-50%, .25rem);\n }\n \n &:after{\n transform: translate(-50%, -.3rem);\n border: .3rem solid transparent;\n border-bottom: .3rem solid;\n }\n }\n\n &[data-placement=\"left\"] {\n &::before,\n &::after {\n top: 50%;\n right: 100%;\n bottom: auto;\n left: auto;\n transform: translate(-.25rem, -50%);\n }\n \n &:after{\n transform: translate(.3rem, -50%);\n border: .3rem solid transparent;\n border-left: .3rem solid;\n }\n }\n\n &[data-placement=\"right\"] {\n &::before,\n &::after {\n top: 50%;\n right: auto;\n bottom: auto;\n left: 100%;\n transform: translate(.25rem, -50%);\n }\n \n &:after{\n transform: translate(-.3rem, -50%);\n border: .3rem solid transparent;\n border-right: .3rem solid;\n }\n }\n\n // Display\n &:focus,\n &:hover {\n &::before,\n &::after {\n opacity: 1;\n }\n }\n\n \n @if $enable-transitions {\n\n // Animations, excluding touch devices\n @media (hover: hover) and (pointer: fine) {\n &[data-placement=\"bottom\"]:focus,\n &[data-placement=\"bottom\"]:hover\n &:focus,\n &:hover {\n &::before,\n &::after {\n animation-duration: .2s;\n animation-name: tooltip-slide-top;\n }\n\n &::after {\n animation-name: tooltip-caret-slide-top; \n }\n }\n \n &[data-placement=\"bottom\"] {\n &:focus,\n &:hover {\n &::before,\n &::after {\n animation-duration: .2s;\n animation-name: tooltip-slide-bottom;\n }\n \n &::after {\n animation-name: tooltip-caret-slide-bottom; \n }\n }\n }\n \n &[data-placement=\"left\"] {\n &:focus,\n &:hover {\n &::before,\n &::after {\n animation-duration: .2s;\n animation-name: tooltip-slide-left;\n }\n \n &::after {\n animation-name: tooltip-caret-slide-left; \n }\n }\n }\n \n &[data-placement=\"right\"] {\n &:focus,\n &:hover {\n &::before,\n &::after {\n animation-duration: .2s;\n animation-name: tooltip-slide-right;\n }\n \n &::after {\n animation-name: tooltip-caret-slide-right; \n }\n }\n }\n }\n\n @keyframes tooltip-slide-top {\n from {\n transform: translate(-50%, .75rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, -.25rem);\n opacity: 1;\n }\n }\n \n @keyframes tooltip-caret-slide-top {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(-50%, -.25rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, 0rem);\n opacity: 1;\n }\n }\n \n @keyframes tooltip-slide-bottom {\n from {\n transform: translate(-50%, -.75rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, .25rem);\n opacity: 1;\n }\n }\n \n @keyframes tooltip-caret-slide-bottom {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(-50%, -.5rem);\n opacity: 0;\n }\n to {\n transform: translate(-50%, -.3rem);\n opacity: 1;\n }\n }\n \n @keyframes tooltip-slide-left {\n from {\n transform: translate(.75rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(-.25rem, -50%);\n opacity: 1;\n }\n }\n \n @keyframes tooltip-caret-slide-left {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(.05rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(.3rem, -50%);\n opacity: 1;\n }\n }\n \n @keyframes tooltip-slide-right {\n from {\n transform: translate(-.75rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(.25rem, -50%);\n opacity: 1;\n }\n }\n \n @keyframes tooltip-caret-slide-right {\n from {\n opacity: 0;\n }\n 50% {\n transform: translate(-.05rem, -50%);\n opacity: 0;\n }\n to {\n transform: translate(-.3rem, -50%);\n opacity: 1;\n }\n }\n }\n}\n","/**\n * Accessibility & User interaction\n */\n\n// Based on :\n// - normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css\n// - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n// āāāāāāāāāāāāāāāāāāāā\n\n// Accessibility\n\n// Change the cursor on control elements in all browsers (opinionated)\n[aria-controls] {\n cursor: pointer;\n}\n\n// Change the cursor on disabled, not-editable, or otherwise inoperable elements in all browsers (opinionated)\n[aria-disabled=\"true\"],\n[disabled] {\n cursor: not-allowed;\n}\n\n// Change the display on visually hidden accessible elements in all browsers (opinionated)\n[aria-hidden=\"false\"][hidden] {\n display: initial;\n}\n\n[aria-hidden=\"false\"][hidden]:not(:focus) {\n clip: rect(0, 0, 0, 0);\n position: absolute;\n}\n\n// User interaction\n// Remove the tapping delay in IE 10\na,\narea,\nbutton,\ninput,\nlabel,\nselect,\nsummary,\ntextarea,\n[tabindex] {\n -ms-touch-action: manipulation;\n}\n\n// Pico\n// āāāāāāāāāāāāāāāāāāāā\n\n[dir=\"rtl\"] {\n direction: rtl;\n}\n","@if $enable-transitions and $enable-important {\n /**\n * Reduce Motion Features\n */\n\n // Based on :\n // - sanitize.css v13.0.0 | CC0 1.0 Universal | github.com/csstools/sanitize.css\n // āāāāāāāāāāāāāāāāāāāā\n\n // 1. Remove animations when motion is reduced (opinionated)\n // 2. Remove fixed background attachments when motion is reduced (opinionated)\n // 3. Remove timed scrolling behaviors when motion is reduced (opinionated)\n // 4. Remove transitions when motion is reduced (opinionated)\n @media (prefers-reduced-motion: reduce) {\n *:not([aria-busy=\"true\"]),\n :not([aria-busy=\"true\"])::before,\n :not([aria-busy=\"true\"])::after {\n background-attachment: initial !important; // 2\n animation-duration: 1ms !important; // 1\n animation-delay: -1ms !important; // 1\n animation-iteration-count: 1 !important; // 1\n scroll-behavior: auto !important; // 3\n transition-delay: 0s !important; // 4\n transition-duration: 0s !important; // 4\n }\n }\n}\n"]}
\ No newline at end of file
diff --git a/argos/server/static/styles.css b/argos/server/static/styles.css
index 93ac005..769c0a9 100644
--- a/argos/server/static/styles.css
+++ b/argos/server/static/styles.css
@@ -13,7 +13,7 @@ body > main {
}
h2 {
- margin-bottom: calc(var(--typography-spacing-vertical) * 0.5);
+ margin-bottom: calc(var(--pico-typography-spacing-vertical) * 0.5);
}
.grid-index {
@@ -26,10 +26,12 @@ h2 {
.grid-index article {
margin-top: 0;
margin-bottom: 1rem;
- padding-bottom: calc(var(--block-spacing-vertical) * 0.7);
+ padding-bottom: calc(var(--pico-block-spacing-vertical) * 2.4);
}
.grid-index article > header {
- margin-bottom: calc(var(--block-spacing-vertical) * 0.7);
+ padding-top: calc(var(--pico-block-spacing-vertical) * 2.4);
+ padding-bottom: calc(var(--pico-block-spacing-vertical) * 2.4);
+ margin-bottom: calc(var(--pico-block-spacing-vertical) * 2.4);
}
label[for="select-status"] {
diff --git a/argos/server/templates/base.html b/argos/server/templates/base.html
index a623714..513e7a6 100644
--- a/argos/server/templates/base.html
+++ b/argos/server/templates/base.html
@@ -32,31 +32,52 @@
+ {% if request.url.remove_query_params('msg') != url_for('login_view') %}
+ {% endif %}
@@ -71,10 +92,10 @@
- Argos PanoptĆØs ,
+ Argos PanoptĆØs ,
AGPLv3
(sources )
-
+
API documentation:
Swagger
or
diff --git a/argos/server/templates/index.html b/argos/server/templates/index.html
index 35b2fe0..1794899 100644
--- a/argos/server/templates/index.html
+++ b/argos/server/templates/index.html
@@ -26,7 +26,7 @@
name="auto_refresh_seconds"
type="number"
form="refresh-form"
- min="1"
+ min="5"
value="{{ auto_refresh_seconds }}"> seconds
diff --git a/argos/server/templates/login.html b/argos/server/templates/login.html
new file mode 100644
index 0000000..b397115
--- /dev/null
+++ b/argos/server/templates/login.html
@@ -0,0 +1,25 @@
+{% extends "base.html" %}
+{% block title %}Login {% endblock title %}
+{% block content %}
+ {% if msg is not none %}
+ {{ msg }}
+ {% endif %}
+
+ Username
+
+ Password
+
+
+
+{% endblock content %}
diff --git a/argos/server/templates/result.html b/argos/server/templates/result.html
index 049e206..abd7d53 100644
--- a/argos/server/templates/result.html
+++ b/argos/server/templates/result.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-{% block title %}{{ result }} {% endblock title %}
+{% block title %}Result {{ result.id }} - {{ result.status }} {% endblock title %}
{% block content %}
Task
diff --git a/argos/server/templates/results.html b/argos/server/templates/results.html
index 36ce6e9..d7a7d57 100644
--- a/argos/server/templates/results.html
+++ b/argos/server/templates/results.html
@@ -13,7 +13,7 @@
{% for result in results %}
-
+
{{ result.submitted_at }}
{{ result.status }}
{{ result.severity }}
@@ -22,5 +22,4 @@
{% endfor %}
-
{% endblock content %}
diff --git a/conf/.env.example b/conf/.env.example
index f53aca5..1dde480 100644
--- a/conf/.env.example
+++ b/conf/.env.example
@@ -1,4 +1,7 @@
-ARGOS_YAML_FILE = "my-config.yaml"
-ARGOS_DATABASE_URL = "postgresql://argos:argos@localhost/argos"
-DB_POOL_SIZE = 10 # https://docs.sqlalchemy.org/en/20/core/pooling.html#sqlalchemy.pool.QueuePool.params.pool_size
-DB_MAX_OVERFLOW = 20
\ No newline at end of file
+ARGOS_YAML_FILE="my-config.yaml"
+ARGOS_DATABASE_URL="postgresql://argos:argos@localhost/argos"
+
+# https://docs.sqlalchemy.org/en/20/core/pooling.html#sqlalchemy.pool.QueuePool.params.pool_size
+DB_POOL_SIZE=10
+# https://docs.sqlalchemy.org/en/20/core/pooling.html#sqlalchemy.pool.QueuePool.params.max_overflow
+DB_MAX_OVERFLOW=20
diff --git a/conf/config-example.yaml b/conf/config-example.yaml
deleted file mode 100644
index 8bbf908..0000000
--- a/conf/config-example.yaml
+++ /dev/null
@@ -1,63 +0,0 @@
-general:
- frequency: "1m" # Run checks every minute.
- # Which way do you want to be warned when a check goes to that severity?
- alerts:
- ok:
- - local
- warning:
- - local
- critical:
- - local
- unknown:
- - local
-# mail:
-# mailfrom: no-reply@example.org
-# host: 127.0.0.1
-# port: 25
-# ssl: False
-# starttls: False
-# auth:
-# login: foo
-# password: bar
-# addresses:
-# - foo@admin.example.org
-# - bar@admin.example.org
-# gotify:
-# - url: https://example.org
-# tokens:
-# - foo
-# - bar
-
-service:
- secrets:
- # Secrets can be generated using `openssl rand -base64 32`.
-
-ssl:
- thresholds:
- - "1d": critical
- - "5d": warning
-
-# It's also possible to define the checks in another file
-# with the include syntax:
-#
-# websites: !include websites.yaml
-#
-websites:
- - domain: "https://mypads.example.org"
- paths:
- - path: "/mypads/"
- checks:
- - status-is: 200
- - body-contains: '
'
- - ssl-certificate-expiration: "on-check"
- - path: "/admin/"
- checks:
- - status-is: 401
- - domain: "https://munin.example.org"
- paths:
- - path: "/"
- checks:
- - status-is: 301
- - path: "/munin/"
- checks:
- - status-is: 401
diff --git a/conf/config-example.yaml b/conf/config-example.yaml
new file mode 120000
index 0000000..52bab49
--- /dev/null
+++ b/conf/config-example.yaml
@@ -0,0 +1 @@
+../argos/config-example.yaml
\ No newline at end of file
diff --git a/conf/default-argos-agent b/conf/default-argos-agent
new file mode 100644
index 0000000..dcd5af7
--- /dev/null
+++ b/conf/default-argos-agent
@@ -0,0 +1,5 @@
+ARGOS_AGENT_TOKEN=Secret
+ARGOS_AGENT_SERVER_URL=http://127.0.0.1:8000
+ARGOS_AGENT_LOGLEVEL=WARNING
+ARGOS_AGENT_MAX_TASKS=20
+ARGOS_AGENT_WAIT_TIME=10
diff --git a/conf/default-argos-server b/conf/default-argos-server
new file mode 100644
index 0000000..724b42e
--- /dev/null
+++ b/conf/default-argos-server
@@ -0,0 +1,5 @@
+ARGOS_YAML_FILE="/etc/argos/config.yaml"
+ARGOS_SERVER_WORKERS=4
+ARGOS_SERVER_SOCKET=127.0.0.1:8000
+# Comma separated list of IP addresses of the web proxy (usually Nginx)
+ARGOS_SERVER_FORWARDED_ALLOW_IPS=127.0.0.1
diff --git a/conf/nginx.conf b/conf/nginx.conf
index 3356186..ecf3681 100644
--- a/conf/nginx.conf
+++ b/conf/nginx.conf
@@ -9,21 +9,15 @@ server {
ssl_certificate /etc/letsencrypt/live/argos.example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/argos.example.org/privkey.pem;
- access_log /var/log/nginx/argos.example.org.access.log;
- error_log /var/log/nginx/argos.example.org.error.log;
+ access_log /var/log/nginx/argos.example.org.access.log;
+ error_log /var/log/nginx/argos.example.org.error.log;
if ($scheme != "https") {
rewrite ^ https://$http_host$request_uri? permanent;
}
- location ~ ^/($|domains?/|result/|task/|refresh/) {
- auth_basic "Closed site";
- auth_basic_user_file argos.passwd;
- include proxy_params;
- proxy_pass http://127.0.0.1:8000;
- }
location / {
- include proxy_params;
- proxy_pass http://127.0.0.1:8000;
+ include proxy_params;
+ proxy_pass http://127.0.0.1:8000;
}
}
diff --git a/conf/systemd-agent.service b/conf/systemd-agent.service
index 93e7e9f..bb0700e 100644
--- a/conf/systemd-agent.service
+++ b/conf/systemd-agent.service
@@ -1,21 +1,17 @@
[Unit]
Description=Argos agent
-Documentation=https://framasoft.frama.io/framaspace/argos/
+Documentation=https://argos-monitoring.framasoft.org/
Requires=network.target
After=network.target
[Service]
-User=www-data
-Environment="ARGOS_AGENT_TOKEN=Secret"
-Environment="ARGOS_AGENT_SERVER_URL=http://127.0.0.1:8000"
-WorkingDirectory=/var/www/argos/
-ExecStart=/var/www/argos/venv/bin/argos agent --max-tasks 20 --wait-time 10 --log-level DEBUG
+User=argos
+EnvironmentFile=/etc/default/argos-agent
+WorkingDirectory=/opt/argos/
+ExecStart=/opt/argos/venv/bin/argos agent --max-tasks $ARGOS_AGENT_MAX_TASKS \
+ --wait-time $ARGOS_AGENT_WAIT_TIME \
+ --log-level $ARGOS_AGENT_LOGLEVEL
SyslogIdentifier=argos-agent
[Install]
WantedBy=multi-user.target
-
-# NB: it may be better to
-# - use a dedicated user
-# - use a EnvironmentFile=/etc/default/argos-agent in order to enable configuration
-# changes without doing a systemctl daemon-reload
diff --git a/conf/systemd-server.service b/conf/systemd-server.service
index 9326b39..15e0c2d 100644
--- a/conf/systemd-server.service
+++ b/conf/systemd-server.service
@@ -1,24 +1,23 @@
[Unit]
Description=Argos server
-Documentation=https://framasoft.frama.io/framaspace/argos/
+Documentation=https://argos-monitoring.framasoft.org/
Requires=network.target postgresql.service
After=network.target postgresql.service
PartOf=postgresql.service
[Service]
-User=www-data
-WorkingDirectory=/var/www/argos/
-Environment="ARGOS_SERVER_WORKERS=4"
-Environment="ARGOS_SERVER_SOCKET=127.0.0.1:8000"
-ExecStartPre=/var/www/argos/venv/bin/argos server migrate
-ExecStartPre=/var/www/argos/venv/bin/argos server reload-config
-ExecStart=/var/www/argos/venv/bin/gunicorn "argos.server.main:get_application()" -w $ARGOS_SERVER_WORKERS -k uvicorn.workers.UvicornWorker -b $ARGOS_SERVER_SOCKET
-ExecReload=/var/www/argos/venv/bin/argos server reload
+User=argos
+WorkingDirectory=/opt/argos/
+EnvironmentFile=/etc/default/argos-server
+ExecStartPre=/opt/argos/venv/bin/argos server migrate
+ExecStartPre=/opt/argos/venv/bin/argos server reload-config
+ExecStart=/opt/argos/venv/bin/gunicorn "argos.server.main:get_application()" \
+ --workers $ARGOS_SERVER_WORKERS \
+ --worker-class uvicorn.workers.UvicornWorker \
+ --bind $ARGOS_SERVER_SOCKET \
+ --forwarded-allow-ips $ARGOS_SERVER_FORWARDED_ALLOW_IPS
+ExecReload=/opt/argos/venv/bin/argos server reload-config
SyslogIdentifier=argos-server
[Install]
WantedBy=multi-user.target
-
-# NB: it may be better to
-# - use a EnvironmentFile=/etc/default/argos-server in order to enable configuration
-# changes without doing a systemctl daemon-reload
diff --git a/docs/checks.md b/docs/checks.md
index 0f96724..fcc4d2c 100644
--- a/docs/checks.md
+++ b/docs/checks.md
@@ -13,7 +13,7 @@ These checks are the most basic ones. They simply check that the response from t
```{code-block} yaml
---
-caption: config.yaml
+caption: argos-config.yaml
---
- domain: "https://example.org"
paths:
@@ -30,7 +30,7 @@ caption: config.yaml
```{code-block} yaml
---
-caption: config.yaml
+caption: argos-config.yaml
---
ssl:
thresholds:
@@ -42,4 +42,4 @@ ssl:
- path: "/"
checks:
- ssl-certificate-expiration: "on-check"
-```
\ No newline at end of file
+```
diff --git a/docs/cli.md b/docs/cli.md
index be7b0ec..83a98f3 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -26,9 +26,9 @@ Options:
--help Show this message and exit.
Commands:
- agent Get and run tasks to the provided server.
- server
- version
+ agent Get and run tasks for the provided server.
+ server Commands for managing server, serverās configuration and users
+ version Prints Argosā version and exits
```
+
+### Server watch-agents
+
+
+
+```man
+Usage: argos server cleandb [OPTIONS]
+
+ Clean the database (to run routinely)
+
+ - Removes old results from the database.
+ - Removes locks from tasks that have been locked for too long.
+
+Options:
+ --max-results INTEGER Number of results per task to keep
+ --max-lock-seconds INTEGER The number of seconds after which a lock is
+ considered stale, must be higher than 60 (the
+ checks have a timeout value of 60 seconds)
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE
+ environment variable is set, its value will be
+ used instead. Default value: argos-config.yaml and
+ /etc/argos/config.yaml as fallback.
--help Show this message and exit.
```
@@ -177,14 +216,37 @@ Usage: argos server reload-config [OPTIONS]
Options:
--config TEXT Path of the configuration file. If ARGOS_YAML_FILE environment
- variable is set, its value will be used instead.
+ variable is set, its value will be used instead. Default value:
+ argos-config.yaml and /etc/argos/config.yaml as fallback.
--help Show this message and exit.
```
-### Server generate-token command
+### Server generate-config
+
+
+
+```man
+Usage: argos server generate-config [OPTIONS]
+
+ Output a self-documented example config file.
+
+ Redirect the output to a file to save it:
+ argos server generate-config > /etc/argos/config.yaml
+
+Options:
+ --help Show this message and exit.
+```
+
+
+
+### Server generate-token
+
+### Server user management
+
+To access Argosā web interface, you need to create at least one user.
+
+You can manage users only through CLI.
+
+
+
+```man
+Usage: argos server user [OPTIONS] COMMAND [ARGS]...
+
+ User management
+
+Options:
+ --help Show this message and exit.
+
+Commands:
+ add Add new user
+ change-password Change userās password
+ delete Delete user
+ disable Disable user
+ enable Enable user
+ show List all users
+ verify-password Test userās password
+```
+
+
+
+#### Add user
+
+
+
+```man
+Usage: argos server user add [OPTIONS]
+
+ Add new user
+
+Options:
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE
+ environment variable is set, its value will be used instead.
+ --name TEXT Name of the user to create.
+ --password TEXT
+ --help Show this message and exit.
+```
+
+
+
+#### Change the password of a user
+
+
+
+```man
+Usage: argos server user change-password [OPTIONS]
+
+ Change userās password
+
+Options:
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE
+ environment variable is set, its value will be used instead.
+ --name TEXT Name of the user you want to change the password.
+ --password TEXT
+ --help Show this message and exit.
+```
+
+
+
+#### Delete a user
+
+
+
+```man
+Usage: argos server user delete [OPTIONS]
+
+ Delete user
+
+Options:
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE environment
+ variable is set, its value will be used instead.
+ --name TEXT Name of the user to delete. [required]
+ --help Show this message and exit.
+```
+
+
+
+#### Disable a user
+
+Disabling a user prevents the user to login and access Argosā web interface but its credentials are still stored in Argosā database.
+
+
+
+```man
+Usage: argos server user disable [OPTIONS]
+
+ Disable user
+
+Options:
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE environment
+ variable is set, its value will be used instead.
+ --name TEXT Name of the user to disable. [required]
+ --help Show this message and exit.
+```
+
+
+
+#### Enable a user
+
+Enabling a user prevents the user to login and access Argosā web interface.
+
+Obviously, the user needs to exists and to be disabled before using the command.
+
+
+
+```man
+Usage: argos server user enable [OPTIONS]
+
+ Enable user
+
+Options:
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE environment
+ variable is set, its value will be used instead.
+ --name TEXT Name of the user to reenable [required]
+ --help Show this message and exit.
+```
+
+
+
+#### List all users
+
+Show all accounts, with their status (enabled or disabled).
+
+
+
+```man
+Usage: argos server user show [OPTIONS]
+
+ List all users
+
+Options:
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE environment
+ variable is set, its value will be used instead.
+ --help Show this message and exit.
+```
+
+
+
+#### Test the password of a user
+
+You can verify that you have the right password for a user with the following command:
+
+
+
+```man
+Usage: argos server user verify-password [OPTIONS]
+
+ Test userās password
+
+Options:
+ --config TEXT Path of the configuration file. If ARGOS_YAML_FILE
+ environment variable is set, its value will be used instead.
+ --name TEXT Name of the user you want to test the password for.
+ [required]
+ --password TEXT
+ --help Show this message and exit.
+```
+
+
diff --git a/docs/conf.py b/docs/conf.py
index a6dffa6..b0a05bb 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -5,6 +5,7 @@
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+# pylint: disable-msg=invalid-name,redefined-builtin
import argos
project = "Argos"
diff --git a/docs/configuration.md b/docs/configuration.md
index 38aeef4..576c55c 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -1,56 +1,11 @@
# Configuration
-There are actually two configuration files: one for the service and one for the checks.
-
-## Server configuration
-
-The server configuration is done using environment variables. You can put them in a `.env` file at the root of the project.
-Here is a list of the useful variables, in the `.env` format:
-
-```{literalinclude} ../conf/.env.example
----
-caption: .env
----
-```
-
-### Environment variables
-
-Here are the environment variables you can define to configure how the service will behave :
-
-#### ARGOS_YAML_FILE
-
-The path to the yaml configuration file, defining the checks.
-
-#### ARGOS_DATABASE_URL
-
-The database url, as defined [in SQLAlchemy docs](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls).
-
-For instance, to connect to a postgres database on localhost with user, pass and dbname "argos":
-
-```
-ARGOS_DATABASE_URL = "postgresql://argos:argos@localhost/argos"
-```
-
-#### DB_POOL_SIZE
-#### DB_MAX_OVERFLOW
-
-You configure the size of the database pool of connection, and the max overflow (until when new connections are accepted ?) These are documented [in the SQLAlchemy docs in greater details](https://docs.sqlalchemy.org/en/20/core/pooling.html#sqlalchemy.pool.QueuePool.params.pool_size)
-
-```bash
-DB_POOL_SIZE = 10
-DB_MAX_OVERFLOW = 20
-```
-
-## Argos "checks" configuration
-
-Argos uses a YAML configuration file to define the websites to monitor and the checks to run on these websites.
-
-Here is a simple configuration file:
+Argos uses a simple YAML configuration file to define the serverās configuration, the websites to monitor and the checks to run on these websites.
+Here is a simple self-documented configuration file, which you can get with [`argos server generate-config`](cli.md#server-generate-config):
```{literalinclude} ../conf/config-example.yaml
---
-caption: config.yaml
+caption: argos-config.yaml
---
-
-```
\ No newline at end of file
+```
diff --git a/docs/deployment/nginx.md b/docs/deployment/nginx.md
index 5f974d0..25af5be 100644
--- a/docs/deployment/nginx.md
+++ b/docs/deployment/nginx.md
@@ -1,13 +1,6 @@
# Using Nginx as reverse proxy
-As Argos has no authentication mechanism for the front-end, you need to protect some routes with HTTP authentication.
-
-To do so on Debian, install `apache2-utils` then create a file containing the wanted credentials:
-```bash
-htpasswd -c /etc/nginx/argos.passwd argos_admin
-```
-
-You can then use this file to protect the front-endās routes:
+Here is a example for Nginx configuration:
```{literalinclude} ../../conf/nginx.conf
---
caption: /etc/nginx/sites-available/argos.example.org
diff --git a/docs/deployment/systemd.md b/docs/deployment/systemd.md
index 04fa7e2..403bc44 100644
--- a/docs/deployment/systemd.md
+++ b/docs/deployment/systemd.md
@@ -4,6 +4,12 @@ Here are the systemd files that can be used to deploy the server and the agents.
## Agent
+```{literalinclude} ../../conf/default-argos-agent
+---
+caption: /etc/default/argos-agent
+---
+```
+
```{literalinclude} ../../conf/systemd-agent.service
---
caption: /etc/systemd/system/argos-agent.service
@@ -12,6 +18,12 @@ caption: /etc/systemd/system/argos-agent.service
## Server
+```{literalinclude} ../../conf/default-argos-server
+---
+caption: /etc/default/argos-server
+---
+```
+
```{literalinclude} ../../conf/systemd-server.service
---
caption: /etc/systemd/system/argos-server.service
diff --git a/docs/developer/license.md b/docs/developer/license.md
new file mode 100644
index 0000000..4acfe2b
--- /dev/null
+++ b/docs/developer/license.md
@@ -0,0 +1,5 @@
+# License
+
+Argos is licensed under the terms of the GNU AFFERO GPLv3.
+
+See [LICENSE file](https://framagit.org/framasoft/framaspace/argos/-/blob/main/LICENSE) on the repository.
diff --git a/docs/developer/new-notification-way.md b/docs/developer/new-notification-way.md
new file mode 100644
index 0000000..3e193a8
--- /dev/null
+++ b/docs/developer/new-notification-way.md
@@ -0,0 +1,34 @@
+# Add a notification way
+
+Adding a new notification way is quite simple.
+
+First, you need to think about how you will configure it.
+As example, hereās how gotify notifications are configured:
+```yaml
+gotify:
+ - url: https://example.org
+ tokens:
+ - foo
+ - bar
+```
+
+Feel free to open an issue to discuss about your notification way or its configuration before coding!
+See [#50](https://framagit.org/framasoft/framaspace/argos/-/issues/50) for example.
+
+Then, youāll need to add the pydantic schema matching your config in [`argos/schemas/config.py`](https://framagit.org/framasoft/framaspace/argos/-/blob/main/argos/schemas/config.py).
+
+For gotify, itās:
+```python
+class GotifyUrl(BaseModel):
+ url: HttpUrl
+ tokens: List[str]
+```
+
+Add the schema to the `General` schema in the same file (donāt forget to make it optional).
+
+For gotify, we added this:
+```python
+ gotify: Optional[List[GotifyUrl]] = None
+```
+
+Finally, write a function which use your new notification way in [`argos/server/alerting.py`](https://framagit.org/framasoft/framaspace/argos/-/blob/main/argos/server/alerting.py) and use it in the `handle_alert` function of the same file.
diff --git a/docs/developer/release.md b/docs/developer/release.md
index ee6af92..0a3500e 100644
--- a/docs/developer/release.md
+++ b/docs/developer/release.md
@@ -17,6 +17,8 @@ You'll need to get an account on [PyPI](https://pypi.org), where the packages wi
Here is the quick version. If you need more details, some parts are explained in more details in the next sections.
```bash
+# Be sure you are on the good branch
+git checkout main
# Ensure the tests run correctly
make test
diff --git a/docs/faq.md b/docs/faq.md
new file mode 100644
index 0000000..469a8f2
--- /dev/null
+++ b/docs/faq.md
@@ -0,0 +1,34 @@
+# FAQ
+
+## How is it different than Nagios?
+
+In a few words, Argos do less things than Nagios, but it makes it more simple.
+
+Nagios can do a lot more than Argos, as it can monitor the load of a server, its disk occupation and so much more.
+You can extend the possibilities of Nagios with your own plugins, allowing to monitor almost everything.
+Argos can only monitor web sites, in various ways (check the HTTP status, check the certificate validity timeā¦).
+
+On the other hand, configuration and deployment of Argos are very much simpler than Nagiosā.
+
+## How is it different than statping-ng or Uptime Kuma?
+
+In one word: scalability.
+
+While [statping-ng](https://statping-ng.github.io/) and [Uptime Kumap](https://uptime.kuma.pet/) have a similar goal than Argos, you canāt monitor thousands of web sites with them efficiently as their dashboard wants to present you the results of all of your web sites at once⦠and with the history of the results.
+
+We gave those solutions a try, but fetching thousand of results from the dashboard made the backend overloads.
+
+## Who created Argos?
+
+### Framasoft
+
+Framasoft is a non-profit association founded in 2004, financed by [donations](https://support.framasoft.org/), which is limited to a dozen employees and about thirty volunteers (a group of friends!).
+You can find more informations on .
+
+We needed a very efficient web sites monitoring tool for one of our project, but didnāt had time to develop it, so we hired [Alexis MĆ©taireau](#alexis-metaireau) for that.
+
+### Alexis MƩtaireau
+
+Alexis is a long-time free software developer, who has worked for Mozilla, created [Pelican](http://getpelican.com/), a static site generator, [I Hate Money](http://ihatemoney.org/), a website for managing group expenses and many more other projects.
+
+See for more informations about him.
diff --git a/docs/index.md b/docs/index.md
index 6d09e90..6383a2a 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -37,6 +37,8 @@ installation/postgresql
cli
api
changelog
+faq
+installation/tl-dr
```
```{toctree}
@@ -61,9 +63,11 @@ developer/installation
developer/overview
developer/dependencies
developer/new-check
+developer/new-notification-way
developer/models
developer/migrations
developer/tests
developer/release
+developer/license
```
diff --git a/docs/installation/getting-started.md b/docs/installation/getting-started.md
index 5f784eb..65fae33 100644
--- a/docs/installation/getting-started.md
+++ b/docs/installation/getting-started.md
@@ -1,10 +1,27 @@
# Installation
+NB: if you want a quick-installation guide, we [got you covered](tl-dr.md).
+
## Requirements
- Python 3.11+
- PostgreSQL 13+ (for production)
+## Recommendation
+
+Create a dedicated user for argos:
+
+```bash
+adduser --home /opt/argos --disabled-login --disabled-password --system argos
+```
+
+Do all the manipulations below in `/opt/argos/`, with the user `argos`.
+Either use `sudo` or login as `argos` with the following command:
+
+```bash
+su argos -s /bin/bash
+```
+
## Install with pip
```bash
@@ -12,12 +29,19 @@ pip install argos-monitoring
```
You may want to install Argos in a virtualenv:
+
```bash
python3 -m venv venv
source venv/bin/activate
pip install argos-monitoring
```
+For production, we recommend the use of [Gunicorn](https://gunicorn.org/), which you can install at the same time as Argos:
+
+```bash
+pip install "argos-monitoring[gunicorn]"
+```
+
## Install from sources
Once you got the source locally, create a virtualenv and install the dependencies:
@@ -28,27 +52,33 @@ source venv/bin/activate
pip install -e .
```
+To install gunicorn, use `pip install -e ".[gunicorn]"` instead of `pip install -e .`
+
## Configure
-The quickest way to get started is to get the `config-example.yaml` file from our repository and edit it:
+The quickest way to get started is to generate the configuration file from argos and edit it:
```bash
-wget https://framagit.org/framasoft/framaspace/argos/-/raw/main/conf/config-example.yaml -O config.yaml
+argos server generate-config > argos-config.yaml
```
You can read more about the configuration in the [configuration section](../configuration.md).
-### Configure the server
-
-Environment variables are used to configure the server. You can also put them in an `.env` file:
-
-```{literalinclude} ../../conf/.env.example
----
-caption: .env
----
+For production, we suggest to put your config in `/etc/argos/config.yaml` and restricts the fileās permissions.
+As root:
+```bash
+mkdir /etc/argos
+chown argos: /etc/argos
+chmod 700 /etc/argos
```
-Please note that the only supported database engines are SQLite for development and PostgreSQL for production.
+Then, as `argos`:
+```bash
+argos server generate-config > /etc/argos/config.yaml
+chmod 600 /etc/argos/config.yaml
+```
+
+Please note that the only supported database engines are SQLite for development and [PostgreSQL](postgresql.md) for production.
## Apply migrations to database
@@ -60,7 +90,7 @@ argos server migrate
## Inject tasks into the database
-Argos keeps tasksā configuration in database, take from the config file.
+Argos keeps tasksā configuration in database, taken from the config file.
Populate the database with the tasks:
@@ -68,17 +98,7 @@ Populate the database with the tasks:
argos server reload-config
```
-## Starting the server
-
-Then you can start the server:
-
-```bash
-argos server start
-```
-
-The server reads the `yaml` file at startup, and populates the tasks queue with the checks defined in the configuration.
-
-## Generating a token
+## Generating a token
The agent needs an authentication token to be able to communicate with the server.
@@ -95,10 +115,54 @@ service:
- "auth-token"
```
+## Starting the server
+
+Then you can start the server:
+
+```bash
+argos server start
+```
+
+This way to start the server is not suitable for production, use it only for developing or testing.
+
+## Starting the server for production
+
+For production, you can use [Gunicorn](https://gunicorn.org/) to start the server.
+
+To install Gunicorn in the virtualenv, if you didnāt already install Argos that way:
+
+```bash
+pip install "argos-monitoring[gunicorn]"
+```
+
+To start the server:
+
+```bash
+gunicorn "argos.server.main:get_application()" -k uvicorn.workers.UvicornWorker
+```
+
+There is some gunicornās options that you should use:
+- `-w INT, --workers INT`: the number of worker processes for handling requests. Default is `1`.
+- `-b ADDRESS, --bind ADDRESS`: the socket to bind. Default is `127.0.0.1:8000`.
+- `--forwarded-allow-ips STRING`: front-end's IPs from which allowed to handle set secure headers as a comma-separated list. Default is `127.0.0.1`.
+
+So, to start the server with 4 workers while listening to `127.0.0.1:8001`:
+
+```bash
+gunicorn "argos.server.main:get_application()" -k uvicorn.workers.UvicornWorker -w 4 -b 127.0.0.1:8001
+```
+
+Gunicorn has a lot of other options, have a look at `gunicorn --help`.
+
+Argos uses FastAPI, so you can use other ways to start the server.
+See (but Gunicorn is recommended).
+
+See [here](../deployment/systemd.md#server) for a systemd service example and [here](../deployment/nginx.md) for a nginx configuration example.
+
## Running the agent
You can run the agent on the same machine as the server, or on a different machine.
-The only requirement is that the agent can reach the server.
+The only requirement is that the agent can reach the server through HTTP or HTTPS.
```bash
argos agent http://localhost:8000 "auth-token"
@@ -106,7 +170,7 @@ argos agent http://localhost:8000 "auth-token"
## Cleaning the database
-You also have to run cleaning tasks periodically. `argos server clean --help` will give you more information on how to do that.
+You have to run cleaning task periodically. `argos server cleandb --help` will give you more information on how to do that.
Here is a crontab example, which will clean the db each hour:
@@ -115,3 +179,15 @@ Here is a crontab example, which will clean the db each hour:
# Keeps 10 results per task, and remove tasksā locks older than 1 hour
7 * * * * argos server cleandb --max-results 10 --max-lock-seconds 3600
```
+
+## Watch the agents
+
+In order to be sure that agents are up and communicate with the server, you can periodically run the `argos server watch-agents` command.
+
+Here is a crontab example, which will check the agents every 5 minutes:
+
+```bash
+*/5 * * * * argos server watch-agents --time-without-agent 10
+```
+
+Check the documentation of the command with `argos server watch-agents --help`
diff --git a/docs/installation/tl-dr.md b/docs/installation/tl-dr.md
new file mode 100644
index 0000000..26b35b6
--- /dev/null
+++ b/docs/installation/tl-dr.md
@@ -0,0 +1,158 @@
+# TL;DR: fast installation instructions
+
+You want to install Argos fast? Ok, here we go.
+
+## For testing
+
+This is for testing only!
+
+```bash
+sudo apt install python3
+mkdir /tmp/argos
+cd /tmp/argos
+python3 -m venv venv
+source venv/bin/activate
+pip install argos-monitoring
+argos server generate-config |
+ sed -e "s@production@dev@" \
+ -e "s@url: .postgresql.*@url: \"sqlite:////tmp/argos.db\"@" > argos-config.yaml
+argos server migrate
+ARGOS_TOKEN=$(argos server generate-token)
+sed -e "s@# - secret_token@- $ARGOS_TOKEN@" -i argos-config.yaml
+echo "The agent token is $ARGOS_TOKEN"
+```
+
+Edit `argos-config.yaml`.
+Add some real web sites to test.
+
+Then:
+
+```
+argos server reload-config
+argos server start --host 0.0.0.0 --port 8000
+```
+
+In another terminal:
+
+```
+cd /tmp/argos
+source venv/bin/activate
+argos agent http://127.0.0.1:8000 the_generated_token
+```
+
+Then go to `http://127.0.0.1:8000` or `http://the_IP_address_of_your_server:8000`.
+
+## For production
+
+```bash
+apt install python3 postgresql
+sudo -u postgres createuser -P argos
+sudo -u postgres createdb -O argos argos
+sudo -u postgres psql -c "ALTER DATABASE argos SET TIMEZONE TO 'UTC';"
+adduser --home /opt/argos --disabled-login --disabled-password --system argos
+
+cd /opt/argos
+sudo -u argos python3 -m venv venv
+sudo -u argos bash -c 'source venv/bin/activate && pip install "argos-monitoring[gunicorn]"'
+
+mkdir /etc/argos
+/opt/argos/venv/bin/argos server generate-config > /etc/argos/config.yaml
+
+cat < /etc/default/argos-server
+ARGOS_YAML_FILE="/etc/argos/config.yaml"
+ARGOS_SERVER_WORKERS=4
+ARGOS_SERVER_SOCKET=127.0.0.1:8000
+# Comma separated list of IP addresses of the web proxy (usually Nginx)
+ARGOS_SERVER_FORWARDED_ALLOW_IPS=127.0.0.1
+EOF
+
+cat < /etc/default/argos-agent
+ARGOS_AGENT_TOKEN=Secret
+ARGOS_AGENT_SERVER_URL=http://127.0.0.1:8000
+ARGOS_AGENT_LOGLEVEL=WARNING
+ARGOS_AGENT_MAX_TASKS=20
+ARGOS_AGENT_WAIT_TIME=10
+EOF
+
+cat < /etc/systemd/system/argos-server.service
+[Unit]
+Description=Argos server
+Documentation=https://argos-monitoring.framasoft.org/
+Requires=network.target postgresql.service
+After=network.target postgresql.service
+PartOf=postgresql.service
+
+[Service]
+User=argos
+WorkingDirectory=/opt/argos/
+EnvironmentFile=/etc/default/argos-server
+ExecStartPre=/opt/argos/venv/bin/argos server migrate
+ExecStartPre=/opt/argos/venv/bin/argos server reload-config
+ExecStart=/opt/argos/venv/bin/gunicorn "argos.server.main:get_application()" \\
+ --workers \$ARGOS_SERVER_WORKERS \\
+ --worker-class uvicorn.workers.UvicornWorker \\
+ --bind \$ARGOS_SERVER_SOCKET \\
+ --forwarded-allow-ips \$ARGOS_SERVER_FORWARDED_ALLOW_IPS
+ExecReload=/opt/argos/venv/bin/argos server reload-config
+SyslogIdentifier=argos-server
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat < /etc/systemd/system/argos-agent.service
+[Unit]
+Description=Argos agent
+Documentation=https://argos-monitoring.framasoft.org/
+Requires=network.target
+After=network.target
+
+[Service]
+User=argos
+EnvironmentFile=/etc/default/argos-agent
+WorkingDirectory=/opt/argos/
+ExecStart=/opt/argos/venv/bin/argos agent --max-tasks \$ARGOS_AGENT_MAX_TASKS \\
+ --wait-time \$ARGOS_AGENT_WAIT_TIME \\
+ --log-level \$ARGOS_AGENT_LOGLEVEL
+SyslogIdentifier=argos-agent
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+chown -R argos: /etc/default/argos-* /etc/argos/
+chmod 700 /etc/argos
+chmod 600 /etc/argos/config.yaml
+
+systemctl daemon-reload
+```
+
+Then, edit `/etc/argos/config.yaml` to put your database password in it and change the other settings to suit your needs.
+
+Create a token for your agentĀ :
+
+```bash
+sudo -u argos /opt/argos/venv/bin/argos server generate-token
+```
+
+Edit `/etc/default/argos-agent` to put the generated token in it and change the other settings to suit your needs.
+
+Edit `/etc/argos/config.yaml` to configure Argos (donāt forget to add the generated token in it too).
+
+Enable and start the server and the agent and make sure they works:
+
+```bash
+systemctl enable --now argos-server.service argos-agent.service
+systemctl status argos-server.service argos-agent.service
+```
+
+If all works well, you have to put some cron tasks in `argos` crontab:
+
+```bash
+cat <=1.13.0,<1.14",
+ "bcrypt>=4.1.3,<5",
"click>=8.1,<9",
"fastapi>=0.103,<0.104",
- "gunicorn>=21.2,<22",
+ "fastapi-login>=1.10.0,<2",
"httpx>=0.25,<1",
"Jinja2>=3.0,<4",
+ "passlib>=1.7.4,<2",
"psycopg2-binary>=2.9,<3",
"pydantic[email]>=2.4,<3",
"pydantic-settings>=2.0,<3",
@@ -62,9 +64,12 @@ docs = [
"sphinx>=7,<8",
"sphinxcontrib-mermaid>=0.9,<1",
]
+gunicorn = [
+ "gunicorn>=21.2,<22",
+]
[project.urls]
-homepage = "https://framasoft.frama.io/framaspace/argos/"
+homepage = "https://argos-monitoring.framasoft.org/"
repository = "https://framagit.org/framasoft/framaspace/argos"
"Funding" = "https://framasoft.org/en/#support"
"Tracker" = "https://framagit.org/framasoft/framaspace/argos/-/issues"
@@ -94,3 +99,7 @@ testpaths = [
"argos"
]
pythonpath = "."
+filterwarnings = [
+ "ignore:'crypt' is deprecated and slated for removal in Python 3.13:DeprecationWarning",
+ "ignore:The 'app' shortcut is now deprecated:DeprecationWarning",
+]
diff --git a/tests/config.yaml b/tests/config.yaml
index d248e88..82f055b 100644
--- a/tests/config.yaml
+++ b/tests/config.yaml
@@ -1,4 +1,9 @@
general:
+ db:
+ # The database URL, as defined in SQLAlchemy docsĀ : https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls
+ url: "sqlite:////tmp/test-argos.db"
+ env: test
+ cookie_secret: "foo-bar-baz"
frequency: "1m"
alerts:
ok:
diff --git a/tests/conftest.py b/tests/conftest.py
index d07ea1a..9b6f3aa 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -6,7 +6,7 @@ from fastapi import FastAPI
from fastapi.testclient import TestClient
from sqlalchemy.orm import Session
-os.environ["ARGOS_APP_ENV"] = "test"
+os.environ["ARGOS_YAML_FILE"] = "tests/config.yaml"
@pytest.fixture
@@ -45,10 +45,6 @@ def _create_app() -> FastAPI:
)
app = get_application()
- # Hardcode the database url and the yaml file for testing purpose
- # Otherwise, the app will try to read the .env file or the environment variables
- app.state.settings.database_url = "sqlite:////tmp/test-argos.db"
- app.state.settings.yaml_file = "tests/config.yaml"
setup_database(app)
asyncio.run(connect_to_db(app))
diff --git a/tests/test_cli.py b/tests/test_cli.py
new file mode 100644
index 0000000..1225379
--- /dev/null
+++ b/tests/test_cli.py
@@ -0,0 +1,150 @@
+import os
+
+from click.testing import CliRunner
+from argos.commands import (
+ add,
+ verify_password,
+ change_password,
+ show,
+ disable,
+ enable,
+ delete,
+)
+
+
+os.environ["ARGOS_APP_ENV"] = "test"
+os.environ["ARGOS_YAML_FILE"] = "tests/config.yaml"
+
+
+def test_add_user():
+ runner = CliRunner()
+ result = runner.invoke(add, ["--name", "foo"], input="bar\nbar\n")
+ assert result.exit_code == 0
+ assert result.output == "Password: \nRepeat for confirmation: \nUser foo added.\n"
+ result = runner.invoke(add, ["--name", "foo"], input="bar\nbar\n")
+ assert result.exit_code == 1
+ assert (
+ result.output
+ == "Password: \nRepeat for confirmation: \nUser foo already exists.\n"
+ )
+ result = runner.invoke(add, ["--name", "baz", "--password", "qux"])
+ assert result.exit_code == 0
+ assert result.output == "User baz added.\n"
+
+
+def test_user_password():
+ runner = CliRunner()
+ result = runner.invoke(verify_password, ["--name", "foo"], input="bar\n")
+ assert result.exit_code == 0
+ assert result.output == "Password: \nThe provided password is correct.\n"
+ result = runner.invoke(verify_password, ["--name", "foo", "--password", "bar"])
+ assert result.exit_code == 0
+ assert result.output == "The provided password is correct.\n"
+ result = runner.invoke(verify_password, ["--name", "quux", "--password", "corge"])
+ assert result.exit_code == 1
+ assert result.output == "User quux does not exist.\n"
+ result = runner.invoke(verify_password, ["--name", "foo", "--password", "grault"])
+ assert result.exit_code == 2
+ assert result.output == "Wrong password!\n"
+
+
+def test_change_password():
+ runner = CliRunner()
+ result = runner.invoke(verify_password, ["--name", "foo", "--password", "grault"])
+ assert result.exit_code == 2
+ assert result.output == "Wrong password!\n"
+ result = runner.invoke(change_password, ["--name", "foo"], input="grault\ngrault\n")
+ assert result.exit_code == 0
+ assert (
+ result.output
+ == "Password: \nRepeat for confirmation: \nPassword of user foo changed.\n"
+ )
+ result = runner.invoke(verify_password, ["--name", "foo", "--password", "grault"])
+ assert result.exit_code == 0
+ assert result.output == "The provided password is correct.\n"
+ result = runner.invoke(change_password, ["--name", "foo", "--password", "bar"])
+ assert result.exit_code == 0
+ assert result.output == "Password of user foo changed.\n"
+ result = runner.invoke(verify_password, ["--name", "foo", "--password", "bar"])
+ assert result.exit_code == 0
+ assert result.output == "The provided password is correct.\n"
+ result = runner.invoke(verify_password, ["--name", "quux", "--password", "bar"])
+ assert result.exit_code == 1
+ assert result.output == "User quux does not exist.\n"
+
+
+def test_show():
+ runner = CliRunner()
+ result = runner.invoke(show)
+ assert result.exit_code == 0
+ assert (
+ result.output
+ == "ā
means that the user is enabled.\nā means that the user is disabled.\n"
+ "ā
baz, last login: None\nā
foo, last login: None\n"
+ )
+
+
+def test_disable():
+ runner = CliRunner()
+ result = runner.invoke(disable, ["--name", "quux"])
+ assert result.exit_code == 1
+ assert result.output == "User quux does not exist.\n"
+ result = runner.invoke(disable, ["--name", "foo"])
+ assert result.exit_code == 0
+ assert result.output == "User foo disabled.\n"
+ result = runner.invoke(disable, ["--name", "foo"])
+ assert result.exit_code == 2
+ assert result.output == "User foo is already disabled.\n"
+ result = runner.invoke(show)
+ assert result.exit_code == 0
+ assert (
+ result.output
+ == "ā
means that the user is enabled.\nā means that the user is disabled.\n"
+ "ā
baz, last login: None\nā foo, last login: None\n"
+ )
+
+
+def test_enable():
+ runner = CliRunner()
+ result = runner.invoke(enable, ["--name", "quux"])
+ assert result.exit_code == 1
+ assert result.output == "User quux does not exist.\n"
+ result = runner.invoke(enable, ["--name", "foo"])
+ assert result.exit_code == 0
+ assert result.output == "User foo enabled.\n"
+ result = runner.invoke(enable, ["--name", "foo"])
+ assert result.exit_code == 2
+ assert result.output == "User foo is already enabled.\n"
+ result = runner.invoke(show)
+ assert result.exit_code == 0
+ assert (
+ result.output
+ == "ā
means that the user is enabled.\nā means that the user is disabled.\n"
+ "ā
baz, last login: None\nā
foo, last login: None\n"
+ )
+
+
+def test_delete():
+ runner = CliRunner()
+ result = runner.invoke(delete, ["--name", "quux"])
+ assert result.exit_code == 1
+ assert result.output == "User quux does not exist.\n"
+ result = runner.invoke(delete, ["--name", "foo"])
+ assert result.exit_code == 0
+ assert result.output == "User foo deleted.\n"
+ result = runner.invoke(delete, ["--name", "foo"])
+ assert result.exit_code == 1
+ assert result.output == "User foo does not exist.\n"
+ result = runner.invoke(show)
+ assert result.exit_code == 0
+ assert (
+ result.output
+ == "ā
means that the user is enabled.\nā means that the user is disabled.\n"
+ "ā
baz, last login: None\n"
+ )
+ result = runner.invoke(delete, ["--name", "baz"])
+ assert result.exit_code == 0
+ assert result.output == "User baz deleted.\n"
+ result = runner.invoke(show)
+ assert result.exit_code == 1
+ assert result.output == "There is no users in database.\n"
diff --git a/tests/test_queries.py b/tests/test_queries.py
index 0fc7c26..c468362 100644
--- a/tests/test_queries.py
+++ b/tests/test_queries.py
@@ -4,18 +4,18 @@ import pytest
from argos import schemas
from argos.server import queries
-from argos.server.models import Result, Task
+from argos.server.models import Result, Task, User
@pytest.mark.asyncio
-async def test_remove_old_results(db, ten_tasks):
- for task in ten_tasks:
- for i in range(5):
+async def test_remove_old_results(db, ten_tasks): # pylint: disable-msg=redefined-outer-name
+ for _task in ten_tasks:
+ for _ in range(5):
result = Result(
submitted_at=datetime.now(),
status="success",
context={"foo": "bar"},
- task=task,
+ task=_task,
agent_id="test",
severity="ok",
)
@@ -28,8 +28,8 @@ async def test_remove_old_results(db, ten_tasks):
deleted = await queries.remove_old_results(db, 2)
assert deleted == 30
assert db.query(Result).count() == 20
- for task in ten_tasks:
- assert db.query(Result).filter(Result.task == task).count() == 2
+ for _task in ten_tasks:
+ assert db.query(Result).filter(Result.task == _task).count() == 2
@pytest.mark.asyncio
@@ -40,7 +40,7 @@ async def test_remove_old_results_with_empty_db(db):
@pytest.mark.asyncio
-async def test_release_old_locks(db, ten_locked_tasks, ten_tasks):
+async def test_release_old_locks(db, ten_locked_tasks, ten_tasks): # pylint: disable-msg=redefined-outer-name
assert db.query(Task).count() == 20
released = await queries.release_old_locks(db, 10)
assert released == 10
@@ -54,9 +54,9 @@ async def test_release_old_locks_with_empty_db(db):
@pytest.mark.asyncio
-async def test_update_from_config_with_duplicate_tasks(db, empty_config):
+async def test_update_from_config_with_duplicate_tasks(db, empty_config): # pylint: disable-msg=redefined-outer-name
# We pass the same path twice
- fake_path = dict(path="/", checks=[{"body-contains": "foo"}])
+ fake_path = {"path": "/", "checks": [{"body-contains": "foo"}]}
website = schemas.config.Website(
domain="https://example.org",
paths=[
@@ -79,7 +79,9 @@ async def test_update_from_config_with_duplicate_tasks(db, empty_config):
@pytest.mark.asyncio
async def test_update_from_config_db_can_remove_duplicates_and_old_tasks(
- db, empty_config, task
+ db,
+ empty_config,
+ task, # pylint: disable-msg=redefined-outer-name
):
# Add a duplicate in the db
same_task = Task(
@@ -96,10 +98,11 @@ async def test_update_from_config_db_can_remove_duplicates_and_old_tasks(
website = schemas.config.Website(
domain=task.domain,
paths=[
- dict(
- path="https://another-example.com", checks=[{task.check: task.expected}]
- ),
- dict(path=task.url, checks=[{task.check: task.expected}]),
+ {
+ "path": "https://another-example.com",
+ "checks": [{task.check: task.expected}],
+ },
+ {"path": task.url, "checks": [{task.check: task.expected}]},
],
)
empty_config.websites = [website]
@@ -110,9 +113,10 @@ async def test_update_from_config_db_can_remove_duplicates_and_old_tasks(
website = schemas.config.Website(
domain=task.domain,
paths=[
- dict(
- path="https://another-example.com", checks=[{task.check: task.expected}]
- ),
+ {
+ "path": "https://another-example.com",
+ "checks": [{task.check: task.expected}],
+ }
],
)
empty_config.websites = [website]
@@ -122,14 +126,12 @@ async def test_update_from_config_db_can_remove_duplicates_and_old_tasks(
@pytest.mark.asyncio
-async def test_update_from_config_db_updates_existing_tasks(db, empty_config, task):
+async def test_update_from_config_db_updates_existing_tasks(db, empty_config, task): # pylint: disable-msg=redefined-outer-name
assert db.query(Task).count() == 1
website = schemas.config.Website(
domain=task.domain,
- paths=[
- dict(path=task.url, checks=[{task.check: task.expected}]),
- ],
+ paths=[{"path": task.url, "checks": [{task.check: task.expected}]}],
)
empty_config.websites = [website]
@@ -139,7 +141,11 @@ async def test_update_from_config_db_updates_existing_tasks(db, empty_config, ta
@pytest.mark.asyncio
async def test_reschedule_all(
- db, ten_tasks, ten_warning_tasks, ten_critical_tasks, ten_ok_tasks
+ db,
+ ten_tasks,
+ ten_warning_tasks,
+ ten_critical_tasks,
+ ten_ok_tasks, # pylint: disable-msg=redefined-outer-name
):
assert db.query(Task).count() == 40
assert db.query(Task).filter(Task.severity == "unknown").count() == 10
@@ -154,24 +160,73 @@ async def test_reschedule_all(
assert db.query(Task).filter(Task.next_run <= one_hour_ago).count() == 30
+@pytest.mark.asyncio
+async def test_add_user(db):
+ users = await queries.list_users(db)
+ assert users.count() == 0
+
+ _user = await queries.add_user(db, "john", "doe")
+ assert _user.username == "john"
+ assert _user.password == "doe"
+ assert _user.disabled == False
+ assert _user.created_at is not None
+ assert _user.updated_at is None
+ assert _user.last_login_at is None
+
+ _user = await queries.get_user(db, "morgan")
+ assert _user is None
+
+ _user = await queries.get_user(db, "john")
+ assert _user.username == "john"
+ assert _user.password == "doe"
+ assert _user.disabled == False
+ assert _user.created_at is not None
+ assert _user.updated_at is None
+ assert _user.last_login_at is None
+
+ users = await queries.list_users(db)
+ assert users.count() == 1
+
+
+@pytest.mark.asyncio
+async def test_remove_user(db, user): # pylint: disable-msg=redefined-outer-name
+ users = await queries.list_users(db)
+ assert users.count() == 1
+
+ assert user.username == "jane"
+ assert user.password == "doe"
+ assert user.disabled == False
+ assert user.created_at is not None
+ assert user.updated_at is None
+ assert user.last_login_at is None
+
+ db.delete(user)
+ db.commit()
+
+ users = await queries.list_users(db)
+ assert users.count() == 0
+
+
@pytest.fixture
def task(db):
- task = Task(
+ _task = Task(
url="https://www.example.com",
domain="https://www.example.com",
check="body-contains",
expected="foo",
frequency=1,
)
- db.add(task)
+ db.add(_task)
db.commit()
- return task
+ return _task
@pytest.fixture
def empty_config():
return schemas.config.Config(
general=schemas.config.General(
+ db=schemas.config.DbSettings(url="sqlite:////tmp/test-argos.db"),
+ cookie_secret="foo-bar-baz",
frequency="1m",
alerts=schemas.config.Alert(
ok=["", ""],
@@ -191,9 +246,9 @@ def empty_config():
@pytest.fixture
-def ten_results(db, task):
+def ten_results(db, task): # pylint: disable-msg=redefined-outer-name
results = []
- for i in range(10):
+ for _ in range(10):
result = Result(
submitted_at=datetime.now(),
status="success",
@@ -212,8 +267,8 @@ def ten_results(db, task):
def ten_locked_tasks(db):
a_minute_ago = datetime.now() - timedelta(minutes=1)
tasks = []
- for i in range(10):
- task = Task(
+ for _ in range(10):
+ _task = Task(
url="https://www.example.com",
domain="example.com",
check="body-contains",
@@ -222,8 +277,8 @@ def ten_locked_tasks(db):
selected_by="test",
selected_at=a_minute_ago,
)
- db.add(task)
- tasks.append(task)
+ db.add(_task)
+ tasks.append(_task)
db.commit()
return tasks
@@ -232,8 +287,8 @@ def ten_locked_tasks(db):
def ten_tasks(db):
now = datetime.now()
tasks = []
- for i in range(10):
- task = Task(
+ for _ in range(10):
+ _task = Task(
url="https://www.example.com",
domain="example.com",
check="body-contains",
@@ -242,8 +297,8 @@ def ten_tasks(db):
selected_by="test",
selected_at=now,
)
- db.add(task)
- tasks.append(task)
+ db.add(_task)
+ tasks.append(_task)
db.commit()
return tasks
@@ -252,8 +307,8 @@ def ten_tasks(db):
def ten_warning_tasks(db):
now = datetime.now()
tasks = []
- for i in range(10):
- task = Task(
+ for _ in range(10):
+ _task = Task(
url="https://www.example.com",
domain="example.com",
check="body-contains",
@@ -262,8 +317,8 @@ def ten_warning_tasks(db):
next_run=now,
severity="warning",
)
- db.add(task)
- tasks.append(task)
+ db.add(_task)
+ tasks.append(_task)
db.commit()
return tasks
@@ -272,8 +327,8 @@ def ten_warning_tasks(db):
def ten_critical_tasks(db):
now = datetime.now()
tasks = []
- for i in range(10):
- task = Task(
+ for _ in range(10):
+ _task = Task(
url="https://www.example.com",
domain="example.com",
check="body-contains",
@@ -282,8 +337,8 @@ def ten_critical_tasks(db):
next_run=now,
severity="critical",
)
- db.add(task)
- tasks.append(task)
+ db.add(_task)
+ tasks.append(_task)
db.commit()
return tasks
@@ -292,8 +347,8 @@ def ten_critical_tasks(db):
def ten_ok_tasks(db):
now = datetime.now()
tasks = []
- for i in range(10):
- task = Task(
+ for _ in range(10):
+ _task = Task(
url="https://www.example.com",
domain="example.com",
check="body-contains",
@@ -302,7 +357,19 @@ def ten_ok_tasks(db):
next_run=now,
severity="ok",
)
- db.add(task)
- tasks.append(task)
+ db.add(_task)
+ tasks.append(_task)
db.commit()
return tasks
+
+
+@pytest.fixture
+def user(db):
+ _user = User(
+ username="jane",
+ password="doe",
+ disabled=False,
+ )
+ db.add(_user)
+ db.commit()
+ return _user