commit 162ff2f407e0008cb05c44f43bfcf1130e283fcb Author: Luciano Laratelli Date: Tue Mar 11 19:42:37 2025 -0400 biff-sqlite starter diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..f487410 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3e7a24 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/.cpcache +/.nrepl-port +/bin +/config.edn +/config.sh +/config.env +/secrets.env +/storage/ +/tailwindcss +/target +.calva/ +.clj-kondo/ +.lsp/ +.portal/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..cb102cb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +from clojure:temurin-17-alpine +EXPOSE 8080 +ENV BIFF_PROFILE=prod +clj -M:prod diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ecb8a9e --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2024 Jacob O'Bryant - Biff, biff-postgres +Copyright (c) 2024 Luciano Laratelli - Modifications to work with sqlite (`biff-sqlite`) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..abbda29 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# biff-sqlite + +This is a modified version of +[biff-postgres](https://github.com/jacobobryant/biff-postgres/tree/master) to +use SQLite. In addition to replacing PostgreSQL with SQLite, I've also: +- removed tailwind (in favor of [pico.css](https://picocss.com/)) and recaptcha +- removed all links to unpkg by vendoring all css and js directly +- brought in [HoneySQL](https://github.com/seancorfield/honeysql) to replace writing raw SQL +- brought in [Migratus](https://github.com/yogthos/migratus) to manage migrations +- attempted to silence all kondo warnings + +# getting started + +``` bash +MY_PROJECT_NAME="dashboard-for-ynab" +git clone https://git.sr.ht/~luciano/biff-sqlite $MY_PROJECT_NAME +cd $MY_PROJECT_NAME +rm -rf .git +git init +git add . +git commit -m "biff-sqlite starter" +clj-kondo --lint "$(clojure -Spath)" --dependencies --parallel --copy-configs +clj -M:dev dev +``` + +Run `clj -M:dev dev` like usual and then connect with a REPL on :7888. + +You may want to rename the `com.biffweb` namespace prefix to your own, as well +as change the strings `my_project` and `my-project` everywhere they're present. +That's left as an exercise for the reader at this time. + +# Deploying to production + +I intend to deploy projects built off this template with fly.io but I haven't +set everything up for that just yet. Essentially you need to configure a fly +volume, make an SQLite db there, then point the #prod DB_URL at it. diff --git a/cljfmt-indents.edn b/cljfmt-indents.edn new file mode 100644 index 0000000..e522409 --- /dev/null +++ b/cljfmt-indents.edn @@ -0,0 +1 @@ +{submit-tx [[:inner 0]]} diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..ab971a1 --- /dev/null +++ b/deps.edn @@ -0,0 +1,45 @@ +{:paths ["src" "resources" "target/resources"] + :deps {com.biffweb/biff {:git/url "https://github.com/jacobobryant/biff" + :git/sha "ada149e" + :git/tag "v1.8.2" + :exclusions [com.xtdb/xtdb-core + com.xtdb/xtdb-rocksdb + com.xtdb/xtdb-jdbc]} + + com.biffweb/xtdb-mock {:git/url "https://github.com/jacobobryant/biff" + :git/sha "92d78a1" + :git/tag "v0.7.18" + :deps/root "libs/xtdb-mock"} + + com.github.seancorfield/next.jdbc {:mvn/version "1.3.894"} + camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.3"} + metosin/muuntaja {:mvn/version "0.6.8"} + ring/ring-defaults {:mvn/version "0.3.4"} + org.clojure/clojure {:mvn/version "1.11.3"} + com.github.clj-easy/graal-build-time {:mvn/version "1.0.5"} + +;; Notes on logging: https://gist.github.com/jacobobryant/76b7a08a07d5ef2cc076b048d078f1f3 + ;; org.slf4j/slf4j-simple {:mvn/version "2.0.0-alpha5"} + org.slf4j/log4j-over-slf4j {:mvn/version "1.7.36"} + org.slf4j/jul-to-slf4j {:mvn/version "1.7.36"} + org.slf4j/jcl-over-slf4j {:mvn/version "1.7.36"} + org.slf4j/slf4j-api {:mvn/version "2.0.13"} + + com.taoensso/slf4j-telemere {:mvn/version "1.0.0-beta14"} + com.taoensso/telemere {:mvn/version "1.0.0-beta14"} + + org.xerial/sqlite-jdbc {:mvn/version "3.45.2.0"} + com.github.seancorfield/honeysql {:mvn/version "2.6.1126"} + migratus/migratus {:mvn/version "1.5.6"}} + + :aliases + {:dev {:extra-deps {com.biffweb/tasks {:git/url "https://github.com/jacobobryant/biff", :git/sha "ada149e", :git/tag "v1.8.2", :deps/root "libs/tasks"}} + :extra-paths ["dev" "test"] + :jvm-opts ["-XX:-OmitStackTraceInFastThrow" + "-XX:+CrashOnOutOfMemoryError" + "-Dbiff.env.BIFF_PROFILE=dev"] + :main-opts ["-m" "com.biffweb.task-runner" "tasks/tasks"]} + :prod {:jvm-opts ["-XX:-OmitStackTraceInFastThrow" + "-XX:+CrashOnOutOfMemoryError" + "-Dbiff.env.BIFF_PROFILE=prod"] + :main-opts ["-m" "com.biffweb.my-project"]}}} diff --git a/dev/repl.clj b/dev/repl.clj new file mode 100644 index 0000000..0c0bfde --- /dev/null +++ b/dev/repl.clj @@ -0,0 +1,98 @@ +(ns repl + (:require + [clojure.java.io :as io] + [com.biffweb :as biff] + [com.biffweb.my-project :as main] + [com.biffweb.my-project.util.db :as db] + [honey.sql :as sql] + [honey.sql.helpers :refer [drop-table]] + [migratus.core :as migratus] + [next.jdbc :as jdbc])) + +;; REPL-driven development +;; ---------------------------------------------------------------------------------------- +;; If you're new to REPL-driven development, Biff makes it easy to get started: whenever +;; you save a file, your changes will be evaluated. Biff is structured so that in most +;; cases, that's all you'll need to do for your changes to take effect. (See main/refresh +;; below for more details.) +;; +;; The `clj -M:dev dev` command also starts an nREPL server on port 7888, so if you're +;; already familiar with REPL-driven development, you can connect to that with your editor. +;; +;; If you're used to jacking in with your editor first and then starting your app via the +;; REPL, you will need to instead connect your editor to the nREPL server that `clj -M:dev +;; dev` starts. e.g. if you use emacs, instead of running `cider-jack-in`, you would run +;; `cider-connect`. See "Connecting to a Running nREPL Server:" +;; https://docs.cider.mx/cider/basics/up_and_running.html#connect-to-a-running-nrepl-server +;; ---------------------------------------------------------------------------------------- + +;; This function should only be used from the REPL. Regular application code +;; should receive the system map from the parent Biff component. For example, +;; the use-jetty component merges the system map into incoming Ring requests. +(defn get-context [] + (biff/merge-context @main/system)) + +(defn add-fixtures [] + (let [{:keys [example/ds] :as _ctx} (get-context)] + (jdbc/execute! ds (db/new-user-statement "a@example.com")))) + +(defn reset-db! [] + (let [{:keys [example/ds]} (get-context) + tables [:users :auth_code] + drop-statements (map (fn [table] (sql/format (drop-table :if-exists table))) tables)] + (db/execute-all! ds drop-statements) + + (jdbc/execute! ds [(slurp (io/resource "migrations.sql"))]))) + +#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} +(defn new-migration [migration-name] + (migratus/create (com.biffweb.my-project/ctx->migratus-config (get-context)) migration-name)) + +#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} +(defn check-config [] + (let [prod-config (biff/use-aero-config {:biff.config/profile "prod"}) + dev-config (biff/use-aero-config {:biff.config/profile "dev"}) + ;; Add keys for any other secrets you've added to resources/config.edn + secret-keys [:biff.middleware/cookie-secret + :biff/jwt-secret + :postmark/api-key] + get-secrets (fn [{:keys [biff/secret] :as _config}] + (into {} + (map (fn [k] + [k (secret k)])) + secret-keys))] + {:prod-config prod-config + :dev-config dev-config + :prod-secrets (get-secrets prod-config) + :dev-secrets (get-secrets dev-config)})) + +(comment + ;; Call this function if you make a change to main/initial-system, + ;; main/components, :tasks, :queues, config.env, or deps.edn. + (main/refresh) + + ;; Call this in dev if you'd like to add some seed data to your database. If + ;; you edit the seed data, you can reset the database by calling reset-db! + ;; (DON'T do that in prod) and calling add-fixtures again. + (reset-db!) + (add-fixtures) + + ;; Create a user + (let [{:keys [example/ds] :as _ctx} (get-context)] + (jdbc/execute! ds (db/new-user-statement "hello@example.com"))) + + ;; Query the database + (let [{:keys [example/ds] :as _ctx} (get-context)] + (jdbc/execute! ds (sql/format {:select :* :from :users}))) + + ;; Update an existing user's email address + (let [{:keys [example/ds] :as _ctx} (get-context)] + (jdbc/execute! ds (sql/format {:update :users + :set {:email "new.address@example.com"} + :where [:= :email "hello@example.com"]}))) + + (sort (keys (get-context))) + + ;; Check the terminal for output. + (biff/submit-job (get-context) :echo {:foo "bar"}) + (deref (biff/submit-job-for-result (get-context) :echo {:foo "bar"}))) diff --git a/dev/tasks.clj b/dev/tasks.clj new file mode 100644 index 0000000..bc5ea9d --- /dev/null +++ b/dev/tasks.clj @@ -0,0 +1,50 @@ +(ns tasks + (:require [com.biffweb.task-runner :refer [run-task]] + [com.biffweb.tasks :as tasks] + [com.biffweb.tasks.lazy.babashka.fs :as fs] + [com.biffweb.tasks.lazy.babashka.process :refer [shell]] + [com.biffweb.tasks.lazy.clojure.java.io :as io] + [com.biffweb.tasks.lazy.com.biffweb.config :as config])) + +(def config (delay (config/use-aero-config {:biff.config/skip-validation true}))) + +(defn hello + "Says 'Hello'" + [] + (println "Hello")) + +(defn dev + "Starts the app locally. + + After running, wait for the `System started` message. Connect your editor to + nrepl port 7888 (by default). Whenever you save a file, Biff will: + + - Evaluate any changed Clojure files + - Regenerate static HTML files + - Run tests" + [] + (if-not (fs/exists? "target/resources") + ;; This is an awful hack. We have to run the app in a new process, otherwise + ;; target/resources won't be included in the classpath. Downside of not + ;; using bb tasks anymore -- no longer have a lightweight parent process + ;; that can create the directory before starting the JVM. + (do + (io/make-parents "target/resources/_") + (shell "clj" "-M:dev" "dev")) + (let [{:keys [biff.tasks/main-ns biff.nrepl/port] :as _ctx} @config] + + (when-not (fs/exists? "config.env") + (run-task "generate-config")) + (when (fs/exists? "package.json") + (shell "npm install")) + (spit ".nrepl-port" port) + ((requiring-resolve (symbol (str main-ns) "-main")))))) + +;; Tasks should be vars (#'hello instead of hello) so that `clj -M:dev help` can +;; print their docstrings. +(def custom-tasks + {"hello" #'hello + "dev" #'dev}) + +#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} +(def tasks (merge tasks/tasks custom-tasks)) diff --git a/resources/config.edn b/resources/config.edn new file mode 100644 index 0000000..c3fc6ad --- /dev/null +++ b/resources/config.edn @@ -0,0 +1,46 @@ +;; See https://github.com/juxt/aero and https://biffweb.com/docs/api/utilities/#use-aero-config. +;; #biff/env and #biff/secret will load values from the environment and from config.env. +{:biff/base-url #profile {:prod #join ["https://" #biff/env DOMAIN] :default "http://localhost:8080"} + :biff/host #profile {:dev "0.0.0.0" + :default "localhost"} + :biff/port 8080 + + :example/db-url #profile {:prod "jdbc:sqlite:storage/site.db" + :dev "jdbc:sqlite:storage/site.db"} + + :biff.beholder/enabled #profile {:dev true :default false} + :biff.middleware/secure #profile {:dev false :default true} + :biff.middleware/cookie-secret #biff/secret COOKIE_SECRET + :biff/jwt-secret #biff/secret JWT_SECRET + :biff.refresh/enabled #profile {:dev true :default false} + + :postmark/api-key #biff/secret POSTMARK_API_KEY + :postmark/from #biff/env POSTMARK_FROM + + :recaptcha/secret-key #biff/secret RECAPTCHA_SECRET_KEY + :recaptcha/site-key #biff/env RECAPTCHA_SITE_KEY + + :biff.nrepl/port #or [#biff/env NREPL_PORT "7888"] + :biff.nrepl/args ["--port" #ref [:biff.nrepl/port] + "--middleware" "[cider.nrepl/cider-middleware,refactor-nrepl.middleware/wrap-refactor]"] + + :biff.system-properties/user.timezone "UTC" + :biff.system-properties/clojure.tools.logging.factory "clojure.tools.logging.impl/slf4j-factory" + + :biff.tasks/server #biff/env DOMAIN + :biff.tasks/main-ns com.biffweb.my-project + :biff.tasks/on-soft-deploy "\"(com.biffweb.my-project/on-save @com.biffweb.my-project/system)\"" + :biff.tasks/generate-assets-fn com.biffweb.my-project/generate-assets! + :biff.tasks/css-output "target/resources/public/css/main.css" + :biff.tasks/deploy-untracked-files [#ref [:biff.tasks/css-output] + "config.env"] + ;; `clj -M:dev prod-dev` will run the soft-deploy task whenever files in these directories are changed. + :biff.tasks/watch-dirs ["src" "dev" "resources" "test"] + + ;; Uncomment this line if you're on Windows/don't have rsync and your local branch is + ;; called main instead of master: + ;; :biff.tasks/deploy-cmd ["git" "push" "prod" "main:master"] + :biff.tasks/deploy-cmd ["git" "push" "prod" "master"] + ;; Uncomment this line if you have any ssh-related problems: + ;; :biff.tasks/skip-ssh-agent true + } diff --git a/resources/config.env b/resources/config.env new file mode 100644 index 0000000..b53a997 --- /dev/null +++ b/resources/config.env @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +BIFF_PROFILE="dev" +COOKIE_SECRET=t6JiKWp/L4wfZ+9C+5WFUA== +JWT_SECRET=RFswnM9hACuUxhMOX8l4UvTQqoWz0yUoaRXYwnoaPdE= diff --git a/resources/config.template.env b/resources/config.template.env new file mode 100644 index 0000000..ac8885b --- /dev/null +++ b/resources/config.template.env @@ -0,0 +1,31 @@ +# This file contains config that is not checked into git. See resources/config.edn for more config +# options. + +# Where will your app be deployed? +DOMAIN=example.com + +# Postmark is used to send email sign-in links. Sign up at https://postmarkapp.com/ +POSTMARK_API_KEY= +# Change to the address of your sending identity. Set a reply-to address on your sending identity if +# you want to receive replies and your from address isn't configured for receiving. +POSTMARK_FROM= + +# Recaptcha is used to protect your sign-in page from bots. Go to +# https://www.google.com/recaptcha/about/ and add a site. Select v2 invisible. Add localhost and the +# value of DOMAIN above to your list of allowed domains. +RECAPTCHA_SITE_KEY= +RECAPTCHA_SECRET_KEY= + +# What port should the nrepl server be started on (in dev and prod)? +NREPL_PORT=7888 + + +## Autogenerated. Create new secrets with `clj -M:dev generate-secrets` + +# Used to encrypt session cookies. +COOKIE_SECRET={{ new-secret 16 }} +# Used to encrypt email sign-in links. +JWT_SECRET={{ new-secret 32 }} + +DEV_POSTGRES_URL=postgresql://user:abc123@localhost:5432/main +#PROD_POSTGRES_URL=... diff --git a/resources/migrations/20240331175207-create-user.down.sql b/resources/migrations/20240331175207-create-user.down.sql new file mode 100644 index 0000000..411d374 --- /dev/null +++ b/resources/migrations/20240331175207-create-user.down.sql @@ -0,0 +1 @@ +DELETE TABLE IF EXISTS users; diff --git a/resources/migrations/20240331175207-create-user.up.sql b/resources/migrations/20240331175207-create-user.up.sql new file mode 100644 index 0000000..d999469 --- /dev/null +++ b/resources/migrations/20240331175207-create-user.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS users ( + id uuid PRIMARY KEY, + email text NOT NULL UNIQUE, + joined_at timestamp DEFAULT CURRENT_TIMESTAMP, + foo text, + bar text +); diff --git a/resources/migrations/20240331175244-create-auth-code.down.sql b/resources/migrations/20240331175244-create-auth-code.down.sql new file mode 100644 index 0000000..33a5fa2 --- /dev/null +++ b/resources/migrations/20240331175244-create-auth-code.down.sql @@ -0,0 +1 @@ +DELETE TABLE IF EXISTS auth_code; diff --git a/resources/migrations/20240331175244-create-auth-code.up.sql b/resources/migrations/20240331175244-create-auth-code.up.sql new file mode 100644 index 0000000..e0ac334 --- /dev/null +++ b/resources/migrations/20240331175244-create-auth-code.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS auth_code ( + id uuid PRIMARY KEY, + email text NOT NULL UNIQUE, + code text NOT NULL, + created_at timestamp NOT NULL, + failed_attempts integer DEFAULT 0 +); diff --git a/resources/public/css/pico.colors.min.css b/resources/public/css/pico.colors.min.css new file mode 100644 index 0000000..1bb5980 --- /dev/null +++ b/resources/public/css/pico.colors.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";/*! + * Pico CSS ✨ v2.0.6 (https://picocss.com) + * Copyright 2019-2024 - Licensed under MIT + */:root{--pico-color-red-950:#1c0d06;--pico-color-red-900:#30130a;--pico-color-red-850:#45150c;--pico-color-red-800:#5c160d;--pico-color-red-750:#72170f;--pico-color-red-700:#861d13;--pico-color-red-650:#9b2318;--pico-color-red-600:#af291d;--pico-color-red-550:#c52f21;--pico-color-red-500:#d93526;--pico-color-red-450:#ee402e;--pico-color-red-400:#f06048;--pico-color-red-350:#f17961;--pico-color-red-300:#f38f79;--pico-color-red-250:#f5a390;--pico-color-red-200:#f5b7a8;--pico-color-red-150:#f6cabf;--pico-color-red-100:#f8dcd6;--pico-color-red-50:#faeeeb;--pico-color-red:#c52f21;--pico-color-pink-950:#25060c;--pico-color-pink-900:#380916;--pico-color-pink-850:#4b0c1f;--pico-color-pink-800:#5f0e28;--pico-color-pink-750:#740f31;--pico-color-pink-700:#88143b;--pico-color-pink-650:#9d1945;--pico-color-pink-600:#b21e4f;--pico-color-pink-550:#c72259;--pico-color-pink-500:#d92662;--pico-color-pink-450:#f42c6f;--pico-color-pink-400:#f6547e;--pico-color-pink-350:#f7708e;--pico-color-pink-300:#f8889e;--pico-color-pink-250:#f99eae;--pico-color-pink-200:#f9b4be;--pico-color-pink-150:#f9c8ce;--pico-color-pink-100:#f9dbdf;--pico-color-pink-50:#fbedef;--pico-color-pink:#d92662;--pico-color-fuchsia-950:#230518;--pico-color-fuchsia-900:#360925;--pico-color-fuchsia-850:#480b33;--pico-color-fuchsia-800:#5c0d41;--pico-color-fuchsia-750:#700e4f;--pico-color-fuchsia-700:#84135e;--pico-color-fuchsia-650:#98176d;--pico-color-fuchsia-600:#ac1c7c;--pico-color-fuchsia-550:#c1208b;--pico-color-fuchsia-500:#d9269d;--pico-color-fuchsia-450:#ed2aac;--pico-color-fuchsia-400:#f748b7;--pico-color-fuchsia-350:#f869bf;--pico-color-fuchsia-300:#f983c7;--pico-color-fuchsia-250:#fa9acf;--pico-color-fuchsia-200:#f9b1d8;--pico-color-fuchsia-150:#f9c6e1;--pico-color-fuchsia-100:#f9daea;--pico-color-fuchsia-50:#fbedf4;--pico-color-fuchsia:#c1208b;--pico-color-purple-950:#1e0820;--pico-color-purple-900:#2d0f33;--pico-color-purple-850:#3d1545;--pico-color-purple-800:#4d1a57;--pico-color-purple-750:#5e206b;--pico-color-purple-700:#6f277d;--pico-color-purple-650:#802e90;--pico-color-purple-600:#9236a4;--pico-color-purple-550:#aa40bf;--pico-color-purple-500:#b645cd;--pico-color-purple-450:#c652dc;--pico-color-purple-400:#cd68e0;--pico-color-purple-350:#d47de4;--pico-color-purple-300:#db90e8;--pico-color-purple-250:#e2a3eb;--pico-color-purple-200:#e7b6ee;--pico-color-purple-150:#edc9f1;--pico-color-purple-100:#f2dcf4;--pico-color-purple-50:#f8eef9;--pico-color-purple:#9236a4;--pico-color-violet-950:#190928;--pico-color-violet-900:#251140;--pico-color-violet-850:#321856;--pico-color-violet-800:#3f1e6d;--pico-color-violet-750:#4d2585;--pico-color-violet-700:#5b2d9c;--pico-color-violet-650:#6935b3;--pico-color-violet-600:#7540bf;--pico-color-violet-550:#8352c5;--pico-color-violet-500:#9062ca;--pico-color-violet-450:#9b71cf;--pico-color-violet-400:#a780d4;--pico-color-violet-350:#b290d9;--pico-color-violet-300:#bd9fdf;--pico-color-violet-250:#c9afe4;--pico-color-violet-200:#d3bfe8;--pico-color-violet-150:#decfed;--pico-color-violet-100:#e8dff2;--pico-color-violet-50:#f3eff7;--pico-color-violet:#7540bf;--pico-color-indigo-950:#110b31;--pico-color-indigo-900:#181546;--pico-color-indigo-850:#1f1e5e;--pico-color-indigo-800:#272678;--pico-color-indigo-750:#2f2f92;--pico-color-indigo-700:#3838ab;--pico-color-indigo-650:#4040bf;--pico-color-indigo-600:#524ed2;--pico-color-indigo-550:#655cd6;--pico-color-indigo-500:#7569da;--pico-color-indigo-450:#8577dd;--pico-color-indigo-400:#9486e1;--pico-color-indigo-350:#a294e5;--pico-color-indigo-300:#b0a3e8;--pico-color-indigo-250:#bdb2ec;--pico-color-indigo-200:#cac1ee;--pico-color-indigo-150:#d8d0f1;--pico-color-indigo-100:#e5e0f4;--pico-color-indigo-50:#f2f0f9;--pico-color-indigo:#524ed2;--pico-color-blue-950:#080f2d;--pico-color-blue-900:#0c1a41;--pico-color-blue-850:#0e2358;--pico-color-blue-800:#0f2d70;--pico-color-blue-750:#0f3888;--pico-color-blue-700:#1343a0;--pico-color-blue-650:#184eb8;--pico-color-blue-600:#1d59d0;--pico-color-blue-550:#2060df;--pico-color-blue-500:#3c71f7;--pico-color-blue-450:#5c7ef8;--pico-color-blue-400:#748bf8;--pico-color-blue-350:#8999f9;--pico-color-blue-300:#9ca7fa;--pico-color-blue-250:#aeb5fb;--pico-color-blue-200:#bfc3fa;--pico-color-blue-150:#d0d2fa;--pico-color-blue-100:#e0e1fa;--pico-color-blue-50:#f0f0fb;--pico-color-blue:#2060df;--pico-color-azure-950:#04121d;--pico-color-azure-900:#061e2f;--pico-color-azure-850:#052940;--pico-color-azure-800:#033452;--pico-color-azure-750:#014063;--pico-color-azure-700:#014c75;--pico-color-azure-650:#015887;--pico-color-azure-600:#02659a;--pico-color-azure-550:#0172ad;--pico-color-azure-500:#017fc0;--pico-color-azure-450:#018cd4;--pico-color-azure-400:#029ae8;--pico-color-azure-350:#01aaff;--pico-color-azure-300:#51b4ff;--pico-color-azure-250:#79c0ff;--pico-color-azure-200:#9bccfd;--pico-color-azure-150:#b7d9fc;--pico-color-azure-100:#d1e5fb;--pico-color-azure-50:#e9f2fc;--pico-color-azure:#0172ad;--pico-color-cyan-950:#041413;--pico-color-cyan-900:#051f1f;--pico-color-cyan-850:#052b2b;--pico-color-cyan-800:#043737;--pico-color-cyan-750:#014343;--pico-color-cyan-700:#015050;--pico-color-cyan-650:#025d5d;--pico-color-cyan-600:#046a6a;--pico-color-cyan-550:#047878;--pico-color-cyan-500:#058686;--pico-color-cyan-450:#059494;--pico-color-cyan-400:#05a2a2;--pico-color-cyan-350:#0ab1b1;--pico-color-cyan-300:#0ac2c2;--pico-color-cyan-250:#0ccece;--pico-color-cyan-200:#25dddd;--pico-color-cyan-150:#3deceb;--pico-color-cyan-100:#58faf9;--pico-color-cyan-50:#c3fcfa;--pico-color-cyan:#047878;--pico-color-jade-950:#04140c;--pico-color-jade-900:#052014;--pico-color-jade-850:#042c1b;--pico-color-jade-800:#033823;--pico-color-jade-750:#00452b;--pico-color-jade-700:#015234;--pico-color-jade-650:#005f3d;--pico-color-jade-600:#006d46;--pico-color-jade-550:#007a50;--pico-color-jade-500:#00895a;--pico-color-jade-450:#029764;--pico-color-jade-400:#00a66e;--pico-color-jade-350:#00b478;--pico-color-jade-300:#00c482;--pico-color-jade-250:#00cc88;--pico-color-jade-200:#21e299;--pico-color-jade-150:#39f1a6;--pico-color-jade-100:#70fcba;--pico-color-jade-50:#cbfce1;--pico-color-jade:#007a50;--pico-color-green-950:#0b1305;--pico-color-green-900:#131f07;--pico-color-green-850:#152b07;--pico-color-green-800:#173806;--pico-color-green-750:#1a4405;--pico-color-green-700:#205107;--pico-color-green-650:#265e09;--pico-color-green-600:#2c6c0c;--pico-color-green-550:#33790f;--pico-color-green-500:#398712;--pico-color-green-450:#409614;--pico-color-green-400:#47a417;--pico-color-green-350:#4eb31b;--pico-color-green-300:#55c21e;--pico-color-green-250:#5dd121;--pico-color-green-200:#62d926;--pico-color-green-150:#77ef3d;--pico-color-green-100:#95fb62;--pico-color-green-50:#d7fbc1;--pico-color-green:#398712;--pico-color-lime-950:#101203;--pico-color-lime-900:#191d03;--pico-color-lime-850:#202902;--pico-color-lime-800:#273500;--pico-color-lime-750:#304100;--pico-color-lime-700:#394d00;--pico-color-lime-650:#435a00;--pico-color-lime-600:#4d6600;--pico-color-lime-550:#577400;--pico-color-lime-500:#628100;--pico-color-lime-450:#6c8f00;--pico-color-lime-400:#779c00;--pico-color-lime-350:#82ab00;--pico-color-lime-300:#8eb901;--pico-color-lime-250:#99c801;--pico-color-lime-200:#a5d601;--pico-color-lime-150:#b2e51a;--pico-color-lime-100:#c1f335;--pico-color-lime-50:#defc85;--pico-color-lime:#a5d601;--pico-color-yellow-950:#141103;--pico-color-yellow-900:#1f1c02;--pico-color-yellow-850:#2b2600;--pico-color-yellow-800:#363100;--pico-color-yellow-750:#423c00;--pico-color-yellow-700:#4e4700;--pico-color-yellow-650:#5b5300;--pico-color-yellow-600:#685f00;--pico-color-yellow-550:#756b00;--pico-color-yellow-500:#827800;--pico-color-yellow-450:#908501;--pico-color-yellow-400:#9e9200;--pico-color-yellow-350:#ad9f00;--pico-color-yellow-300:#bbac00;--pico-color-yellow-250:#caba01;--pico-color-yellow-200:#d9c800;--pico-color-yellow-150:#e8d600;--pico-color-yellow-100:#f2df0d;--pico-color-yellow-50:#fdf1b4;--pico-color-yellow:#f2df0d;--pico-color-amber-950:#161003;--pico-color-amber-900:#231a03;--pico-color-amber-850:#312302;--pico-color-amber-800:#3f2d00;--pico-color-amber-750:#4d3700;--pico-color-amber-700:#5b4200;--pico-color-amber-650:#694d00;--pico-color-amber-600:#785800;--pico-color-amber-550:#876400;--pico-color-amber-500:#977000;--pico-color-amber-450:#a77c00;--pico-color-amber-400:#b78800;--pico-color-amber-350:#c79400;--pico-color-amber-300:#d8a100;--pico-color-amber-250:#e8ae01;--pico-color-amber-200:#ffbf00;--pico-color-amber-150:#fecc63;--pico-color-amber-100:#fddea6;--pico-color-amber-50:#fcefd9;--pico-color-amber:#ffbf00;--pico-color-pumpkin-950:#180f04;--pico-color-pumpkin-900:#271805;--pico-color-pumpkin-850:#372004;--pico-color-pumpkin-800:#482802;--pico-color-pumpkin-750:#593100;--pico-color-pumpkin-700:#693a00;--pico-color-pumpkin-650:#7a4400;--pico-color-pumpkin-600:#8b4f00;--pico-color-pumpkin-550:#9c5900;--pico-color-pumpkin-500:#ad6400;--pico-color-pumpkin-450:#bf6e00;--pico-color-pumpkin-400:#d27a01;--pico-color-pumpkin-350:#e48500;--pico-color-pumpkin-300:#ff9500;--pico-color-pumpkin-250:#ffa23a;--pico-color-pumpkin-200:#feb670;--pico-color-pumpkin-150:#fcca9b;--pico-color-pumpkin-100:#fcdcc1;--pico-color-pumpkin-50:#fceee3;--pico-color-pumpkin:#ff9500;--pico-color-orange-950:#1b0d06;--pico-color-orange-900:#2d1509;--pico-color-orange-850:#411a0a;--pico-color-orange-800:#561e0a;--pico-color-orange-750:#6b220a;--pico-color-orange-700:#7f270b;--pico-color-orange-650:#942d0d;--pico-color-orange-600:#a83410;--pico-color-orange-550:#bd3c13;--pico-color-orange-500:#d24317;--pico-color-orange-450:#e74b1a;--pico-color-orange-400:#f45d2c;--pico-color-orange-350:#f56b3d;--pico-color-orange-300:#f68e68;--pico-color-orange-250:#f8a283;--pico-color-orange-200:#f8b79f;--pico-color-orange-150:#f8cab9;--pico-color-orange-100:#f9dcd2;--pico-color-orange-50:#faeeea;--pico-color-orange:#d24317;--pico-color-sand-950:#111110;--pico-color-sand-900:#1c1b19;--pico-color-sand-850:#272622;--pico-color-sand-800:#32302b;--pico-color-sand-750:#3d3b35;--pico-color-sand-700:#49463f;--pico-color-sand-650:#55524a;--pico-color-sand-600:#615e55;--pico-color-sand-550:#6e6a60;--pico-color-sand-500:#7b776b;--pico-color-sand-450:#888377;--pico-color-sand-400:#959082;--pico-color-sand-350:#a39e8f;--pico-color-sand-300:#b0ab9b;--pico-color-sand-250:#beb8a7;--pico-color-sand-200:#ccc6b4;--pico-color-sand-150:#dad4c2;--pico-color-sand-100:#e8e2d2;--pico-color-sand-50:#f2f0ec;--pico-color-sand:#ccc6b4;--pico-color-grey-950:#111111;--pico-color-grey-900:#1b1b1b;--pico-color-grey-850:#262626;--pico-color-grey-800:#303030;--pico-color-grey-750:#3b3b3b;--pico-color-grey-700:#474747;--pico-color-grey-650:#525252;--pico-color-grey-600:#5e5e5e;--pico-color-grey-550:#6a6a6a;--pico-color-grey-500:#777777;--pico-color-grey-450:#808080;--pico-color-grey-400:#919191;--pico-color-grey-350:#9e9e9e;--pico-color-grey-300:#ababab;--pico-color-grey-250:#b9b9b9;--pico-color-grey-200:#c6c6c6;--pico-color-grey-150:#d4d4d4;--pico-color-grey-100:#e2e2e2;--pico-color-grey-50:#f1f1f1;--pico-color-grey:#ababab;--pico-color-zinc-950:#0f1114;--pico-color-zinc-900:#191c20;--pico-color-zinc-850:#23262c;--pico-color-zinc-800:#2d3138;--pico-color-zinc-750:#373c44;--pico-color-zinc-700:#424751;--pico-color-zinc-650:#4d535e;--pico-color-zinc-600:#5c6370;--pico-color-zinc-550:#646b79;--pico-color-zinc-500:#6f7887;--pico-color-zinc-450:#7b8495;--pico-color-zinc-400:#8891a4;--pico-color-zinc-350:#969eaf;--pico-color-zinc-300:#a4acba;--pico-color-zinc-250:#b3b9c5;--pico-color-zinc-200:#c2c7d0;--pico-color-zinc-150:#d1d5db;--pico-color-zinc-100:#e0e3e7;--pico-color-zinc-50:#f0f1f3;--pico-color-zinc:#646b79;--pico-color-slate-950:#0e1118;--pico-color-slate-900:#181c25;--pico-color-slate-850:#202632;--pico-color-slate-800:#2a3140;--pico-color-slate-750:#333c4e;--pico-color-slate-700:#3d475c;--pico-color-slate-650:#48536b;--pico-color-slate-600:#525f7a;--pico-color-slate-550:#5d6b89;--pico-color-slate-500:#687899;--pico-color-slate-450:#7385a9;--pico-color-slate-400:#8191b5;--pico-color-slate-350:#909ebe;--pico-color-slate-300:#a0acc7;--pico-color-slate-250:#b0b9d0;--pico-color-slate-200:#bfc7d9;--pico-color-slate-150:#cfd5e2;--pico-color-slate-100:#dfe3eb;--pico-color-slate-50:#eff1f4;--pico-color-slate:#525f7a;--pico-color-light:#fff;--pico-color-dark:#000}.pico-color-red-950{color:var(--pico-color-red-950)}.pico-color-red-900{color:var(--pico-color-red-900)}.pico-color-red-850{color:var(--pico-color-red-850)}.pico-color-red-800{color:var(--pico-color-red-800)}.pico-color-red-750{color:var(--pico-color-red-750)}.pico-color-red-700{color:var(--pico-color-red-700)}.pico-color-red-650{color:var(--pico-color-red-650)}.pico-color-red-600{color:var(--pico-color-red-600)}.pico-color-red-550{color:var(--pico-color-red-550)}.pico-color-red-500{color:var(--pico-color-red-500)}.pico-color-red-450{color:var(--pico-color-red-450)}.pico-color-red-400{color:var(--pico-color-red-400)}.pico-color-red-350{color:var(--pico-color-red-350)}.pico-color-red-300{color:var(--pico-color-red-300)}.pico-color-red-250{color:var(--pico-color-red-250)}.pico-color-red-200{color:var(--pico-color-red-200)}.pico-color-red-150{color:var(--pico-color-red-150)}.pico-color-red-100{color:var(--pico-color-red-100)}.pico-color-red-50{color:var(--pico-color-red-50)}.pico-color-red{color:var(--pico-color-red)}.pico-color-pink-950{color:var(--pico-color-pink-950)}.pico-color-pink-900{color:var(--pico-color-pink-900)}.pico-color-pink-850{color:var(--pico-color-pink-850)}.pico-color-pink-800{color:var(--pico-color-pink-800)}.pico-color-pink-750{color:var(--pico-color-pink-750)}.pico-color-pink-700{color:var(--pico-color-pink-700)}.pico-color-pink-650{color:var(--pico-color-pink-650)}.pico-color-pink-600{color:var(--pico-color-pink-600)}.pico-color-pink-550{color:var(--pico-color-pink-550)}.pico-color-pink-500{color:var(--pico-color-pink-500)}.pico-color-pink-450{color:var(--pico-color-pink-450)}.pico-color-pink-400{color:var(--pico-color-pink-400)}.pico-color-pink-350{color:var(--pico-color-pink-350)}.pico-color-pink-300{color:var(--pico-color-pink-300)}.pico-color-pink-250{color:var(--pico-color-pink-250)}.pico-color-pink-200{color:var(--pico-color-pink-200)}.pico-color-pink-150{color:var(--pico-color-pink-150)}.pico-color-pink-100{color:var(--pico-color-pink-100)}.pico-color-pink-50{color:var(--pico-color-pink-50)}.pico-color-pink{color:var(--pico-color-pink)}.pico-color-fuchsia-950{color:var(--pico-color-fuchsia-950)}.pico-color-fuchsia-900{color:var(--pico-color-fuchsia-900)}.pico-color-fuchsia-850{color:var(--pico-color-fuchsia-850)}.pico-color-fuchsia-800{color:var(--pico-color-fuchsia-800)}.pico-color-fuchsia-750{color:var(--pico-color-fuchsia-750)}.pico-color-fuchsia-700{color:var(--pico-color-fuchsia-700)}.pico-color-fuchsia-650{color:var(--pico-color-fuchsia-650)}.pico-color-fuchsia-600{color:var(--pico-color-fuchsia-600)}.pico-color-fuchsia-550{color:var(--pico-color-fuchsia-550)}.pico-color-fuchsia-500{color:var(--pico-color-fuchsia-500)}.pico-color-fuchsia-450{color:var(--pico-color-fuchsia-450)}.pico-color-fuchsia-400{color:var(--pico-color-fuchsia-400)}.pico-color-fuchsia-350{color:var(--pico-color-fuchsia-350)}.pico-color-fuchsia-300{color:var(--pico-color-fuchsia-300)}.pico-color-fuchsia-250{color:var(--pico-color-fuchsia-250)}.pico-color-fuchsia-200{color:var(--pico-color-fuchsia-200)}.pico-color-fuchsia-150{color:var(--pico-color-fuchsia-150)}.pico-color-fuchsia-100{color:var(--pico-color-fuchsia-100)}.pico-color-fuchsia-50{color:var(--pico-color-fuchsia-50)}.pico-color-fuchsia{color:var(--pico-color-fuchsia)}.pico-color-purple-950{color:var(--pico-color-purple-950)}.pico-color-purple-900{color:var(--pico-color-purple-900)}.pico-color-purple-850{color:var(--pico-color-purple-850)}.pico-color-purple-800{color:var(--pico-color-purple-800)}.pico-color-purple-750{color:var(--pico-color-purple-750)}.pico-color-purple-700{color:var(--pico-color-purple-700)}.pico-color-purple-650{color:var(--pico-color-purple-650)}.pico-color-purple-600{color:var(--pico-color-purple-600)}.pico-color-purple-550{color:var(--pico-color-purple-550)}.pico-color-purple-500{color:var(--pico-color-purple-500)}.pico-color-purple-450{color:var(--pico-color-purple-450)}.pico-color-purple-400{color:var(--pico-color-purple-400)}.pico-color-purple-350{color:var(--pico-color-purple-350)}.pico-color-purple-300{color:var(--pico-color-purple-300)}.pico-color-purple-250{color:var(--pico-color-purple-250)}.pico-color-purple-200{color:var(--pico-color-purple-200)}.pico-color-purple-150{color:var(--pico-color-purple-150)}.pico-color-purple-100{color:var(--pico-color-purple-100)}.pico-color-purple-50{color:var(--pico-color-purple-50)}.pico-color-purple{color:var(--pico-color-purple)}.pico-color-violet-950{color:var(--pico-color-violet-950)}.pico-color-violet-900{color:var(--pico-color-violet-900)}.pico-color-violet-850{color:var(--pico-color-violet-850)}.pico-color-violet-800{color:var(--pico-color-violet-800)}.pico-color-violet-750{color:var(--pico-color-violet-750)}.pico-color-violet-700{color:var(--pico-color-violet-700)}.pico-color-violet-650{color:var(--pico-color-violet-650)}.pico-color-violet-600{color:var(--pico-color-violet-600)}.pico-color-violet-550{color:var(--pico-color-violet-550)}.pico-color-violet-500{color:var(--pico-color-violet-500)}.pico-color-violet-450{color:var(--pico-color-violet-450)}.pico-color-violet-400{color:var(--pico-color-violet-400)}.pico-color-violet-350{color:var(--pico-color-violet-350)}.pico-color-violet-300{color:var(--pico-color-violet-300)}.pico-color-violet-250{color:var(--pico-color-violet-250)}.pico-color-violet-200{color:var(--pico-color-violet-200)}.pico-color-violet-150{color:var(--pico-color-violet-150)}.pico-color-violet-100{color:var(--pico-color-violet-100)}.pico-color-violet-50{color:var(--pico-color-violet-50)}.pico-color-violet{color:var(--pico-color-violet)}.pico-color-indigo-950{color:var(--pico-color-indigo-950)}.pico-color-indigo-900{color:var(--pico-color-indigo-900)}.pico-color-indigo-850{color:var(--pico-color-indigo-850)}.pico-color-indigo-800{color:var(--pico-color-indigo-800)}.pico-color-indigo-750{color:var(--pico-color-indigo-750)}.pico-color-indigo-700{color:var(--pico-color-indigo-700)}.pico-color-indigo-650{color:var(--pico-color-indigo-650)}.pico-color-indigo-600{color:var(--pico-color-indigo-600)}.pico-color-indigo-550{color:var(--pico-color-indigo-550)}.pico-color-indigo-500{color:var(--pico-color-indigo-500)}.pico-color-indigo-450{color:var(--pico-color-indigo-450)}.pico-color-indigo-400{color:var(--pico-color-indigo-400)}.pico-color-indigo-350{color:var(--pico-color-indigo-350)}.pico-color-indigo-300{color:var(--pico-color-indigo-300)}.pico-color-indigo-250{color:var(--pico-color-indigo-250)}.pico-color-indigo-200{color:var(--pico-color-indigo-200)}.pico-color-indigo-150{color:var(--pico-color-indigo-150)}.pico-color-indigo-100{color:var(--pico-color-indigo-100)}.pico-color-indigo-50{color:var(--pico-color-indigo-50)}.pico-color-indigo{color:var(--pico-color-indigo)}.pico-color-blue-950{color:var(--pico-color-blue-950)}.pico-color-blue-900{color:var(--pico-color-blue-900)}.pico-color-blue-850{color:var(--pico-color-blue-850)}.pico-color-blue-800{color:var(--pico-color-blue-800)}.pico-color-blue-750{color:var(--pico-color-blue-750)}.pico-color-blue-700{color:var(--pico-color-blue-700)}.pico-color-blue-650{color:var(--pico-color-blue-650)}.pico-color-blue-600{color:var(--pico-color-blue-600)}.pico-color-blue-550{color:var(--pico-color-blue-550)}.pico-color-blue-500{color:var(--pico-color-blue-500)}.pico-color-blue-450{color:var(--pico-color-blue-450)}.pico-color-blue-400{color:var(--pico-color-blue-400)}.pico-color-blue-350{color:var(--pico-color-blue-350)}.pico-color-blue-300{color:var(--pico-color-blue-300)}.pico-color-blue-250{color:var(--pico-color-blue-250)}.pico-color-blue-200{color:var(--pico-color-blue-200)}.pico-color-blue-150{color:var(--pico-color-blue-150)}.pico-color-blue-100{color:var(--pico-color-blue-100)}.pico-color-blue-50{color:var(--pico-color-blue-50)}.pico-color-blue{color:var(--pico-color-blue)}.pico-color-azure-950{color:var(--pico-color-azure-950)}.pico-color-azure-900{color:var(--pico-color-azure-900)}.pico-color-azure-850{color:var(--pico-color-azure-850)}.pico-color-azure-800{color:var(--pico-color-azure-800)}.pico-color-azure-750{color:var(--pico-color-azure-750)}.pico-color-azure-700{color:var(--pico-color-azure-700)}.pico-color-azure-650{color:var(--pico-color-azure-650)}.pico-color-azure-600{color:var(--pico-color-azure-600)}.pico-color-azure-550{color:var(--pico-color-azure-550)}.pico-color-azure-500{color:var(--pico-color-azure-500)}.pico-color-azure-450{color:var(--pico-color-azure-450)}.pico-color-azure-400{color:var(--pico-color-azure-400)}.pico-color-azure-350{color:var(--pico-color-azure-350)}.pico-color-azure-300{color:var(--pico-color-azure-300)}.pico-color-azure-250{color:var(--pico-color-azure-250)}.pico-color-azure-200{color:var(--pico-color-azure-200)}.pico-color-azure-150{color:var(--pico-color-azure-150)}.pico-color-azure-100{color:var(--pico-color-azure-100)}.pico-color-azure-50{color:var(--pico-color-azure-50)}.pico-color-azure{color:var(--pico-color-azure)}.pico-color-cyan-950{color:var(--pico-color-cyan-950)}.pico-color-cyan-900{color:var(--pico-color-cyan-900)}.pico-color-cyan-850{color:var(--pico-color-cyan-850)}.pico-color-cyan-800{color:var(--pico-color-cyan-800)}.pico-color-cyan-750{color:var(--pico-color-cyan-750)}.pico-color-cyan-700{color:var(--pico-color-cyan-700)}.pico-color-cyan-650{color:var(--pico-color-cyan-650)}.pico-color-cyan-600{color:var(--pico-color-cyan-600)}.pico-color-cyan-550{color:var(--pico-color-cyan-550)}.pico-color-cyan-500{color:var(--pico-color-cyan-500)}.pico-color-cyan-450{color:var(--pico-color-cyan-450)}.pico-color-cyan-400{color:var(--pico-color-cyan-400)}.pico-color-cyan-350{color:var(--pico-color-cyan-350)}.pico-color-cyan-300{color:var(--pico-color-cyan-300)}.pico-color-cyan-250{color:var(--pico-color-cyan-250)}.pico-color-cyan-200{color:var(--pico-color-cyan-200)}.pico-color-cyan-150{color:var(--pico-color-cyan-150)}.pico-color-cyan-100{color:var(--pico-color-cyan-100)}.pico-color-cyan-50{color:var(--pico-color-cyan-50)}.pico-color-cyan{color:var(--pico-color-cyan)}.pico-color-jade-950{color:var(--pico-color-jade-950)}.pico-color-jade-900{color:var(--pico-color-jade-900)}.pico-color-jade-850{color:var(--pico-color-jade-850)}.pico-color-jade-800{color:var(--pico-color-jade-800)}.pico-color-jade-750{color:var(--pico-color-jade-750)}.pico-color-jade-700{color:var(--pico-color-jade-700)}.pico-color-jade-650{color:var(--pico-color-jade-650)}.pico-color-jade-600{color:var(--pico-color-jade-600)}.pico-color-jade-550{color:var(--pico-color-jade-550)}.pico-color-jade-500{color:var(--pico-color-jade-500)}.pico-color-jade-450{color:var(--pico-color-jade-450)}.pico-color-jade-400{color:var(--pico-color-jade-400)}.pico-color-jade-350{color:var(--pico-color-jade-350)}.pico-color-jade-300{color:var(--pico-color-jade-300)}.pico-color-jade-250{color:var(--pico-color-jade-250)}.pico-color-jade-200{color:var(--pico-color-jade-200)}.pico-color-jade-150{color:var(--pico-color-jade-150)}.pico-color-jade-100{color:var(--pico-color-jade-100)}.pico-color-jade-50{color:var(--pico-color-jade-50)}.pico-color-jade{color:var(--pico-color-jade)}.pico-color-green-950{color:var(--pico-color-green-950)}.pico-color-green-900{color:var(--pico-color-green-900)}.pico-color-green-850{color:var(--pico-color-green-850)}.pico-color-green-800{color:var(--pico-color-green-800)}.pico-color-green-750{color:var(--pico-color-green-750)}.pico-color-green-700{color:var(--pico-color-green-700)}.pico-color-green-650{color:var(--pico-color-green-650)}.pico-color-green-600{color:var(--pico-color-green-600)}.pico-color-green-550{color:var(--pico-color-green-550)}.pico-color-green-500{color:var(--pico-color-green-500)}.pico-color-green-450{color:var(--pico-color-green-450)}.pico-color-green-400{color:var(--pico-color-green-400)}.pico-color-green-350{color:var(--pico-color-green-350)}.pico-color-green-300{color:var(--pico-color-green-300)}.pico-color-green-250{color:var(--pico-color-green-250)}.pico-color-green-200{color:var(--pico-color-green-200)}.pico-color-green-150{color:var(--pico-color-green-150)}.pico-color-green-100{color:var(--pico-color-green-100)}.pico-color-green-50{color:var(--pico-color-green-50)}.pico-color-green{color:var(--pico-color-green)}.pico-color-lime-950{color:var(--pico-color-lime-950)}.pico-color-lime-900{color:var(--pico-color-lime-900)}.pico-color-lime-850{color:var(--pico-color-lime-850)}.pico-color-lime-800{color:var(--pico-color-lime-800)}.pico-color-lime-750{color:var(--pico-color-lime-750)}.pico-color-lime-700{color:var(--pico-color-lime-700)}.pico-color-lime-650{color:var(--pico-color-lime-650)}.pico-color-lime-600{color:var(--pico-color-lime-600)}.pico-color-lime-550{color:var(--pico-color-lime-550)}.pico-color-lime-500{color:var(--pico-color-lime-500)}.pico-color-lime-450{color:var(--pico-color-lime-450)}.pico-color-lime-400{color:var(--pico-color-lime-400)}.pico-color-lime-350{color:var(--pico-color-lime-350)}.pico-color-lime-300{color:var(--pico-color-lime-300)}.pico-color-lime-250{color:var(--pico-color-lime-250)}.pico-color-lime-200{color:var(--pico-color-lime-200)}.pico-color-lime-150{color:var(--pico-color-lime-150)}.pico-color-lime-100{color:var(--pico-color-lime-100)}.pico-color-lime-50{color:var(--pico-color-lime-50)}.pico-color-lime{color:var(--pico-color-lime)}.pico-color-yellow-950{color:var(--pico-color-yellow-950)}.pico-color-yellow-900{color:var(--pico-color-yellow-900)}.pico-color-yellow-850{color:var(--pico-color-yellow-850)}.pico-color-yellow-800{color:var(--pico-color-yellow-800)}.pico-color-yellow-750{color:var(--pico-color-yellow-750)}.pico-color-yellow-700{color:var(--pico-color-yellow-700)}.pico-color-yellow-650{color:var(--pico-color-yellow-650)}.pico-color-yellow-600{color:var(--pico-color-yellow-600)}.pico-color-yellow-550{color:var(--pico-color-yellow-550)}.pico-color-yellow-500{color:var(--pico-color-yellow-500)}.pico-color-yellow-450{color:var(--pico-color-yellow-450)}.pico-color-yellow-400{color:var(--pico-color-yellow-400)}.pico-color-yellow-350{color:var(--pico-color-yellow-350)}.pico-color-yellow-300{color:var(--pico-color-yellow-300)}.pico-color-yellow-250{color:var(--pico-color-yellow-250)}.pico-color-yellow-200{color:var(--pico-color-yellow-200)}.pico-color-yellow-150{color:var(--pico-color-yellow-150)}.pico-color-yellow-100{color:var(--pico-color-yellow-100)}.pico-color-yellow-50{color:var(--pico-color-yellow-50)}.pico-color-yellow{color:var(--pico-color-yellow)}.pico-color-amber-950{color:var(--pico-color-amber-950)}.pico-color-amber-900{color:var(--pico-color-amber-900)}.pico-color-amber-850{color:var(--pico-color-amber-850)}.pico-color-amber-800{color:var(--pico-color-amber-800)}.pico-color-amber-750{color:var(--pico-color-amber-750)}.pico-color-amber-700{color:var(--pico-color-amber-700)}.pico-color-amber-650{color:var(--pico-color-amber-650)}.pico-color-amber-600{color:var(--pico-color-amber-600)}.pico-color-amber-550{color:var(--pico-color-amber-550)}.pico-color-amber-500{color:var(--pico-color-amber-500)}.pico-color-amber-450{color:var(--pico-color-amber-450)}.pico-color-amber-400{color:var(--pico-color-amber-400)}.pico-color-amber-350{color:var(--pico-color-amber-350)}.pico-color-amber-300{color:var(--pico-color-amber-300)}.pico-color-amber-250{color:var(--pico-color-amber-250)}.pico-color-amber-200{color:var(--pico-color-amber-200)}.pico-color-amber-150{color:var(--pico-color-amber-150)}.pico-color-amber-100{color:var(--pico-color-amber-100)}.pico-color-amber-50{color:var(--pico-color-amber-50)}.pico-color-amber{color:var(--pico-color-amber)}.pico-color-pumpkin-950{color:var(--pico-color-pumpkin-950)}.pico-color-pumpkin-900{color:var(--pico-color-pumpkin-900)}.pico-color-pumpkin-850{color:var(--pico-color-pumpkin-850)}.pico-color-pumpkin-800{color:var(--pico-color-pumpkin-800)}.pico-color-pumpkin-750{color:var(--pico-color-pumpkin-750)}.pico-color-pumpkin-700{color:var(--pico-color-pumpkin-700)}.pico-color-pumpkin-650{color:var(--pico-color-pumpkin-650)}.pico-color-pumpkin-600{color:var(--pico-color-pumpkin-600)}.pico-color-pumpkin-550{color:var(--pico-color-pumpkin-550)}.pico-color-pumpkin-500{color:var(--pico-color-pumpkin-500)}.pico-color-pumpkin-450{color:var(--pico-color-pumpkin-450)}.pico-color-pumpkin-400{color:var(--pico-color-pumpkin-400)}.pico-color-pumpkin-350{color:var(--pico-color-pumpkin-350)}.pico-color-pumpkin-300{color:var(--pico-color-pumpkin-300)}.pico-color-pumpkin-250{color:var(--pico-color-pumpkin-250)}.pico-color-pumpkin-200{color:var(--pico-color-pumpkin-200)}.pico-color-pumpkin-150{color:var(--pico-color-pumpkin-150)}.pico-color-pumpkin-100{color:var(--pico-color-pumpkin-100)}.pico-color-pumpkin-50{color:var(--pico-color-pumpkin-50)}.pico-color-pumpkin{color:var(--pico-color-pumpkin)}.pico-color-orange-950{color:var(--pico-color-orange-950)}.pico-color-orange-900{color:var(--pico-color-orange-900)}.pico-color-orange-850{color:var(--pico-color-orange-850)}.pico-color-orange-800{color:var(--pico-color-orange-800)}.pico-color-orange-750{color:var(--pico-color-orange-750)}.pico-color-orange-700{color:var(--pico-color-orange-700)}.pico-color-orange-650{color:var(--pico-color-orange-650)}.pico-color-orange-600{color:var(--pico-color-orange-600)}.pico-color-orange-550{color:var(--pico-color-orange-550)}.pico-color-orange-500{color:var(--pico-color-orange-500)}.pico-color-orange-450{color:var(--pico-color-orange-450)}.pico-color-orange-400{color:var(--pico-color-orange-400)}.pico-color-orange-350{color:var(--pico-color-orange-350)}.pico-color-orange-300{color:var(--pico-color-orange-300)}.pico-color-orange-250{color:var(--pico-color-orange-250)}.pico-color-orange-200{color:var(--pico-color-orange-200)}.pico-color-orange-150{color:var(--pico-color-orange-150)}.pico-color-orange-100{color:var(--pico-color-orange-100)}.pico-color-orange-50{color:var(--pico-color-orange-50)}.pico-color-orange{color:var(--pico-color-orange)}.pico-color-sand-950{color:var(--pico-color-sand-950)}.pico-color-sand-900{color:var(--pico-color-sand-900)}.pico-color-sand-850{color:var(--pico-color-sand-850)}.pico-color-sand-800{color:var(--pico-color-sand-800)}.pico-color-sand-750{color:var(--pico-color-sand-750)}.pico-color-sand-700{color:var(--pico-color-sand-700)}.pico-color-sand-650{color:var(--pico-color-sand-650)}.pico-color-sand-600{color:var(--pico-color-sand-600)}.pico-color-sand-550{color:var(--pico-color-sand-550)}.pico-color-sand-500{color:var(--pico-color-sand-500)}.pico-color-sand-450{color:var(--pico-color-sand-450)}.pico-color-sand-400{color:var(--pico-color-sand-400)}.pico-color-sand-350{color:var(--pico-color-sand-350)}.pico-color-sand-300{color:var(--pico-color-sand-300)}.pico-color-sand-250{color:var(--pico-color-sand-250)}.pico-color-sand-200{color:var(--pico-color-sand-200)}.pico-color-sand-150{color:var(--pico-color-sand-150)}.pico-color-sand-100{color:var(--pico-color-sand-100)}.pico-color-sand-50{color:var(--pico-color-sand-50)}.pico-color-sand{color:var(--pico-color-sand)}.pico-color-grey-950{color:var(--pico-color-grey-950)}.pico-color-grey-900{color:var(--pico-color-grey-900)}.pico-color-grey-850{color:var(--pico-color-grey-850)}.pico-color-grey-800{color:var(--pico-color-grey-800)}.pico-color-grey-750{color:var(--pico-color-grey-750)}.pico-color-grey-700{color:var(--pico-color-grey-700)}.pico-color-grey-650{color:var(--pico-color-grey-650)}.pico-color-grey-600{color:var(--pico-color-grey-600)}.pico-color-grey-550{color:var(--pico-color-grey-550)}.pico-color-grey-500{color:var(--pico-color-grey-500)}.pico-color-grey-450{color:var(--pico-color-grey-450)}.pico-color-grey-400{color:var(--pico-color-grey-400)}.pico-color-grey-350{color:var(--pico-color-grey-350)}.pico-color-grey-300{color:var(--pico-color-grey-300)}.pico-color-grey-250{color:var(--pico-color-grey-250)}.pico-color-grey-200{color:var(--pico-color-grey-200)}.pico-color-grey-150{color:var(--pico-color-grey-150)}.pico-color-grey-100{color:var(--pico-color-grey-100)}.pico-color-grey-50{color:var(--pico-color-grey-50)}.pico-color-grey{color:var(--pico-color-grey)}.pico-color-zinc-950{color:var(--pico-color-zinc-950)}.pico-color-zinc-900{color:var(--pico-color-zinc-900)}.pico-color-zinc-850{color:var(--pico-color-zinc-850)}.pico-color-zinc-800{color:var(--pico-color-zinc-800)}.pico-color-zinc-750{color:var(--pico-color-zinc-750)}.pico-color-zinc-700{color:var(--pico-color-zinc-700)}.pico-color-zinc-650{color:var(--pico-color-zinc-650)}.pico-color-zinc-600{color:var(--pico-color-zinc-600)}.pico-color-zinc-550{color:var(--pico-color-zinc-550)}.pico-color-zinc-500{color:var(--pico-color-zinc-500)}.pico-color-zinc-450{color:var(--pico-color-zinc-450)}.pico-color-zinc-400{color:var(--pico-color-zinc-400)}.pico-color-zinc-350{color:var(--pico-color-zinc-350)}.pico-color-zinc-300{color:var(--pico-color-zinc-300)}.pico-color-zinc-250{color:var(--pico-color-zinc-250)}.pico-color-zinc-200{color:var(--pico-color-zinc-200)}.pico-color-zinc-150{color:var(--pico-color-zinc-150)}.pico-color-zinc-100{color:var(--pico-color-zinc-100)}.pico-color-zinc-50{color:var(--pico-color-zinc-50)}.pico-color-zinc{color:var(--pico-color-zinc)}.pico-color-slate-950{color:var(--pico-color-slate-950)}.pico-color-slate-900{color:var(--pico-color-slate-900)}.pico-color-slate-850{color:var(--pico-color-slate-850)}.pico-color-slate-800{color:var(--pico-color-slate-800)}.pico-color-slate-750{color:var(--pico-color-slate-750)}.pico-color-slate-700{color:var(--pico-color-slate-700)}.pico-color-slate-650{color:var(--pico-color-slate-650)}.pico-color-slate-600{color:var(--pico-color-slate-600)}.pico-color-slate-550{color:var(--pico-color-slate-550)}.pico-color-slate-500{color:var(--pico-color-slate-500)}.pico-color-slate-450{color:var(--pico-color-slate-450)}.pico-color-slate-400{color:var(--pico-color-slate-400)}.pico-color-slate-350{color:var(--pico-color-slate-350)}.pico-color-slate-300{color:var(--pico-color-slate-300)}.pico-color-slate-250{color:var(--pico-color-slate-250)}.pico-color-slate-200{color:var(--pico-color-slate-200)}.pico-color-slate-150{color:var(--pico-color-slate-150)}.pico-color-slate-100{color:var(--pico-color-slate-100)}.pico-color-slate-50{color:var(--pico-color-slate-50)}.pico-color-slate{color:var(--pico-color-slate)}.pico-background-red-950{background-color:var(--pico-color-red-950);color:var(--pico-color-light)}.pico-background-red-900{background-color:var(--pico-color-red-900);color:var(--pico-color-light)}.pico-background-red-850{background-color:var(--pico-color-red-850);color:var(--pico-color-light)}.pico-background-red-800{background-color:var(--pico-color-red-800);color:var(--pico-color-light)}.pico-background-red-750{background-color:var(--pico-color-red-750);color:var(--pico-color-light)}.pico-background-red-700{background-color:var(--pico-color-red-700);color:var(--pico-color-light)}.pico-background-red-650{background-color:var(--pico-color-red-650);color:var(--pico-color-light)}.pico-background-red-600{background-color:var(--pico-color-red-600);color:var(--pico-color-light)}.pico-background-red-550{background-color:var(--pico-color-red-550);color:var(--pico-color-light)}.pico-background-red-500{background-color:var(--pico-color-red-500);color:var(--pico-color-light)}.pico-background-red-450{background-color:var(--pico-color-red-450);color:var(--pico-color-light)}.pico-background-red-400{background-color:var(--pico-color-red-400);color:var(--pico-color-dark)}.pico-background-red-350{background-color:var(--pico-color-red-350);color:var(--pico-color-dark)}.pico-background-red-300{background-color:var(--pico-color-red-300);color:var(--pico-color-dark)}.pico-background-red-250{background-color:var(--pico-color-red-250);color:var(--pico-color-dark)}.pico-background-red-200{background-color:var(--pico-color-red-200);color:var(--pico-color-dark)}.pico-background-red-150{background-color:var(--pico-color-red-150);color:var(--pico-color-dark)}.pico-background-red-100{background-color:var(--pico-color-red-100);color:var(--pico-color-dark)}.pico-background-red-50{background-color:var(--pico-color-red-50);color:var(--pico-color-dark)}.pico-background-red{background-color:var(--pico-color-red);color:var(--pico-color-light)}.pico-background-pink-950{background-color:var(--pico-color-pink-950);color:var(--pico-color-light)}.pico-background-pink-900{background-color:var(--pico-color-pink-900);color:var(--pico-color-light)}.pico-background-pink-850{background-color:var(--pico-color-pink-850);color:var(--pico-color-light)}.pico-background-pink-800{background-color:var(--pico-color-pink-800);color:var(--pico-color-light)}.pico-background-pink-750{background-color:var(--pico-color-pink-750);color:var(--pico-color-light)}.pico-background-pink-700{background-color:var(--pico-color-pink-700);color:var(--pico-color-light)}.pico-background-pink-650{background-color:var(--pico-color-pink-650);color:var(--pico-color-light)}.pico-background-pink-600{background-color:var(--pico-color-pink-600);color:var(--pico-color-light)}.pico-background-pink-550{background-color:var(--pico-color-pink-550);color:var(--pico-color-light)}.pico-background-pink-500{background-color:var(--pico-color-pink-500);color:var(--pico-color-light)}.pico-background-pink-450{background-color:var(--pico-color-pink-450);color:var(--pico-color-light)}.pico-background-pink-400{background-color:var(--pico-color-pink-400);color:var(--pico-color-dark)}.pico-background-pink-350{background-color:var(--pico-color-pink-350);color:var(--pico-color-dark)}.pico-background-pink-300{background-color:var(--pico-color-pink-300);color:var(--pico-color-dark)}.pico-background-pink-250{background-color:var(--pico-color-pink-250);color:var(--pico-color-dark)}.pico-background-pink-200{background-color:var(--pico-color-pink-200);color:var(--pico-color-dark)}.pico-background-pink-150{background-color:var(--pico-color-pink-150);color:var(--pico-color-dark)}.pico-background-pink-100{background-color:var(--pico-color-pink-100);color:var(--pico-color-dark)}.pico-background-pink-50{background-color:var(--pico-color-pink-50);color:var(--pico-color-dark)}.pico-background-pink{background-color:var(--pico-color-pink);color:var(--pico-color-light)}.pico-background-fuchsia-950{background-color:var(--pico-color-fuchsia-950);color:var(--pico-color-light)}.pico-background-fuchsia-900{background-color:var(--pico-color-fuchsia-900);color:var(--pico-color-light)}.pico-background-fuchsia-850{background-color:var(--pico-color-fuchsia-850);color:var(--pico-color-light)}.pico-background-fuchsia-800{background-color:var(--pico-color-fuchsia-800);color:var(--pico-color-light)}.pico-background-fuchsia-750{background-color:var(--pico-color-fuchsia-750);color:var(--pico-color-light)}.pico-background-fuchsia-700{background-color:var(--pico-color-fuchsia-700);color:var(--pico-color-light)}.pico-background-fuchsia-650{background-color:var(--pico-color-fuchsia-650);color:var(--pico-color-light)}.pico-background-fuchsia-600{background-color:var(--pico-color-fuchsia-600);color:var(--pico-color-light)}.pico-background-fuchsia-550{background-color:var(--pico-color-fuchsia-550);color:var(--pico-color-light)}.pico-background-fuchsia-500{background-color:var(--pico-color-fuchsia-500);color:var(--pico-color-light)}.pico-background-fuchsia-450{background-color:var(--pico-color-fuchsia-450);color:var(--pico-color-light)}.pico-background-fuchsia-400{background-color:var(--pico-color-fuchsia-400);color:var(--pico-color-dark)}.pico-background-fuchsia-350{background-color:var(--pico-color-fuchsia-350);color:var(--pico-color-dark)}.pico-background-fuchsia-300{background-color:var(--pico-color-fuchsia-300);color:var(--pico-color-dark)}.pico-background-fuchsia-250{background-color:var(--pico-color-fuchsia-250);color:var(--pico-color-dark)}.pico-background-fuchsia-200{background-color:var(--pico-color-fuchsia-200);color:var(--pico-color-dark)}.pico-background-fuchsia-150{background-color:var(--pico-color-fuchsia-150);color:var(--pico-color-dark)}.pico-background-fuchsia-100{background-color:var(--pico-color-fuchsia-100);color:var(--pico-color-dark)}.pico-background-fuchsia-50{background-color:var(--pico-color-fuchsia-50);color:var(--pico-color-dark)}.pico-background-fuchsia{background-color:var(--pico-color-fuchsia);color:var(--pico-color-light)}.pico-background-purple-950{background-color:var(--pico-color-purple-950);color:var(--pico-color-light)}.pico-background-purple-900{background-color:var(--pico-color-purple-900);color:var(--pico-color-light)}.pico-background-purple-850{background-color:var(--pico-color-purple-850);color:var(--pico-color-light)}.pico-background-purple-800{background-color:var(--pico-color-purple-800);color:var(--pico-color-light)}.pico-background-purple-750{background-color:var(--pico-color-purple-750);color:var(--pico-color-light)}.pico-background-purple-700{background-color:var(--pico-color-purple-700);color:var(--pico-color-light)}.pico-background-purple-650{background-color:var(--pico-color-purple-650);color:var(--pico-color-light)}.pico-background-purple-600{background-color:var(--pico-color-purple-600);color:var(--pico-color-light)}.pico-background-purple-550{background-color:var(--pico-color-purple-550);color:var(--pico-color-light)}.pico-background-purple-500{background-color:var(--pico-color-purple-500);color:var(--pico-color-light)}.pico-background-purple-450{background-color:var(--pico-color-purple-450);color:var(--pico-color-dark)}.pico-background-purple-400{background-color:var(--pico-color-purple-400);color:var(--pico-color-dark)}.pico-background-purple-350{background-color:var(--pico-color-purple-350);color:var(--pico-color-dark)}.pico-background-purple-300{background-color:var(--pico-color-purple-300);color:var(--pico-color-dark)}.pico-background-purple-250{background-color:var(--pico-color-purple-250);color:var(--pico-color-dark)}.pico-background-purple-200{background-color:var(--pico-color-purple-200);color:var(--pico-color-dark)}.pico-background-purple-150{background-color:var(--pico-color-purple-150);color:var(--pico-color-dark)}.pico-background-purple-100{background-color:var(--pico-color-purple-100);color:var(--pico-color-dark)}.pico-background-purple-50{background-color:var(--pico-color-purple-50);color:var(--pico-color-dark)}.pico-background-purple{background-color:var(--pico-color-purple);color:var(--pico-color-light)}.pico-background-violet-950{background-color:var(--pico-color-violet-950);color:var(--pico-color-light)}.pico-background-violet-900{background-color:var(--pico-color-violet-900);color:var(--pico-color-light)}.pico-background-violet-850{background-color:var(--pico-color-violet-850);color:var(--pico-color-light)}.pico-background-violet-800{background-color:var(--pico-color-violet-800);color:var(--pico-color-light)}.pico-background-violet-750{background-color:var(--pico-color-violet-750);color:var(--pico-color-light)}.pico-background-violet-700{background-color:var(--pico-color-violet-700);color:var(--pico-color-light)}.pico-background-violet-650{background-color:var(--pico-color-violet-650);color:var(--pico-color-light)}.pico-background-violet-600{background-color:var(--pico-color-violet-600);color:var(--pico-color-light)}.pico-background-violet-550{background-color:var(--pico-color-violet-550);color:var(--pico-color-light)}.pico-background-violet-500{background-color:var(--pico-color-violet-500);color:var(--pico-color-light)}.pico-background-violet-450{background-color:var(--pico-color-violet-450);color:var(--pico-color-dark)}.pico-background-violet-400{background-color:var(--pico-color-violet-400);color:var(--pico-color-dark)}.pico-background-violet-350{background-color:var(--pico-color-violet-350);color:var(--pico-color-dark)}.pico-background-violet-300{background-color:var(--pico-color-violet-300);color:var(--pico-color-dark)}.pico-background-violet-250{background-color:var(--pico-color-violet-250);color:var(--pico-color-dark)}.pico-background-violet-200{background-color:var(--pico-color-violet-200);color:var(--pico-color-dark)}.pico-background-violet-150{background-color:var(--pico-color-violet-150);color:var(--pico-color-dark)}.pico-background-violet-100{background-color:var(--pico-color-violet-100);color:var(--pico-color-dark)}.pico-background-violet-50{background-color:var(--pico-color-violet-50);color:var(--pico-color-dark)}.pico-background-violet{background-color:var(--pico-color-violet);color:var(--pico-color-light)}.pico-background-indigo-950{background-color:var(--pico-color-indigo-950);color:var(--pico-color-light)}.pico-background-indigo-900{background-color:var(--pico-color-indigo-900);color:var(--pico-color-light)}.pico-background-indigo-850{background-color:var(--pico-color-indigo-850);color:var(--pico-color-light)}.pico-background-indigo-800{background-color:var(--pico-color-indigo-800);color:var(--pico-color-light)}.pico-background-indigo-750{background-color:var(--pico-color-indigo-750);color:var(--pico-color-light)}.pico-background-indigo-700{background-color:var(--pico-color-indigo-700);color:var(--pico-color-light)}.pico-background-indigo-650{background-color:var(--pico-color-indigo-650);color:var(--pico-color-light)}.pico-background-indigo-600{background-color:var(--pico-color-indigo-600);color:var(--pico-color-light)}.pico-background-indigo-550{background-color:var(--pico-color-indigo-550);color:var(--pico-color-light)}.pico-background-indigo-500{background-color:var(--pico-color-indigo-500);color:var(--pico-color-light)}.pico-background-indigo-450{background-color:var(--pico-color-indigo-450);color:var(--pico-color-dark)}.pico-background-indigo-400{background-color:var(--pico-color-indigo-400);color:var(--pico-color-dark)}.pico-background-indigo-350{background-color:var(--pico-color-indigo-350);color:var(--pico-color-dark)}.pico-background-indigo-300{background-color:var(--pico-color-indigo-300);color:var(--pico-color-dark)}.pico-background-indigo-250{background-color:var(--pico-color-indigo-250);color:var(--pico-color-dark)}.pico-background-indigo-200{background-color:var(--pico-color-indigo-200);color:var(--pico-color-dark)}.pico-background-indigo-150{background-color:var(--pico-color-indigo-150);color:var(--pico-color-dark)}.pico-background-indigo-100{background-color:var(--pico-color-indigo-100);color:var(--pico-color-dark)}.pico-background-indigo-50{background-color:var(--pico-color-indigo-50);color:var(--pico-color-dark)}.pico-background-indigo{background-color:var(--pico-color-indigo);color:var(--pico-color-light)}.pico-background-blue-950{background-color:var(--pico-color-blue-950);color:var(--pico-color-light)}.pico-background-blue-900{background-color:var(--pico-color-blue-900);color:var(--pico-color-light)}.pico-background-blue-850{background-color:var(--pico-color-blue-850);color:var(--pico-color-light)}.pico-background-blue-800{background-color:var(--pico-color-blue-800);color:var(--pico-color-light)}.pico-background-blue-750{background-color:var(--pico-color-blue-750);color:var(--pico-color-light)}.pico-background-blue-700{background-color:var(--pico-color-blue-700);color:var(--pico-color-light)}.pico-background-blue-650{background-color:var(--pico-color-blue-650);color:var(--pico-color-light)}.pico-background-blue-600{background-color:var(--pico-color-blue-600);color:var(--pico-color-light)}.pico-background-blue-550{background-color:var(--pico-color-blue-550);color:var(--pico-color-light)}.pico-background-blue-500{background-color:var(--pico-color-blue-500);color:var(--pico-color-light)}.pico-background-blue-450{background-color:var(--pico-color-blue-450);color:var(--pico-color-dark)}.pico-background-blue-400{background-color:var(--pico-color-blue-400);color:var(--pico-color-dark)}.pico-background-blue-350{background-color:var(--pico-color-blue-350);color:var(--pico-color-dark)}.pico-background-blue-300{background-color:var(--pico-color-blue-300);color:var(--pico-color-dark)}.pico-background-blue-250{background-color:var(--pico-color-blue-250);color:var(--pico-color-dark)}.pico-background-blue-200{background-color:var(--pico-color-blue-200);color:var(--pico-color-dark)}.pico-background-blue-150{background-color:var(--pico-color-blue-150);color:var(--pico-color-dark)}.pico-background-blue-100{background-color:var(--pico-color-blue-100);color:var(--pico-color-dark)}.pico-background-blue-50{background-color:var(--pico-color-blue-50);color:var(--pico-color-dark)}.pico-background-blue{background-color:var(--pico-color-blue);color:var(--pico-color-light)}.pico-background-azure-950{background-color:var(--pico-color-azure-950);color:var(--pico-color-light)}.pico-background-azure-900{background-color:var(--pico-color-azure-900);color:var(--pico-color-light)}.pico-background-azure-850{background-color:var(--pico-color-azure-850);color:var(--pico-color-light)}.pico-background-azure-800{background-color:var(--pico-color-azure-800);color:var(--pico-color-light)}.pico-background-azure-750{background-color:var(--pico-color-azure-750);color:var(--pico-color-light)}.pico-background-azure-700{background-color:var(--pico-color-azure-700);color:var(--pico-color-light)}.pico-background-azure-650{background-color:var(--pico-color-azure-650);color:var(--pico-color-light)}.pico-background-azure-600{background-color:var(--pico-color-azure-600);color:var(--pico-color-light)}.pico-background-azure-550{background-color:var(--pico-color-azure-550);color:var(--pico-color-light)}.pico-background-azure-500{background-color:var(--pico-color-azure-500);color:var(--pico-color-light)}.pico-background-azure-450{background-color:var(--pico-color-azure-450);color:var(--pico-color-light)}.pico-background-azure-400{background-color:var(--pico-color-azure-400);color:var(--pico-color-light)}.pico-background-azure-350{background-color:var(--pico-color-azure-350);color:var(--pico-color-dark)}.pico-background-azure-300{background-color:var(--pico-color-azure-300);color:var(--pico-color-dark)}.pico-background-azure-250{background-color:var(--pico-color-azure-250);color:var(--pico-color-dark)}.pico-background-azure-200{background-color:var(--pico-color-azure-200);color:var(--pico-color-dark)}.pico-background-azure-150{background-color:var(--pico-color-azure-150);color:var(--pico-color-dark)}.pico-background-azure-100{background-color:var(--pico-color-azure-100);color:var(--pico-color-dark)}.pico-background-azure-50{background-color:var(--pico-color-azure-50);color:var(--pico-color-dark)}.pico-background-azure{background-color:var(--pico-color-azure);color:var(--pico-color-light)}.pico-background-cyan-950{background-color:var(--pico-color-cyan-950);color:var(--pico-color-light)}.pico-background-cyan-900{background-color:var(--pico-color-cyan-900);color:var(--pico-color-light)}.pico-background-cyan-850{background-color:var(--pico-color-cyan-850);color:var(--pico-color-light)}.pico-background-cyan-800{background-color:var(--pico-color-cyan-800);color:var(--pico-color-light)}.pico-background-cyan-750{background-color:var(--pico-color-cyan-750);color:var(--pico-color-light)}.pico-background-cyan-700{background-color:var(--pico-color-cyan-700);color:var(--pico-color-light)}.pico-background-cyan-650{background-color:var(--pico-color-cyan-650);color:var(--pico-color-light)}.pico-background-cyan-600{background-color:var(--pico-color-cyan-600);color:var(--pico-color-light)}.pico-background-cyan-550{background-color:var(--pico-color-cyan-550);color:var(--pico-color-light)}.pico-background-cyan-500{background-color:var(--pico-color-cyan-500);color:var(--pico-color-light)}.pico-background-cyan-450{background-color:var(--pico-color-cyan-450);color:var(--pico-color-light)}.pico-background-cyan-400{background-color:var(--pico-color-cyan-400);color:var(--pico-color-light)}.pico-background-cyan-350{background-color:var(--pico-color-cyan-350);color:var(--pico-color-light)}.pico-background-cyan-300{background-color:var(--pico-color-cyan-300);color:var(--pico-color-dark)}.pico-background-cyan-250{background-color:var(--pico-color-cyan-250);color:var(--pico-color-dark)}.pico-background-cyan-200{background-color:var(--pico-color-cyan-200);color:var(--pico-color-dark)}.pico-background-cyan-150{background-color:var(--pico-color-cyan-150);color:var(--pico-color-dark)}.pico-background-cyan-100{background-color:var(--pico-color-cyan-100);color:var(--pico-color-dark)}.pico-background-cyan-50{background-color:var(--pico-color-cyan-50);color:var(--pico-color-dark)}.pico-background-cyan{background-color:var(--pico-color-cyan);color:var(--pico-color-light)}.pico-background-jade-950{background-color:var(--pico-color-jade-950);color:var(--pico-color-light)}.pico-background-jade-900{background-color:var(--pico-color-jade-900);color:var(--pico-color-light)}.pico-background-jade-850{background-color:var(--pico-color-jade-850);color:var(--pico-color-light)}.pico-background-jade-800{background-color:var(--pico-color-jade-800);color:var(--pico-color-light)}.pico-background-jade-750{background-color:var(--pico-color-jade-750);color:var(--pico-color-light)}.pico-background-jade-700{background-color:var(--pico-color-jade-700);color:var(--pico-color-light)}.pico-background-jade-650{background-color:var(--pico-color-jade-650);color:var(--pico-color-light)}.pico-background-jade-600{background-color:var(--pico-color-jade-600);color:var(--pico-color-light)}.pico-background-jade-550{background-color:var(--pico-color-jade-550);color:var(--pico-color-light)}.pico-background-jade-500{background-color:var(--pico-color-jade-500);color:var(--pico-color-light)}.pico-background-jade-450{background-color:var(--pico-color-jade-450);color:var(--pico-color-light)}.pico-background-jade-400{background-color:var(--pico-color-jade-400);color:var(--pico-color-light)}.pico-background-jade-350{background-color:var(--pico-color-jade-350);color:var(--pico-color-light)}.pico-background-jade-300{background-color:var(--pico-color-jade-300);color:var(--pico-color-dark)}.pico-background-jade-250{background-color:var(--pico-color-jade-250);color:var(--pico-color-dark)}.pico-background-jade-200{background-color:var(--pico-color-jade-200);color:var(--pico-color-dark)}.pico-background-jade-150{background-color:var(--pico-color-jade-150);color:var(--pico-color-dark)}.pico-background-jade-100{background-color:var(--pico-color-jade-100);color:var(--pico-color-dark)}.pico-background-jade-50{background-color:var(--pico-color-jade-50);color:var(--pico-color-dark)}.pico-background-jade{background-color:var(--pico-color-jade);color:var(--pico-color-light)}.pico-background-green-950{background-color:var(--pico-color-green-950);color:var(--pico-color-light)}.pico-background-green-900{background-color:var(--pico-color-green-900);color:var(--pico-color-light)}.pico-background-green-850{background-color:var(--pico-color-green-850);color:var(--pico-color-light)}.pico-background-green-800{background-color:var(--pico-color-green-800);color:var(--pico-color-light)}.pico-background-green-750{background-color:var(--pico-color-green-750);color:var(--pico-color-light)}.pico-background-green-700{background-color:var(--pico-color-green-700);color:var(--pico-color-light)}.pico-background-green-650{background-color:var(--pico-color-green-650);color:var(--pico-color-light)}.pico-background-green-600{background-color:var(--pico-color-green-600);color:var(--pico-color-light)}.pico-background-green-550{background-color:var(--pico-color-green-550);color:var(--pico-color-light)}.pico-background-green-500{background-color:var(--pico-color-green-500);color:var(--pico-color-light)}.pico-background-green-450{background-color:var(--pico-color-green-450);color:var(--pico-color-light)}.pico-background-green-400{background-color:var(--pico-color-green-400);color:var(--pico-color-light)}.pico-background-green-350{background-color:var(--pico-color-green-350);color:var(--pico-color-dark)}.pico-background-green-300{background-color:var(--pico-color-green-300);color:var(--pico-color-dark)}.pico-background-green-250{background-color:var(--pico-color-green-250);color:var(--pico-color-dark)}.pico-background-green-200{background-color:var(--pico-color-green-200);color:var(--pico-color-dark)}.pico-background-green-150{background-color:var(--pico-color-green-150);color:var(--pico-color-dark)}.pico-background-green-100{background-color:var(--pico-color-green-100);color:var(--pico-color-dark)}.pico-background-green-50{background-color:var(--pico-color-green-50);color:var(--pico-color-dark)}.pico-background-green{background-color:var(--pico-color-green);color:var(--pico-color-light)}.pico-background-lime-950{background-color:var(--pico-color-lime-950);color:var(--pico-color-light)}.pico-background-lime-900{background-color:var(--pico-color-lime-900);color:var(--pico-color-light)}.pico-background-lime-850{background-color:var(--pico-color-lime-850);color:var(--pico-color-light)}.pico-background-lime-800{background-color:var(--pico-color-lime-800);color:var(--pico-color-light)}.pico-background-lime-750{background-color:var(--pico-color-lime-750);color:var(--pico-color-light)}.pico-background-lime-700{background-color:var(--pico-color-lime-700);color:var(--pico-color-light)}.pico-background-lime-650{background-color:var(--pico-color-lime-650);color:var(--pico-color-light)}.pico-background-lime-600{background-color:var(--pico-color-lime-600);color:var(--pico-color-light)}.pico-background-lime-550{background-color:var(--pico-color-lime-550);color:var(--pico-color-light)}.pico-background-lime-500{background-color:var(--pico-color-lime-500);color:var(--pico-color-light)}.pico-background-lime-450{background-color:var(--pico-color-lime-450);color:var(--pico-color-light)}.pico-background-lime-400{background-color:var(--pico-color-lime-400);color:var(--pico-color-light)}.pico-background-lime-350{background-color:var(--pico-color-lime-350);color:var(--pico-color-dark)}.pico-background-lime-300{background-color:var(--pico-color-lime-300);color:var(--pico-color-dark)}.pico-background-lime-250{background-color:var(--pico-color-lime-250);color:var(--pico-color-dark)}.pico-background-lime-200{background-color:var(--pico-color-lime-200);color:var(--pico-color-dark)}.pico-background-lime-150{background-color:var(--pico-color-lime-150);color:var(--pico-color-dark)}.pico-background-lime-100{background-color:var(--pico-color-lime-100);color:var(--pico-color-dark)}.pico-background-lime-50{background-color:var(--pico-color-lime-50);color:var(--pico-color-dark)}.pico-background-lime{background-color:var(--pico-color-lime);color:var(--pico-color-dark)}.pico-background-yellow-950{background-color:var(--pico-color-yellow-950);color:var(--pico-color-light)}.pico-background-yellow-900{background-color:var(--pico-color-yellow-900);color:var(--pico-color-light)}.pico-background-yellow-850{background-color:var(--pico-color-yellow-850);color:var(--pico-color-light)}.pico-background-yellow-800{background-color:var(--pico-color-yellow-800);color:var(--pico-color-light)}.pico-background-yellow-750{background-color:var(--pico-color-yellow-750);color:var(--pico-color-light)}.pico-background-yellow-700{background-color:var(--pico-color-yellow-700);color:var(--pico-color-light)}.pico-background-yellow-650{background-color:var(--pico-color-yellow-650);color:var(--pico-color-light)}.pico-background-yellow-600{background-color:var(--pico-color-yellow-600);color:var(--pico-color-light)}.pico-background-yellow-550{background-color:var(--pico-color-yellow-550);color:var(--pico-color-light)}.pico-background-yellow-500{background-color:var(--pico-color-yellow-500);color:var(--pico-color-light)}.pico-background-yellow-450{background-color:var(--pico-color-yellow-450);color:var(--pico-color-light)}.pico-background-yellow-400{background-color:var(--pico-color-yellow-400);color:var(--pico-color-dark)}.pico-background-yellow-350{background-color:var(--pico-color-yellow-350);color:var(--pico-color-dark)}.pico-background-yellow-300{background-color:var(--pico-color-yellow-300);color:var(--pico-color-dark)}.pico-background-yellow-250{background-color:var(--pico-color-yellow-250);color:var(--pico-color-dark)}.pico-background-yellow-200{background-color:var(--pico-color-yellow-200);color:var(--pico-color-dark)}.pico-background-yellow-150{background-color:var(--pico-color-yellow-150);color:var(--pico-color-dark)}.pico-background-yellow-100{background-color:var(--pico-color-yellow-100);color:var(--pico-color-dark)}.pico-background-yellow-50{background-color:var(--pico-color-yellow-50);color:var(--pico-color-dark)}.pico-background-yellow{background-color:var(--pico-color-yellow);color:var(--pico-color-dark)}.pico-background-amber-950{background-color:var(--pico-color-amber-950);color:var(--pico-color-light)}.pico-background-amber-900{background-color:var(--pico-color-amber-900);color:var(--pico-color-light)}.pico-background-amber-850{background-color:var(--pico-color-amber-850);color:var(--pico-color-light)}.pico-background-amber-800{background-color:var(--pico-color-amber-800);color:var(--pico-color-light)}.pico-background-amber-750{background-color:var(--pico-color-amber-750);color:var(--pico-color-light)}.pico-background-amber-700{background-color:var(--pico-color-amber-700);color:var(--pico-color-light)}.pico-background-amber-650{background-color:var(--pico-color-amber-650);color:var(--pico-color-light)}.pico-background-amber-600{background-color:var(--pico-color-amber-600);color:var(--pico-color-light)}.pico-background-amber-550{background-color:var(--pico-color-amber-550);color:var(--pico-color-light)}.pico-background-amber-500{background-color:var(--pico-color-amber-500);color:var(--pico-color-light)}.pico-background-amber-450{background-color:var(--pico-color-amber-450);color:var(--pico-color-light)}.pico-background-amber-400{background-color:var(--pico-color-amber-400);color:var(--pico-color-dark)}.pico-background-amber-350{background-color:var(--pico-color-amber-350);color:var(--pico-color-dark)}.pico-background-amber-300{background-color:var(--pico-color-amber-300);color:var(--pico-color-dark)}.pico-background-amber-250{background-color:var(--pico-color-amber-250);color:var(--pico-color-dark)}.pico-background-amber-200{background-color:var(--pico-color-amber-200);color:var(--pico-color-dark)}.pico-background-amber-150{background-color:var(--pico-color-amber-150);color:var(--pico-color-dark)}.pico-background-amber-100{background-color:var(--pico-color-amber-100);color:var(--pico-color-dark)}.pico-background-amber-50{background-color:var(--pico-color-amber-50);color:var(--pico-color-dark)}.pico-background-amber{background-color:var(--pico-color-amber);color:var(--pico-color-dark)}.pico-background-pumpkin-950{background-color:var(--pico-color-pumpkin-950);color:var(--pico-color-light)}.pico-background-pumpkin-900{background-color:var(--pico-color-pumpkin-900);color:var(--pico-color-light)}.pico-background-pumpkin-850{background-color:var(--pico-color-pumpkin-850);color:var(--pico-color-light)}.pico-background-pumpkin-800{background-color:var(--pico-color-pumpkin-800);color:var(--pico-color-light)}.pico-background-pumpkin-750{background-color:var(--pico-color-pumpkin-750);color:var(--pico-color-light)}.pico-background-pumpkin-700{background-color:var(--pico-color-pumpkin-700);color:var(--pico-color-light)}.pico-background-pumpkin-650{background-color:var(--pico-color-pumpkin-650);color:var(--pico-color-light)}.pico-background-pumpkin-600{background-color:var(--pico-color-pumpkin-600);color:var(--pico-color-light)}.pico-background-pumpkin-550{background-color:var(--pico-color-pumpkin-550);color:var(--pico-color-light)}.pico-background-pumpkin-500{background-color:var(--pico-color-pumpkin-500);color:var(--pico-color-light)}.pico-background-pumpkin-450{background-color:var(--pico-color-pumpkin-450);color:var(--pico-color-light)}.pico-background-pumpkin-400{background-color:var(--pico-color-pumpkin-400);color:var(--pico-color-dark)}.pico-background-pumpkin-350{background-color:var(--pico-color-pumpkin-350);color:var(--pico-color-dark)}.pico-background-pumpkin-300{background-color:var(--pico-color-pumpkin-300);color:var(--pico-color-dark)}.pico-background-pumpkin-250{background-color:var(--pico-color-pumpkin-250);color:var(--pico-color-dark)}.pico-background-pumpkin-200{background-color:var(--pico-color-pumpkin-200);color:var(--pico-color-dark)}.pico-background-pumpkin-150{background-color:var(--pico-color-pumpkin-150);color:var(--pico-color-dark)}.pico-background-pumpkin-100{background-color:var(--pico-color-pumpkin-100);color:var(--pico-color-dark)}.pico-background-pumpkin-50{background-color:var(--pico-color-pumpkin-50);color:var(--pico-color-dark)}.pico-background-pumpkin{background-color:var(--pico-color-pumpkin);color:var(--pico-color-dark)}.pico-background-orange-950{background-color:var(--pico-color-orange-950);color:var(--pico-color-light)}.pico-background-orange-900{background-color:var(--pico-color-orange-900);color:var(--pico-color-light)}.pico-background-orange-850{background-color:var(--pico-color-orange-850);color:var(--pico-color-light)}.pico-background-orange-800{background-color:var(--pico-color-orange-800);color:var(--pico-color-light)}.pico-background-orange-750{background-color:var(--pico-color-orange-750);color:var(--pico-color-light)}.pico-background-orange-700{background-color:var(--pico-color-orange-700);color:var(--pico-color-light)}.pico-background-orange-650{background-color:var(--pico-color-orange-650);color:var(--pico-color-light)}.pico-background-orange-600{background-color:var(--pico-color-orange-600);color:var(--pico-color-light)}.pico-background-orange-550{background-color:var(--pico-color-orange-550);color:var(--pico-color-light)}.pico-background-orange-500{background-color:var(--pico-color-orange-500);color:var(--pico-color-light)}.pico-background-orange-450{background-color:var(--pico-color-orange-450);color:var(--pico-color-light)}.pico-background-orange-400{background-color:var(--pico-color-orange-400);color:var(--pico-color-dark)}.pico-background-orange-350{background-color:var(--pico-color-orange-350);color:var(--pico-color-dark)}.pico-background-orange-300{background-color:var(--pico-color-orange-300);color:var(--pico-color-dark)}.pico-background-orange-250{background-color:var(--pico-color-orange-250);color:var(--pico-color-dark)}.pico-background-orange-200{background-color:var(--pico-color-orange-200);color:var(--pico-color-dark)}.pico-background-orange-150{background-color:var(--pico-color-orange-150);color:var(--pico-color-dark)}.pico-background-orange-100{background-color:var(--pico-color-orange-100);color:var(--pico-color-dark)}.pico-background-orange-50{background-color:var(--pico-color-orange-50);color:var(--pico-color-dark)}.pico-background-orange{background-color:var(--pico-color-orange);color:var(--pico-color-light)}.pico-background-sand-950{background-color:var(--pico-color-sand-950);color:var(--pico-color-light)}.pico-background-sand-900{background-color:var(--pico-color-sand-900);color:var(--pico-color-light)}.pico-background-sand-850{background-color:var(--pico-color-sand-850);color:var(--pico-color-light)}.pico-background-sand-800{background-color:var(--pico-color-sand-800);color:var(--pico-color-light)}.pico-background-sand-750{background-color:var(--pico-color-sand-750);color:var(--pico-color-light)}.pico-background-sand-700{background-color:var(--pico-color-sand-700);color:var(--pico-color-light)}.pico-background-sand-650{background-color:var(--pico-color-sand-650);color:var(--pico-color-light)}.pico-background-sand-600{background-color:var(--pico-color-sand-600);color:var(--pico-color-light)}.pico-background-sand-550{background-color:var(--pico-color-sand-550);color:var(--pico-color-light)}.pico-background-sand-500{background-color:var(--pico-color-sand-500);color:var(--pico-color-light)}.pico-background-sand-450{background-color:var(--pico-color-sand-450);color:var(--pico-color-dark)}.pico-background-sand-400{background-color:var(--pico-color-sand-400);color:var(--pico-color-dark)}.pico-background-sand-350{background-color:var(--pico-color-sand-350);color:var(--pico-color-dark)}.pico-background-sand-300{background-color:var(--pico-color-sand-300);color:var(--pico-color-dark)}.pico-background-sand-250{background-color:var(--pico-color-sand-250);color:var(--pico-color-dark)}.pico-background-sand-200{background-color:var(--pico-color-sand-200);color:var(--pico-color-dark)}.pico-background-sand-150{background-color:var(--pico-color-sand-150);color:var(--pico-color-dark)}.pico-background-sand-100{background-color:var(--pico-color-sand-100);color:var(--pico-color-dark)}.pico-background-sand-50{background-color:var(--pico-color-sand-50);color:var(--pico-color-dark)}.pico-background-sand{background-color:var(--pico-color-sand);color:var(--pico-color-dark)}.pico-background-grey-950{background-color:var(--pico-color-grey-950);color:var(--pico-color-light)}.pico-background-grey-900{background-color:var(--pico-color-grey-900);color:var(--pico-color-light)}.pico-background-grey-850{background-color:var(--pico-color-grey-850);color:var(--pico-color-light)}.pico-background-grey-800{background-color:var(--pico-color-grey-800);color:var(--pico-color-light)}.pico-background-grey-750{background-color:var(--pico-color-grey-750);color:var(--pico-color-light)}.pico-background-grey-700{background-color:var(--pico-color-grey-700);color:var(--pico-color-light)}.pico-background-grey-650{background-color:var(--pico-color-grey-650);color:var(--pico-color-light)}.pico-background-grey-600{background-color:var(--pico-color-grey-600);color:var(--pico-color-light)}.pico-background-grey-550{background-color:var(--pico-color-grey-550);color:var(--pico-color-light)}.pico-background-grey-500{background-color:var(--pico-color-grey-500);color:var(--pico-color-light)}.pico-background-grey-450{background-color:var(--pico-color-grey-450);color:var(--pico-color-dark)}.pico-background-grey-400{background-color:var(--pico-color-grey-400);color:var(--pico-color-dark)}.pico-background-grey-350{background-color:var(--pico-color-grey-350);color:var(--pico-color-dark)}.pico-background-grey-300{background-color:var(--pico-color-grey-300);color:var(--pico-color-dark)}.pico-background-grey-250{background-color:var(--pico-color-grey-250);color:var(--pico-color-dark)}.pico-background-grey-200{background-color:var(--pico-color-grey-200);color:var(--pico-color-dark)}.pico-background-grey-150{background-color:var(--pico-color-grey-150);color:var(--pico-color-dark)}.pico-background-grey-100{background-color:var(--pico-color-grey-100);color:var(--pico-color-dark)}.pico-background-grey-50{background-color:var(--pico-color-grey-50);color:var(--pico-color-dark)}.pico-background-grey{background-color:var(--pico-color-grey);color:var(--pico-color-dark)}.pico-background-zinc-950{background-color:var(--pico-color-zinc-950);color:var(--pico-color-light)}.pico-background-zinc-900{background-color:var(--pico-color-zinc-900);color:var(--pico-color-light)}.pico-background-zinc-850{background-color:var(--pico-color-zinc-850);color:var(--pico-color-light)}.pico-background-zinc-800{background-color:var(--pico-color-zinc-800);color:var(--pico-color-light)}.pico-background-zinc-750{background-color:var(--pico-color-zinc-750);color:var(--pico-color-light)}.pico-background-zinc-700{background-color:var(--pico-color-zinc-700);color:var(--pico-color-light)}.pico-background-zinc-650{background-color:var(--pico-color-zinc-650);color:var(--pico-color-light)}.pico-background-zinc-600{background-color:var(--pico-color-zinc-600);color:var(--pico-color-light)}.pico-background-zinc-550{background-color:var(--pico-color-zinc-550);color:var(--pico-color-light)}.pico-background-zinc-500{background-color:var(--pico-color-zinc-500);color:var(--pico-color-light)}.pico-background-zinc-450{background-color:var(--pico-color-zinc-450);color:var(--pico-color-dark)}.pico-background-zinc-400{background-color:var(--pico-color-zinc-400);color:var(--pico-color-dark)}.pico-background-zinc-350{background-color:var(--pico-color-zinc-350);color:var(--pico-color-dark)}.pico-background-zinc-300{background-color:var(--pico-color-zinc-300);color:var(--pico-color-dark)}.pico-background-zinc-250{background-color:var(--pico-color-zinc-250);color:var(--pico-color-dark)}.pico-background-zinc-200{background-color:var(--pico-color-zinc-200);color:var(--pico-color-dark)}.pico-background-zinc-150{background-color:var(--pico-color-zinc-150);color:var(--pico-color-dark)}.pico-background-zinc-100{background-color:var(--pico-color-zinc-100);color:var(--pico-color-dark)}.pico-background-zinc-50{background-color:var(--pico-color-zinc-50);color:var(--pico-color-dark)}.pico-background-zinc{background-color:var(--pico-color-zinc);color:var(--pico-color-light)}.pico-background-slate-950{background-color:var(--pico-color-slate-950);color:var(--pico-color-light)}.pico-background-slate-900{background-color:var(--pico-color-slate-900);color:var(--pico-color-light)}.pico-background-slate-850{background-color:var(--pico-color-slate-850);color:var(--pico-color-light)}.pico-background-slate-800{background-color:var(--pico-color-slate-800);color:var(--pico-color-light)}.pico-background-slate-750{background-color:var(--pico-color-slate-750);color:var(--pico-color-light)}.pico-background-slate-700{background-color:var(--pico-color-slate-700);color:var(--pico-color-light)}.pico-background-slate-650{background-color:var(--pico-color-slate-650);color:var(--pico-color-light)}.pico-background-slate-600{background-color:var(--pico-color-slate-600);color:var(--pico-color-light)}.pico-background-slate-550{background-color:var(--pico-color-slate-550);color:var(--pico-color-light)}.pico-background-slate-500{background-color:var(--pico-color-slate-500);color:var(--pico-color-light)}.pico-background-slate-450{background-color:var(--pico-color-slate-450);color:var(--pico-color-dark)}.pico-background-slate-400{background-color:var(--pico-color-slate-400);color:var(--pico-color-dark)}.pico-background-slate-350{background-color:var(--pico-color-slate-350);color:var(--pico-color-dark)}.pico-background-slate-300{background-color:var(--pico-color-slate-300);color:var(--pico-color-dark)}.pico-background-slate-250{background-color:var(--pico-color-slate-250);color:var(--pico-color-dark)}.pico-background-slate-200{background-color:var(--pico-color-slate-200);color:var(--pico-color-dark)}.pico-background-slate-150{background-color:var(--pico-color-slate-150);color:var(--pico-color-dark)}.pico-background-slate-100{background-color:var(--pico-color-slate-100);color:var(--pico-color-dark)}.pico-background-slate-50{background-color:var(--pico-color-slate-50);color:var(--pico-color-dark)}.pico-background-slate{background-color:var(--pico-color-slate);color:var(--pico-color-light)} \ No newline at end of file diff --git a/resources/public/css/pico.min.css b/resources/public/css/pico.min.css new file mode 100644 index 0000000..5928ed7 --- /dev/null +++ b/resources/public/css/pico.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";/*! + * 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/resources/public/img/glider.png b/resources/public/img/glider.png new file mode 100644 index 0000000..8330165 Binary files /dev/null and b/resources/public/img/glider.png differ diff --git a/resources/public/js/htmx-1.9.11-ext-multi-swap.min.js b/resources/public/js/htmx-1.9.11-ext-multi-swap.min.js new file mode 100644 index 0000000..f38f5b0 --- /dev/null +++ b/resources/public/js/htmx-1.9.11-ext-multi-swap.min.js @@ -0,0 +1,45 @@ +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension('multi-swap', { + init: function (apiRef) { + api = apiRef; + }, + isInlineSwap: function (swapStyle) { + return swapStyle.indexOf('multi:') === 0; + }, + handleSwap: function (swapStyle, target, fragment, settleInfo) { + if (swapStyle.indexOf('multi:') === 0) { + var selectorToSwapStyle = {}; + var elements = swapStyle.replace(/^multi\s*:\s*/, '').split(/\s*,\s*/); + + elements.map(function (element) { + var split = element.split(/\s*:\s*/); + var elementSelector = split[0]; + var elementSwapStyle = typeof (split[1]) !== "undefined" ? split[1] : "innerHTML"; + + if (elementSelector.charAt(0) !== '#') { + console.error("HTMX multi-swap: unsupported selector '" + elementSelector + "'. Only ID selectors starting with '#' are supported."); + return; + } + + selectorToSwapStyle[elementSelector] = elementSwapStyle; + }); + + for (var selector in selectorToSwapStyle) { + var swapStyle = selectorToSwapStyle[selector]; + var elementToSwap = fragment.querySelector(selector); + if (elementToSwap) { + api.oobSwap(swapStyle, elementToSwap, settleInfo); + } else { + console.warn("HTMX multi-swap: selector '" + selector + "' not found in source content."); + } + } + + return true; + } + } + }); +})(); \ No newline at end of file diff --git a/resources/public/js/htmx-1.9.11-ext-ws.min.js b/resources/public/js/htmx-1.9.11-ext-ws.min.js new file mode 100644 index 0000000..c1e2962 --- /dev/null +++ b/resources/public/js/htmx-1.9.11-ext-ws.min.js @@ -0,0 +1,476 @@ +/* +WebSockets Extension +============================ +This extension adds support for WebSockets to htmx. See /www/extensions/ws.md for usage instructions. +*/ + +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension("ws", { + + /** + * init is called once, when this extension is first registered. + * @param {import("../htmx").HtmxInternalApi} apiRef + */ + init: function (apiRef) { + + // Store reference to internal API + api = apiRef; + + // Default function for creating new EventSource objects + if (!htmx.createWebSocket) { + htmx.createWebSocket = createWebSocket; + } + + // Default setting for reconnect delay + if (!htmx.config.wsReconnectDelay) { + htmx.config.wsReconnectDelay = "full-jitter"; + } + }, + + /** + * onEvent handles all events passed to this extension. + * + * @param {string} name + * @param {Event} evt + */ + onEvent: function (name, evt) { + var parent = evt.target || evt.detail.elt; + + switch (name) { + + // Try to close the socket when elements are removed + case "htmx:beforeCleanupElement": + + var internalData = api.getInternalData(parent) + + if (internalData.webSocket) { + internalData.webSocket.close(); + } + return; + + // Try to create websockets when elements are processed + case "htmx:beforeProcessNode": + forEach(queryAttributeOnThisOrChildren(parent, "ws-connect"), function (child) { + ensureWebSocket(child) + }); + forEach(queryAttributeOnThisOrChildren(parent, "ws-send"), function (child) { + ensureWebSocketSend(child) + }); + } + } + }); + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + function getLegacyWebsocketURL(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-ws"); + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + return value[1]; + } + } + } + } + + /** + * ensureWebSocket creates a new WebSocket on the designated element, using + * the element's "ws-connect" attribute. + * @param {HTMLElement} socketElt + * @returns + */ + function ensureWebSocket(socketElt) { + + // If the element containing the WebSocket connection no longer exists, then + // do not connect/reconnect the WebSocket. + if (!api.bodyContains(socketElt)) { + return; + } + + // Get the source straight from the element's value + var wssSource = api.getAttributeValue(socketElt, "ws-connect") + + if (wssSource == null || wssSource === "") { + var legacySource = getLegacyWebsocketURL(socketElt); + if (legacySource == null) { + return; + } else { + wssSource = legacySource; + } + } + + // Guarantee that the wssSource value is a fully qualified URL + if (wssSource.indexOf("/") === 0) { + var base_part = location.hostname + (location.port ? ':' + location.port : ''); + if (location.protocol === 'https:') { + wssSource = "wss://" + base_part + wssSource; + } else if (location.protocol === 'http:') { + wssSource = "ws://" + base_part + wssSource; + } + } + + var socketWrapper = createWebsocketWrapper(socketElt, function () { + return htmx.createWebSocket(wssSource) + }); + + socketWrapper.addEventListener('message', function (event) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + var response = event.data; + if (!api.triggerEvent(socketElt, "htmx:wsBeforeMessage", { + message: response, + socketWrapper: socketWrapper.publicInterface + })) { + return; + } + + api.withExtensions(socketElt, function (extension) { + response = extension.transformResponse(response, null, socketElt); + }); + + var settleInfo = api.makeSettleInfo(socketElt); + var fragment = api.makeFragment(response); + + if (fragment.children.length) { + var children = Array.from(fragment.children); + for (var i = 0; i < children.length; i++) { + api.oobSwap(api.getAttributeValue(children[i], "hx-swap-oob") || "true", children[i], settleInfo); + } + } + + api.settleImmediately(settleInfo.tasks); + api.triggerEvent(socketElt, "htmx:wsAfterMessage", { message: response, socketWrapper: socketWrapper.publicInterface }) + }); + + // Put the WebSocket into the HTML Element's custom data. + api.getInternalData(socketElt).webSocket = socketWrapper; + } + + /** + * @typedef {Object} WebSocketWrapper + * @property {WebSocket} socket + * @property {Array<{message: string, sendElt: Element}>} messageQueue + * @property {number} retryCount + * @property {(message: string, sendElt: Element) => void} sendImmediately sendImmediately sends message regardless of websocket connection state + * @property {(message: string, sendElt: Element) => void} send + * @property {(event: string, handler: Function) => void} addEventListener + * @property {() => void} handleQueuedMessages + * @property {() => void} init + * @property {() => void} close + */ + /** + * + * @param socketElt + * @param socketFunc + * @returns {WebSocketWrapper} + */ + function createWebsocketWrapper(socketElt, socketFunc) { + var wrapper = { + socket: null, + messageQueue: [], + retryCount: 0, + + /** @type {Object} */ + events: {}, + + addEventListener: function (event, handler) { + if (this.socket) { + this.socket.addEventListener(event, handler); + } + + if (!this.events[event]) { + this.events[event] = []; + } + + this.events[event].push(handler); + }, + + sendImmediately: function (message, sendElt) { + if (!this.socket) { + api.triggerErrorEvent() + } + if (!sendElt || api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { + message: message, + socketWrapper: this.publicInterface + })) { + this.socket.send(message); + sendElt && api.triggerEvent(sendElt, 'htmx:wsAfterSend', { + message: message, + socketWrapper: this.publicInterface + }) + } + }, + + send: function (message, sendElt) { + if (this.socket.readyState !== this.socket.OPEN) { + this.messageQueue.push({ message: message, sendElt: sendElt }); + } else { + this.sendImmediately(message, sendElt); + } + }, + + handleQueuedMessages: function () { + while (this.messageQueue.length > 0) { + var queuedItem = this.messageQueue[0] + if (this.socket.readyState === this.socket.OPEN) { + this.sendImmediately(queuedItem.message, queuedItem.sendElt); + this.messageQueue.shift(); + } else { + break; + } + } + }, + + init: function () { + if (this.socket && this.socket.readyState === this.socket.OPEN) { + // Close discarded socket + this.socket.close() + } + + // Create a new WebSocket and event handlers + /** @type {WebSocket} */ + var socket = socketFunc(); + + // The event.type detail is added for interface conformance with the + // other two lifecycle events (open and close) so a single handler method + // can handle them polymorphically, if required. + api.triggerEvent(socketElt, "htmx:wsConnecting", { event: { type: 'connecting' } }); + + this.socket = socket; + + socket.onopen = function (e) { + wrapper.retryCount = 0; + api.triggerEvent(socketElt, "htmx:wsOpen", { event: e, socketWrapper: wrapper.publicInterface }); + wrapper.handleQueuedMessages(); + } + + socket.onclose = function (e) { + // If socket should not be connected, stop further attempts to establish connection + // If Abnormal Closure/Service Restart/Try Again Later, then set a timer to reconnect after a pause. + if (!maybeCloseWebSocketSource(socketElt) && [1006, 1012, 1013].indexOf(e.code) >= 0) { + var delay = getWebSocketReconnectDelay(wrapper.retryCount); + setTimeout(function () { + wrapper.retryCount += 1; + wrapper.init(); + }, delay); + } + + // Notify client code that connection has been closed. Client code can inspect `event` field + // to determine whether closure has been valid or abnormal + api.triggerEvent(socketElt, "htmx:wsClose", { event: e, socketWrapper: wrapper.publicInterface }) + }; + + socket.onerror = function (e) { + api.triggerErrorEvent(socketElt, "htmx:wsError", { error: e, socketWrapper: wrapper }); + maybeCloseWebSocketSource(socketElt); + }; + + var events = this.events; + Object.keys(events).forEach(function (k) { + events[k].forEach(function (e) { + socket.addEventListener(k, e); + }) + }); + }, + + close: function () { + this.socket.close() + } + } + + wrapper.init(); + + wrapper.publicInterface = { + send: wrapper.send.bind(wrapper), + sendImmediately: wrapper.sendImmediately.bind(wrapper), + queue: wrapper.messageQueue + }; + + return wrapper; + } + + /** + * ensureWebSocketSend attaches trigger handles to elements with + * "ws-send" attribute + * @param {HTMLElement} elt + */ + function ensureWebSocketSend(elt) { + var legacyAttribute = api.getAttributeValue(elt, "hx-ws"); + if (legacyAttribute && legacyAttribute !== 'send') { + return; + } + + var webSocketParent = api.getClosestMatch(elt, hasWebSocket) + processWebSocketSend(webSocketParent, elt); + } + + /** + * hasWebSocket function checks if a node has webSocket instance attached + * @param {HTMLElement} node + * @returns {boolean} + */ + function hasWebSocket(node) { + return api.getInternalData(node).webSocket != null; + } + + /** + * processWebSocketSend adds event listeners to the
element so that + * messages can be sent to the WebSocket server when the form is submitted. + * @param {HTMLElement} socketElt + * @param {HTMLElement} sendElt + */ + function processWebSocketSend(socketElt, sendElt) { + var nodeData = api.getInternalData(sendElt); + var triggerSpecs = api.getTriggerSpecs(sendElt); + triggerSpecs.forEach(function (ts) { + api.addTriggerHandler(sendElt, ts, nodeData, function (elt, evt) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + /** @type {WebSocketWrapper} */ + var socketWrapper = api.getInternalData(socketElt).webSocket; + var headers = api.getHeaders(sendElt, api.getTarget(sendElt)); + var results = api.getInputValues(sendElt, 'post'); + var errors = results.errors; + var rawParameters = results.values; + var expressionVars = api.getExpressionVars(sendElt); + var allParameters = api.mergeObjects(rawParameters, expressionVars); + var filteredParameters = api.filterValues(allParameters, sendElt); + + var sendConfig = { + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers: headers, + errors: errors, + + triggeringEvent: evt, + messageBody: undefined, + socketWrapper: socketWrapper.publicInterface + }; + + if (!api.triggerEvent(elt, 'htmx:wsConfigSend', sendConfig)) { + return; + } + + if (errors && errors.length > 0) { + api.triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + + var body = sendConfig.messageBody; + if (body === undefined) { + var toSend = Object.assign({}, sendConfig.parameters); + if (sendConfig.headers) + toSend['HEADERS'] = headers; + body = JSON.stringify(toSend); + } + + socketWrapper.send(body, elt); + + if (evt && api.shouldCancel(evt, elt)) { + evt.preventDefault(); + } + }); + }); + } + + /** + * getWebSocketReconnectDelay is the default easing function for WebSocket reconnects. + * @param {number} retryCount // The number of retries that have already taken place + * @returns {number} + */ + function getWebSocketReconnectDelay(retryCount) { + + /** @type {"full-jitter" | ((retryCount:number) => number)} */ + var delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + return delay(retryCount); + } + if (delay === 'full-jitter') { + var exp = Math.min(retryCount, 6); + var maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + + logError('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + + /** + * maybeCloseWebSocketSource checks to the if the element that created the WebSocket + * still exists in the DOM. If NOT, then the WebSocket is closed and this function + * returns TRUE. If the element DOES EXIST, then no action is taken, and this function + * returns FALSE. + * + * @param {*} elt + * @returns + */ + function maybeCloseWebSocketSource(elt) { + if (!api.bodyContains(elt)) { + api.getInternalData(elt).webSocket.close(); + return true; + } + return false; + } + + /** + * createWebSocket is the default method for creating new WebSocket objects. + * it is hoisted into htmx.createWebSocket to be overridden by the user, if needed. + * + * @param {string} url + * @returns WebSocket + */ + function createWebSocket(url) { + var sock = new WebSocket(url, []); + sock.binaryType = htmx.config.wsBinaryType; + return sock; + } + + /** + * queryAttributeOnThisOrChildren returns all nodes that contain the requested attributeName, INCLUDING THE PROVIDED ROOT ELEMENT. + * + * @param {HTMLElement} elt + * @param {string} attributeName + */ + function queryAttributeOnThisOrChildren(elt, attributeName) { + + var result = [] + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-ws")) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [data-hx-ws], [hx-ws]").forEach(function (node) { + result.push(node) + }) + + return result + } + + /** + * @template T + * @param {T[]} arr + * @param {(T) => void} func + */ + function forEach(arr, func) { + if (arr) { + for (var i = 0; i < arr.length; i++) { + func(arr[i]); + } + } + } + +})(); + diff --git a/resources/public/js/htmx-1.9.11.min.js b/resources/public/js/htmx-1.9.11.min.js new file mode 100644 index 0000000..d68f3c6 --- /dev/null +++ b/resources/public/js/htmx-1.9.11.min.js @@ -0,0 +1 @@ +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:B,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Fr,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.11"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t=false){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function A(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function s(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function N(e){return/",0);var a=i.querySelector("template").content;if(Q.config.allowScriptTags){oe(a.querySelectorAll("script"),function(e){if(Q.config.inlineScriptNonce){e.nonce=Q.config.inlineScriptNonce}e.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1})}else{oe(a.querySelectorAll("script"),function(e){_(e)})}return a}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s(""+n+"
",1);case"col":return s(""+n+"
",2);case"tr":return s(""+n+"
",2);case"td":case"th":return s(""+n+"
",3);case"script":case"style":return s("
"+n+"
",1);default:return s(n,0)}}function ie(e){if(e){e()}}function I(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return I(e,"Function")}function P(e){return I(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function M(e){var t=[];if(e){for(var r=0;r=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function D(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function U(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function F(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return Tr(re().body,function(){return eval(e)})}function B(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function j(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function _(e,t){e=p(e);if(t){setTimeout(function(){_(e);e=null},t)}else{e.parentElement.removeChild(e)}}function z(e,t,r){e=p(e);if(r){setTimeout(function(){z(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=p(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function $(e,t){e=p(e);e.classList.toggle(t)}function W(e,t){e=p(e);oe(e.parentElement.children,function(e){n(e,t)});z(e,t)}function v(e,t){e=p(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function g(e,t){return e.substring(0,t.length)===t}function G(e,t){return e.substring(e.length-t.length)===t}function J(e){var t=e.trim();if(g(t,"<")&&G(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Z(e,t){if(t.indexOf("closest ")===0){return[v(e,J(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,J(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[K(e,J(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[Y(e,J(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(J(t))}}var K=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Z(e,t)[0]}else{return Z(re().body,e)[0]}}function p(e){if(I(e,"String")){return C(e)}else{return e}}function ve(e,t,r){if(k(t)){return{target:re().body,event:e,listener:t}}else{return{target:p(e),event:t,listener:r}}}function de(t,r,n){jr(function(){var e=ve(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=k(r);return e?r:n}function ge(t,r,n){jr(function(){var e=ve(t,r,n);e.target.removeEventListener(e.event,e.listener)});return k(r)?r:n}var pe=re().createElement("output");function me(e,t){var r=ne(e,t);if(r){if(r==="this"){return[xe(e,t)]}else{var n=Z(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[pe]}else{return n}}}}function xe(e,t){return c(e,function(e){return te(e,t)!=null})}function ye(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return xe(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function be(e){var t=Q.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Se(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){Be(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Ce(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();we(e,i);s.tasks.push(function(){we(e,a)})}}})}function Oe(e){return function(){n(e,Q.config.addedClass);zt(e);Nt(e);qe(e);ce(e,"htmx:load")}}function qe(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){Te(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;z(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Oe(i))}}}function He(e,t){var r=0;while(r-1){var t=e.replace(H,"");var r=t.match(q);if(r){return r[2]}}}function je(e,t,r,n,i,a){i.title=Ve(n);var o=l(n);if(o){Ce(r,o,i);o=Fe(r,o,a);Re(o);return Be(e,r,t,o,i)}}function _e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!P(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=Tr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Qe(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function tt(e){var t;if(e.length>0&&Ze.test(e[0])){e.shift();t=y(e,Ke).trim();e.shift()}else{t=y(e,x)}return t}var rt="input, textarea, select";function nt(e,t,r){var n=[];var i=Ye(t);do{y(i,Je);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Je);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Je);var l=et(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=et(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Je);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ze.test(i[0])){var c=tt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=tt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=tt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=tt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Je)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function it(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||nt(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,rt)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function at(e){ae(e).cancelled=true}function ot(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!ct(r,e,Wt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}ot(e,t,r)}},r.pollInterval)}function st(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function lt(t,r,e){if(t.tagName==="A"&&st(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){ht(t,function(e,t){if(v(e,Q.config.disableSelector)){m(e);return}he(n,i,e,t)},r,e,true)})}}function ut(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ft(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function ct(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function ht(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Z(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ft(a,e)){return}if(l||ut(e,a)){e.preventDefault()}if(ct(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var vt=false;var dt=null;function gt(){if(!dt){dt=function(){vt=true};window.addEventListener("scroll",dt);setInterval(function(){if(vt){vt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){pt(e)})}},200)}}function pt(t){if(!o(t,"data-hx-revealed")&&X(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function mt(e,t,r){var n=D(r);for(var i=0;i=0){var t=wt(n);setTimeout(function(){xt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(yt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=M(n.children);for(var a=0;a0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ut(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function wt(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(e,t,r){var n=D(r);for(var i=0;i0){setTimeout(i,n)}else{i()}}function Ht(t,i,e){var a=false;oe(w,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Lt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){m(e);return}he(r,n,e,t)})})}});return a}function Lt(n,e,t,r){if(e.sseEvent){Rt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){gt();ht(n,r,t,e);pt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t0){t.polling=true;ot(n,r,e)}else{ht(n,r,t,e)}}function At(e){if(!e.htmxExecuted&&Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function Nt(e){if(h(e,"script")){At(e)}oe(f(e,"script"),function(e){At(e)})}function It(e){var t=e.attributes;for(var r=0;r0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Ft(o)}for(var l in r){Bt(e,l,r[l])}}}function jt(e){Ae(e);for(var t=0;tQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Yt(e){if(!U()){return null}e=F(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Zt();var r=T(t);var n=Ve(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ue(t,e,r);nr(r.tasks);Jt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function ar(e){er();e=e||location.pathname+location.search;var t=Yt(e);if(t){var r=l(t.content);var n=Zt();var i=T(n);Ue(n,r,i);nr(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Jt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{ir(e)}}}function or(e){var t=me(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function sr(e){var t=me(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function lr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function ur(e,t){for(var r=0;r=0}function wr(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!br(e)){n["show"]="top"}if(r){var i=D(r);if(i.length>0){for(var a=0;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Sr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Er(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Sr(r)){return mr(n)}else{return pr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Cr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Rr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=Tr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Rr(u(e),t,r,n)}function Tr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Or(e,t){return Rr(e,"hx-vars",true,t)}function qr(e,t){return Rr(e,"hx-vals",false,t)}function Hr(e){return le(Or(e),qr(e))}function Lr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Ar(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Nr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||I(r,"String")){return he(e,t,null,null,{targetOverride:p(r),returnPromise:true})}else{return he(e,t,p(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:p(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Ir(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function kr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=g(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Mr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||ye(n);if(u==null||u==pe){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var p=ne(n,"hx-sync");var m=null;var x=false;if(p){var F=p.split(":");var B=F[0].trim();if(B==="this"){g=xe(n,"hx-sync")}else{g=ue(n,B)}p=(F[1]||"drop").trim();f=ae(g);if(p==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(p==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(p==="replace"){ce(g,"htmx:abort")}else if(p.indexOf("queue")===0){var V=p.split(" ");m=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(m==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){m=y.triggerSpec.queue}}if(m==null){m="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(m==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(m==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(m==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=xr(n,u,S);if(t!=="get"&&!Sr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=dr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Hr(n);var $=le(R,z);var T=yr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Rr(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=pr(T);if(L){A+="#"+L}}}if(!kr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Lr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Ir(n);I.pathInfo.responsePath=Ar(b);M(n,I);lr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=or(n);var P=sr(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Er(b,n,T);b.send(Y);return l}function Pr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Mr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){_e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){er();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}Nr("GET",r,v).then(function(){tr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Pr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var p=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:p},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;p=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){at(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){er()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=wr(l,s);if(v.hasOwnProperty("ignoreTitle")){p=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var m=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){tr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{rr(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);je(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}_e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!p){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Cr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}_e(f,"HX-Trigger-After-Settle",r)}ie(m)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){m=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Xr={};function Dr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ur(e,t){if(t.init){t.init(r)}Xr[e]=le(Dr(),t)}function Fr(e){delete Xr[e]}function Br(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Xr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Br(u(e),r,n)}var Vr=false;re().addEventListener("DOMContentLoaded",function(){Vr=true});function jr(e){if(Vr||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function _r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","")}}function zr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function $r(){var e=zr();if(e){Q.config=le(Q.config,e)}}jr(function(){$r();_r();var e=re().body;zt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){ar();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()}); \ No newline at end of file diff --git a/resources/public/js/hyperscript-0.9.8.min.js b/resources/public/js/hyperscript-0.9.8.min.js new file mode 100644 index 0000000..b47a671 --- /dev/null +++ b/resources/public/js/hyperscript-0.9.8.min.js @@ -0,0 +1 @@ +(function(e,t){const r=t(e);if(typeof exports==="object"&&typeof exports["nodeName"]!=="string"){module.exports=r}else{e["_hyperscript"]=r;if("document"in e)e["_hyperscript"].browserInit()}})(typeof self!=="undefined"?self:this,(e=>{"use strict";const t={dynamicResolvers:[function(e,t){if(e==="Fixed"){return Number(t).toFixed()}else if(e.indexOf("Fixed:")===0){let r=e.split(":")[1];return Number(t).toFixed(parseInt(r))}}],String:function(e){if(e.toString){return e.toString()}else{return""+e}},Int:function(e){return parseInt(e)},Float:function(e){return parseFloat(e)},Number:function(e){return Number(e)},Date:function(e){return new Date(e)},Array:function(e){return Array.from(e)},JSON:function(e){return JSON.stringify(e)},Object:function(e){if(e instanceof String){e=e.toString()}if(typeof e==="string"){return JSON.parse(e)}else{return Object.assign({},e)}}};const r={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:t};class n{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS"};static isValidCSSClassChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isValidCSSIDChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isWhitespace(e){return e===" "||e==="\t"||n.isNewline(e)}static positionString(e){return"[Line: "+e.line+", Column: "+e.column+"]"}static isNewline(e){return e==="\r"||e==="\n"}static isNumeric(e){return e>="0"&&e<="9"}static isAlpha(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}static isIdentifierChar(e,t){return e==="_"||e==="$"}static isReservedChar(e){return e==="`"||e==="^"}static isValidSingleQuoteStringStart(e){if(e.length>0){var t=e[e.length-1];if(t.type==="IDENTIFIER"||t.type==="CLASS_REF"||t.type==="ID_REF"){return false}if(t.op&&(t.value===">"||t.value===")")){return false}}return true}static tokenize(e,t){var r=[];var a=e;var o=0;var s=0;var u=1;var l="";var c=0;function f(){return t&&c===0}while(o=0){return this.consumeToken()}}requireToken(e,t){var r=this.matchToken(e,t);if(r){return r}else{this.raiseError(this,"Expected '"+e+"' but found '"+this.currentToken().value+"'")}}peekToken(e,t,r){t=t||0;r=r||"IDENTIFIER";return this.tokens[t]&&this.tokens[t].value===e&&this.tokens[t].type===r}matchToken(e,t){if(this.follows.indexOf(e)!==-1){return}t=t||"IDENTIFIER";if(this.currentToken()&&this.currentToken().value===e&&this.currentToken().type===t){return this.consumeToken()}}consumeToken(){var e=this.tokens.shift();this.consumed.push(e);this._lastConsumed=e;this.consumeWhitespace();return e}consumeUntil(e,t){var r=[];var n=this.token(0,true);while((t==null||n.type!==t)&&(e==null||n.value!==e)&&n.type!=="EOF"){var i=this.tokens.shift();this.consumed.push(i);r.push(n);n=this.token(0,true)}this.consumeWhitespace();return r}lastWhitespace(){if(this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"){return this.consumed[this.consumed.length-1].value}else{return""}}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(e,t){var r;var n=0;do{if(!t){while(this.tokens[n]&&this.tokens[n].type==="WHITESPACE"){n++}}r=this.tokens[n];e--;n++}while(e>-1);if(r){return r}else{return{type:"EOF",value:"<<>>"}}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split("\n")[this.startToken.line-1]};follows=[];pushFollow(e){this.follows.push(e)}popFollow(){this.follows.pop()}clearFollows(){var e=this.follows;this.follows=[];return e}restoreFollows(e){this.follows=e}}class a{constructor(e){this.runtime=e;this.possessivesDisabled=false;this.addGrammarElement("feature",(function(e,t,r){if(r.matchOpToken("(")){var n=e.requireElement("feature",r);r.requireOpToken(")");return n}var i=e.FEATURES[r.currentToken().value||""];if(i){return i(e,t,r)}}));this.addGrammarElement("command",(function(e,t,r){if(r.matchOpToken("(")){const t=e.requireElement("command",r);r.requireOpToken(")");return t}var n=e.COMMANDS[r.currentToken().value||""];let i;if(n){i=n(e,t,r)}else if(r.currentToken().type==="IDENTIFIER"){i=e.parseElement("pseudoCommand",r)}if(i){return e.parseElement("indirectStatement",r,i)}return i}));this.addGrammarElement("commandList",(function(e,t,r){if(r.hasMore()){var n=e.parseElement("command",r);if(n){r.matchToken("then");const t=e.parseElement("commandList",r);if(t)n.next=t;return n}}return{type:"emptyCommandListCommand",op:function(e){return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}));this.addGrammarElement("leaf",(function(e,t,r){var n=e.parseAnyOf(e.LEAF_EXPRESSIONS,r);if(n==null){return e.parseElement("symbol",r)}return n}));this.addGrammarElement("indirectExpression",(function(e,t,r,n){for(var i=0;i{this.unifiedExec(e,t)})).catch((e=>{this.unifiedExec({op:function(){throw e}},t)}));return}else if(r===o.HALT){if(t.meta.finallyHandler&&!t.meta.handlingFinally){t.meta.handlingFinally=true;e=t.meta.finallyHandler}else{if(t.meta.onHalt){t.meta.onHalt()}if(t.meta.currentException){if(t.meta.reject){t.meta.reject(t.meta.currentException);return}else{throw t.meta.currentException}}else{return}}}else{e=r}}}unifiedEval(e,t){var r=[t];var n=false;var i=false;if(e.args){for(var a=0;a{r=this.wrapArrays(r);Promise.all(r).then((function(r){if(i){this.unwrapAsyncs(r)}try{var a=e.op.apply(e,r);t(a)}catch(e){n(e)}})).catch((function(e){n(e)}))}))}else{if(i){this.unwrapAsyncs(r)}return e.op.apply(e,r)}}_scriptAttrs=null;getScriptAttributes(){if(this._scriptAttrs==null){this._scriptAttrs=r.attributes.replace(/ /g,"").split(",")}return this._scriptAttrs}getScript(e){for(var t=0;t{this.initElement(e,e instanceof HTMLScriptElement&&e.type==="text/hyperscript"?document.body:e)}))}}initElement(e,t){if(e.closest&&e.closest(r.disableSelector)){return}var n=this.getInternalData(e);if(!n.initialized){var i=this.getScript(e);if(i){try{n.initialized=true;n.script=i;const r=this.lexer,s=this.parser;var a=r.tokenize(i);var o=s.parseHyperScript(a);if(!o)return;o.apply(t||e,e);setTimeout((()=>{this.triggerEvent(t||e,"load",{hyperscript:true})}),1)}catch(t){this.triggerEvent(e,"exception",{error:t});console.error("hyperscript errors were found on the following element:",e,"\n\n",t.message,t.stack)}}}}internalDataMap=new WeakMap;getInternalData(e){var t=this.internalDataMap.get(e);if(typeof t==="undefined"){this.internalDataMap.set(e,t={})}return t}typeCheck(e,t,r){if(e==null&&r){return true}var n=Object.prototype.toString.call(e).slice(8,-1);return n===t}getElementScope(e){var t=e.meta&&e.meta.owner;if(t){var r=this.getInternalData(t);var n="elementScope";if(e.meta.feature&&e.meta.feature.behavior){n=e.meta.feature.behavior+"Scope"}var i=c(r,n);return i}else{return{}}}isReservedWord(e){return["meta","it","result","locals","event","target","detail","sender","body"].includes(e)}isHyperscriptContext(e){return e instanceof s}resolveSymbol(t,r,n){if(t==="me"||t==="my"||t==="I"){return r.me}if(t==="it"||t==="its"||t==="result"){return r.result}if(t==="you"||t==="your"||t==="yourself"){return r.you}else{if(n==="global"){return e[t]}else if(n==="element"){var i=this.getElementScope(r);return i[t]}else if(n==="local"){return r.locals[t]}else{if(r.meta&&r.meta.context){var a=r.meta.context[t];if(typeof a!=="undefined"){return a}if(r.meta.context.detail){a=r.meta.context.detail[t];if(typeof a!=="undefined"){return a}}}if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){var o=r.locals[t]}else{var o=r[t]}if(typeof o!=="undefined"){return o}else{var i=this.getElementScope(r);o=i[t];if(typeof o!=="undefined"){return o}else{return e[t]}}}}}setSymbol(t,r,n,i){if(n==="global"){e[t]=i}else if(n==="element"){var a=this.getElementScope(r);a[t]=i}else if(n==="local"){r.locals[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)&&typeof r.locals[t]!=="undefined"){r.locals[t]=i}else{var a=this.getElementScope(r);var o=a[t];if(typeof o!=="undefined"){a[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){r.locals[t]=i}else{r[t]=i}}}}}findNext(e,t){if(e){if(e.resolveNext){return e.resolveNext(t)}else if(e.next){return e.next}else{return this.findNext(e.parent,t)}}}flatGet(e,t,r){if(e!=null){var n=r(e,t);if(typeof n!=="undefined"){return n}if(this.shouldAutoIterate(e)){var i=[];for(var a of e){var o=r(a,t);i.push(o)}return i}}}resolveProperty(e,t){return this.flatGet(e,t,((e,t)=>e[t]))}resolveAttribute(e,t){return this.flatGet(e,t,((e,t)=>e.getAttribute&&e.getAttribute(t)))}resolveStyle(e,t){return this.flatGet(e,t,((e,t)=>e.style&&e.style[t]))}resolveComputedStyle(e,t){return this.flatGet(e,t,((e,t)=>getComputedStyle(e).getPropertyValue(t)))}assignToNamespace(t,r,n,i){let a;if(typeof document!=="undefined"&&t===document.body){a=e}else{a=this.getHyperscriptFeatures(t)}var o;while((o=r.shift())!==undefined){var s=a[o];if(s==null){s={};a[o]=s}a=s}a[n]=i}getHyperTrace(e,t){var r=[];var n=e;while(n.meta.caller){n=n.meta.caller}if(n.meta.traceMap){return n.meta.traceMap.get(t,r)}}registerHyperTrace(e,t){var r=[];var n=null;while(e!=null){r.push(e);n=e;e=e.meta.caller}if(n.meta.traceMap==null){n.meta.traceMap=new Map}if(!n.meta.traceMap.get(t)){var i={trace:r,print:function(e){e=e||console.error;e("hypertrace /// ");var t=0;for(var n=0;n",i.meta.feature.displayName.padEnd(t+2),"-",i.meta.owner)}}};n.meta.traceMap.set(t,i)}}escapeSelector(e){return e.replace(/:/g,(function(e){return"\\"+e}))}nullCheck(e,t){if(e==null){throw new Error("'"+t.sourceFor()+"' is null")}}isEmpty(e){return e==undefined||e.length===0}doesExist(e){if(e==null){return false}if(this.shouldAutoIterate(e)){for(const t of e){return true}return false}return true}getRootNode(e){if(e&&e instanceof Node){var t=e.getRootNode();if(t instanceof Document||t instanceof ShadowRoot)return t}return document}getEventQueueFor(e,t){let r=this.getInternalData(e);var n=r.eventQueues;if(n==null){n=new Map;r.eventQueues=n}var i=n.get(t);if(i==null){i={queue:[],executing:false};n.set(t,i)}return i}hyperscriptUrl="document"in e&&document.currentScript?document.currentScript.src:null}class s{constructor(t,r,n,i,a){this.meta={parser:a.parser,lexer:a.lexer,runtime:a,owner:t,feature:r,iterators:{},ctx:this};this.locals={};this.me=n,this.you=undefined;this.result=undefined;this.event=i;this.target=i?i.target:null;this.detail=i?i.detail:null;this.sender=i?i.detail?i.detail.sender:null:null;this.body="document"in e?document.body:null;a.addFeatures(t,this)}}class u{constructor(e,t,r){this._css=e;this.relativeToElement=t;this.escape=r;this[l]=true}get css(){if(this.escape){return o.prototype.escapeSelector(this._css)}else{return this._css}}get className(){return this._css.substr(1)}get id(){return this.className()}contains(e){for(let t of this){if(t.contains(e)){return true}}return false}get length(){return this.selectMatches().length}[Symbol.iterator](){let e=this.selectMatches();return e[Symbol.iterator]()}selectMatches(){let e=o.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css);return e}}const l=Symbol();function c(e,t){var r=e[t];if(r){return r}else{var n={};e[t]=n;return n}}function f(e){try{return JSON.parse(e)}catch(e){m(e);return null}}function m(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function p(e,t){return new(e.bind.apply(e,[e].concat(t)))}function h(t){t.addLeafExpression("parenthesized",(function(e,t,r){if(r.matchOpToken("(")){var n=r.clearFollows();try{var i=e.requireElement("expression",r)}finally{r.restoreFollows(n)}r.requireOpToken(")");return i}}));t.addLeafExpression("string",(function(e,t,r){var i=r.matchTokenType("STRING");if(!i)return;var a=i.value;var o;if(i.template){var s=n.tokenize(a,true);o=e.parseStringTemplate(s)}else{o=[]}return{type:"string",token:i,args:o,op:function(e){var t="";for(var r=1;re instanceof Element))}get css(){let e="",t=0;for(const r of this.templateParts){if(r instanceof Element){e+="[data-hs-query-id='"+t+++"']"}else e+=r}return e}[Symbol.iterator](){this.elements.forEach(((e,t)=>e.dataset.hsQueryId=t));const e=super[Symbol.iterator]();this.elements.forEach((e=>e.removeAttribute("data-hs-query-id")));return e}}t.addLeafExpression("queryRef",(function(e,t,i){var a=i.matchOpToken("<");if(!a)return;var o=i.consumeUntil("/");i.requireOpToken("/");i.requireOpToken(">");var s=o.map((function(e){if(e.type==="STRING"){return'"'+e.value+'"'}else{return e.value}})).join("");var l,c,f;if(s.indexOf("$")>=0){l=true;c=n.tokenize(s,true);f=e.parseStringTemplate(c)}return{type:"queryRef",css:s,args:f,op:function(e,...t){if(l){return new r(s,e.me,t)}else{return new u(s,e.me)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("attributeRef",(function(e,t,r){var n=r.matchTokenType("ATTRIBUTE_REF");if(!n)return;if(!n.value)return;var i=n.value;if(i.indexOf("[")===0){var a=i.substring(2,i.length-1)}else{var a=i.substring(1)}var o="["+a+"]";var s=a.split("=");var u=s[0];var l=s[1];if(l){if(l.indexOf('"')===0){l=l.substring(1,l.length-1)}}return{type:"attributeRef",name:u,css:o,value:l,op:function(e){var t=e.you||e.me;if(t){return t.getAttribute(u)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("styleRef",(function(e,t,r){var n=r.matchTokenType("STYLE_REF");if(!n)return;if(!n.value)return;var i=n.value.substr(1);if(i.startsWith("computed-")){i=i.substr("computed-".length);return{type:"computedStyleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveComputedStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}else{return{type:"styleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}}));t.addGrammarElement("objectKey",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{type:"objectKey",key:n.value,evaluate:function(){return n.value}}}else if(r.matchOpToken("[")){var i=e.parseElement("expression",r);r.requireOpToken("]");return{type:"objectKey",expr:i,args:[i],op:function(e,t){return t},evaluate:function(e){return t.unifiedEval(this,e)}}}else{var a="";do{n=r.matchTokenType("IDENTIFIER")||r.matchOpToken("-");if(n)a+=n.value}while(n);return{type:"objectKey",key:a,evaluate:function(){return a}}}}));t.addLeafExpression("objectLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[];var i=[];if(!r.matchOpToken("}")){do{var a=e.requireElement("objectKey",r);r.requireOpToken(":");var o=e.requireElement("expression",r);i.push(o);n.push(a)}while(r.matchOpToken(","));r.requireOpToken("}")}return{type:"objectLiteral",args:[n,i],op:function(e,t,r){var n={};for(var i=0;i");var a=e.requireElement("expression",r);return{type:"blockLiteral",args:n,expr:a,evaluate:function(e){var t=function(){for(var t=0;t=0;a--){var o=i[a];if(o.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}if(n){return i[i.length-1]}};var f=function(e,t,r,n){var i=[];o.prototype.forEach(t,(function(t){if(t.matches(r)||t===e){i.push(t)}}));for(var a=0;a","<=",">=","==","===","!=","!==");var a=i?i.value:null;var o=true;var s=false;if(a==null){if(r.matchToken("is")||r.matchToken("am")){if(r.matchToken("not")){if(r.matchToken("in")){a="not in"}else if(r.matchToken("a")){a="not a";s=true}else if(r.matchToken("empty")){a="not empty";o=false}else{a="!="}}else if(r.matchToken("in")){a="in"}else if(r.matchToken("a")){a="a";s=true}else if(r.matchToken("empty")){a="empty";o=false}else if(r.matchToken("less")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a="<="}else{a="<"}}else if(r.matchToken("greater")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a=">="}else{a=">"}}else{a="=="}}else if(r.matchToken("exist")||r.matchToken("exists")){a="exist";o=false}else if(r.matchToken("matches")||r.matchToken("match")){a="match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="contain"}else if(r.matchToken("includes")||r.matchToken("include")){a="include"}else if(r.matchToken("do")||r.matchToken("does")){r.requireToken("not");if(r.matchToken("matches")||r.matchToken("match")){a="not match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="not contain"}else if(r.matchToken("exist")||r.matchToken("exist")){a="not exist";o=false}else if(r.matchToken("include")){a="not include"}else{e.raiseParseError(r,"Expected matches or contains")}}}if(a){var u,l,c;if(s){u=r.requireTokenType("IDENTIFIER");l=!r.matchOpToken("!")}else if(o){c=e.requireElement("mathExpression",r);if(a==="match"||a==="not match"){c=c.css?c.css:c}}var f=n;n={type:"comparisonOperator",operator:a,typeName:u,nullOk:l,lhs:n,rhs:c,args:[n,c],op:function(e,r,n){if(a==="=="){return r==n}else if(a==="!="){return r!=n}if(a==="match"){return r!=null&&v(f,r,n)}if(a==="not match"){return r==null||!v(f,r,n)}if(a==="in"){return n!=null&&h(c,n,r)}if(a==="not in"){return n==null||!h(c,n,r)}if(a==="contain"){return r!=null&&h(f,r,n)}if(a==="not contain"){return r==null||!h(f,r,n)}if(a==="include"){return r!=null&&h(f,r,n)}if(a==="not include"){return r==null||!h(f,r,n)}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}else if(a==="<"){return r"){return r>n}else if(a==="<="){return r<=n}else if(a===">="){return r>=n}else if(a==="empty"){return t.isEmpty(r)}else if(a==="not empty"){return!t.isEmpty(r)}else if(a==="exist"){return t.doesExist(r)}else if(a==="not exist"){return!t.doesExist(r)}else if(a==="a"){return t.typeCheck(r,u.value,l)}else if(a==="not a"){return!t.typeCheck(r,u.value,l)}else{throw"Unknown comparison : "+a}},evaluate:function(e){return t.unifiedEval(this,e)}}}return n}));t.addGrammarElement("comparisonExpression",(function(e,t,r){return e.parseAnyOf(["comparisonOperator","mathExpression"],r)}));t.addGrammarElement("logicalOperator",(function(e,t,r){var n=e.parseElement("comparisonExpression",r);var i,a=null;i=r.matchToken("and")||r.matchToken("or");while(i){a=a||i;if(a.value!==i.value){e.raiseParseError(r,"You must parenthesize logical operations with different operators")}var o=e.requireElement("comparisonExpression",r);const s=i.value;n={type:"logicalOperator",operator:s,lhs:n,rhs:o,args:[n,o],op:function(e,t,r){if(s==="and"){return t&&r}else{return t||r}},evaluate:function(e){return t.unifiedEval(this,e)}};i=r.matchToken("and")||r.matchToken("or")}return n}));t.addGrammarElement("logicalExpression",(function(e,t,r){return e.parseAnyOf(["logicalOperator","mathExpression"],r)}));t.addGrammarElement("asyncExpression",(function(e,t,r){if(r.matchToken("async")){var n=e.requireElement("logicalExpression",r);var i={type:"asyncExpression",value:n,evaluate:function(e){return{asyncWrapper:true,value:this.value.evaluate(e)}}};return i}else{return e.parseElement("logicalExpression",r)}}));t.addGrammarElement("expression",(function(e,t,r){r.matchToken("the");return e.parseElement("asyncExpression",r)}));t.addGrammarElement("assignableExpression",(function(e,t,r){r.matchToken("the");var n=e.parseElement("primaryExpression",r);if(n&&(n.type==="symbol"||n.type==="ofExpression"||n.type==="propertyAccess"||n.type==="attributeRefAccess"||n.type==="attributeRef"||n.type==="styleRef"||n.type==="arrayIndex"||n.type==="possessive")){return n}else{e.raiseParseError(r,"A target expression must be writable. The expression type '"+(n&&n.type)+"' is not.")}return n}));t.addGrammarElement("hyperscript",(function(e,t,r){var n=[];if(r.hasMore()){while(e.featureStart(r.currentToken())||r.currentToken().value==="("){var i=e.requireElement("feature",r);n.push(i);r.matchToken("end")}}return{type:"hyperscript",features:n,apply:function(e,t,r){for(const i of n){i.install(e,t,r)}}}}));var d=function(e){var t=[];if(e.token(0).value==="("&&(e.token(1).value===")"||e.token(2).value===","||e.token(2).value===")")){e.matchOpToken("(");do{t.push(e.requireTokenType("IDENTIFIER"))}while(e.matchOpToken(","));e.requireOpToken(")")}return t};t.addFeature("on",(function(e,t,r){if(!r.matchToken("on"))return;var n=false;if(r.matchToken("every")){n=true}var i=[];var a=null;do{var o=e.requireElement("eventName",r,"Expected event name");var s=o.evaluate();if(a){a=a+" or "+s}else{a="on "+s}var u=d(r);var l=null;if(r.matchOpToken("[")){l=e.requireElement("expression",r);r.requireOpToken("]")}var c,f,m;if(r.currentToken().type==="NUMBER"){var p=r.consumeToken();if(!p.value)return;c=parseInt(p.value);if(r.matchToken("to")){var h=r.consumeToken();if(!h.value)return;f=parseInt(h.value)}else if(r.matchToken("and")){m=true;r.requireToken("on")}}var v,E;if(s==="intersection"){v={};if(r.matchToken("with")){v["with"]=e.requireElement("expression",r).evaluate()}if(r.matchToken("having")){do{if(r.matchToken("margin")){v["rootMargin"]=e.requireElement("stringLike",r).evaluate()}else if(r.matchToken("threshold")){v["threshold"]=e.requireElement("expression",r).evaluate()}else{e.raiseParseError(r,"Unknown intersection config specification")}}while(r.matchToken("and"))}}else if(s==="mutation"){E={};if(r.matchToken("of")){do{if(r.matchToken("anything")){E["attributes"]=true;E["subtree"]=true;E["characterData"]=true;E["childList"]=true}else if(r.matchToken("childList")){E["childList"]=true}else if(r.matchToken("attributes")){E["attributes"]=true;E["attributeOldValue"]=true}else if(r.matchToken("subtree")){E["subtree"]=true}else if(r.matchToken("characterData")){E["characterData"]=true;E["characterDataOldValue"]=true}else if(r.currentToken().type==="ATTRIBUTE_REF"){var T=r.consumeToken();if(E["attributeFilter"]==null){E["attributeFilter"]=[]}if(T.value.indexOf("@")==0){E["attributeFilter"].push(T.value.substring(1))}else{e.raiseParseError(r,"Only shorthand attribute references are allowed here")}}else{e.raiseParseError(r,"Unknown mutation config specification")}}while(r.matchToken("or"))}else{E["attributes"]=true;E["characterData"]=true;E["childList"]=true}}var y=null;var k=false;if(r.matchToken("from")){if(r.matchToken("elsewhere")){k=true}else{r.pushFollow("or");try{y=e.requireElement("expression",r)}finally{r.popFollow()}if(!y){e.raiseParseError(r,'Expected either target value or "elsewhere".')}}}if(y===null&&k===false&&r.matchToken("elsewhere")){k=true}if(r.matchToken("in")){var x=e.parseElement("unaryExpression",r)}if(r.matchToken("debounced")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var b=g.evaluate({})}else if(r.matchToken("throttled")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var w=g.evaluate({})}i.push({execCount:0,every:n,on:s,args:u,filter:l,from:y,inExpr:x,elsewhere:k,startCount:c,endCount:f,unbounded:m,debounceTime:b,throttleTime:w,mutationSpec:E,intersectionSpec:v,debounced:undefined,lastExec:undefined})}while(r.matchToken("or"));var S=true;if(!n){if(r.matchToken("queue")){if(r.matchToken("all")){var q=true;var S=false}else if(r.matchToken("first")){var N=true}else if(r.matchToken("none")){var I=true}else{r.requireToken("last")}}}var C=e.requireElement("commandList",r);e.ensureTerminated(C);var R,A;if(r.matchToken("catch")){R=r.requireTokenType("IDENTIFIER").value;A=e.requireElement("commandList",r);e.ensureTerminated(A)}if(r.matchToken("finally")){var O=e.requireElement("commandList",r);e.ensureTerminated(O)}var L={displayName:a,events:i,start:C,every:n,execCount:0,errorHandler:A,errorSymbol:R,execute:function(e){let r=t.getEventQueueFor(e.me,L);if(r.executing&&n===false){if(I||N&&r.queue.length>0){return}if(S){r.queue.length=0}r.queue.push(e);return}L.execCount++;r.executing=true;e.meta.onHalt=function(){r.executing=false;var e=r.queue.shift();if(e){setTimeout((function(){L.execute(e)}),1)}};e.meta.reject=function(r){console.error(r.message?r.message:r);var n=t.getHyperTrace(e,r);if(n){n.print()}t.triggerEvent(e.me,"exception",{error:r})};C.execute(e)},install:function(e,r){for(const r of L.events){var n;if(r.elsewhere){n=[document]}else if(r.from){n=r.from.evaluate(t.makeContext(e,L,e,null))}else{n=[e]}t.implicitLoop(n,(function(n){var i=r.on;if(n==null){console.warn("'%s' feature ignored because target does not exists:",a,e);return}if(r.mutationSpec){i="hyperscript:mutation";const e=new MutationObserver((function(e,r){if(!L.executing){t.triggerEvent(n,i,{mutationList:e,observer:r})}}));e.observe(n,r.mutationSpec)}if(r.intersectionSpec){i="hyperscript:intersection";const e=new IntersectionObserver((function(r){for(const o of r){var a={observer:e};a=Object.assign(a,o);a["intersecting"]=o.isIntersecting;t.triggerEvent(n,i,a)}}),r.intersectionSpec);e.observe(n)}var o=n.addEventListener||n.on;o.call(n,i,(function a(o){if(typeof Node!=="undefined"&&e instanceof Node&&n!==e&&!e.isConnected){n.removeEventListener(i,a);return}var s=t.makeContext(e,L,e,o);if(r.elsewhere&&e.contains(o.target)){return}if(r.from){s.result=n}for(const e of r.args){let t=s.event[e.value];if(t!==undefined){s.locals[e.value]=t}else if("detail"in s.event){s.locals[e.value]=s.event["detail"][e.value]}}s.meta.errorHandler=A;s.meta.errorSymbol=R;s.meta.finallyHandler=O;if(r.filter){var u=s.meta.context;s.meta.context=s.event;try{var l=r.filter.evaluate(s);if(l){}else{return}}finally{s.meta.context=u}}if(r.inExpr){var c=o.target;while(true){if(c.matches&&c.matches(r.inExpr.css)){s.result=c;break}else{c=c.parentElement;if(c==null){return}}}}r.execCount++;if(r.startCount){if(r.endCount){if(r.execCountr.endCount){return}}else if(r.unbounded){if(r.execCount{var a=false;for(const s of i){var o=n=>{e.result=n;if(s.args){for(const t of s.args){e.locals[t.value]=n[t.value]||(n.detail?n.detail[t.value]:null)}}if(!a){a=true;r(t.findNext(this,e))}};if(s.name){n.addEventListener(s.name,o,{once:true})}else if(s.time!=null){setTimeout(o,s.time,s.time)}}}))}};return n}else{var s;if(r.matchToken("a")){r.requireToken("tick");s=0}else{s=e.requireElement("expression",r)}n={type:"waitCmd",time:s,args:[s],op:function(e,r){return new Promise((n=>{setTimeout((()=>{n(t.findNext(this,e))}),r)}))},execute:function(e){return t.unifiedExec(this,e)}};return n}}));t.addGrammarElement("dotOrColonPath",(function(e,t,r){var n=r.matchTokenType("IDENTIFIER");if(n){var i=[n.value];var a=r.matchOpToken(".")||r.matchOpToken(":");if(a){do{i.push(r.requireTokenType("IDENTIFIER","NUMBER").value)}while(r.matchOpToken(a.value))}return{type:"dotOrColonPath",path:i,evaluate:function(){return i.join(a?a.value:"")}}}}));t.addGrammarElement("eventName",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{evaluate:function(){return n.value}}}return e.parseElement("dotOrColonPath",r)}));function E(e,t,r,n){var i=t.requireElement("eventName",n);var a=t.parseElement("namedArgumentList",n);if(e==="send"&&n.matchToken("to")||e==="trigger"&&n.matchToken("on")){var o=t.requireElement("expression",n)}else{var o=t.requireElement("implicitMeTarget",n)}var s={eventName:i,details:a,to:o,args:[o,i,a],op:function(e,t,n,i){r.nullCheck(t,o);r.forEach(t,(function(t){r.triggerEvent(t,n,i,e.me)}));return r.findNext(s,e)}};return s}t.addCommand("trigger",(function(e,t,r){if(r.matchToken("trigger")){return E("trigger",e,t,r)}}));t.addCommand("send",(function(e,t,r){if(r.matchToken("send")){return E("send",e,t,r)}}));var T=function(e,t,r,n){if(n){if(e.commandBoundary(r.currentToken())){e.raiseParseError(r,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.")}else{var i=e.requireElement("expression",r)}}var a={value:i,args:[i],op:function(e,r){var n=e.meta.resolve;e.meta.returned=true;e.meta.returnValue=r;if(n){if(r){n(r)}else{n()}}return t.HALT}};return a};t.addCommand("return",(function(e,t,r){if(r.matchToken("return")){return T(e,t,r,true)}}));t.addCommand("exit",(function(e,t,r){if(r.matchToken("exit")){return T(e,t,r,false)}}));t.addCommand("halt",(function(e,t,r){if(r.matchToken("halt")){if(r.matchToken("the")){r.requireToken("event");if(r.matchOpToken("'")){r.requireToken("s")}var n=true}if(r.matchToken("bubbling")){var i=true}else if(r.matchToken("default")){var a=true}var o=T(e,t,r,false);var s={keepExecuting:true,bubbling:i,haltDefault:a,exit:o,op:function(e){if(e.event){if(i){e.event.stopPropagation()}else if(a){e.event.preventDefault()}else{e.event.stopPropagation();e.event.preventDefault()}if(n){return t.findNext(this,e)}else{return o}}}};return s}}));t.addCommand("log",(function(e,t,r){if(!r.matchToken("log"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}if(r.matchToken("with")){var i=e.requireElement("expression",r)}var a={exprs:n,withExpr:i,args:[i,n],op:function(e,r,n){if(r){r.apply(null,n)}else{console.log.apply(null,n)}return t.findNext(this,e)}};return a}));t.addCommand("throw",(function(e,t,r){if(!r.matchToken("throw"))return;var n=e.requireElement("expression",r);var i={expr:n,args:[n],op:function(e,r){t.registerHyperTrace(e,r);throw r}};return i}));var y=function(e,t,r){var n=e.requireElement("expression",r);var i={expr:n,args:[n],op:function(e,r){e.result=r;return t.findNext(i,e)}};return i};t.addCommand("call",(function(e,t,r){if(!r.matchToken("call"))return;var n=y(e,t,r);if(n.expr&&n.expr.type!=="functionCall"){e.raiseParseError(r,"Must be a function invocation")}return n}));t.addCommand("get",(function(e,t,r){if(r.matchToken("get")){return y(e,t,r)}}));t.addCommand("make",(function(e,t,r){if(!r.matchToken("make"))return;r.matchToken("a")||r.matchToken("an");var n=e.requireElement("expression",r);var i=[];if(n.type!=="queryRef"&&r.matchToken("from")){do{i.push(e.requireElement("expression",r))}while(r.matchOpToken(","))}if(r.matchToken("called")){var a=e.requireElement("symbol",r)}var o;if(n.type==="queryRef"){o={op:function(e){var r,i="div",o,s=[];var u=/(?:(^|#|\.)([^#\. ]+))/g;while(r=u.exec(n.css)){if(r[1]==="")i=r[2].trim();else if(r[1]==="#")o=r[2].trim();else s.push(r[2].trim())}var l=document.createElement(i);if(o!==undefined)l.id=o;for(var c=0;c{if(!r.matchToken("pick"))return;r.matchToken("the");if(r.matchToken("item")||r.matchToken("items")||r.matchToken("character")||r.matchToken("characters")){const n=g(e,t,r);r.requireToken("from");const i=e.requireElement("expression",r);return{args:[i,n.from,n.to],op(e,r,i,a){if(n.toEnd)a=r.length;if(!n.includeStart)i++;if(n.includeEnd)a++;if(a==null||a==undefined)a=i+1;e.result=r.slice(i,a);return t.findNext(this,e)}}}if(r.matchToken("match")){r.matchToken("of");const n=e.parseElement("expression",r);let i="";if(r.matchOpToken("|")){i=r.requireToken("identifier").value}r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new RegExp(n,i).exec(r);return t.findNext(this,e)}}}if(r.matchToken("matches")){r.matchToken("of");const n=e.parseElement("expression",r);let i="gu";if(r.matchOpToken("|")){i="g"+r.requireToken("identifier").value.replace("g","")}console.log("flags",i);r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new w(n,i,r);return t.findNext(this,e)}}}}));t.addCommand("increment",(function(e,t,r){if(!r.matchToken("increment"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitIncrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t+r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));t.addCommand("decrement",(function(e,t,r){if(!r.matchToken("decrement"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitDecrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t-r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));function S(e,t){var r="text";var n;e.matchToken("a")||e.matchToken("an");if(e.matchToken("json")||e.matchToken("Object")){r="json"}else if(e.matchToken("response")){r="response"}else if(e.matchToken("html")){r="html"}else if(e.matchToken("text")){}else{n=t.requireElement("dotOrColonPath",e).evaluate()}return{type:r,conversion:n}}t.addCommand("fetch",(function(e,t,r){if(!r.matchToken("fetch"))return;var n=e.requireElement("stringLike",r);if(r.matchToken("as")){var i=S(r,e)}if(r.matchToken("with")&&r.currentToken().value!=="{"){var a=e.parseElement("nakedNamedArgumentList",r)}else{var a=e.parseElement("objectLiteral",r)}if(i==null&&r.matchToken("as")){i=S(r,e)}var o=i?i.type:"text";var s=i?i.conversion:null;var u={url:n,argExpressions:a,args:[n,a],op:function(e,r,n){var i=n||{};i["sender"]=e.me;i["headers"]=i["headers"]||{};var a=new AbortController;let l=e.me.addEventListener("fetch:abort",(function(){a.abort()}),{once:true});i["signal"]=a.signal;t.triggerEvent(e.me,"hyperscript:beforeFetch",i);t.triggerEvent(e.me,"fetch:beforeRequest",i);n=i;var c=false;if(n.timeout){setTimeout((function(){if(!c){a.abort()}}),n.timeout)}return fetch(r,n).then((function(r){let n={response:r};t.triggerEvent(e.me,"fetch:afterResponse",n);r=n.response;if(o==="response"){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}if(o==="json"){return r.json().then((function(r){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))}return r.text().then((function(r){if(s)r=t.convertValue(r,s);if(o==="html")r=t.convertValue(r,"Fragment");e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))})).catch((function(r){t.triggerEvent(e.me,"fetch:error",{reason:r});throw r})).finally((function(){e.me.removeEventListener("fetch:abort",l)}))}};return u}))}function v(e){e.addCommand("settle",(function(e,t,r){if(r.matchToken("settle")){if(!e.commandBoundary(r.currentToken())){var n=e.requireElement("expression",r)}else{var n=e.requireElement("implicitMeTarget",r)}var i={type:"settleCmd",args:[n],op:function(e,r){t.nullCheck(r,n);var a=null;var o=false;var s=false;var u=new Promise((function(e){a=e}));r.addEventListener("transitionstart",(function(){s=true}),{once:true});setTimeout((function(){if(!s&&!o){a(t.findNext(i,e))}}),500);r.addEventListener("transitionend",(function(){if(!o){a(t.findNext(i,e))}}),{once:true});return u},execute:function(e){return t.unifiedExec(this,e)}};return i}}));e.addCommand("add",(function(e,t,r){if(r.matchToken("add")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("styleLiteral",r);if(a==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("to")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}if(r.matchToken("when")){if(a){e.raiseParseError(r,"Only class and properties are supported with a when clause")}var u=e.requireElement("expression",r)}if(o){return{classRefs:o,to:s,args:[s,o],op:function(e,r,n){t.nullCheck(r,s);t.forEach(n,(function(n){t.implicitLoop(r,(function(r){if(u){e.result=r;let i=t.evaluateNoPromise(u,e);if(i){if(r instanceof Element)r.classList.add(n.className)}else{if(r instanceof Element)r.classList.remove(n.className)}e.result=null}else{if(r instanceof Element)r.classList.add(n.className)}}))}));return t.findNext(this,e)}}}else if(i){return{type:"addCmd",attributeRef:i,to:s,args:[s],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(r){if(u){e.result=r;let n=t.evaluateNoPromise(u,e);if(n){r.setAttribute(i.name,i.value)}else{r.removeAttribute(i.name)}e.result=null}else{r.setAttribute(i.name,i.value)}}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}else{return{type:"addCmd",cssDeclaration:a,to:s,args:[s,a],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(e){e.style.cssText+=n}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}}}));e.addGrammarElement("styleLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[""];var i=[];while(r.hasMore()){if(r.matchOpToken("\\")){r.consumeToken()}else if(r.matchOpToken("}")){break}else if(r.matchToken("$")){var a=r.matchOpToken("{");var o=e.parseElement("expression",r);if(a)r.requireOpToken("}");i.push(o);n.push("")}else{var s=r.consumeToken();n[n.length-1]+=r.source.substring(s.start,s.end)}n[n.length-1]+=r.lastWhitespace()}return{type:"styleLiteral",args:[i],op:function(e,t){var r="";n.forEach((function(e,n){r+=e;if(n in t)r+=t[n]}));return r},evaluate:function(e){return t.unifiedEval(this,e)}}}));e.addCommand("remove",(function(e,t,r){if(r.matchToken("remove")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("expression",r);if(a==null){e.raiseParseError(r,"Expected either a class reference, attribute expression or value expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("from")){var s=e.requireElement("expression",r)}else{if(a==null){var s=e.requireElement("implicitMeTarget",r)}}if(a){return{elementExpr:a,from:s,args:[a,s],op:function(e,r,n){t.nullCheck(r,a);t.implicitLoop(r,(function(e){if(e.parentElement&&(n==null||n.contains(e))){e.parentElement.removeChild(e)}}));return t.findNext(this,e)}}}else{return{classRefs:o,attributeRef:i,elementExpr:a,from:s,args:[o,s],op:function(e,r,n){t.nullCheck(n,s);if(r){t.forEach(r,(function(e){t.implicitLoop(n,(function(t){t.classList.remove(e.className)}))}))}else{t.implicitLoop(n,(function(e){e.removeAttribute(i.name)}))}return t.findNext(this,e)}}}}}));e.addCommand("toggle",(function(e,t,r){if(r.matchToken("toggle")){r.matchAnyToken("the","my");if(r.currentToken().type==="STYLE_REF"){let t=r.consumeToken();var n=t.value.substr(1);var a=true;var o=i(e,r,n);if(r.matchToken("of")){r.pushFollow("with");try{var s=e.requireElement("expression",r)}finally{r.popFollow()}}else{var s=e.requireElement("implicitMeTarget",r)}}else if(r.matchToken("between")){var u=true;var l=e.parseElement("classRef",r);r.requireToken("and");var c=e.requireElement("classRef",r)}else{var l=e.parseElement("classRef",r);var f=null;if(l==null){f=e.parseElement("attributeRef",r);if(f==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}else{var m=[l];while(l=e.parseElement("classRef",r)){m.push(l)}}}if(a!==true){if(r.matchToken("on")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}}if(r.matchToken("for")){var p=e.requireElement("expression",r)}else if(r.matchToken("until")){var h=e.requireElement("dotOrColonPath",r,"Expected event name");if(r.matchToken("from")){var v=e.requireElement("expression",r)}}var d={classRef:l,classRef2:c,classRefs:m,attributeRef:f,on:s,time:p,evt:h,from:v,toggle:function(e,r,n,i){t.nullCheck(e,s);if(a){t.implicitLoop(e,(function(e){o("toggle",e)}))}else if(u){t.implicitLoop(e,(function(e){if(e.classList.contains(r.className)){e.classList.remove(r.className);e.classList.add(n.className)}else{e.classList.add(r.className);e.classList.remove(n.className)}}))}else if(i){t.forEach(i,(function(r){t.implicitLoop(e,(function(e){e.classList.toggle(r.className)}))}))}else{t.forEach(e,(function(e){if(e.hasAttribute(f.name)){e.removeAttribute(f.name)}else{e.setAttribute(f.name,f.value)}}))}},args:[s,p,h,v,l,c,m],op:function(e,r,n,i,a,o,s,u){if(n){return new Promise((function(i){d.toggle(r,o,s,u);setTimeout((function(){d.toggle(r,o,s,u);i(t.findNext(d,e))}),n)}))}else if(i){return new Promise((function(n){var l=a||e.me;l.addEventListener(i,(function(){d.toggle(r,o,s,u);n(t.findNext(d,e))}),{once:true});d.toggle(r,o,s,u)}))}else{this.toggle(r,o,s,u);return t.findNext(d,e)}}};return d}}));var t={display:function(r,n,i){if(i){n.style.display=i}else if(r==="toggle"){if(getComputedStyle(n).display==="none"){t.display("show",n,i)}else{t.display("hide",n,i)}}else if(r==="hide"){const t=e.runtime.getInternalData(n);if(t.originalDisplay==null){t.originalDisplay=n.style.display}n.style.display="none"}else{const t=e.runtime.getInternalData(n);if(t.originalDisplay&&t.originalDisplay!=="none"){n.style.display=t.originalDisplay}else{n.style.removeProperty("display")}}},visibility:function(e,r,n){if(n){r.style.visibility=n}else if(e==="toggle"){if(getComputedStyle(r).visibility==="hidden"){t.visibility("show",r,n)}else{t.visibility("hide",r,n)}}else if(e==="hide"){r.style.visibility="hidden"}else{r.style.visibility="visible"}},opacity:function(e,r,n){if(n){r.style.opacity=n}else if(e==="toggle"){if(getComputedStyle(r).opacity==="0"){t.opacity("show",r,n)}else{t.opacity("hide",r,n)}}else if(e==="hide"){r.style.opacity="0"}else{r.style.opacity="1"}}};var n=function(e,t,r){var n;var i=r.currentToken();if(i.value==="when"||i.value==="with"||e.commandBoundary(i)){n=e.parseElement("implicitMeTarget",r)}else{n=e.parseElement("expression",r)}return n};var i=function(e,n,i){var a=r.defaultHideShowStrategy;var o=t;if(r.hideShowStrategies){o=Object.assign(o,r.hideShowStrategies)}i=i||a||"display";var s=o[i];if(s==null){e.raiseParseError(n,"Unknown show/hide strategy : "+i)}return s};e.addCommand("hide",(function(e,t,r){if(r.matchToken("hide")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=i(e,r,o);return{target:a,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(e){s("hide",e)}));return t.findNext(this,e)}}}}));e.addCommand("show",(function(e,t,r){if(r.matchToken("show")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=null;if(r.matchOpToken(":")){var u=r.consumeUntilWhitespace();r.matchTokenType("WHITESPACE");s=u.map((function(e){return e.value})).join("")}if(r.matchToken("when")){var l=e.requireElement("expression",r)}var c=i(e,r,o);return{target:a,when:l,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(r){if(l){e.result=r;let n=t.evaluateNoPromise(l,e);if(n){c("show",r,s)}else{c("hide",r)}e.result=null}else{c("show",r,s)}}));return t.findNext(this,e)}}}}));e.addCommand("take",(function(e,t,r){if(r.matchToken("take")){var n=e.requireElement("classRef",r);if(r.matchToken("from")){var i=e.requireElement("expression",r)}else{var i=n}if(r.matchToken("for")){var a=e.requireElement("expression",r)}else{var a=e.requireElement("implicitMeTarget",r)}var o={classRef:n,from:i,forElt:a,args:[n,i,a],op:function(e,r,n,o){t.nullCheck(n,i);t.nullCheck(o,a);var s=r.className;t.implicitLoop(n,(function(e){e.classList.remove(s)}));t.implicitLoop(o,(function(e){e.classList.add(s)}));return t.findNext(this,e)}};return o}}));function a(t,r,n,i){if(n!=null){var a=t.resolveSymbol(n,r)}else{var a=r}if(a instanceof Element||a instanceof HTMLDocument){while(a.firstChild)a.removeChild(a.firstChild);a.append(e.runtime.convertValue(i,"Fragment"));t.processNode(a)}else{if(n!=null){t.setSymbol(n,r,null,i)}else{throw"Don't know how to put a value into "+typeof r}}}e.addCommand("put",(function(e,t,r){if(r.matchToken("put")){var n=e.requireElement("expression",r);var i=r.matchAnyToken("into","before","after");if(i==null&&r.matchToken("at")){r.matchToken("the");i=r.matchAnyToken("start","end");r.requireToken("of")}if(i==null){e.raiseParseError(r,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'")}var o=e.requireElement("expression",r);var s=i.value;var u=false;var l=false;var c=null;var f=null;if(o.type==="arrayIndex"&&s==="into"){u=true;f=o.prop;c=o.root}else if(o.prop&&o.root&&s==="into"){f=o.prop.value;c=o.root}else if(o.type==="symbol"&&s==="into"){l=true;f=o.name}else if(o.type==="attributeRef"&&s==="into"){var m=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.type==="styleRef"&&s==="into"){var p=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.attribute&&s==="into"){var m=o.attribute.type==="attributeRef";var p=o.attribute.type==="styleRef";f=o.attribute.name;c=o.root}else{c=o}var h={target:o,operation:s,symbolWrite:l,value:n,args:[c,f,n],op:function(e,r,n,i){if(l){a(t,e,n,i)}else{t.nullCheck(r,c);if(s==="into"){if(m){t.implicitLoop(r,(function(e){e.setAttribute(n,i)}))}else if(p){t.implicitLoop(r,(function(e){e.style[n]=i}))}else if(u){r[n]=i}else{t.implicitLoop(r,(function(e){a(t,e,n,i)}))}}else{var o=s==="before"?Element.prototype.before:s==="after"?Element.prototype.after:s==="start"?Element.prototype.prepend:s==="end"?Element.prototype.append:Element.prototype.append;t.implicitLoop(r,(function(e){o.call(e,i instanceof Node?i:t.convertValue(i,"Fragment"));if(e.parentElement){t.processNode(e.parentElement)}else{t.processNode(e)}}))}}return t.findNext(this,e)}};return h}}));function o(e,t,r){var n;if(r.matchToken("the")||r.matchToken("element")||r.matchToken("elements")||r.currentToken().type==="CLASS_REF"||r.currentToken().type==="ID_REF"||r.currentToken().op&&r.currentToken().value==="<"){e.possessivesDisabled=true;try{n=e.parseElement("expression",r)}finally{delete e.possessivesDisabled}if(r.matchOpToken("'")){r.requireToken("s")}}else if(r.currentToken().type==="IDENTIFIER"&&r.currentToken().value==="its"){var i=r.matchToken("its");n={type:"pseudopossessiveIts",token:i,name:i.value,evaluate:function(e){return t.resolveSymbol("it",e)}}}else{r.matchToken("my")||r.matchToken("me");n=e.parseElement("implicitMeTarget",r)}return n}e.addCommand("transition",(function(e,t,n){if(n.matchToken("transition")){var i=o(e,t,n);var a=[];var s=[];var u=[];var l=n.currentToken();while(!e.commandBoundary(l)&&l.value!=="over"&&l.value!=="using"){if(n.currentToken().type==="STYLE_REF"){let e=n.consumeToken();let t=e.value.substr(1);a.push({type:"styleRefValue",evaluate:function(){return t}})}else{a.push(e.requireElement("stringLike",n))}if(n.matchToken("from")){s.push(e.requireElement("expression",n))}else{s.push(null)}n.requireToken("to");if(n.matchToken("initial")){u.push({type:"initial_literal",evaluate:function(){return"initial"}})}else{u.push(e.requireElement("expression",n))}l=n.currentToken()}if(n.matchToken("over")){var c=e.requireElement("expression",n)}else if(n.matchToken("using")){var f=e.requireElement("expression",n)}var m={to:u,args:[i,a,s,u,f,c],op:function(e,n,a,o,s,u,l){t.nullCheck(n,i);var c=[];t.implicitLoop(n,(function(e){var n=new Promise((function(n,i){var c=e.style.transition;if(l){e.style.transition="all "+l+"ms ease-in"}else if(u){e.style.transition=u}else{e.style.transition=r.defaultTransition}var f=t.getInternalData(e);var m=getComputedStyle(e);var p={};for(var h=0;he.forEach((e=>x(e))))).then((()=>n((function(){a();d.processNode(document.documentElement);e.document.addEventListener("htmx:load",(function(e){d.processNode(e.detail.elt)}))}))));function n(e){if(document.readyState!=="loading"){setTimeout(e)}else{document.addEventListener("DOMContentLoaded",e)}}function i(){var e=document.querySelector('meta[name="htmx-config"]');if(e){return f(e.content)}else{return null}}function a(){var e=i();if(e){Object.assign(r,e)}}}const x=Object.assign(y,{config:r,use(e){e(x)},internals:{lexer:E,parser:T,runtime:d,Lexer:n,Tokens:i,Parser:a,Runtime:o},ElementCollection:u,addFeature:T.addFeature.bind(T),addCommand:T.addCommand.bind(T),addLeafExpression:T.addLeafExpression.bind(T),addIndirectExpression:T.addIndirectExpression.bind(T),evaluate:d.evaluate.bind(d),parse:d.parse.bind(d),processNode:d.processNode.bind(d),browserInit:k});return x})); diff --git a/resources/public/js/main.js b/resources/public/js/main.js new file mode 100644 index 0000000..ae02ab5 --- /dev/null +++ b/resources/public/js/main.js @@ -0,0 +1 @@ +// When plain htmx isn't quite enough, you can stick some custom JS here. diff --git a/server-setup.sh b/server-setup.sh new file mode 100644 index 0000000..68d4a3e --- /dev/null +++ b/server-setup.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +set -x +set -e + +BIFF_PROFILE=${1:-prod} +CLJ_VERSION=1.11.1.1165 +TRENCH_VERSION=0.4.0 +TRENCH_FILE=trenchman_${TRENCH_VERSION}_linux_amd64.tar.gz + +echo waiting for apt to finish +while (ps aux | grep [a]pt); do + sleep 3 +done + +# Dependencies +apt-get update +apt-get upgrade +apt-get -y install default-jre rlwrap ufw git snapd +bash < <(curl -s https://download.clojure.org/install/linux-install-$CLJ_VERSION.sh) +bash < <(curl -s https://raw.githubusercontent.com/babashka/babashka/master/install) +wget https://github.com/athos/trenchman/releases/download/v$TRENCH_VERSION/$TRENCH_FILE +mkdir .trench_tmp +tar -xf $TRENCH_FILE --directory .trench_tmp +mv .trench_tmp/trench /usr/local/bin/ +rm -rf $TRENCH_FILE .trench_tmp + +# Non-root user +useradd -m app +mkdir -m 700 -p /home/app/.ssh +cp /root/.ssh/authorized_keys /home/app/.ssh +chown -R app:app /home/app/.ssh + +# Git deploys - only used if you don't have rsync on your machine +set_up_app () { + cd + mkdir repo.git + cd repo.git + git init --bare + cat > hooks/post-receive << EOD +#!/usr/bin/env bash +git --work-tree=/home/app --git-dir=/home/app/repo.git checkout -f +EOD + chmod +x hooks/post-receive +} +sudo -u app bash -c "$(declare -f set_up_app); set_up_app" + +# Systemd service +cat > /etc/systemd/system/app.service << EOD +[Unit] +Description=app +StartLimitIntervalSec=500 +StartLimitBurst=5 + +[Service] +User=app +Restart=on-failure +RestartSec=5s +Environment="BIFF_PROFILE=$BIFF_PROFILE" +WorkingDirectory=/home/app +ExecStart=/bin/sh -c "mkdir -p target/resources; clj -M:prod" + +[Install] +WantedBy=multi-user.target +EOD +systemctl enable app +cat > /etc/systemd/journald.conf << EOD +[Journal] +Storage=persistent +EOD +systemctl restart systemd-journald +cat > /etc/sudoers.d/restart-app << EOD +app ALL= NOPASSWD: /bin/systemctl reset-failed app.service +app ALL= NOPASSWD: /bin/systemctl restart app +app ALL= NOPASSWD: /usr/bin/systemctl reset-failed app.service +app ALL= NOPASSWD: /usr/bin/systemctl restart app +EOD +chmod 440 /etc/sudoers.d/restart-app + +# Firewall +ufw allow OpenSSH +ufw --force enable + +# Web dependencies +apt-get -y install nginx +snap install core +snap refresh core +snap install --classic certbot +ln -s /snap/bin/certbot /usr/bin/certbot + +# Nginx +rm /etc/nginx/sites-enabled/default +cat > /etc/nginx/sites-available/app << EOD +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name _; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + root /home/app/target/resources/public; + location / { + try_files \$uri \$uri/index.html @resources; + } + location @resources { + root /home/app/resources/public; + try_files \$uri \$uri/index.html @proxy; + } + location @proxy { + proxy_pass http://localhost:8080; + proxy_http_version 1.1; + proxy_set_header Host \$host; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header X-Real-IP \$remote_addr; + } +} +EOD +ln -s /etc/nginx/sites-{available,enabled}/app + +# Firewall +ufw allow "Nginx Full" + +# Let's encrypt +certbot --nginx + +# App dependencies +# If you need to install additional packages for your app, you can do it here. +# apt-get -y install ... diff --git a/src/com/biffweb/my_project.clj b/src/com/biffweb/my_project.clj new file mode 100644 index 0000000..d5bf9e4 --- /dev/null +++ b/src/com/biffweb/my_project.clj @@ -0,0 +1,107 @@ +(ns com.biffweb.my-project + (:require + [migratus.core :as migratus] + [clojure.test :as test] + ;; [clojure.tools.logging :as log] + [clojure.tools.namespace.repl :as tn-repl] + [com.biffweb :as biff] + [com.biffweb.my-project.app :as app] + [com.biffweb.my-project.auth-module :as auth-module] + [com.biffweb.my-project.email :as email] + [com.biffweb.my-project.home :as home] + [com.biffweb.my-project.middleware :as mid] + [com.biffweb.my-project.ui :as ui] + [com.biffweb.my-project.worker :as worker] + [taoensso.telemere :as t] + [taoensso.telemere.tools-logging :as tlog] + [taoensso.telemere.timbre :as log] + [next.jdbc :as jdbc] + [nrepl.cmdline :as nrepl-cmd]) + (:gen-class)) + +(def modules + [app/module + (auth-module/module {}) + home/module + worker/module]) + +(def routes [["" {:middleware [mid/wrap-site-defaults]} + (keep :routes modules)] + ["" {:middleware [mid/wrap-api-defaults]} + (keep :api-routes modules)]]) + +(def handler (-> (biff/reitit-handler {:routes routes}) + mid/wrap-base-defaults)) + +(def static-pages (apply biff/safe-merge (map :static modules))) + +(defn generate-assets! [_ctx] + (biff/export-rum static-pages "target/resources/public") + (biff/delete-old-files {:dir "target/resources/public" + :exts [".html"]})) + +(defn on-save [ctx] + (biff/add-libs) + (biff/eval-files! ctx) + (generate-assets! ctx) + (biff/catchall (require 'com.biffweb.my-project-test)) + (test/run-all-tests #"com.biffweb.my-project.*-test")) + +(def initial-system + {:biff/modules #'modules + :biff/merge-context-fn identity + :biff/send-email #'email/send-email + :biff/handler #'handler + :biff.beholder/on-save #'on-save + :biff.middleware/on-error #'ui/on-error + :example/chat-clients (atom #{})}) + +(defonce system (atom {})) + +(defn ctx->migratus-config [ctx] + {:store :database + :migration-dir "migrations/" + :migration-table-name "migrations" + :db {:connection (jdbc/get-connection (:example/db-url ctx)) + :managed-connection? true}}) + +(defn use-sqlite [ctx] + (let [db-url (get ctx :example/db-url) + ds (jdbc/get-datasource db-url) + migration-config (ctx->migratus-config ctx)] + + (migratus/init migration-config) + (migratus/migrate migration-config) + (assoc ctx :example/ds ds))) + +(def components + [biff/use-aero-config + use-sqlite + biff/use-queues + biff/use-htmx-refresh + biff/use-jetty + biff/use-chime + biff/use-beholder]) + +(defn start [] + (let [new-system (reduce (fn [system component] + (log/info "starting:" (str component)) + (component system)) + initial-system + components)] + (reset! system new-system) + (generate-assets! new-system) + (log/info "System started.") + (log/info "Go to" (:biff/base-url new-system)) + new-system)) + +(defn -main [] + (let [{:keys [biff.nrepl/args]} (start)] + (apply nrepl-cmd/-main args))) + +(defn refresh [] + (doseq [f (:biff/stop @system)] + (log/info "stopping:" (str f)) + (f)) + (tn-repl/refresh :after `start) + :done) diff --git a/src/com/biffweb/my_project/app.clj b/src/com/biffweb/my_project/app.clj new file mode 100644 index 0000000..3a3e5b8 --- /dev/null +++ b/src/com/biffweb/my_project/app.clj @@ -0,0 +1,64 @@ +(ns com.biffweb.my-project.app + (:require [com.biffweb :as biff] + [com.biffweb.my-project.middleware :as mid] + [com.biffweb.my-project.ui :as ui] + [honey.sql :as sql] + [com.biffweb.my-project.settings :as settings] + [next.jdbc :as jdbc])) + +(defn bar-form [{:keys [value]}] + (biff/form + {:hx-post "/app/set-bar" + :hx-swap "outerHTML"} + [:label {:for "bar"} "Bar: " + [:span (pr-str value)]] + [:div + [:input#bar {:type "text" :name "bar" :value value}] + [:button {:type "submit"} "Update"]] + "This demonstrates updating a value with HTMX.")) + +(defn set-bar [{:keys [example/ds session params] :as _ctx}] + (jdbc/execute! ds (sql/format {:update :users + :set {:bar (:bar params)} + :where [:= :id (:uid session)]})) + (biff/render (bar-form {:value (:bar params)}))) + +(defn app [{:keys [session example/ds] :as _ctx}] + (let [query (sql/format {:select [:*] + :from [:users] :where [:= :id (:uid session)]}) + {:users/keys [email bar]} (jdbc/execute-one! ds query)] + (ui/page + {} + [:header.container + [:hgroup + {:style + {:display "flex" + :align-items "center" + :justify-content "space-between"}} + "some text for " email + (biff/form + {:action "/auth/signout" + :class "inline"} + [:button {:type "submit"} + "Sign out"])]] + + (bar-form {:value bar})))) + +(def about-page + (ui/page + {:base/title (str "About " settings/app-name)} + [:p "This app was made with " + [:a {:href "https://biffweb.com"} "Biff"] "."])) + +(defn echo [{:keys [params]}] + {:status 200 + :headers {"content-type" "application/json"} + :body params}) + +(def module + {:static {"/about/" about-page} + :routes ["/app" {:middleware [mid/wrap-signed-in]} + ["" {:get app}] + + ["/set-bar" {:post set-bar}]] + :api-routes [["/api/echo" {:post echo}]]}) diff --git a/src/com/biffweb/my_project/auth_module.clj b/src/com/biffweb/my_project/auth_module.clj new file mode 100644 index 0000000..20fa270 --- /dev/null +++ b/src/com/biffweb/my_project/auth_module.clj @@ -0,0 +1,225 @@ +(ns com.biffweb.my-project.auth-module + (:require + [com.biffweb :as biff] + [com.biffweb.my-project.util.db :as db] + [honey.sql :as sql] + [next.jdbc :as jdbc])) + +(defn email-valid? [_ctx email] + (and email + (re-matches #".+@.+\..+" email) + (not (re-find #"\s" email)))) + +(defn new-link [{:keys [biff.auth/check-state + biff/base-url + biff/secret + anti-forgery-token]} + email] + (str base-url "/auth/verify-link/" + (biff/jwt-encrypt + (cond-> {:intent "signin" + :email email + :exp-in (* 60 60)} + check-state (assoc :state (biff/sha256 anti-forgery-token))) + (secret :biff/jwt-secret)))) + +(defn new-code [length] + ;; We use (SecureRandom.) instead of (SecureRandom/getInstanceStrong) because + ;; the latter can block, and on some shared hosts often does. Blocking is + ;; fine for e.g. generating environment variables in a new project, but we + ;; don't want to block here. + ;; https://tersesystems.com/blog/2015/12/17/the-right-way-to-use-securerandom/ + (let [rng (java.security.SecureRandom.)] + (format (str "%0" length "d") + (.nextInt rng (dec (int (Math/pow 10 length))))))) + +(defn send-link! [{:keys [biff.auth/email-validator + biff/send-email + params] + :as ctx}] + (let [email (biff/normalize-email (:email params)) + url (new-link ctx email) + user-id (delay (db/get-user-id ctx email))] + (cond + (not (email-validator ctx email)) + {:success false :error "invalid-email"} + + (not (send-email ctx + {:template :signin-link + :to email + :url url + :user-exists (some? @user-id)})) + {:success false :error "send-failed"} + + :else + {:success true :email email :user-id @user-id}))) + +(defn verify-link [{:keys [biff.auth/check-state + biff/secret + path-params + params + anti-forgery-token]}] + (let [{:keys [intent email state]} (-> (merge params path-params) + :token + (biff/jwt-decrypt (secret :biff/jwt-secret))) + valid-state (= state (biff/sha256 anti-forgery-token)) + valid-email (= email (:email params))] + (cond + (not= intent "signin") + {:success false :error "invalid-link"} + + (or (not check-state) valid-state valid-email) + {:success true :email email} + + (some? (:email params)) + {:success false :error "invalid-email"} + + :else + {:success false :error "invalid-state"}))) + +(defn send-code! [{:keys [biff.auth/email-validator + biff/send-email + params] + :as ctx}] + (let [email (biff/normalize-email (:email params)) + code (new-code 6) + user-id (delay (db/get-user-id ctx email))] + (cond + (not (email-validator ctx email)) + {:success false :error "invalid-email"} + + (not (send-email ctx + {:template :signin-code + :to email + :code code + :user-exists (some? @user-id)})) + {:success false :error "send-failed"} + + :else + {:success true :email email :code code :user-id @user-id}))) + +;;; HANDLERS ------------------------------------------------------------------- + +(defn send-link-handler [{:keys [biff.auth/single-opt-in + example/ds + params] + :as ctx}] + (let [{:keys [success error email user-id]} (send-link! ctx)] + (when (and success single-opt-in (not user-id)) + (jdbc/execute! ds (db/new-user-statement email))) + {:status 303 + :headers {"location" (if success + (str "/link-sent?email=" (:email params)) + (str (:on-error params "/") "?error=" error))}})) + +(defn verify-link-handler [{:keys [biff.auth/app-path + biff.auth/invalid-link-path + example/ds + session + params + path-params] + :as ctx}] + (let [{:keys [success error email]} (verify-link ctx) + existing-user-id (when success (db/get-user-id ctx email)) + token (:token (merge params path-params))] + (when (and success (not existing-user-id)) + (jdbc/execute! ds (db/new-user-statement email))) + {:status 303 + :headers {"location" (cond + success + app-path + + (= error "invalid-state") + (str "/verify-link?token=" token) + + (= error "invalid-email") + (str "/verify-link?error=incorrect-email&token=" token) + + :else + invalid-link-path)} + :session (cond-> session + success (assoc :uid (or existing-user-id + (db/get-user-id ctx email))))})) + +(defn send-code-handler [{:keys [biff.auth/single-opt-in + params] + :as ctx}] + (let [{:keys [success error email code user-id]} (send-code! ctx) + statements (when success + (concat + [[(str "INSERT INTO auth_code (id, email, code, created_at, failed_attempts) VALUES (?, ?, ?, ?, ?) " + "ON CONFLICT (email) DO UPDATE " + "SET (code, created_at, failed_attempts) = (EXCLUDED.code, EXCLUDED.created_at, EXCLUDED.failed_attempts)") + (random-uuid) email code (java.sql.Timestamp. (System/currentTimeMillis)) 0]] + (when (and single-opt-in (not user-id)) + [(db/new-user-statement email)])))] + (db/execute-all! ctx statements) + {:status 303 + :headers {"location" (if success + (str "/verify-code?email=" (:email params)) + (str (:on-error params "/") "?error=" error))}})) + +(defn verify-code-handler [{:keys [biff.auth/app-path + example/ds + params + session] + :as ctx}] + (let [email (biff/normalize-email (:email params)) + code (jdbc/execute-one! ds (sql/format {:select :* + :from :auth_code + :where [:= :email email]})) + _ (println code) + success (and (some? code) + (< (:auth_code/failed_attempts code) 3) + (not (biff/elapsed? (java.util.Date. (:auth_code/created_at code)) :now 3 :minutes)) + (= (:code params) (:auth_code/code code))) + existing-user-id (when success (db/get-user-id ctx email)) + statements (cond + success + (concat [(sql/format {:delete-from :auth_code + :where [:= :id (:auth_code/id code)]})] + + (when-not existing-user-id + [(db/new-user-statement email)])) + + (and (not success) + (some? code) + (< (:auth_code/failed_attempts code) 3)) + [(sql/format {:update :auth_code + :set {:failed_attempts (inc (:auth_code/failed_attempts code))} + :where [:= :id (:auth_code/id code)]})])] + (db/execute-all! ctx statements) + (if success + {:status 303 + :headers {"location" app-path} + :session (assoc session :uid (or existing-user-id + (db/get-user-id ctx email)))} + {:status 303 + :headers {"location" (str "/verify-code?error=invalid-code&email=" email)}}))) + +(defn signout [{:keys [session]}] + {:status 303 + :headers {"location" "/"} + :session (dissoc session :uid)}) + +;;; ---------------------------------------------------------------------------- + +(def default-options + #:biff.auth{:app-path "/app" + :invalid-link-path "/signin?error=invalid-link" + :check-state true + :single-opt-in false + :email-validator email-valid?}) + +(defn wrap-options [handler options] + (fn [ctx] + (handler (merge options ctx)))) + +(defn module [options] + {:routes [["/auth" {:middleware [[wrap-options (merge default-options options)]]} + ["/send-link" {:post send-link-handler}] + ["/verify-link/:token" {:get verify-link-handler}] + ["/verify-link" {:post verify-link-handler}] + ["/send-code" {:post send-code-handler}] + ["/verify-code" {:post verify-code-handler}] + ["/signout" {:post signout}]]]}) diff --git a/src/com/biffweb/my_project/email.clj b/src/com/biffweb/my_project/email.clj new file mode 100644 index 0000000..8d2aa72 --- /dev/null +++ b/src/com/biffweb/my_project/email.clj @@ -0,0 +1,90 @@ +(ns com.biffweb.my-project.email + (:require [camel-snake-kebab.core :as csk] + [camel-snake-kebab.extras :as cske] + [clj-http.client :as http] + [com.biffweb.my-project.settings :as settings] + [clojure.tools.logging :as log] + [rum.core :as rum])) + +(defn signin-link [{:keys [to url user-exists]}] + (let [[subject action] (if user-exists + [(str "Sign in to " settings/app-name) "sign in"] + [(str "Sign up for " settings/app-name) "sign up"])] + {:to to + :subject subject + :html-body (rum/render-static-markup + [:html + [:body + [:p "We received a request to " action " to " settings/app-name + " using this email address. Click this link to " action " :"] + [:p [:a {:href url :target "_blank"} "Click here to " action "."]] + [:p "This link will expire in one hour. " + "If you did not request this link, you can ignore this email."]]]) + :text-body (str "We received a request to " action " to " settings/app-name + " using this email address. Click this link to " action ":\n" + "\n" + url "\n" + "\n" + "This link will expire in one hour. If you did not request this link, " + "you can ignore this email.") + :message-stream "outbound"})) + +(defn signin-code [{:keys [to code user-exists]}] + (let [[subject action] (if user-exists + [(str "Sign in to " settings/app-name) "sign in"] + [(str "Sign up for " settings/app-name) "sign up"])] + {:to to + :subject subject + :html-body (rum/render-static-markup + [:html + [:body + [:p "We received a request to " action " to " settings/app-name + " using this email address. Enter the following code to " action ":"] + [:p {:style {:font-size "2rem"}} code] + [:p + "This code will expire in three minutes. " + "If you did not request this code, you can ignore this email."]]]) + :text-body (str "We received a request to " action " to " settings/app-name + " using this email address. Enter the following code to " action ":\n" + "\n" + code "\n" + "\n" + "This code will expire in three minutes. If you did not request this code, " + "you can ignore this email.") + :message-stream "outbound"})) + +(defn template [k opts] + ((case k + :signin-link signin-link + :signin-code signin-code) + opts)) + +(defn send-postmark [{:keys [biff/secret postmark/from]} form-params] + (let [result (http/post "https://api.postmarkapp.com/email" + {:headers {"X-Postmark-Server-Token" (secret :postmark/api-key)} + :as :json + :content-type :json + :form-params (merge {:from from} (cske/transform-keys csk/->PascalCase form-params)) + :throw-exceptions false}) + success (< (:status result) 400)] + (when-not success + (log/error (:body result))) + success)) + +(defn send-console [_ctx form-params] + (println "TO:" (:to form-params)) + (println "SUBJECT:" (:subject form-params)) + (println) + (println (:text-body form-params)) + (println) + (println "To send emails instead of printing them to the console, add your" + "API key for Postmark to config.env.") + true) + +(defn send-email [{:keys [biff/secret] :as ctx} opts] + (let [form-params (if-some [template-key (:template opts)] + (template template-key opts) + opts)] + (if (every? some? [(secret :postmark/api-key)]) + (send-postmark ctx form-params) + (send-console ctx form-params)))) diff --git a/src/com/biffweb/my_project/home.clj b/src/com/biffweb/my_project/home.clj new file mode 100644 index 0000000..a041235 --- /dev/null +++ b/src/com/biffweb/my_project/home.clj @@ -0,0 +1,126 @@ +(ns com.biffweb.my-project.home + (:require + [com.biffweb :as biff] + [com.biffweb.my-project.middleware :as mid] + [com.biffweb.my-project.ui :as ui] + [com.biffweb.my-project.settings :as settings])) + +(defn home-page [{:keys [params] :as ctx}] + (ui/page + ctx + [:article + (biff/form + {:action "/auth/send-link" + :id "signup" + :hidden {:on-error "/"}} + [:h2 (str "Sign up for " settings/app-name)] + [:fieldset {:role "group"} + [:input#email {:name "email" + :type "email" + :autocomplete "email" + :placeholder "Enter your email address"}] + [:input + {:type "submit" + :value "Sign up"}]] + + (when-some [error (:error params)] + [:<> + [:p.pico-color-red-500 + (case error + "invalid-email" "Invalid email. Try again with a different address." + "send-failed" (str "We weren't able to send an email to that address. " + "If the problem persists, try another address.") + "There was an error.")]]) + [:small "Already have an account? " [:a.link {:href "/signin"} "Sign in"] "."])])) + +(defn link-sent [{:keys [params] :as ctx}] + (ui/page + ctx + [:h2 "Check your inbox"] + [:p "We've sent a sign-in link to " [:span.font-bold (:email params)] "."])) + +(defn verify-email-page [{:keys [params] :as ctx}] + (ui/page + ctx + [:article + [:h2 (str "Sign up for " settings/app-name)] + (biff/form + {:action "/auth/verify-link" + :hidden {:token (:token params)}} + [:div [:label {:for "email"} + "It looks like you opened this link on a different device or browser than the one " + "you signed up on. For verification, please enter the email you signed up with:"]] + [:fieldset {:role "group"} + [:input#email {:name "email" + :type "email" + :autocomplete "email" + :placeholder "Enter your email address"}] + [:input + {:type "submit" + :value "Sign in"}]]) + (when-some [error (:error params)] + [:small.pico-color-red-500 + (case error + "incorrect-email" "Incorrect email address. Try again." + "There was an error.")])])) + +(defn signin-page [{:keys [params] :as ctx}] + (ui/page + ctx + [:article + (biff/form + {:action "/auth/send-code" + :id "signin" + :hidden {:on-error "/signin"}} + [:h2 "Sign in to " settings/app-name] + [:fieldset {:role "group"} + [:input#email {:name "email" + :type "email" + :autocomplete "email" + :placeholder "Enter your email address"}] + [:input + {:type "submit" + :value "Sign in"}]] + + (when-some [error (:error params)] + [:div + [:small.pico-color-red-500 + (case error + "invalid-email" "Invalid email. Try again with a different address." + "send-failed" (str "We weren't able to send an email to that address. " + "If the problem persists, try another address.") + "invalid-link" "Invalid or expired link. Sign in to get a new link." + "not-signed-in" "You must be signed in to view that page." + "There was an error.")]]) + [:small "Don't have an account yet? " [:a.link {:href "/"} "Sign up"] "."])])) + +(defn enter-code-page [{:keys [params] :as ctx}] + (ui/page + ctx + [:article + (biff/form + {:action "/auth/verify-code" + :id "code-form" + :hidden {:email (:email params)}} + [:div [:label {:for "code"} "Enter the 6-digit code that we sent to " + [:span.font-bold (:email params)]]] + [:input#code {:name "code" :type "text"}] + (when-some [error (:error params)] + [:small.pico-color-red-500 + (case error + "invalid-code" "Invalid code." + "There was an error.")])) + + (biff/form + {:action "/auth/send-code" + :id "signin" + :hidden {:email (:email params) + :on-error "/signin"}})])) + +(def module + {:routes [["" {:middleware [mid/wrap-redirect-signed-in]} + ["/" {:get home-page}]] + ["/link-sent" {:get link-sent}] + ["/verify-link" {:get verify-email-page}] + ["/signin" {:get signin-page}] + ["/verify-code" {:get enter-code-page}]]}) diff --git a/src/com/biffweb/my_project/middleware.clj b/src/com/biffweb/my_project/middleware.clj new file mode 100644 index 0000000..60d3c85 --- /dev/null +++ b/src/com/biffweb/my_project/middleware.clj @@ -0,0 +1,63 @@ +(ns com.biffweb.my-project.middleware + (:require [com.biffweb :as biff] + [muuntaja.middleware :as muuntaja] + [ring.middleware.anti-forgery :as csrf] + [ring.middleware.defaults :as rd])) + +(defn wrap-redirect-signed-in [handler] + (fn [{:keys [session] :as ctx}] + (if (some? (:uid session)) + {:status 303 + :headers {"location" "/app"}} + (handler ctx)))) + +(defn wrap-signed-in [handler] + (fn [{:keys [session] :as ctx}] + (if (some? (:uid session)) + (handler ctx) + {:status 303 + :headers {"location" "/signin?error=not-signed-in"}}))) + +;; Stick this function somewhere in your middleware stack below if you want to +;; inspect what things look like before/after certain middleware fns run. +#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]} +(defn wrap-debug [handler] + (fn [ctx] + (let [response (handler ctx)] + (println "REQUEST") + (biff/pprint ctx) + #_{:clj-kondo/ignore [:inline-def :clojure-lsp/unused-public-var]} + (def ctx* ctx) + (println "RESPONSE") + (biff/pprint response) + #_{:clj-kondo/ignore [:inline-def :clojure-lsp/unused-public-var]} + (def response* response) + response))) + +(defn wrap-site-defaults [handler] + (-> handler + biff/wrap-render-rum + biff/wrap-anti-forgery-websockets + csrf/wrap-anti-forgery + biff/wrap-session + muuntaja/wrap-params + muuntaja/wrap-format + (rd/wrap-defaults (-> rd/site-defaults + (assoc-in [:security :anti-forgery] false) + (assoc-in [:responses :absolute-redirects] true) + (assoc :session false) + (assoc :static false))))) + +(defn wrap-api-defaults [handler] + (-> handler + muuntaja/wrap-params + muuntaja/wrap-format + (rd/wrap-defaults rd/api-defaults))) + +(defn wrap-base-defaults [handler] + (-> handler + biff/wrap-https-scheme + biff/wrap-resource + biff/wrap-internal-error + biff/wrap-ssl + biff/wrap-log-requests)) diff --git a/src/com/biffweb/my_project/settings.clj b/src/com/biffweb/my_project/settings.clj new file mode 100644 index 0000000..27377cd --- /dev/null +++ b/src/com/biffweb/my_project/settings.clj @@ -0,0 +1,3 @@ +(ns com.biffweb.my-project.settings) + +(def app-name "my_project") diff --git a/src/com/biffweb/my_project/ui.clj b/src/com/biffweb/my_project/ui.clj new file mode 100644 index 0000000..0870df9 --- /dev/null +++ b/src/com/biffweb/my_project/ui.clj @@ -0,0 +1,85 @@ +(ns com.biffweb.my-project.ui + (:require [cheshire.core :as cheshire] + [com.biffweb.my-project.settings :as settings] + [ring.middleware.anti-forgery :as csrf] + [rum.core :as rum])) + +(defn the-base-html + [{:base/keys [title + description + lang + image + icon + url + canonical + _font-families + head]} + & contents] + [:html + {:lang lang + :style {:min-height "100%" + :height "auto"}} + [:head + [:title title] + [:meta {:name "description" :content description}] + [:meta {:content title :property "og:title"}] + [:meta {:content description :property "og:description"}] + (when image + [:<> + [:meta {:content image :property "og:image"}] + [:meta {:content "summary_large_image" :name "twitter:card"}]]) + (when-some [url (or url canonical)] + [:meta {:content url :property "og:url"}]) + (when-some [url (or canonical url)] + [:link {:ref "canonical" :href url}]) + [:meta {:name "viewport" :content "width=device-width, initial-scale=1"}] + (when icon + [:link {:rel "icon" + :type "image/png" + :sizes "16x16" + :href icon}]) + [:meta {:charset "utf-8"}] + (into [:<>] head)] + [:body + [:main.container + contents]]]) + +(defn base [ctx & body] + (apply + the-base-html + (-> ctx + (merge #:base{:title settings/app-name + :lang "en-US" + :icon "/img/glider.png" + :description (str settings/app-name " Description") + :image "https://clojure.org/images/clojure-logo-120b.png"}) + (update :base/head (fn [head] + (concat [[:link {:rel "stylesheet" :href "/css/pico.min.css"}] + [:link {:rel "stylesheet" :href "/css/pico.colors.min.css"}] + [:script {:src "/js/main.js"}] + [:script {:src "/js/htmx-1.9.11.min.js"}] + [:script {:src "/js/htmx-1.9.11-ext-ws.min.js"}] + [:script {:src "/js/htmx-1.9.11-ext-multi-swap.min.js"}] + [:script {:src "/js/hyperscript-0.9.8.min.js"}]] + head)))) + body)) + +(defn page [ctx & body] + (base + ctx + [:div + (when (bound? #'csrf/*anti-forgery-token*) + {:hx-headers (cheshire/generate-string + {:x-csrf-token csrf/*anti-forgery-token*})}) + body])) + +(defn on-error [{:keys [status _ex] :as ctx}] + {:status status + :headers {"content-type" "text/html"} + :body (rum/render-static-markup + (page + ctx + [:h1 + (if (= status 404) + "Page not found." + "Something went wrong.")]))}) diff --git a/src/com/biffweb/my_project/util/db.clj b/src/com/biffweb/my_project/util/db.clj new file mode 100644 index 0000000..80a5949 --- /dev/null +++ b/src/com/biffweb/my_project/util/db.clj @@ -0,0 +1,24 @@ +(ns com.biffweb.my-project.util.db + (:require [next.jdbc :as jdbc] + [honey.sql :as sql])) + +(defn execute-all! [{:keys [example/ds]} statements] + (when (not-empty statements) + (jdbc/with-transaction [tx ds] + (doseq [statement statements] + (jdbc/execute! tx statement))))) + +(defn new-user-statement [email] + (sql/format {:insert-into :users + :columns [:id :email] + :values [[(random-uuid) email]] + :on-conflict :email + :do-nothing true})) + +(defn get-user-id [{:keys [example/ds]} email] + (-> (jdbc/execute! ds (sql/format {:select :id + :from :users + :where [:= :email email]})) + + first + :users/id)) diff --git a/src/com/biffweb/my_project/worker.clj b/src/com/biffweb/my_project/worker.clj new file mode 100644 index 0000000..11eee23 --- /dev/null +++ b/src/com/biffweb/my_project/worker.clj @@ -0,0 +1,27 @@ +(ns com.biffweb.my-project.worker + (:require [clojure.tools.logging :as log] + [com.biffweb :as biff] + [honey.sql :as sql] + [next.jdbc :as jdbc])) + +(defn every-n-minutes [n] + (iterate #(biff/add-seconds % (* 60 n)) (java.util.Date.))) + +(defn print-usage [{:keys [example/ds]}] + ;; For a real app, you can have this run once per day and send you the output + ;; in an email. + (let [n-users (:count (jdbc/execute-one! ds + (sql/format {:select [[[:count :*] :count]] + :from :users})))] + (log/info "There are" n-users "users."))) + +(defn echo-consumer [{:keys [biff/job] :as _ctx}] + (prn :echo job) + (when-some [callback (:biff/callback job)] + (callback job))) + +(def module + {:tasks [{:task #'print-usage + :schedule #(every-n-minutes 5)}] + :queues [{:id :echo + :consumer #'echo-consumer}]}) diff --git a/test/com/biffweb/my_project_test.clj b/test/com/biffweb/my_project_test.clj new file mode 100644 index 0000000..3238c51 --- /dev/null +++ b/test/com/biffweb/my_project_test.clj @@ -0,0 +1,6 @@ +(ns com.biffweb.my-project-test + ;; If you add more test files, require them here so that they'll get loaded by com.biffweb.my-project/on-save + (:require [clojure.test :refer [deftest is]])) + +(deftest example-test + (is (= 4 (+ 2 2))))