From b7ed0e7d5b8719b5a27d455059f4d087ca435a1e Mon Sep 17 00:00:00 2001 From: Evan Jarrett Date: Sat, 17 Jan 2026 10:38:35 -0600 Subject: [PATCH] more pagespeed improvements, improve routing handler logic --- cmd/appview/serve.go | 13 +- pkg/appview/handlers/api.go | 31 +-- pkg/appview/handlers/auth.go | 6 +- pkg/appview/handlers/base.go | 41 ++++ pkg/appview/handlers/delete.go | 6 +- pkg/appview/handlers/delete_test.go | 48 ++-- pkg/appview/handlers/device.go | 30 +-- pkg/appview/handlers/device_test.go | 47 ++-- pkg/appview/handlers/errors.go | 3 +- pkg/appview/handlers/export.go | 5 +- pkg/appview/handlers/home.go | 18 +- pkg/appview/handlers/images.go | 13 +- pkg/appview/handlers/images_test.go | 4 +- pkg/appview/handlers/install.go | 4 +- pkg/appview/handlers/learn_more.go | 23 ++ pkg/appview/handlers/learn_more_test.go | 101 ++++++++ pkg/appview/handlers/legal.go | 11 +- pkg/appview/handlers/legal_test.go | 40 ++-- pkg/appview/handlers/logout.go | 2 +- pkg/appview/handlers/logout_test.go | 4 +- pkg/appview/handlers/manifest_health.go | 6 +- pkg/appview/handlers/opengraph.go | 15 +- pkg/appview/handlers/repository.go | 26 +- pkg/appview/handlers/search.go | 12 +- pkg/appview/handlers/settings.go | 12 +- pkg/appview/handlers/storage.go | 5 +- pkg/appview/handlers/user.go | 12 +- pkg/appview/public/amathea_manatee-1152w.webp | Bin 0 -> 31296 bytes pkg/appview/public/amathea_manatee-576w.webp | Bin 0 -> 13448 bytes pkg/appview/public/amathea_manatee-768w.webp | Bin 0 -> 18662 bytes pkg/appview/public/css/style.css | 2 +- pkg/appview/routes/routes.go | 222 +++++------------- pkg/appview/src/css/main.css | 2 +- pkg/appview/templates/components/head.html | 30 ++- pkg/appview/templates/components/hero.html | 19 +- pkg/appview/templates/pages/learn-more.html | 186 +++++++++++++++ pkg/appview/ui.go | 34 +++ 37 files changed, 633 insertions(+), 400 deletions(-) create mode 100644 pkg/appview/handlers/base.go create mode 100644 pkg/appview/handlers/learn_more.go create mode 100644 pkg/appview/handlers/learn_more_test.go create mode 100644 pkg/appview/public/amathea_manatee-1152w.webp create mode 100644 pkg/appview/public/amathea_manatee-576w.webp create mode 100644 pkg/appview/public/amathea_manatee-768w.webp create mode 100644 pkg/appview/templates/pages/learn-more.html diff --git a/cmd/appview/serve.go b/cmd/appview/serve.go index 07ff3ad..8cb3474 100644 --- a/cmd/appview/serve.go +++ b/cmd/appview/serve.go @@ -369,10 +369,11 @@ func serveRegistry(cmd *cobra.Command, args []string) error { slog.Info("Registered dynamic root file routes", "count", len(rootFiles), "files", rootFiles) } - // Mount subdirectory routes with clean paths - mainRouter.Handle("/css/*", http.StripPrefix("/css/", appview.PublicSubdir("css"))) - mainRouter.Handle("/js/*", http.StripPrefix("/js/", appview.PublicSubdir("js"))) - mainRouter.Handle("/static/*", http.StripPrefix("/static/", appview.PublicSubdir("static"))) + // Mount subdirectory routes with clean paths and long cache headers (1 year) + // Cache busting is handled via query string hashes in templates + mainRouter.Handle("/css/*", appview.CacheMiddleware(http.StripPrefix("/css/", appview.PublicSubdir("css")), 31536000)) + mainRouter.Handle("/js/*", appview.CacheMiddleware(http.StripPrefix("/js/", appview.PublicSubdir("js")), 31536000)) + mainRouter.Handle("/static/*", appview.CacheMiddleware(http.StripPrefix("/static/", appview.PublicSubdir("static")), 31536000)) slog.Info("UI enabled", "home", "/", "settings", "/settings") } @@ -448,11 +449,11 @@ func serveRegistry(cmd *cobra.Command, args []string) error { // Device authorization endpoints (public) mainRouter.Handle("/auth/device/code", &uihandlers.DeviceCodeHandler{ - Store: deviceStore, + BaseUIHandler: uihandlers.BaseUIHandler{DeviceStore: deviceStore}, AppViewBaseURL: baseURL, }) mainRouter.Handle("/auth/device/token", &uihandlers.DeviceTokenHandler{ - Store: deviceStore, + BaseUIHandler: uihandlers.BaseUIHandler{DeviceStore: deviceStore}, }) slog.Info("Auth endpoints enabled", diff --git a/pkg/appview/handlers/api.go b/pkg/appview/handlers/api.go index a04cfd8..1ba0f1a 100644 --- a/pkg/appview/handlers/api.go +++ b/pkg/appview/handlers/api.go @@ -2,7 +2,6 @@ package handlers import ( "bytes" - "database/sql" "errors" "fmt" "html/template" @@ -12,18 +11,13 @@ import ( "atcr.io/pkg/appview/db" "atcr.io/pkg/appview/middleware" "atcr.io/pkg/atproto" - "atcr.io/pkg/auth/oauth" - "github.com/bluesky-social/indigo/atproto/identity" "github.com/go-chi/chi/v5" "github.com/go-chi/render" ) // StarRepositoryHandler handles starring a repository type StarRepositoryHandler struct { - DB *sql.DB - Directory identity.Directory - Refresher *oauth.Refresher - Templates *template.Template + BaseUIHandler } func (h *StarRepositoryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -70,7 +64,7 @@ func (h *StarRepositoryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request // Check if HTMX request - return HTML component if r.Header.Get("HX-Request") == "true" && h.Templates != nil { // Get current star count and do optimistic increment - stats, _ := db.GetRepositoryStats(h.DB, ownerDID, repository) + stats, _ := db.GetRepositoryStats(h.ReadOnlyDB, ownerDID, repository) starCount := 0 if stats != nil { starCount = stats.StarCount @@ -88,10 +82,7 @@ func (h *StarRepositoryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request // UnstarRepositoryHandler handles unstarring a repository type UnstarRepositoryHandler struct { - DB *sql.DB - Directory identity.Directory - Refresher *oauth.Refresher - Templates *template.Template + BaseUIHandler } func (h *UnstarRepositoryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -140,7 +131,7 @@ func (h *UnstarRepositoryHandler) ServeHTTP(w http.ResponseWriter, r *http.Reque // Check if HTMX request - return HTML component if r.Header.Get("HX-Request") == "true" && h.Templates != nil { // Get current star count and do optimistic decrement - stats, _ := db.GetRepositoryStats(h.DB, ownerDID, repository) + stats, _ := db.GetRepositoryStats(h.ReadOnlyDB, ownerDID, repository) starCount := 0 if stats != nil { starCount = stats.StarCount @@ -159,9 +150,7 @@ func (h *UnstarRepositoryHandler) ServeHTTP(w http.ResponseWriter, r *http.Reque // CheckStarHandler checks if current user has starred a repository type CheckStarHandler struct { - DB *sql.DB - Directory identity.Directory - Refresher *oauth.Refresher + BaseUIHandler } func (h *CheckStarHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -208,8 +197,7 @@ func (h *CheckStarHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // GetStatsHandler returns repository statistics type GetStatsHandler struct { - DB *sql.DB - Directory identity.Directory + BaseUIHandler } func (h *GetStatsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -225,7 +213,7 @@ func (h *GetStatsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Get repository stats from database - stats, err := db.GetRepositoryStats(h.DB, ownerDID, repository) + stats, err := db.GetRepositoryStats(h.ReadOnlyDB, ownerDID, repository) if err != nil { http.Error(w, "Failed to fetch stats", http.StatusInternalServerError) return @@ -237,8 +225,7 @@ func (h *GetStatsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // ManifestDetailHandler returns detailed manifest information including platforms type ManifestDetailHandler struct { - DB *sql.DB - Directory identity.Directory + BaseUIHandler } func (h *ManifestDetailHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -255,7 +242,7 @@ func (h *ManifestDetailHandler) ServeHTTP(w http.ResponseWriter, r *http.Request } // Get manifest detail from database - manifest, err := db.GetManifestDetail(h.DB, ownerDID, repository, digest) + manifest, err := db.GetManifestDetail(h.ReadOnlyDB, ownerDID, repository, digest) if err != nil { if err.Error() == "manifest not found" { http.Error(w, "Manifest not found", http.StatusNotFound) diff --git a/pkg/appview/handlers/auth.go b/pkg/appview/handlers/auth.go index 4aaea70..3c5bb0d 100644 --- a/pkg/appview/handlers/auth.go +++ b/pkg/appview/handlers/auth.go @@ -1,14 +1,13 @@ package handlers import ( - "html/template" "log/slog" "net/http" ) // LoginHandler shows the OAuth login form type LoginHandler struct { - Templates *template.Template + BaseUIHandler } func (h *LoginHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -19,9 +18,11 @@ func (h *LoginHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } data := struct { + PageData ReturnTo string Error string }{ + PageData: NewPageData(r, h.RegistryURL), ReturnTo: returnTo, Error: r.URL.Query().Get("error"), } @@ -34,6 +35,7 @@ func (h *LoginHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // LoginSubmitHandler processes the login form submission type LoginSubmitHandler struct { + BaseUIHandler } func (h *LoginSubmitHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/base.go b/pkg/appview/handlers/base.go new file mode 100644 index 0000000..f1f9df6 --- /dev/null +++ b/pkg/appview/handlers/base.go @@ -0,0 +1,41 @@ +package handlers + +import ( + "database/sql" + "html/template" + + "atcr.io/pkg/appview/db" + "atcr.io/pkg/appview/holdhealth" + "atcr.io/pkg/appview/readme" + "atcr.io/pkg/auth/oauth" + "github.com/bluesky-social/indigo/atproto/identity" +) + +// BaseUIHandler contains all dependencies for UI handlers. +// Handlers embed this and use whatever fields they need. +// Route registration becomes simply &Handler{base} for everything. +type BaseUIHandler struct { + // Display + Templates *template.Template + RegistryURL string + + // Database (handlers choose which to use) + DB *sql.DB // Write access + ReadOnlyDB *sql.DB // Read-only access + + // Services + Refresher *oauth.Refresher + HealthChecker *holdhealth.Checker + ReadmeFetcher *readme.Fetcher + Directory identity.Directory + + // Stores + SessionStore *db.SessionStore + DeviceStore *db.DeviceStore + OAuthStore *db.OAuthStore + + // Config + DefaultHoldDID string + CompanyName string + Jurisdiction string +} diff --git a/pkg/appview/handlers/delete.go b/pkg/appview/handlers/delete.go index 676cafa..cbe8bc9 100644 --- a/pkg/appview/handlers/delete.go +++ b/pkg/appview/handlers/delete.go @@ -2,7 +2,6 @@ package handlers import ( "context" - "database/sql" "encoding/json" "fmt" "io" @@ -15,7 +14,6 @@ import ( "atcr.io/pkg/appview/middleware" "atcr.io/pkg/atproto" "atcr.io/pkg/auth" - "atcr.io/pkg/auth/oauth" ) // DeleteAccountRequest represents the GDPR account deletion request @@ -48,9 +46,7 @@ type HoldDeleteResult struct { // DeleteAccountHandler handles GDPR account deletion requests type DeleteAccountHandler struct { - DB *sql.DB - OAuthStore *db.OAuthStore - Refresher *oauth.Refresher + BaseUIHandler } func (h *DeleteAccountHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/delete_test.go b/pkg/appview/handlers/delete_test.go index 8fb019b..0674f36 100644 --- a/pkg/appview/handlers/delete_test.go +++ b/pkg/appview/handlers/delete_test.go @@ -18,9 +18,11 @@ func TestDeleteAccountHandler_Unauthorized(t *testing.T) { defer database.Close() handler := &DeleteAccountHandler{ - DB: database, - OAuthStore: nil, - Refresher: nil, + BaseUIHandler: BaseUIHandler{ + DB: database, + OAuthStore: nil, + Refresher: nil, + }, } reqBody := DeleteAccountRequest{ @@ -55,9 +57,11 @@ func TestDeleteAccountHandler_MissingConfirmation(t *testing.T) { } handler := &DeleteAccountHandler{ - DB: database, - OAuthStore: nil, - Refresher: nil, + BaseUIHandler: BaseUIHandler{ + DB: database, + OAuthStore: nil, + Refresher: nil, + }, } // Request without confirmation @@ -93,9 +97,11 @@ func TestDeleteAccountHandler_WrongConfirmation(t *testing.T) { } handler := &DeleteAccountHandler{ - DB: database, - OAuthStore: nil, - Refresher: nil, + BaseUIHandler: BaseUIHandler{ + DB: database, + OAuthStore: nil, + Refresher: nil, + }, } tests := []struct { @@ -158,9 +164,11 @@ func TestDeleteAccountHandler_SuccessfulDeletion(t *testing.T) { oauthStore := db.NewOAuthStore(database) handler := &DeleteAccountHandler{ - DB: database, - OAuthStore: oauthStore, - Refresher: nil, // No remote operations in this test + BaseUIHandler: BaseUIHandler{ + DB: database, + OAuthStore: oauthStore, + Refresher: nil, // No remote operations in this test + }, } reqBody := DeleteAccountRequest{ @@ -226,9 +234,11 @@ func TestDeleteAccountHandler_InvalidJSON(t *testing.T) { } handler := &DeleteAccountHandler{ - DB: database, - OAuthStore: nil, - Refresher: nil, + BaseUIHandler: BaseUIHandler{ + DB: database, + OAuthStore: nil, + Refresher: nil, + }, } req := httptest.NewRequest("DELETE", "/api/account", bytes.NewReader([]byte("not json"))) @@ -277,9 +287,11 @@ func TestDeleteAccountHandler_DeletesHoldMembershipData(t *testing.T) { oauthStore := db.NewOAuthStore(database) handler := &DeleteAccountHandler{ - DB: database, - OAuthStore: oauthStore, - Refresher: nil, + BaseUIHandler: BaseUIHandler{ + DB: database, + OAuthStore: oauthStore, + Refresher: nil, + }, } reqBody := DeleteAccountRequest{ diff --git a/pkg/appview/handlers/device.go b/pkg/appview/handlers/device.go index ec28f27..bec5e71 100644 --- a/pkg/appview/handlers/device.go +++ b/pkg/appview/handlers/device.go @@ -29,7 +29,7 @@ type DeviceCodeResponse struct { // DeviceCodeHandler handles POST /auth/device/code type DeviceCodeHandler struct { - Store *db.DeviceStore + BaseUIHandler AppViewBaseURL string // e.g., "http://localhost:5000" } @@ -57,7 +57,7 @@ func (h *DeviceCodeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { userAgent := r.UserAgent() // Create pending authorization - pending, err := h.Store.CreatePendingAuth(req.DeviceName, ip, userAgent) + pending, err := h.DeviceStore.CreatePendingAuth(req.DeviceName, ip, userAgent) if err != nil { http.Error(w, "failed to create authorization", http.StatusInternalServerError) return @@ -90,7 +90,7 @@ type DeviceTokenResponse struct { // DeviceTokenHandler handles POST /auth/device/token type DeviceTokenHandler struct { - Store *db.DeviceStore + BaseUIHandler } func (h *DeviceTokenHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -106,7 +106,7 @@ func (h *DeviceTokenHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Get pending authorization - pending, ok := h.Store.GetPendingByDeviceCode(req.DeviceCode) + pending, ok := h.DeviceStore.GetPendingByDeviceCode(req.DeviceCode) if !ok { resp := DeviceTokenResponse{ Error: "expired_token", @@ -126,7 +126,7 @@ func (h *DeviceTokenHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Approved! Get device from store to find handle - devices := h.Store.ListDevices(*pending.ApprovedDID) + devices := h.DeviceStore.ListDevices(*pending.ApprovedDID) var handle string for _, d := range devices { @@ -148,8 +148,7 @@ func (h *DeviceTokenHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // DeviceApprovalPageHandler handles GET /device type DeviceApprovalPageHandler struct { - Store *db.DeviceStore - SessionStore *db.SessionStore + BaseUIHandler } func (h *DeviceApprovalPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -204,7 +203,7 @@ func (h *DeviceApprovalPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Req } // Get pending authorization - pending, ok := h.Store.GetPendingByUserCode(userCode) + pending, ok := h.DeviceStore.GetPendingByUserCode(userCode) if !ok { h.renderError(w, "Invalid or expired authorization code") return @@ -228,8 +227,7 @@ type DeviceApproveRequest struct { // DeviceApproveHandler handles POST /device/approve type DeviceApproveHandler struct { - Store *db.DeviceStore - SessionStore *db.SessionStore + BaseUIHandler } func (h *DeviceApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -264,7 +262,7 @@ func (h *DeviceApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) } // Approve the device - _, err := h.Store.ApprovePending(req.UserCode, sess.DID, sess.Handle) + _, err := h.DeviceStore.ApprovePending(req.UserCode, sess.DID, sess.Handle) if err != nil { slog.Error("Failed to approve device", "component", "device/approve", "error", err) http.Error(w, fmt.Sprintf("failed to approve: %v", err), http.StatusInternalServerError) @@ -275,8 +273,7 @@ func (h *DeviceApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) // ListDevicesHandler handles GET /api/devices type ListDevicesHandler struct { - Store *db.DeviceStore - SessionStore *db.SessionStore + BaseUIHandler } func (h *ListDevicesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -299,15 +296,14 @@ func (h *ListDevicesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Get devices for this user - devices := h.Store.ListDevices(sess.DID) + devices := h.DeviceStore.ListDevices(sess.DID) render.JSON(w, r, devices) } // RevokeDeviceHandler handles DELETE /api/devices/{id} type RevokeDeviceHandler struct { - Store *db.DeviceStore - SessionStore *db.SessionStore + BaseUIHandler } func (h *RevokeDeviceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -337,7 +333,7 @@ func (h *RevokeDeviceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) } // Revoke device - if err := h.Store.RevokeDevice(sess.DID, deviceID); err != nil { + if err := h.DeviceStore.RevokeDevice(sess.DID, deviceID); err != nil { http.Error(w, fmt.Sprintf("failed to revoke: %v", err), http.StatusInternalServerError) return } diff --git a/pkg/appview/handlers/device_test.go b/pkg/appview/handlers/device_test.go index 9ac02d0..8ebebec 100644 --- a/pkg/appview/handlers/device_test.go +++ b/pkg/appview/handlers/device_test.go @@ -126,7 +126,7 @@ func TestDeviceCodeHandler_Success(t *testing.T) { store := db.NewDeviceStore(database) handler := &DeviceCodeHandler{ - Store: store, + BaseUIHandler: BaseUIHandler{DeviceStore: store}, AppViewBaseURL: "http://localhost:5000", } @@ -172,7 +172,7 @@ func TestDeviceCodeHandler_DefaultDeviceName(t *testing.T) { store := db.NewDeviceStore(database) handler := &DeviceCodeHandler{ - Store: store, + BaseUIHandler: BaseUIHandler{DeviceStore: store}, AppViewBaseURL: "http://localhost:5000", } @@ -207,7 +207,7 @@ func TestDeviceCodeHandler_MethodNotAllowed(t *testing.T) { store := db.NewDeviceStore(database) handler := &DeviceCodeHandler{ - Store: store, + BaseUIHandler: BaseUIHandler{DeviceStore: store}, AppViewBaseURL: "http://localhost:5000", } @@ -226,7 +226,7 @@ func TestDeviceTokenHandler_AuthorizationPending(t *testing.T) { store := db.NewDeviceStore(database) handler := &DeviceTokenHandler{ - Store: store, + BaseUIHandler: BaseUIHandler{DeviceStore: store}, } // Create a pending authorization @@ -266,7 +266,7 @@ func TestDeviceTokenHandler_ExpiredToken(t *testing.T) { store := db.NewDeviceStore(database) handler := &DeviceTokenHandler{ - Store: store, + BaseUIHandler: BaseUIHandler{DeviceStore: store}, } // Try to poll with invalid device code @@ -300,7 +300,7 @@ func TestDeviceTokenHandler_Approved(t *testing.T) { store := db.NewDeviceStore(database) handler := &DeviceTokenHandler{ - Store: store, + BaseUIHandler: BaseUIHandler{DeviceStore: store}, } // Create a pending authorization @@ -361,7 +361,7 @@ func TestDeviceTokenHandler_MethodNotAllowed(t *testing.T) { store := db.NewDeviceStore(database) handler := &DeviceTokenHandler{ - Store: store, + BaseUIHandler: BaseUIHandler{DeviceStore: store}, } req := httptest.NewRequest("GET", "/auth/device/token", nil) @@ -381,8 +381,7 @@ func TestDeviceApprovalPageHandler_NotLoggedIn(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &DeviceApprovalPageHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/device?user_code=ABC123", nil) @@ -420,8 +419,7 @@ func TestDeviceApprovalPageHandler_MissingUserCode(t *testing.T) { sessionID, _ := sessionStore.Create("did:plc:test123", "test.bsky.social", "https://pds.example.com", 24*time.Hour) handler := &DeviceApprovalPageHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/device", nil) // No user_code parameter @@ -446,8 +444,7 @@ func TestDeviceApprovalPageHandler_MethodNotAllowed(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &DeviceApprovalPageHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("POST", "/device?user_code=ABC123", nil) @@ -467,8 +464,7 @@ func TestDeviceApproveHandler_Unauthorized(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &DeviceApproveHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } reqBody := DeviceApproveRequest{ @@ -507,8 +503,7 @@ func TestDeviceApproveHandler_Deny(t *testing.T) { sessionID, _ := sessionStore.Create("did:plc:test123", "test.bsky.social", "https://pds.example.com", 24*time.Hour) handler := &DeviceApproveHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } reqBody := DeviceApproveRequest{ @@ -548,8 +543,7 @@ func TestDeviceApproveHandler_MethodNotAllowed(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &DeviceApproveHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/device/approve", nil) @@ -569,8 +563,7 @@ func TestListDevicesHandler_Unauthorized(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &ListDevicesHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/api/devices", nil) @@ -606,8 +599,7 @@ func TestListDevicesHandler_Success(t *testing.T) { store.ApprovePending(pending.UserCode, "did:plc:test123", "test.bsky.social") handler := &ListDevicesHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/api/devices", nil) @@ -641,8 +633,7 @@ func TestListDevicesHandler_MethodNotAllowed(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &ListDevicesHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("POST", "/api/devices", nil) @@ -662,8 +653,7 @@ func TestRevokeDeviceHandler_Unauthorized(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &RevokeDeviceHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("DELETE", "/api/devices/device123", nil) @@ -689,8 +679,7 @@ func TestRevokeDeviceHandler_MethodNotAllowed(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &RevokeDeviceHandler{ - Store: store, - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{DeviceStore: store, SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/api/devices/device123", nil) diff --git a/pkg/appview/handlers/errors.go b/pkg/appview/handlers/errors.go index bc92172..1fe1497 100644 --- a/pkg/appview/handlers/errors.go +++ b/pkg/appview/handlers/errors.go @@ -7,8 +7,7 @@ import ( // NotFoundHandler handles 404 errors type NotFoundHandler struct { - Templates *template.Template - RegistryURL string + BaseUIHandler } func (h *NotFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/export.go b/pkg/appview/handlers/export.go index 70ff3bb..616ab0e 100644 --- a/pkg/appview/handlers/export.go +++ b/pkg/appview/handlers/export.go @@ -2,7 +2,6 @@ package handlers import ( "context" - "database/sql" "encoding/json" "fmt" "io" @@ -15,7 +14,6 @@ import ( "atcr.io/pkg/appview/middleware" "atcr.io/pkg/atproto" "atcr.io/pkg/auth" - "atcr.io/pkg/auth/oauth" ) // HoldExportResult represents the result of fetching export from a hold @@ -37,8 +35,7 @@ type FullUserDataExport struct { // ExportUserDataHandler handles GDPR data export requests type ExportUserDataHandler struct { - DB *sql.DB - Refresher *oauth.Refresher + BaseUIHandler } func (h *ExportUserDataHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/home.go b/pkg/appview/handlers/home.go index 7da85fc..c02c76b 100644 --- a/pkg/appview/handlers/home.go +++ b/pkg/appview/handlers/home.go @@ -4,14 +4,11 @@ package handlers import ( - "database/sql" - "html/template" "log" "net/http" "strconv" "atcr.io/pkg/appview/db" - "atcr.io/pkg/appview/holdhealth" "atcr.io/pkg/appview/middleware" ) @@ -24,9 +21,7 @@ type BenefitCard struct { // HomeHandler handles the home page type HomeHandler struct { - DB *sql.DB - Templates *template.Template - RegistryURL string + BaseUIHandler } func (h *HomeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -37,7 +32,7 @@ func (h *HomeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Fetch featured repositories (top 6 by score - carousel cycles through them) - featuredCards, err := db.GetRepoCards(h.DB, 6, currentUserDID, db.SortByScore) + featuredCards, err := db.GetRepoCards(h.ReadOnlyDB, 6, currentUserDID, db.SortByScore) if err != nil { log.Printf("Error fetching featured repos: %v", err) featuredCards = []db.RepoCardData{} @@ -45,7 +40,7 @@ func (h *HomeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { db.SetRegistryURL(featuredCards, h.RegistryURL) // Fetch recently updated repositories (top 18 by last push - 6 rows) - recentCards, err := db.GetRepoCards(h.DB, 18, currentUserDID, db.SortByLastUpdate) + recentCards, err := db.GetRepoCards(h.ReadOnlyDB, 18, currentUserDID, db.SortByLastUpdate) if err != nil { log.Printf("Error fetching recent repos: %v", err) recentCards = []db.RepoCardData{} @@ -79,10 +74,7 @@ func (h *HomeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // RecentPushesHandler handles the HTMX request for recent repositories // Note: This endpoint returns repo cards (one per repository) instead of individual pushes type RecentPushesHandler struct { - DB *sql.DB - Templates *template.Template - RegistryURL string - HealthChecker *holdhealth.Checker + BaseUIHandler } func (h *RecentPushesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -100,7 +92,7 @@ func (h *RecentPushesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) } // Get recent repositories using repo cards (sorted by last update) - repos, err := db.GetRepoCards(h.DB, limit+offset, currentUserDID, db.SortByLastUpdate) + repos, err := db.GetRepoCards(h.ReadOnlyDB, limit+offset, currentUserDID, db.SortByLastUpdate) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/pkg/appview/handlers/images.go b/pkg/appview/handlers/images.go index 28d4952..bcc79ac 100644 --- a/pkg/appview/handlers/images.go +++ b/pkg/appview/handlers/images.go @@ -1,11 +1,9 @@ package handlers import ( - "database/sql" "encoding/json" "errors" "fmt" - "html/template" "io" "net/http" "strings" @@ -14,15 +12,13 @@ import ( "atcr.io/pkg/appview/db" "atcr.io/pkg/appview/middleware" "atcr.io/pkg/atproto" - "atcr.io/pkg/auth/oauth" "github.com/go-chi/chi/v5" "github.com/go-chi/render" ) // DeleteTagHandler handles deleting a tag type DeleteTagHandler struct { - DB *sql.DB - Refresher *oauth.Refresher + BaseUIHandler } func (h *DeleteTagHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -65,8 +61,7 @@ func (h *DeleteTagHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // DeleteManifestHandler handles deleting a manifest type DeleteManifestHandler struct { - DB *sql.DB - Refresher *oauth.Refresher + BaseUIHandler } func (h *DeleteManifestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -162,9 +157,7 @@ func (h *DeleteManifestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request // UploadAvatarHandler handles uploading/updating a repository avatar type UploadAvatarHandler struct { - DB *sql.DB - Refresher *oauth.Refresher - Templates *template.Template + BaseUIHandler } // validImageTypes are the allowed MIME types for avatars (matches lexicon) diff --git a/pkg/appview/handlers/images_test.go b/pkg/appview/handlers/images_test.go index 227141e..b15c725 100644 --- a/pkg/appview/handlers/images_test.go +++ b/pkg/appview/handlers/images_test.go @@ -14,7 +14,7 @@ func TestDeleteTagHandler_Unauthorized(t *testing.T) { defer database.Close() handler := &DeleteTagHandler{ - DB: database, + BaseUIHandler: BaseUIHandler{DB: database}, } req := httptest.NewRequest("DELETE", "/alice/myapp/tags/latest", nil) @@ -40,7 +40,7 @@ func TestDeleteManifestHandler_Unauthorized(t *testing.T) { defer database.Close() handler := &DeleteManifestHandler{ - DB: database, + BaseUIHandler: BaseUIHandler{DB: database}, } req := httptest.NewRequest("DELETE", "/alice/myapp/manifests/sha256:abc123", nil) diff --git a/pkg/appview/handlers/install.go b/pkg/appview/handlers/install.go index b3b0ccd..1136c37 100644 --- a/pkg/appview/handlers/install.go +++ b/pkg/appview/handlers/install.go @@ -1,14 +1,12 @@ package handlers import ( - "html/template" "net/http" ) // InstallHandler handles the /install page type InstallHandler struct { - Templates *template.Template - RegistryURL string + BaseUIHandler } func (h *InstallHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/learn_more.go b/pkg/appview/handlers/learn_more.go new file mode 100644 index 0000000..9daba9d --- /dev/null +++ b/pkg/appview/handlers/learn_more.go @@ -0,0 +1,23 @@ +package handlers + +import ( + "net/http" +) + +// LearnMoreHandler handles the /learn-more page +type LearnMoreHandler struct { + BaseUIHandler +} + +func (h *LearnMoreHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + data := struct { + PageData + }{ + PageData: NewPageData(r, h.RegistryURL), + } + + if err := h.Templates.ExecuteTemplate(w, "learn-more", data); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} diff --git a/pkg/appview/handlers/learn_more_test.go b/pkg/appview/handlers/learn_more_test.go new file mode 100644 index 0000000..ba468ae --- /dev/null +++ b/pkg/appview/handlers/learn_more_test.go @@ -0,0 +1,101 @@ +package handlers + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + + "atcr.io/pkg/appview" +) + +func TestLearnMoreHandler_RendersPage(t *testing.T) { + templates, err := appview.Templates() + if err != nil { + t.Fatalf("Failed to load templates: %v", err) + } + + handler := &LearnMoreHandler{ + BaseUIHandler: BaseUIHandler{ + Templates: templates, + RegistryURL: "myregistry.example.com", + }, + } + + req := httptest.NewRequest("GET", "/learn-more", nil) + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + if rr.Code != http.StatusOK { + t.Errorf("Expected status %d, got %d", http.StatusOK, rr.Code) + } + + body := rr.Body.String() + + // Verify registry URL is rendered + if !strings.Contains(body, "myregistry.example.com") { + t.Error("Expected body to contain registry URL 'myregistry.example.com'") + } + + // Verify page title is present + if !strings.Contains(body, "Decentralized Container Registry") { + t.Error("Expected body to contain page title") + } + + // Verify key sections are rendered + if !strings.Contains(body, "How It Works") { + t.Error("Expected body to contain 'How It Works' section") + } + + if !strings.Contains(body, "Why Decentralized") { + t.Error("Expected body to contain 'Why Decentralized' section") + } + + // Verify CTA links to /install + if !strings.Contains(body, `href="/install"`) { + t.Error("Expected body to contain link to /install") + } +} + +func TestLearnMoreHandler_SEOMetadata(t *testing.T) { + templates, err := appview.Templates() + if err != nil { + t.Fatalf("Failed to load templates: %v", err) + } + + handler := &LearnMoreHandler{ + BaseUIHandler: BaseUIHandler{ + Templates: templates, + RegistryURL: "atcr.io", + }, + } + + req := httptest.NewRequest("GET", "/learn-more", nil) + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + if rr.Code != http.StatusOK { + t.Errorf("Expected status %d, got %d", http.StatusOK, rr.Code) + } + + body := rr.Body.String() + + // Verify canonical URL + if !strings.Contains(body, `rel="canonical"`) { + t.Error("Expected body to contain canonical link") + } + + // Verify meta description + if !strings.Contains(body, `name="description"`) { + t.Error("Expected body to contain meta description") + } + + // Verify Open Graph tags + if !strings.Contains(body, `property="og:title"`) { + t.Error("Expected body to contain og:title") + } + + if !strings.Contains(body, `property="og:description"`) { + t.Error("Expected body to contain og:description") + } +} diff --git a/pkg/appview/handlers/legal.go b/pkg/appview/handlers/legal.go index fb57114..0d6abe6 100644 --- a/pkg/appview/handlers/legal.go +++ b/pkg/appview/handlers/legal.go @@ -1,7 +1,6 @@ package handlers import ( - "html/template" "net/http" ) @@ -14,10 +13,7 @@ type LegalPageData struct { // PrivacyPolicyHandler handles the /privacy page type PrivacyPolicyHandler struct { - Templates *template.Template - RegistryURL string - CompanyName string - Jurisdiction string + BaseUIHandler } func (h *PrivacyPolicyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -35,10 +31,7 @@ func (h *PrivacyPolicyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) // TermsOfServiceHandler handles the /terms page type TermsOfServiceHandler struct { - Templates *template.Template - RegistryURL string - CompanyName string - Jurisdiction string + BaseUIHandler } func (h *TermsOfServiceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/legal_test.go b/pkg/appview/handlers/legal_test.go index e19b05e..caaf1dc 100644 --- a/pkg/appview/handlers/legal_test.go +++ b/pkg/appview/handlers/legal_test.go @@ -16,10 +16,12 @@ func TestPrivacyPolicyHandler_RendersTemplateVars(t *testing.T) { } handler := &PrivacyPolicyHandler{ - Templates: templates, - RegistryURL: "myregistry.example.com", - CompanyName: "My Container Registry", - Jurisdiction: "State of California, United States", + BaseUIHandler: BaseUIHandler{ + Templates: templates, + RegistryURL: "myregistry.example.com", + CompanyName: "My Container Registry", + Jurisdiction: "State of California, United States", + }, } req := httptest.NewRequest("GET", "/privacy", nil) @@ -57,10 +59,12 @@ func TestTermsOfServiceHandler_RendersTemplateVars(t *testing.T) { } handler := &TermsOfServiceHandler{ - Templates: templates, - RegistryURL: "myregistry.example.com", - CompanyName: "My Container Registry", - Jurisdiction: "State of California, United States", + BaseUIHandler: BaseUIHandler{ + Templates: templates, + RegistryURL: "myregistry.example.com", + CompanyName: "My Container Registry", + Jurisdiction: "State of California, United States", + }, } req := httptest.NewRequest("GET", "/terms", nil) @@ -106,10 +110,12 @@ func TestLegalHandlers_DefaultValues(t *testing.T) { t.Run("privacy with defaults", func(t *testing.T) { handler := &PrivacyPolicyHandler{ - Templates: templates, - RegistryURL: "atcr.io", - CompanyName: "AT Container Registry", - Jurisdiction: "State of Texas, United States", + BaseUIHandler: BaseUIHandler{ + Templates: templates, + RegistryURL: "atcr.io", + CompanyName: "AT Container Registry", + Jurisdiction: "State of Texas, United States", + }, } req := httptest.NewRequest("GET", "/privacy", nil) @@ -128,10 +134,12 @@ func TestLegalHandlers_DefaultValues(t *testing.T) { t.Run("terms with defaults", func(t *testing.T) { handler := &TermsOfServiceHandler{ - Templates: templates, - RegistryURL: "atcr.io", - CompanyName: "AT Container Registry", - Jurisdiction: "State of Texas, United States", + BaseUIHandler: BaseUIHandler{ + Templates: templates, + RegistryURL: "atcr.io", + CompanyName: "AT Container Registry", + Jurisdiction: "State of Texas, United States", + }, } req := httptest.NewRequest("GET", "/terms", nil) diff --git a/pkg/appview/handlers/logout.go b/pkg/appview/handlers/logout.go index bf73109..10e2783 100644 --- a/pkg/appview/handlers/logout.go +++ b/pkg/appview/handlers/logout.go @@ -10,7 +10,7 @@ import ( // This only clears the current UI session cookie - it does NOT revoke OAuth tokens // OAuth sessions remain intact so other browser tabs/devices stay logged in type LogoutHandler struct { - SessionStore *db.SessionStore + BaseUIHandler } func (h *LogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/logout_test.go b/pkg/appview/handlers/logout_test.go index 61c7695..32d30e4 100644 --- a/pkg/appview/handlers/logout_test.go +++ b/pkg/appview/handlers/logout_test.go @@ -16,7 +16,7 @@ func TestLogoutHandler_NoSession(t *testing.T) { sessionStore := db.NewSessionStore(database) handler := &LogoutHandler{ - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/auth/logout", nil) @@ -56,7 +56,7 @@ func TestLogoutHandler_WithSession(t *testing.T) { } handler := &LogoutHandler{ - SessionStore: sessionStore, + BaseUIHandler: BaseUIHandler{SessionStore: sessionStore}, } req := httptest.NewRequest("GET", "/auth/logout", nil) diff --git a/pkg/appview/handlers/manifest_health.go b/pkg/appview/handlers/manifest_health.go index 808643f..575d4c7 100644 --- a/pkg/appview/handlers/manifest_health.go +++ b/pkg/appview/handlers/manifest_health.go @@ -2,19 +2,15 @@ package handlers import ( "context" - "html/template" "log/slog" "net/http" "net/url" "time" - - "atcr.io/pkg/appview/holdhealth" ) // ManifestHealthHandler handles HTMX polling for manifest health status type ManifestHealthHandler struct { - HealthChecker *holdhealth.Checker - Templates *template.Template + BaseUIHandler } func (h *ManifestHealthHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/opengraph.go b/pkg/appview/handlers/opengraph.go index c4d7d02..f474b7e 100644 --- a/pkg/appview/handlers/opengraph.go +++ b/pkg/appview/handlers/opengraph.go @@ -1,7 +1,6 @@ package handlers import ( - "database/sql" "fmt" "log/slog" "net/http" @@ -15,7 +14,7 @@ import ( // RepoOGHandler generates OpenGraph images for repository pages type RepoOGHandler struct { - DB *sql.DB + BaseUIHandler } func (h *RepoOGHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -31,7 +30,7 @@ func (h *RepoOGHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Get user info - user, err := db.GetUserByDID(h.DB, did) + user, err := db.GetUserByDID(h.ReadOnlyDB, did) if err != nil || user == nil { slog.Warn("Failed to get user for OG image", "did", did, "error", err) // Use resolved handle even if user not in DB @@ -39,14 +38,14 @@ func (h *RepoOGHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Get repository stats - stats, err := db.GetRepositoryStats(h.DB, did, repository) + stats, err := db.GetRepositoryStats(h.ReadOnlyDB, did, repository) if err != nil { slog.Warn("Failed to get repo stats for OG image", "did", did, "repo", repository, "error", err) stats = &db.RepositoryStats{} } // Get repository metadata (description, icon) - metadata, err := db.GetRepositoryMetadata(h.DB, did, repository) + metadata, err := db.GetRepositoryMetadata(h.ReadOnlyDB, did, repository) if err != nil { slog.Warn("Failed to get repo metadata for OG image", "did", did, "repo", repository, "error", err) metadata = map[string]string{} @@ -148,7 +147,7 @@ func (h *DefaultOGHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // UserOGHandler generates OpenGraph images for user profile pages type UserOGHandler struct { - DB *sql.DB + BaseUIHandler } func (h *UserOGHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -163,14 +162,14 @@ func (h *UserOGHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Get user info - user, err := db.GetUserByDID(h.DB, did) + user, err := db.GetUserByDID(h.ReadOnlyDB, did) if err != nil || user == nil { // Use resolved handle even if user not in DB user = &db.User{DID: did, Handle: resolvedHandle} } // Get repository count - repos, err := db.GetUserRepositories(h.DB, did) + repos, err := db.GetUserRepositories(h.ReadOnlyDB, did) repoCount := 0 if err == nil { repoCount = len(repos) diff --git a/pkg/appview/handlers/repository.go b/pkg/appview/handlers/repository.go index 62c0fc5..f1792cf 100644 --- a/pkg/appview/handlers/repository.go +++ b/pkg/appview/handlers/repository.go @@ -2,7 +2,6 @@ package handlers import ( "context" - "database/sql" "html/template" "log/slog" "net/http" @@ -10,24 +9,15 @@ import ( "time" "atcr.io/pkg/appview/db" - "atcr.io/pkg/appview/holdhealth" "atcr.io/pkg/appview/middleware" "atcr.io/pkg/appview/readme" "atcr.io/pkg/atproto" - "atcr.io/pkg/auth/oauth" - "github.com/bluesky-social/indigo/atproto/identity" "github.com/go-chi/chi/v5" ) // RepositoryPageHandler handles the public repository page type RepositoryPageHandler struct { - DB *sql.DB - Templates *template.Template - RegistryURL string - Directory identity.Directory - Refresher *oauth.Refresher - HealthChecker *holdhealth.Checker - ReadmeFetcher *readme.Fetcher // For rendering repo page descriptions + BaseUIHandler } func (h *RepositoryPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -42,7 +32,7 @@ func (h *RepositoryPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request } // Look up user by DID - owner, err := db.GetUserByDID(h.DB, did) + owner, err := db.GetUserByDID(h.ReadOnlyDB, did) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -54,19 +44,19 @@ func (h *RepositoryPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request // Opportunistically update cached handle if it changed if owner.Handle != resolvedHandle { - _ = db.UpdateUserHandle(h.DB, did, resolvedHandle) + _ = db.UpdateUserHandle(h.ReadOnlyDB, did, resolvedHandle) owner.Handle = resolvedHandle } // Fetch tags with platform information - tagsWithPlatforms, err := db.GetTagsWithPlatforms(h.DB, owner.DID, repository) + tagsWithPlatforms, err := db.GetTagsWithPlatforms(h.ReadOnlyDB, owner.DID, repository) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Fetch top-level manifests (filters out platform-specific manifests) - manifests, err := db.GetTopLevelManifests(h.DB, owner.DID, repository, 50, 0) + manifests, err := db.GetTopLevelManifests(h.ReadOnlyDB, owner.DID, repository, 50, 0) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -145,7 +135,7 @@ func (h *RepositoryPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request } // Fetch repository metadata from annotations table - metadata, err := db.GetRepositoryMetadata(h.DB, owner.DID, repository) + metadata, err := db.GetRepositoryMetadata(h.ReadOnlyDB, owner.DID, repository) if err != nil { slog.Warn("Failed to fetch repository metadata", "error", err) // Continue without metadata on error @@ -161,7 +151,7 @@ func (h *RepositoryPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request } // Fetch star count - stats, err := db.GetRepositoryStats(h.DB, owner.DID, repository) + stats, err := db.GetRepositoryStats(h.ReadOnlyDB, owner.DID, repository) if err != nil { slog.Warn("Failed to fetch repository stats", "error", err) // Continue with zero stats on error @@ -191,7 +181,7 @@ func (h *RepositoryPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request var readmeHTML template.HTML // Try repo page record from database (synced from PDS via Jetstream) - repoPage, err := db.GetRepoPage(h.DB, owner.DID, repository) + repoPage, err := db.GetRepoPage(h.ReadOnlyDB, owner.DID, repository) if err == nil && repoPage != nil { // Use repo page avatar if present if repoPage.AvatarCID != "" { diff --git a/pkg/appview/handlers/search.go b/pkg/appview/handlers/search.go index 1004b7d..d729972 100644 --- a/pkg/appview/handlers/search.go +++ b/pkg/appview/handlers/search.go @@ -1,8 +1,6 @@ package handlers import ( - "database/sql" - "html/template" "net/http" "strconv" "strings" @@ -13,9 +11,7 @@ import ( // SearchHandler handles the search page type SearchHandler struct { - DB *sql.DB - Templates *template.Template - RegistryURL string + BaseUIHandler } func (h *SearchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -37,9 +33,7 @@ func (h *SearchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // SearchResultsHandler handles the HTMX request for search results type SearchResultsHandler struct { - DB *sql.DB - Templates *template.Template - RegistryURL string + BaseUIHandler } func (h *SearchResultsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -86,7 +80,7 @@ func (h *SearchResultsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) currentUserDID = user.DID } - repos, total, err := db.SearchRepositories(h.DB, query, limit, offset, currentUserDID) + repos, total, err := db.SearchRepositories(h.ReadOnlyDB, query, limit, offset, currentUserDID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/pkg/appview/handlers/settings.go b/pkg/appview/handlers/settings.go index 78aaa8d..be62653 100644 --- a/pkg/appview/handlers/settings.go +++ b/pkg/appview/handlers/settings.go @@ -1,7 +1,6 @@ package handlers import ( - "database/sql" "encoding/json" "html/template" "log/slog" @@ -14,7 +13,6 @@ import ( "atcr.io/pkg/appview/middleware" "atcr.io/pkg/appview/storage" "atcr.io/pkg/atproto" - "atcr.io/pkg/auth/oauth" ) // HoldDisplay represents a hold for display in the UI @@ -28,11 +26,7 @@ type HoldDisplay struct { // SettingsHandler handles the settings page type SettingsHandler struct { - Templates *template.Template - Refresher *oauth.Refresher - RegistryURL string - DB *sql.DB - DefaultHoldDID string + BaseUIHandler } func (h *SettingsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -187,9 +181,7 @@ func deriveDisplayName(did string) string { // UpdateDefaultHoldHandler handles updating the default hold type UpdateDefaultHoldHandler struct { - Refresher *oauth.Refresher - Templates *template.Template - DB *sql.DB + BaseUIHandler } func (h *UpdateDefaultHoldHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/appview/handlers/storage.go b/pkg/appview/handlers/storage.go index 2c24a55..6f4c4d2 100644 --- a/pkg/appview/handlers/storage.go +++ b/pkg/appview/handlers/storage.go @@ -3,21 +3,18 @@ package handlers import ( "encoding/json" "fmt" - "html/template" "log/slog" "net/http" "atcr.io/pkg/appview/middleware" "atcr.io/pkg/appview/storage" "atcr.io/pkg/atproto" - "atcr.io/pkg/auth/oauth" ) // StorageHandler handles the storage quota API endpoint // Returns an HTML partial for HTMX to swap into the settings page type StorageHandler struct { - Templates *template.Template - Refresher *oauth.Refresher + BaseUIHandler } // QuotaStats mirrors the hold service response diff --git a/pkg/appview/handlers/user.go b/pkg/appview/handlers/user.go index 77b41a9..7fbd242 100644 --- a/pkg/appview/handlers/user.go +++ b/pkg/appview/handlers/user.go @@ -1,8 +1,6 @@ package handlers import ( - "database/sql" - "html/template" "log" "net/http" @@ -14,9 +12,7 @@ import ( // UserPageHandler handles the public user page showing all images for a user type UserPageHandler struct { - DB *sql.DB - Templates *template.Template - RegistryURL string + BaseUIHandler } func (h *UserPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -30,7 +26,7 @@ func (h *UserPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Look up user by DID - viewedUser, err := db.GetUserByDID(h.DB, did) + viewedUser, err := db.GetUserByDID(h.ReadOnlyDB, did) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -48,7 +44,7 @@ func (h *UserPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } else if viewedUser.Handle != resolvedHandle { // Opportunistically update cached handle if it changed - _ = db.UpdateUserHandle(h.DB, did, resolvedHandle) + _ = db.UpdateUserHandle(h.ReadOnlyDB, did, resolvedHandle) viewedUser.Handle = resolvedHandle } @@ -59,7 +55,7 @@ func (h *UserPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Fetch repository cards for this user - cards, err := db.GetUserRepoCards(h.DB, viewedUser.DID, currentUserDID) + cards, err := db.GetUserRepoCards(h.ReadOnlyDB, viewedUser.DID, currentUserDID) if err != nil { log.Printf("Error fetching repo cards for user %s: %v", viewedUser.DID, err) cards = []db.RepoCardData{} diff --git a/pkg/appview/public/amathea_manatee-1152w.webp b/pkg/appview/public/amathea_manatee-1152w.webp new file mode 100644 index 0000000000000000000000000000000000000000..119bb820c629e11cd0d329acb2c5169a3ce80105 GIT binary patch literal 31296 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 literal 0 HcmV?d00001 diff --git a/pkg/appview/public/amathea_manatee-768w.webp b/pkg/appview/public/amathea_manatee-768w.webp new file mode 100644 index 0000000000000000000000000000000000000000..5268a6fedabf1c130eb32a2990c02561d00c1fc7 GIT binary patch literal 18662 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 z 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 literal 0 HcmV?d00001 diff --git a/pkg/appview/public/css/style.css b/pkg/appview/public/css/style.css index 64f7f3d..469f889 100644 --- a/pkg/appview/public/css/style.css +++ b/pkg/appview/public/css/style.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-amber-400:oklch(82.8% .189 84.429);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{flex-direction:column;min-height:100vh;display:flex}main{flex:1}.prose{--tw-prose-body:var(--color-base-content);--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-primary);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content);--tw-prose-hr:var(--color-base-300);--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-300);--tw-prose-captions:var(--color-base-content);--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-base-content);--tw-prose-pre-bg:var(--color-base-200);--tw-prose-th-borders:var(--color-base-300);--tw-prose-td-borders:var(--color-base-300)}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch,currentColor 35%,#0000)#0000}}@property --radialprogress{syntax: ""; inherits: true; initial-value: 0%;}:root:not(span){overflow:var(--page-overflow)}:root{background:var(--page-scroll-bg,var(--root-bg));--page-scroll-bg-on:linear-gradient(var(--root-bg,#0000),var(--root-bg,#0000))var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg-on:linear-gradient(var(--root-bg,#0000),var(--root-bg,#0000))color-mix(in srgb,var(--root-bg,#0000),oklch(0% 0 0) calc(var(--page-has-backdrop,0)*40%))}}:root{--page-scroll-transition-on:background-color .3s ease-out;transition:var(--page-scroll-transition);scrollbar-gutter:var(--page-scroll-gutter,unset);scrollbar-gutter:if(style(--page-has-scroll: 1): var(--page-scroll-gutter,unset); else: unset)}@keyframes set-page-has-scroll{0%,to{--page-has-scroll:1}}:root,[data-theme]{background:var(--page-scroll-bg,var(--root-bg));color:var(--color-base-content)}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:normal;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(50% .08 230);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(78% .08 30);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(85% .06 75);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:normal;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(60% .09 230);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(80% .08 30);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(80% .05 75);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}@layer components{.cmd{align-items:center;gap:calc(var(--spacing)*2);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-300);background-color:var(--color-base-200);width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:flex;position:relative;overflow:hidden}.cmd code{text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow:hidden}.nav-search-wrapper{align-items:center;display:flex;position:relative}.nav-search-form{margin-right:calc(var(--spacing)*2);width:calc(var(--spacing)*0);opacity:0;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s;position:absolute;right:100%;overflow:hidden}.nav-search-wrapper.expanded .nav-search-form{width:calc(var(--spacing)*62);opacity:1}.text-helm{color:#0f1689}[data-theme=dark] .text-helm{color:#6b7fff}.badge-helm{--badge-color:#0f1689}[data-theme=dark] .badge-helm{--badge-color:#6b7fff}@layer daisyui.l1.l2{.badge-owner{--badge-color:var(--color-primary);--badge-fg:var(--color-primary-content)}.badge-deckhand{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.badge-bosun{--badge-color:var(--color-secondary);--badge-fg:var(--color-secondary-content)}}.card-interactive{cursor:pointer;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.5s;transition-duration:.5s}.card-interactive:hover{box-shadow:var(--shadow-card-hover);transform:translateY(-2px)}actor-typeahead{--color-background:var(--color-base-100);--color-border:var(--color-base-300);--color-shadow:var(--color-base-content);--color-hover:var(--color-base-200);--color-avatar-fallback:var(--color-base-300);--radius:.5rem;--padding-menu:.25rem;z-index:50}actor-typeahead::part(handle){color:var(--color-base-content)}actor-typeahead::part(menu){--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);margin-top:.25rem}.recent-accounts-dropdown{top:100%;right:calc(var(--spacing)*0);left:calc(var(--spacing)*0);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-300);background-color:var(--color-base-100);border-radius:var(--radius-lg);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);z-index:50;max-height:calc(var(--spacing)*60);margin-top:.25rem;position:absolute;overflow-y:auto}.recent-accounts-header{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);text-transform:uppercase;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-base-300);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.recent-accounts-header{color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.recent-accounts-item{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2.5);cursor:pointer;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;color:var(--color-base-content);transition-duration:.15s}.recent-accounts-item:hover,.recent-accounts-item.focused{background-color:var(--color-base-200)}}@layer utilities{@layer daisyui.l1.l2.l3{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible),.diff:focus-visible{outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:visibility .3s allow-discrete,background-color .3s ease-out,opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field),var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)),var(--tab-border-color)calc(69% - var(--border) + .25px),var(--tab-border-color)69%,var(--tab-bg)calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab,var(--color-base-content)50%,transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;text-wrap:balance;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth)*3px)-2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dropdown{position-area:var(--anchor-v,bottom)var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:95%}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:100%}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:95%}:where(.btn){width:unset}.btn{cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;padding-inline:var(--btn-p);color:var(--btn-fg);--tw-prose-links:var(--btn-fg);height:var(--size);font-size:var(--fontsize,.875rem);outline-color:var(--btn-color,var(--color-base-content));background-color:var(--btn-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--btn-noise);border-width:var(--border);border-style:solid;border-color:var(--btn-border);text-shadow:0 .5px oklch(100% 0 0/calc(var(--depth)*.15));touch-action:manipulation;box-shadow:0 .5px 0 .5px oklch(100% 0 0/calc(var(--depth)*6%))inset,var(--btn-shadow);--size:calc(var(--size-field,.25rem)*10);--btn-bg:var(--btn-color,var(--color-base-200));--btn-fg:var(--color-base-content);--btn-p:1rem;--btn-border:var(--btn-bg);border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab,var(--btn-bg),#000 calc(var(--depth)*5%))}}.btn{--btn-shadow:0 3px 2px -2px var(--btn-bg),0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000),0 4px 3px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000)}}.btn{--btn-noise:var(--fx-noise)}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}.btn:active:not(.btn-active){--btn-bg:var(--btn-color,var(--color-base-200));translate:0 .5px}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 5%)}}.btn:active:not(.btn-active){--btn-border:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}.btn:active:not(.btn-active){--btn-shadow:0 0 0 0 oklch(0% 0 0/0),0 0 0 0 oklch(0% 0 0/0)}.btn:is(input[type=checkbox],input[type=radio]){appearance:none}.btn:is(input[type=checkbox],input[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.btn:where(input:checked:not(.filter .btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem)*6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.validator:user-valid{--input-color:var(--color-success)}.validator:user-valid:focus{--input-color:var(--color-success)}.validator:user-valid:checked{--input-color:var(--color-success)}.validator:user-valid[aria-checked=true]{--input-color:var(--color-success)}.validator:user-valid:focus-within{--input-color:var(--color-success)}.validator:has(:user-valid){--input-color:var(--color-success)}.validator:has(:user-valid):focus{--input-color:var(--color-success)}.validator:has(:user-valid):checked{--input-color:var(--color-success)}.validator:has(:user-valid)[aria-checked=true]{--input-color:var(--color-success)}.validator:has(:user-valid):focus-within{--input-color:var(--color-success)}.validator:user-invalid{--input-color:var(--color-error)}.validator:user-invalid:focus{--input-color:var(--color-error)}.validator:user-invalid:checked{--input-color:var(--color-error)}.validator:user-invalid[aria-checked=true]{--input-color:var(--color-error)}.validator:user-invalid:focus-within{--input-color:var(--color-error)}.validator:user-invalid~.validator-hint{visibility:visible;color:var(--color-error)}.validator:has(:user-invalid){--input-color:var(--color-error)}.validator:has(:user-invalid):focus{--input-color:var(--color-error)}.validator:has(:user-invalid):checked{--input-color:var(--color-error)}.validator:has(:user-invalid)[aria-checked=true]{--input-color:var(--color-error)}.validator:has(:user-invalid):focus-within{--input-color:var(--color-error)}.validator:has(:user-invalid)~.validator-hint{visibility:visible;color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))),:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):checked,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))[aria-checked=true],:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus-within{--input-color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{visibility:visible;color:var(--color-error)}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0,auto)1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border)solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab,var(--color-base-content)5%,transparent)}}.toggle{border:var(--border)solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p),var(--radius-selector-max)) + min(var(--border),var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000)inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab,var(--color-base-content)50%,#0000)}}.toggle{--toggle-p:calc(var(--size)*.125);--size:calc(var(--size-selector,.25rem)*6);width:calc((var(--size)*2) - (var(--border) + var(--toggle-p))*2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:none}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:none}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);height:100%;box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000)}}.toggle:before{background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px*-1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border)solid currentColor;background-color:#0000}.input{cursor:text;border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,.875rem),.875rem);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset}}.input{--size:calc(var(--size-field,.25rem)*10);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.input:where(input){display:inline-flex}.input :where(input){appearance:none;background-color:#0000;border:none;width:100%;height:100%;display:inline-flex}.input :where(input):focus,.input :where(input):focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input :where(input):focus,.input :where(input):focus-within{outline-offset:2px;outline:2px solid #0000}}.input :where(input[type=url]),.input :where(input[type=email]){direction:ltr}.input :where(input[type=date]){display:inline-flex}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.input[type=number]::-webkit-inner-spin-button{margin-block:-.75rem;margin-inline-end:-.75rem}.input::-webkit-calendar-picker-indicator{position:absolute;inset-inline-end:.75em}.input:has(>input[type=date]) :where(input[type=date]){webkit-appearance:none;appearance:none;display:inline-flex}.input:has(>input[type=date]) input[type=date]::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}.indicator{width:max-content;display:inline-flex;position:relative}.indicator :where(.indicator-item){z-index:1;white-space:nowrap;top:var(--indicator-t,0);bottom:var(--indicator-b,auto);left:var(--indicator-s,auto);right:var(--indicator-e,0);translate:var(--indicator-x,50%)var(--indicator-y,-50%);position:absolute}.table{border-collapse:separate;--tw-border-spacing-x:calc(.25rem*0);--tw-border-spacing-y:calc(.25rem*0);width:100%;border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem)*6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab,currentColor 10%,#0000)}}.range{cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size)*.5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p)solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px currentColor,0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill));position:relative;top:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000),0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill))}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size)*.5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p)solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px currentColor,0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill));background-color:currentColor;position:relative;top:50%}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000),0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill))}}.range:disabled{cursor:not-allowed;opacity:.3}.select{border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;width:clamp(3rem,20rem,100%);height:var(--size);touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;box-shadow:0 1px var(--input-color)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;font-size:.875rem;display:inline-flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset}}.select{border-color:var(--input-color);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.select{--size:calc(var(--size-field,.25rem)*10)}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border)*2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}.select:focus,.select:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.select:focus,.select:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.select:focus,.select:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){.select,.select select{appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border)solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth)*3px)-2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth)*.1)),0 8px 10px -6px rgb(0 0 0/calc(var(--depth)*.1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);white-space:normal;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth)*3px)-2px var(--color-neutral)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0,1fr))auto var(--timeline-row-end,minmax(0,1fr));grid-template-columns:var(--timeline-col-start,minmax(0,1fr))auto var(--timeline-col-end,minmax(0,1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.mockup-code{border-radius:var(--radius-box);background-color:var(--color-neutral);color:var(--color-neutral-content);direction:ltr;padding-block:1.25rem;font-size:.875rem;position:relative;overflow:auto hidden}.mockup-code:before{content:"";opacity:.3;border-radius:3.40282e38px;width:.75rem;height:.75rem;margin-bottom:1rem;display:block;box-shadow:1.4em 0,2.8em 0,4.2em 0}.mockup-code pre{padding-right:1.25rem}.mockup-code pre:before{content:"";margin-right:2ch}.mockup-code pre[data-prefix]:before{--tw-content:attr(data-prefix);content:var(--tw-content);text-align:right;opacity:.5;width:2rem;display:inline-block}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border)solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border)solid var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 0 #0000 inset,0 0 #0000;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0/calc(var(--depth)*.1))inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:none}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border)solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border)solid var(--input-color,color-mix(in srgb,currentColor 20%,#0000))}}.radio{box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1))inset;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px*-1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.card{border-radius:var(--radius-box);outline-offset:2px;outline:0 solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.card:focus{outline-offset:2px;outline:2px solid #0000}}.card:focus-visible{outline-color:currentColor}.card :where(figure:first-child){border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card :where(figure:last-child){border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}.card:has(>input:is(input[type=checkbox],input[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card:has(>:checked){outline:2px solid}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab,currentcolor 20%,transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.hero-content{isolation:isolate;justify-content:center;align-items:center;gap:1rem;max-width:80rem;padding:1rem;display:flex}.modal-backdrop{color:#0000;z-index:-1;grid-row-start:1;grid-column-start:1;place-self:stretch stretch;display:grid}.modal-backdrop button{cursor:pointer}.hero{background-position:50%;background-size:cover;place-items:center;width:100%;display:grid}.hero>*{grid-row-start:1;grid-column-start:1}.modal-box{background-color:var(--color-base-100);border-top-left-radius:var(--modal-tl,var(--radius-box));border-top-right-radius:var(--modal-tr,var(--radius-box));border-bottom-left-radius:var(--modal-bl,var(--radius-box));border-bottom-right-radius:var(--modal-br,var(--radius-box));opacity:0;overscroll-behavior:contain;grid-row-start:1;grid-column-start:1;width:91.6667%;max-width:32rem;max-height:100vh;padding:1.5rem;transition:translate .3s ease-out,scale .3s ease-out,opacity .2s ease-out 50ms,box-shadow .3s ease-out;overflow-y:auto;scale:95%;box-shadow:0 25px 50px -12px oklch(0% 0 0/.25)}.stat-value{white-space:nowrap;grid-column-start:1;font-size:2rem;font-weight:800}.divider{white-space:nowrap;height:1rem;margin:var(--divider-m,1rem 0);--divider-color:var(--color-base-content);flex-direction:row;align-self:stretch;align-items:center;display:flex}@supports (color:color-mix(in lab, red, red)){.divider{--divider-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.divider:before,.divider:after{content:"";background-color:var(--divider-color);flex-grow:1;width:100%;height:.125rem}@media print{.divider:before,.divider:after{border:.5px solid}}.divider:not(:empty){gap:1rem}.filter{flex-wrap:wrap;display:flex}.filter input[type=radio]{width:auto}.filter input{opacity:1;transition:margin .1s,opacity .3s,padding .3s,border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.filter:not(:has(input:checked:not(.filter-reset))) .filter-reset,.filter:not(:has(input:checked:not(.filter-reset))) input[type=reset],.filter:has(input:checked:not(.filter-reset)) input:not(:checked,.filter-reset,input[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab,currentcolor 60%,transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.modal-action{justify-content:flex-end;gap:.5rem;margin-top:1.5rem;display:flex}.carousel-item{box-sizing:content-box;scroll-snap-align:start;flex:none;display:flex}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab,var(--color-black)30%,transparent)}}.status{background-image:radial-gradient(circle at 35% 30%,oklch(1 0 0/calc(var(--depth)*.5)),#0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab,currentColor calc(var(--depth)*100%),#0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border)solid var(--badge-color,var(--color-base-200));background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem)*6);width:fit-content;height:var(--size);padding-inline:calc(var(--size)/2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem)*10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>*{place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>*{place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border)dashed currentColor}@supports (color:color-mix(in lab, red, red)){.stat:not(:last-child){border-inline-end:var(--border)dashed color-mix(in oklab,currentColor 10%,#0000)}}.stat:not(:last-child){border-block-end:none}.navbar-end{justify-content:flex-end;align-items:center;width:50%;display:inline-flex}.navbar-start{justify-content:flex-start;align-items:center;width:50%;display:inline-flex}.carousel{scroll-snap-type:x mandatory;scrollbar-width:none;display:inline-flex;overflow-x:scroll}@media (prefers-reduced-motion:no-preference){.carousel{scroll-behavior:smooth}}.carousel::-webkit-scrollbar{display:none}.alert{--alert-border-color:var(--color-base-200);border-radius:var(--radius-box);color:var(--color-base-content);background-color:var(--alert-color,var(--color-base-200));text-align:start;background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08))inset,0 1px #000,0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08));border-style:solid;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;place-items:center start;gap:1rem;padding-block:.75rem;padding-inline:1rem;font-size:.875rem;line-height:1.25rem;display:grid}@supports (color:color-mix(in lab, red, red)){.alert{box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08))inset,0 1px color-mix(in oklab,color-mix(in oklab,#000 20%,var(--alert-color,var(--color-base-200)))calc(var(--depth)*20%),#0000),0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08))}}.alert:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.fieldset{grid-template-columns:1fr;grid-auto-rows:max-content;gap:.375rem;padding-block:.25rem;font-size:.75rem;display:grid}.chat{--mask-chat:url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");grid-auto-rows:min-content;column-gap:.75rem;padding-block:.25rem;display:grid}.mask{vertical-align:middle;display:inline-block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg,#0000 0% 40%,var(--color-base-100)50%,#0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}.btn-error{--btn-color:var(--color-error);--btn-fg:var(--color-error-content)}.btn-primary{--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content)}.btn-secondary{--btn-color:var(--color-secondary);--btn-fg:var(--color-secondary-content)}}@layer daisyui.l1.l2{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete,background-color .3s ease-out,opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-has-backdrop:1;--page-overflow:hidden;--page-scroll-bg:var(--page-scroll-bg-on);--page-scroll-gutter:stable;--page-scroll-transition:var(--page-scroll-transition-on);animation:forwards set-page-has-scroll;animation-timeline:scroll()}@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off)50%}.tooltip:after{transform:translateX(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail)50%}.btn:disabled:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:disabled:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn:disabled:not(.btn-link,.btn-ghost){box-shadow:none}.btn:disabled{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:disabled{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}.btn[disabled]:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn[disabled]:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn[disabled]:not(.btn-link,.btn-ghost){box-shadow:none}.btn[disabled]{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn[disabled]{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row>*{grid-row-start:1}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}:where(.navbar){position:relative}.dropdown-end{--anchor-h:span-left}.dropdown-end :where(.dropdown-content){inset-inline-end:0;translate:0}[dir=rtl] :is(.dropdown-end :where(.dropdown-content)){translate:0}.dropdown-end.dropdown-left{--anchor-h:left;--anchor-v:span-top}.dropdown-end.dropdown-left .dropdown-content{top:auto;bottom:0}.dropdown-end.dropdown-right{--anchor-h:right;--anchor-v:span-top}.dropdown-end.dropdown-right .dropdown-content{top:auto;bottom:0}.input-sm{--size:calc(var(--size-field,.25rem)*8);font-size:max(var(--font-size,.75rem),.75rem)}.input-sm[type=number]::-webkit-inner-spin-button{margin-block:-.5rem;margin-inline-end:-.75rem}.avatar-placeholder>div{justify-content:center;align-items:center;display:flex}.btn-circle{width:var(--size);height:var(--size);border-radius:3.40282e38px;padding-inline:0}.btn-block{width:100%}.loading-sm{width:calc(var(--size-selector,.25rem)*5)}.badge-ghost{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.badge-soft{color:var(--badge-color,var(--color-base-content));background-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.badge-soft{background-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))8%,var(--color-base-100))}}.badge-soft{border-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.badge-soft{border-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))10%,var(--color-base-100))}}.badge-soft{background-image:none}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}.table-zebra tbody tr:where(:nth-child(2n)),.table-zebra tbody tr:where(:nth-child(2n)) :where(.table-pin-cols tr th){background-color:var(--color-base-200)}@media (hover:hover){:is(.table-zebra tbody tr.row-hover,.table-zebra tbody tr.row-hover:where(:nth-child(2n))):hover{background-color:var(--color-base-300)}}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.checkbox-sm{--size:calc(var(--size-selector,.25rem)*5);padding:.1875rem}.badge-md{--size:calc(var(--size-selector,.25rem)*6);font-size:.875rem}.badge-sm{--size:calc(var(--size-selector,.25rem)*5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem)*4);font-size:.625rem}.alert-error{color:var(--color-error-content);--alert-border-color:var(--color-error);--alert-color:var(--color-error)}.alert-info{color:var(--color-info-content);--alert-border-color:var(--color-info);--alert-color:var(--color-info)}.alert-success{color:var(--color-success-content);--alert-border-color:var(--color-success);--alert-color:var(--color-success)}.link-primary{color:var(--color-primary)}@media (hover:hover){.link-primary:hover{color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-primary:hover{color:color-mix(in oklab,var(--color-primary)80%,#000)}}}.progress-error{color:var(--color-error)}.progress-success{color:var(--color-success)}.progress-warning{color:var(--color-warning)}.link-hover{text-decoration-line:none}@media (hover:hover){.link-hover:hover{text-decoration-line:underline}}.btn-lg{--fontsize:1.125rem;--btn-p:1.25rem;--size:calc(var(--size-field,.25rem)*12)}.btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem)*8)}.btn-xs{--fontsize:.6875rem;--btn-p:.5rem;--size:calc(var(--size-field,.25rem)*6)}.badge-accent{--badge-color:var(--color-accent);--badge-fg:var(--color-accent-content)}.badge-info{--badge-color:var(--color-info);--badge-fg:var(--color-info-content)}.badge-primary{--badge-color:var(--color-primary);--badge-fg:var(--color-primary-content)}.badge-secondary{--badge-color:var(--color-secondary);--badge-fg:var(--color-secondary-content)}.badge-success{--badge-color:var(--color-success);--badge-fg:var(--color-success-content)}.badge-warning{--badge-color:var(--color-warning);--badge-fg:var(--color-warning-content)}}.pointer-events-none{pointer-events:none}.validator:user-invalid~.validator-hint{display:revert-layer}.validator:has(:user-invalid)~.validator-hint{display:revert-layer}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{display:revert-layer}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-\[12\%\]{top:12%}.right-1\/2{right:50%}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;align-items:stretch;display:inline-flex}.join :where(.join-item){border-start-start-radius:var(--join-ss,0);border-start-end-radius:var(--join-se,0);border-end-end-radius:var(--join-ee,0);border-end-start-radius:var(--join-es,0)}.join :where(.join-item) *{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join>.join-item:where(:first-child),.join :first-child:not(:last-child) :where(.join-item){--join-ss:var(--radius-field);--join-se:0;--join-es:var(--radius-field);--join-ee:0}.join>.join-item:where(:last-child),.join :last-child:not(:first-child) :where(.join-item){--join-ss:0;--join-se:var(--radius-field);--join-es:0;--join-ee:var(--radius-field)}.join>.join-item:where(:only-child),.join :only-child :where(.join-item){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join>:where(:focus,:has(:focus)){z-index:1}@media (hover:hover){.join>:where(.btn:hover,:has(.btn:hover)){isolation:isolate}}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing)*2)}.my-4{margin-block:calc(var(--spacing)*4)}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.71429}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-auto{margin-top:auto}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-7{margin-left:calc(var(--spacing)*7)}.ml-auto{margin-left:auto}.alert{border-width:var(--border);border-color:var(--alert-border-color,var(--color-base-200))}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab,var(--color-base-content)80%,#0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab,var(--color-base-content)80%,#0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border)solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-12{width:calc(var(--spacing)*12);height:calc(var(--spacing)*12)}.size-16{width:calc(var(--spacing)*16);height:calc(var(--spacing)*16)}.size-\[1\.1rem\]{width:1.1rem;height:1.1rem}.h-16{height:calc(var(--spacing)*16)}.min-h-60{min-height:calc(var(--spacing)*60)}.min-h-\[60vh\]{min-height:60vh}.min-h-\[calc\(100vh-4rem\)\]{min-height:calc(100vh - 4rem)}.w-7{width:calc(var(--spacing)*7)}.w-12{width:calc(var(--spacing)*12)}.w-20{width:calc(var(--spacing)*20)}.w-40{width:calc(var(--spacing)*40)}.w-52{width:calc(var(--spacing)*52)}.w-96{width:calc(var(--spacing)*96)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-40{max-width:calc(var(--spacing)*40)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[150px\]{min-width:150px}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.translate-x-1\/2{--tw-translate-x:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*12)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*12)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--radius-box);border-radius:var(--radius-box)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-amber-400\!{border-color:var(--color-amber-400)!important}.border-base-300{border-color:var(--color-base-300)}.border-error{border-color:var(--color-error)}.border-transparent{border-color:#0000}.bg-base-100{background-color:var(--color-base-100)}.bg-base-200{background-color:var(--color-base-200)}.bg-base-300{background-color:var(--color-base-300)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-neutral{background-color:var(--color-neutral)}.fill-amber-400{fill:var(--color-amber-400)}.stroke-amber-400{stroke:var(--color-amber-400)}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-20{padding-top:calc(var(--spacing)*20)}.pb-24{padding-bottom:calc(var(--spacing)*24)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-nowrap{white-space:nowrap}.text-amber-400{color:var(--color-amber-400)}.text-base-content,.text-base-content\/30{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/30{color:color-mix(in oklab,var(--color-base-content)30%,transparent)}}.text-base-content\/40{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/40{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}.text-base-content\/50{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/50{color:color-mix(in oklab,var(--color-base-content)50%,transparent)}}.text-base-content\/60{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/60{color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.text-base-content\/70{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/70{color:color-mix(in oklab,var(--color-base-content)70%,transparent)}}.text-base-content\/80{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/80{color:color-mix(in oklab,var(--color-base-content)80%,transparent)}}.text-error{color:var(--color-error)}.text-neutral{color:var(--color-neutral)}.text-neutral-content{color:var(--color-neutral-content)}.text-primary{color:var(--color-primary)}.text-success{color:var(--color-success)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.no-underline,.prose :where(.btn-link):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-30{opacity:.3}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}@layer daisyui.l1{.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn)){--btn-shadow:"";--btn-bg:#0000;--btn-border:#0000;--btn-noise:none}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn)):not(:disabled,[disabled],.btn-disabled){--btn-fg:var(--btn-color,currentColor);outline-color:currentColor}@media (hover:none){.btn-ghost:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color,currentColor);--btn-border:#0000;--btn-noise:none;outline-color:currentColor}}.btn-outline:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}@media (hover:none){.btn-outline:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}.\[xml\:lang\]{xml:lang}@media (hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:border-primary:hover{border-color:var(--color-primary)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}@media (min-width:40rem){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:48rem){.md\:top-\[18\%\]{top:18%}.md\:w-\[calc\(50\%-0\.75rem\)\]{width:calc(50% - .75rem)}.md\:w-md{width:var(--container-md)}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (min-width:64rem){.lg\:top-\[40\%\]{top:40%}.lg\:right-\[20\%\]{right:20%}.lg\:w-\[calc\(33\.333\%-1rem\)\]{width:calc(33.333% - 1rem)}.lg\:w-xl{width:var(--container-xl)}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[3fr_2fr\]{grid-template-columns:3fr 2fr}}@media (min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}}}:root{--shadow-card-hover:0 8px 25px oklch(50% .08 230/.25),0 4px 12px #0000001a}[data-theme=dark]{--shadow-card-hover:0 8px 25px oklch(60% .09 230/.2),0 4px 12px #0003}.icon-light{display:block}.icon-dark,[data-theme=dark] .icon-light{display:none}[data-theme=dark] .icon-dark{display:block}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes dropdown{0%{opacity:0}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items)*100%)}to{translate:0 -100%}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes menu{0%{opacity:0}}@keyframes progress{50%{background-position-x:-115%}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}} \ No newline at end of file +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-amber-400:oklch(82.8% .189 84.429);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{flex-direction:column;min-height:100vh;display:flex}main{flex:1}.prose{--tw-prose-body:var(--color-base-content);--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-primary);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content);--tw-prose-hr:var(--color-base-300);--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-300);--tw-prose-captions:var(--color-base-content);--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-base-content);--tw-prose-pre-bg:var(--color-base-200);--tw-prose-th-borders:var(--color-base-300);--tw-prose-td-borders:var(--color-base-300)}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch,currentColor 35%,#0000)#0000}}@property --radialprogress{syntax: ""; inherits: true; initial-value: 0%;}:root:not(span){overflow:var(--page-overflow)}:root{background:var(--page-scroll-bg,var(--root-bg));--page-scroll-bg-on:linear-gradient(var(--root-bg,#0000),var(--root-bg,#0000))var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg-on:linear-gradient(var(--root-bg,#0000),var(--root-bg,#0000))color-mix(in srgb,var(--root-bg,#0000),oklch(0% 0 0) calc(var(--page-has-backdrop,0)*40%))}}:root{--page-scroll-transition-on:background-color .3s ease-out;transition:var(--page-scroll-transition);scrollbar-gutter:var(--page-scroll-gutter,unset);scrollbar-gutter:if(style(--page-has-scroll: 1): var(--page-scroll-gutter,unset); else: unset)}@keyframes set-page-has-scroll{0%,to{--page-has-scroll:1}}:root,[data-theme]{background:var(--page-scroll-bg,var(--root-bg));color:var(--color-base-content)}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:normal;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(50% .08 230);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(78% .08 30);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(85% .06 75);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:normal;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(60% .09 230);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(80% .08 30);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(80% .05 75);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}@layer components{.cmd{align-items:center;gap:calc(var(--spacing)*2);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-300);background-color:var(--color-base-200);width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);display:flex;position:relative;overflow:hidden}.cmd code{text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));overflow:hidden}.nav-search-wrapper{align-items:center;display:flex;position:relative}.nav-search-form{margin-right:calc(var(--spacing)*2);width:calc(var(--spacing)*0);opacity:0;transition-property:width,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s;position:absolute;right:100%;overflow:hidden}.nav-search-wrapper.expanded .nav-search-form{width:calc(var(--spacing)*62);opacity:1}.text-helm{color:#0f1689}[data-theme=dark] .text-helm{color:#6b7fff}.badge-helm{--badge-color:#0f1689}[data-theme=dark] .badge-helm{--badge-color:#6b7fff}@layer daisyui.l1.l2{.badge-owner{--badge-color:var(--color-primary);--badge-fg:var(--color-primary-content)}.badge-deckhand{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.badge-bosun{--badge-color:var(--color-secondary);--badge-fg:var(--color-secondary-content)}}.card-interactive{cursor:pointer;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.5s;transition-duration:.5s}.card-interactive:hover{box-shadow:var(--shadow-card-hover);transform:translateY(-2px)}actor-typeahead{--color-background:var(--color-base-100);--color-border:var(--color-base-300);--color-shadow:var(--color-base-content);--color-hover:var(--color-base-200);--color-avatar-fallback:var(--color-base-300);--radius:.5rem;--padding-menu:.25rem;z-index:50}actor-typeahead::part(handle){color:var(--color-base-content)}actor-typeahead::part(menu){--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);margin-top:.25rem}.recent-accounts-dropdown{top:100%;right:calc(var(--spacing)*0);left:calc(var(--spacing)*0);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-300);background-color:var(--color-base-100);border-radius:var(--radius-lg);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);z-index:50;max-height:calc(var(--spacing)*60);margin-top:.25rem;position:absolute;overflow-y:auto}.recent-accounts-header{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);text-transform:uppercase;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-base-300);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.recent-accounts-header{color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.recent-accounts-item{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2.5);cursor:pointer;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;color:var(--color-base-content);transition-duration:.15s}.recent-accounts-item:hover,.recent-accounts-item.focused{background-color:var(--color-base-200)}}@layer utilities{@layer daisyui.l1.l2.l3{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible),.diff:focus-visible{outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:visibility .3s allow-discrete,background-color .3s ease-out,opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.fab{pointer-events:none;z-index:999;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;inset-inline-end:1rem;flex-direction:column-reverse;align-items:flex-end;gap:.5rem;display:flex;position:fixed;bottom:1rem}.fab>*{pointer-events:auto;align-items:center;gap:.5rem;display:flex}.fab>:hover,.fab>:has(:focus-visible){z-index:1}.fab>[tabindex]:first-child{transition-property:opacity,visibility,rotate;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:grid;position:relative}.fab .fab-close,.fab .fab-main-action{inset-inline-end:0;position:absolute;bottom:0}:is(.fab:focus-within:has(.fab-close),.fab:focus-within:has(.fab-main-action))>[tabindex]{opacity:0;rotate:90deg}.fab:focus-within>[tabindex]:first-child{pointer-events:none}.fab:focus-within>:nth-child(n+2){visibility:visible;--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:1}.fab>:nth-child(n+2){visibility:hidden;--tw-scale-x:80%;--tw-scale-y:80%;--tw-scale-z:80%;scale:var(--tw-scale-x)var(--tw-scale-y);opacity:0;transition-property:opacity,scale,visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fab>:nth-child(n+2).fab-main-action,.fab>:nth-child(n+2).fab-close{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.fab>:nth-child(3){transition-delay:30ms}.fab>:nth-child(4){transition-delay:60ms}.fab>:nth-child(5){transition-delay:90ms}.fab>:nth-child(6){transition-delay:.12s}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field),var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)),var(--tab-border-color)calc(69% - var(--border) + .25px),var(--tab-border-color)69%,var(--tab-bg)calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab,var(--color-base-content)50%,transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;text-wrap:balance;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth)*3px)-2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dropdown{position-area:var(--anchor-v,bottom)var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:95%}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:100%}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:95%}:where(.btn){width:unset}.btn{cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;padding-inline:var(--btn-p);color:var(--btn-fg);--tw-prose-links:var(--btn-fg);height:var(--size);font-size:var(--fontsize,.875rem);outline-color:var(--btn-color,var(--color-base-content));background-color:var(--btn-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--btn-noise);border-width:var(--border);border-style:solid;border-color:var(--btn-border);text-shadow:0 .5px oklch(100% 0 0/calc(var(--depth)*.15));touch-action:manipulation;box-shadow:0 .5px 0 .5px oklch(100% 0 0/calc(var(--depth)*6%))inset,var(--btn-shadow);--size:calc(var(--size-field,.25rem)*10);--btn-bg:var(--btn-color,var(--color-base-200));--btn-fg:var(--color-base-content);--btn-p:1rem;--btn-border:var(--btn-bg);border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab,var(--btn-bg),#000 calc(var(--depth)*5%))}}.btn{--btn-shadow:0 3px 2px -2px var(--btn-bg),0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000),0 4px 3px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000)}}.btn{--btn-noise:var(--fx-noise)}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}.btn:active:not(.btn-active){--btn-bg:var(--btn-color,var(--color-base-200));translate:0 .5px}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 5%)}}.btn:active:not(.btn-active){--btn-border:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}.btn:active:not(.btn-active){--btn-shadow:0 0 0 0 oklch(0% 0 0/0),0 0 0 0 oklch(0% 0 0/0)}.btn:is(input[type=checkbox],input[type=radio]){appearance:none}.btn:is(input[type=checkbox],input[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.btn:where(input:checked:not(.filter .btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem)*6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative;overflow:hidden}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:content-visibility .2s allow-discrete,visibility .2s allow-discrete,min-height .2s ease-out allow-discrete,padding .1s ease-out 20ms,background-color .2s ease-out,height .2s;interpolate-size:allow-keywords;height:0}.collapse:is(details):where([open])::details-content{height:auto}}.collapse:is(details) summary{display:block;position:relative}.collapse:is(details) summary::-webkit-details-marker{display:none}.collapse:is(details)>.collapse-content{content-visibility:visible}.collapse:is(details) summary{outline:none}.collapse-content{content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:content-visibility .2s allow-discrete,visibility .2s allow-discrete,min-height .2s ease-out allow-discrete,padding .1s ease-out 20ms,background-color .2s ease-out}}.validator-hint{visibility:hidden;margin-top:.5rem;font-size:.75rem}.validator:user-valid{--input-color:var(--color-success)}.validator:user-valid:focus{--input-color:var(--color-success)}.validator:user-valid:checked{--input-color:var(--color-success)}.validator:user-valid[aria-checked=true]{--input-color:var(--color-success)}.validator:user-valid:focus-within{--input-color:var(--color-success)}.validator:has(:user-valid){--input-color:var(--color-success)}.validator:has(:user-valid):focus{--input-color:var(--color-success)}.validator:has(:user-valid):checked{--input-color:var(--color-success)}.validator:has(:user-valid)[aria-checked=true]{--input-color:var(--color-success)}.validator:has(:user-valid):focus-within{--input-color:var(--color-success)}.validator:user-invalid{--input-color:var(--color-error)}.validator:user-invalid:focus{--input-color:var(--color-error)}.validator:user-invalid:checked{--input-color:var(--color-error)}.validator:user-invalid[aria-checked=true]{--input-color:var(--color-error)}.validator:user-invalid:focus-within{--input-color:var(--color-error)}.validator:user-invalid~.validator-hint{visibility:visible;color:var(--color-error)}.validator:has(:user-invalid){--input-color:var(--color-error)}.validator:has(:user-invalid):focus{--input-color:var(--color-error)}.validator:has(:user-invalid):checked{--input-color:var(--color-error)}.validator:has(:user-invalid)[aria-checked=true]{--input-color:var(--color-error)}.validator:has(:user-invalid):focus-within{--input-color:var(--color-error)}.validator:has(:user-invalid)~.validator-hint{visibility:visible;color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))),:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):checked,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))[aria-checked=true],:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus-within{--input-color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{visibility:visible;color:var(--color-error)}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0,auto)1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border)solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab,var(--color-base-content)5%,transparent)}}.toast{translate:var(--toast-x,0)var(--toast-y,0);inset-inline:auto 1rem;background-color:#0000;flex-direction:column;gap:.5rem;width:max-content;max-width:calc(100vw - 2rem);display:flex;position:fixed;top:auto;bottom:1rem}@media (prefers-reduced-motion:no-preference){.toast>*{animation:.25s ease-out toast}}.toggle{border:var(--border)solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p),var(--radius-selector-max)) + min(var(--border),var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000)inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab,var(--color-base-content)50%,#0000)}}.toggle{--toggle-p:calc(var(--size)*.125);--size:calc(var(--size-selector,.25rem)*6);width:calc((var(--size)*2) - (var(--border) + var(--toggle-p))*2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:none}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:none}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);height:100%;box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000)}}.toggle:before{background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px*-1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border)solid currentColor;background-color:#0000}.input{cursor:text;border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,.875rem),.875rem);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset}}.input{--size:calc(var(--size-field,.25rem)*10);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.input:where(input){display:inline-flex}.input :where(input){appearance:none;background-color:#0000;border:none;width:100%;height:100%;display:inline-flex}.input :where(input):focus,.input :where(input):focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input :where(input):focus,.input :where(input):focus-within{outline-offset:2px;outline:2px solid #0000}}.input :where(input[type=url]),.input :where(input[type=email]){direction:ltr}.input :where(input[type=date]){display:inline-flex}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.input[type=number]::-webkit-inner-spin-button{margin-block:-.75rem;margin-inline-end:-.75rem}.input::-webkit-calendar-picker-indicator{position:absolute;inset-inline-end:.75em}.input:has(>input[type=date]) :where(input[type=date]){webkit-appearance:none;appearance:none;display:inline-flex}.input:has(>input[type=date]) input[type=date]::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}.indicator{width:max-content;display:inline-flex;position:relative}.indicator :where(.indicator-item){z-index:1;white-space:nowrap;top:var(--indicator-t,0);bottom:var(--indicator-b,auto);left:var(--indicator-s,auto);right:var(--indicator-e,0);translate:var(--indicator-x,50%)var(--indicator-y,-50%);position:absolute}.table{border-collapse:separate;--tw-border-spacing-x:calc(.25rem*0);--tw-border-spacing-y:calc(.25rem*0);width:100%;border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem)*6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab,currentColor 10%,#0000)}}.range{cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size)*.5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p)solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px currentColor,0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill));position:relative;top:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000),0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill))}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size)*.5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p),var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p)solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px currentColor,0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill));background-color:currentColor;position:relative;top:50%}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000),0 0 0 2rem var(--range-thumb)inset,calc((var(--range-dir,1)*-100cqw) - (var(--range-dir,1)*var(--range-thumb-size)/2))0 0 calc(100cqw*var(--range-fill))}}.range:disabled{cursor:not-allowed;opacity:.3}.diff-resizer{isolation:isolate;z-index:2;resize:horizontal;opacity:0;cursor:ew-resize;transform-origin:100% 100%;clip-path:inset(calc(100% - .75rem) 0 0 calc(100% - .75rem));grid-row-start:2;grid-column-start:1;width:50cqi;min-width:1rem;max-width:calc(100cqi - 1rem);height:.75rem;transition:min-width .3s ease-out,max-width .3s ease-out;position:relative;overflow:hidden;transform:scaleY(5)translate(.32rem,50%)}.select{border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;width:clamp(3rem,20rem,100%);height:var(--size);touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;box-shadow:0 1px var(--input-color)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;font-size:.875rem;display:inline-flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset}}.select{border-color:var(--input-color);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.select{--size:calc(var(--size-field,.25rem)*10)}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border)*2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}.select:focus,.select:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.select:focus,.select:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.select:focus,.select:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){.select,.select select{appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border)solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth)*3px)-2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth)*.1)),0 8px 10px -6px rgb(0 0 0/calc(var(--depth)*.1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);white-space:normal;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth)*3px)-2px var(--color-neutral)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0,1fr))auto var(--timeline-row-end,minmax(0,1fr));grid-template-columns:var(--timeline-col-start,minmax(0,1fr))auto var(--timeline-col-end,minmax(0,1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.mockup-code{border-radius:var(--radius-box);background-color:var(--color-neutral);color:var(--color-neutral-content);direction:ltr;padding-block:1.25rem;font-size:.875rem;position:relative;overflow:auto hidden}.mockup-code:before{content:"";opacity:.3;border-radius:3.40282e38px;width:.75rem;height:.75rem;margin-bottom:1rem;display:block;box-shadow:1.4em 0,2.8em 0,4.2em 0}.mockup-code pre{padding-right:1.25rem}.mockup-code pre:before{content:"";margin-right:2ch}.mockup-code pre[data-prefix]:before{--tw-content:attr(data-prefix);content:var(--tw-content);text-align:right;opacity:.5;width:2rem;display:inline-block}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border)solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border)solid var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 0 #0000 inset,0 0 #0000;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0/calc(var(--depth)*.1))inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:none}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border)solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border)solid var(--input-color,color-mix(in srgb,currentColor 20%,#0000))}}.radio{box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1))inset;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1))inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1))inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px*-1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.rating{vertical-align:middle;display:inline-flex;position:relative}.rating input{appearance:none;border:none}.rating :where(*){background-color:var(--color-base-content);opacity:.2;border-radius:0;width:1.5rem;height:1.5rem}@media (prefers-reduced-motion:no-preference){.rating :where(*){animation:.25s ease-out rating}}.rating :where(*):is(input){cursor:pointer}.rating .rating-hidden{background-color:#0000;width:.5rem}.rating input[type=radio]:checked{background-image:none}.rating :checked,.rating [aria-checked=true],.rating [aria-current=true],.rating :has(~:checked,~[aria-checked=true],~[aria-current=true]){opacity:1}.rating :focus-visible{scale:1.1}@media (prefers-reduced-motion:no-preference){.rating :focus-visible{transition:scale .2s ease-out}}.rating :active:focus{animation:none;scale:1.1}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.card{border-radius:var(--radius-box);outline-offset:2px;outline:0 solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.card:focus{outline-offset:2px;outline:2px solid #0000}}.card:focus-visible{outline-color:currentColor}.card :where(figure:first-child){border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card :where(figure:last-child){border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}.card:has(>input:is(input[type=checkbox],input[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card:has(>:checked){outline:2px solid}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab,currentcolor 20%,transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.hero-content{isolation:isolate;justify-content:center;align-items:center;gap:1rem;max-width:80rem;padding:1rem;display:flex}.textarea{border:var(--border)solid #0000;appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;width:clamp(3rem,20rem,100%);min-height:5rem;font-size:max(var(--font-size,.875rem),.875rem);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset;flex-shrink:1;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1))inset}}.textarea{--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.modal-backdrop{color:#0000;z-index:-1;grid-row-start:1;grid-column-start:1;place-self:stretch stretch;display:grid}.modal-backdrop button{cursor:pointer}.tab-content{order:var(--tabcontent-order);--tabcontent-radius-ss:var(--radius-box);--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:var(--radius-box);--tabcontent-radius-ee:var(--radius-box);--tabcontent-order:1;width:100%;height:calc(100% - var(--tab-height) + var(--border));margin:var(--tabcontent-margin);border-color:#0000;border-width:var(--border);border-start-start-radius:var(--tabcontent-radius-ss);border-start-end-radius:var(--tabcontent-radius-se);border-end-end-radius:var(--tabcontent-radius-ee);border-end-start-radius:var(--tabcontent-radius-es);display:none}.hero{background-position:50%;background-size:cover;place-items:center;width:100%;display:grid}.hero>*{grid-row-start:1;grid-column-start:1}.modal-box{background-color:var(--color-base-100);border-top-left-radius:var(--modal-tl,var(--radius-box));border-top-right-radius:var(--modal-tr,var(--radius-box));border-bottom-left-radius:var(--modal-bl,var(--radius-box));border-bottom-right-radius:var(--modal-br,var(--radius-box));opacity:0;overscroll-behavior:contain;grid-row-start:1;grid-column-start:1;width:91.6667%;max-width:32rem;max-height:100vh;padding:1.5rem;transition:translate .3s ease-out,scale .3s ease-out,opacity .2s ease-out 50ms,box-shadow .3s ease-out;overflow-y:auto;scale:95%;box-shadow:0 25px 50px -12px oklch(0% 0 0/.25)}.timeline-middle{grid-row-start:2;grid-column-start:2}.stat-value{white-space:nowrap;grid-column-start:1;font-size:2rem;font-weight:800}.divider{white-space:nowrap;height:1rem;margin:var(--divider-m,1rem 0);--divider-color:var(--color-base-content);flex-direction:row;align-self:stretch;align-items:center;display:flex}@supports (color:color-mix(in lab, red, red)){.divider{--divider-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.divider:before,.divider:after{content:"";background-color:var(--divider-color);flex-grow:1;width:100%;height:.125rem}@media print{.divider:before,.divider:after{border:.5px solid}}.divider:not(:empty){gap:1rem}.filter{flex-wrap:wrap;display:flex}.filter input[type=radio]{width:auto}.filter input{opacity:1;transition:margin .1s,opacity .3s,padding .3s,border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.filter:not(:has(input:checked:not(.filter-reset))) .filter-reset,.filter:not(:has(input:checked:not(.filter-reset))) input[type=reset],.filter:has(input:checked:not(.filter-reset)) input:not(:checked,.filter-reset,input[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab,currentcolor 60%,transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.modal-action{justify-content:flex-end;gap:.5rem;margin-top:1.5rem;display:flex}.carousel-item{box-sizing:content-box;scroll-snap-align:start;flex:none;display:flex}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab,var(--color-black)30%,transparent)}}.status{background-image:radial-gradient(circle at 35% 30%,oklch(1 0 0/calc(var(--depth)*.5)),#0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab,currentColor calc(var(--depth)*100%),#0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border)solid var(--badge-color,var(--color-base-200));background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem)*6);width:fit-content;height:var(--size);padding-inline:calc(var(--size)/2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.kbd{border-radius:var(--radius-field);background-color:var(--color-base-200);vertical-align:middle;border:var(--border)solid var(--color-base-content);justify-content:center;align-items:center;padding-inline:.5em;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.kbd{border:var(--border)solid color-mix(in srgb,var(--color-base-content)20%,#0000)}}.kbd{border-bottom:calc(var(--border) + 1px)solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.kbd{border-bottom:calc(var(--border) + 1px)solid color-mix(in srgb,var(--color-base-content)20%,#0000)}}.kbd{--size:calc(var(--size-selector,.25rem)*6);height:var(--size);min-width:var(--size);font-size:.875rem}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem)*10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>*{place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>*{place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border)dashed currentColor}@supports (color:color-mix(in lab, red, red)){.stat:not(:last-child){border-inline-end:var(--border)dashed color-mix(in oklab,currentColor 10%,#0000)}}.stat:not(:last-child){border-block-end:none}.navbar-end{justify-content:flex-end;align-items:center;width:50%;display:inline-flex}.navbar-start{justify-content:flex-start;align-items:center;width:50%;display:inline-flex}.carousel{scroll-snap-type:x mandatory;scrollbar-width:none;display:inline-flex;overflow-x:scroll}@media (prefers-reduced-motion:no-preference){.carousel{scroll-behavior:smooth}}.carousel::-webkit-scrollbar{display:none}.alert{--alert-border-color:var(--color-base-200);border-radius:var(--radius-box);color:var(--color-base-content);background-color:var(--alert-color,var(--color-base-200));text-align:start;background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08))inset,0 1px #000,0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08));border-style:solid;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;place-items:center start;gap:1rem;padding-block:.75rem;padding-inline:1rem;font-size:.875rem;line-height:1.25rem;display:grid}@supports (color:color-mix(in lab, red, red)){.alert{box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08))inset,0 1px color-mix(in oklab,color-mix(in oklab,#000 20%,var(--alert-color,var(--color-base-200)))calc(var(--depth)*20%),#0000),0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08))}}.alert:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.fieldset{grid-template-columns:1fr;grid-auto-rows:max-content;gap:.375rem;padding-block:.25rem;font-size:.75rem;display:grid}.chat{--mask-chat:url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");grid-auto-rows:min-content;column-gap:.75rem;padding-block:.25rem;display:grid}.mask{vertical-align:middle;display:inline-block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg,#0000 0% 40%,var(--color-base-100)50%,#0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}.btn-error{--btn-color:var(--color-error);--btn-fg:var(--color-error-content)}.btn-primary{--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content)}.btn-secondary{--btn-color:var(--color-secondary);--btn-fg:var(--color-secondary-content)}}@layer daisyui.l1.l2{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete,background-color .3s ease-out,opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-has-backdrop:1;--page-overflow:hidden;--page-scroll-bg:var(--page-scroll-bg-on);--page-scroll-gutter:stable;--page-scroll-transition:var(--page-scroll-transition-on);animation:forwards set-page-has-scroll;animation-timeline:scroll()}@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off)50%}.tooltip:after{transform:translateX(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail)50%}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:"";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}.btn:disabled:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:disabled:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn:disabled:not(.btn-link,.btn-ghost){box-shadow:none}.btn:disabled{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:disabled{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}.btn[disabled]:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn[disabled]:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn[disabled]:not(.btn-link,.btn-ghost){box-shadow:none}.btn[disabled]{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn[disabled]{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:"−";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:"−";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list .list-row>*{grid-row-start:1}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}.rating.rating-xs :where(:not(.rating-hidden)){width:1rem;height:1rem}.rating.rating-sm :where(:not(.rating-hidden)){width:1.25rem;height:1.25rem}.rating.rating-md :where(:not(.rating-hidden)){width:1.5rem;height:1.5rem}.rating.rating-lg :where(:not(.rating-hidden)){width:1.75rem;height:1.75rem}.rating.rating-xl :where(:not(.rating-hidden)){width:2rem;height:2rem}:where(.navbar){position:relative}.dropdown-right{--anchor-h:right;--anchor-v:span-bottom}.dropdown-right .dropdown-content{transform-origin:0;inset-inline-start:100%;top:0;bottom:auto}.dropdown-left{--anchor-h:left;--anchor-v:span-bottom}.dropdown-left .dropdown-content{transform-origin:100%;inset-inline-end:100%;top:0;bottom:auto}.dropdown-end{--anchor-h:span-left}.dropdown-end :where(.dropdown-content){inset-inline-end:0;translate:0}[dir=rtl] :is(.dropdown-end :where(.dropdown-content)){translate:0}.dropdown-end.dropdown-left{--anchor-h:left;--anchor-v:span-top}.dropdown-end.dropdown-left .dropdown-content{top:auto;bottom:0}.dropdown-end.dropdown-right{--anchor-h:right;--anchor-v:span-top}.dropdown-end.dropdown-right .dropdown-content{top:auto;bottom:0}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.input-sm{--size:calc(var(--size-field,.25rem)*8);font-size:max(var(--font-size,.75rem),.75rem)}.input-sm[type=number]::-webkit-inner-spin-button{margin-block:-.5rem;margin-inline-end:-.75rem}.avatar-placeholder>div{justify-content:center;align-items:center;display:flex}.btn-circle{width:var(--size);height:var(--size);border-radius:3.40282e38px;padding-inline:0}.btn-block{width:100%}.loading-sm{width:calc(var(--size-selector,.25rem)*5)}.badge-ghost{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.badge-soft{color:var(--badge-color,var(--color-base-content));background-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.badge-soft{background-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))8%,var(--color-base-100))}}.badge-soft{border-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.badge-soft{border-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))10%,var(--color-base-100))}}.badge-soft{background-image:none}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}.table-zebra tbody tr:where(:nth-child(2n)),.table-zebra tbody tr:where(:nth-child(2n)) :where(.table-pin-cols tr th){background-color:var(--color-base-200)}@media (hover:hover){:is(.table-zebra tbody tr.row-hover,.table-zebra tbody tr.row-hover:where(:nth-child(2n))):hover{background-color:var(--color-base-300)}}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.checkbox-sm{--size:calc(var(--size-selector,.25rem)*5);padding:.1875rem}.badge-md{--size:calc(var(--size-selector,.25rem)*6);font-size:.875rem}.badge-sm{--size:calc(var(--size-selector,.25rem)*5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem)*4);font-size:.625rem}.alert-error{color:var(--color-error-content);--alert-border-color:var(--color-error);--alert-color:var(--color-error)}.alert-info{color:var(--color-info-content);--alert-border-color:var(--color-info);--alert-color:var(--color-info)}.alert-success{color:var(--color-success-content);--alert-border-color:var(--color-success);--alert-color:var(--color-success)}.link-primary{color:var(--color-primary)}@media (hover:hover){.link-primary:hover{color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-primary:hover{color:color-mix(in oklab,var(--color-primary)80%,#000)}}}.progress-error{color:var(--color-error)}.progress-success{color:var(--color-success)}.progress-warning{color:var(--color-warning)}.link-hover{text-decoration-line:none}@media (hover:hover){.link-hover:hover{text-decoration-line:underline}}.btn-lg{--fontsize:1.125rem;--btn-p:1.25rem;--size:calc(var(--size-field,.25rem)*12)}.btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem)*8)}.btn-xs{--fontsize:.6875rem;--btn-p:.5rem;--size:calc(var(--size-field,.25rem)*6)}.badge-accent{--badge-color:var(--color-accent);--badge-fg:var(--color-accent-content)}.badge-info{--badge-color:var(--color-info);--badge-fg:var(--color-info-content)}.badge-primary{--badge-color:var(--color-primary);--badge-fg:var(--color-primary-content)}.badge-secondary{--badge-color:var(--color-secondary);--badge-fg:var(--color-secondary-content)}.badge-success{--badge-color:var(--color-success);--badge-fg:var(--color-success-content)}.badge-warning{--badge-color:var(--color-warning);--badge-fg:var(--color-warning-content)}}.pointer-events-none{pointer-events:none}.collapse:not(td,tr,colgroup){visibility:revert-layer}.validator:user-invalid~.validator-hint{display:revert-layer}.validator:has(:user-invalid)~.validator-hint{display:revert-layer}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{display:revert-layer}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-\[12\%\]{top:12%}.right-1{right:calc(var(--spacing)*1)}.right-1\/2{right:50%}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;align-items:stretch;display:inline-flex}.join :where(.join-item){border-start-start-radius:var(--join-ss,0);border-start-end-radius:var(--join-se,0);border-end-end-radius:var(--join-ee,0);border-end-start-radius:var(--join-es,0)}.join :where(.join-item) *{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join>.join-item:where(:first-child),.join :first-child:not(:last-child) :where(.join-item){--join-ss:var(--radius-field);--join-se:0;--join-es:var(--radius-field);--join-ee:0}.join>.join-item:where(:last-child),.join :last-child:not(:first-child) :where(.join-item){--join-ss:0;--join-se:var(--radius-field);--join-es:0;--join-ee:var(--radius-field)}.join>.join-item:where(:only-child),.join :only-child :where(.join-item){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join>:where(:focus,:has(:focus)){z-index:1}@media (hover:hover){.join>:where(.btn:hover,:has(.btn:hover)){isolation:isolate}}.z-6{z-index:6}.z-7{z-index:7}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing)*2)}.my-4{margin-block:calc(var(--spacing)*4)}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.71429}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-7{margin-left:calc(var(--spacing)*7)}.ml-auto{margin-left:auto}.kbd{box-shadow:none}.alert{border-width:var(--border);border-color:var(--alert-border-color,var(--color-base-200))}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab,var(--color-base-content)80%,#0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab,var(--color-base-content)50%,#0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab,var(--color-base-content)20%,#0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab,var(--color-base-content)80%,#0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border)solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-12{width:calc(var(--spacing)*12);height:calc(var(--spacing)*12)}.size-16{width:calc(var(--spacing)*16);height:calc(var(--spacing)*16)}.size-\[1\.1rem\]{width:1.1rem;height:1.1rem}.h-3{height:calc(var(--spacing)*3)}.h-6{height:calc(var(--spacing)*6)}.h-16{height:calc(var(--spacing)*16)}.min-h-60{min-height:calc(var(--spacing)*60)}.min-h-\[60vh\]{min-height:60vh}.min-h-\[calc\(100vh-4rem\)\]{min-height:calc(100vh - 4rem)}.w-0{width:calc(var(--spacing)*0)}.w-7{width:calc(var(--spacing)*7)}.w-12{width:calc(var(--spacing)*12)}.w-20{width:calc(var(--spacing)*20)}.w-40{width:calc(var(--spacing)*40)}.w-52{width:calc(var(--spacing)*52)}.w-96{width:calc(var(--spacing)*96)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-40{max-width:calc(var(--spacing)*40)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[150px\]{min-width:150px}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.translate-x-1{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*12)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*12)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--radius-box);border-radius:var(--radius-box)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-amber-400{border-color:var(--color-amber-400)}.border-amber-400\!{border-color:var(--color-amber-400)!important}.border-base-300{border-color:var(--color-base-300)}.border-error{border-color:var(--color-error)}.border-primary{border-color:var(--color-primary)}.border-transparent{border-color:#0000}.bg-base-100{background-color:var(--color-base-100)}.bg-base-200{background-color:var(--color-base-200)}.bg-base-300{background-color:var(--color-base-300)}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-neutral{background-color:var(--color-neutral)}.fill-amber-400{fill:var(--color-amber-400)}.stroke-amber-400{stroke:var(--color-amber-400)}.object-cover{object-fit:cover}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-20{padding-top:calc(var(--spacing)*20)}.pb-24{padding-bottom:calc(var(--spacing)*24)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-nowrap{white-space:nowrap}.text-amber-400{color:var(--color-amber-400)}.text-base-content,.text-base-content\/30{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/30{color:color-mix(in oklab,var(--color-base-content)30%,transparent)}}.text-base-content\/40{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/40{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}.text-base-content\/50{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/50{color:color-mix(in oklab,var(--color-base-content)50%,transparent)}}.text-base-content\/60{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/60{color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.text-base-content\/65{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/65{color:color-mix(in oklab,var(--color-base-content)65%,transparent)}}.text-base-content\/70{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/70{color:color-mix(in oklab,var(--color-base-content)70%,transparent)}}.text-base-content\/80{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/80{color:color-mix(in oklab,var(--color-base-content)80%,transparent)}}.text-error{color:var(--color-error)}.text-neutral{color:var(--color-neutral)}.text-neutral-content{color:var(--color-neutral-content)}.text-primary{color:var(--color-primary)}.text-success{color:var(--color-success)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.no-underline,.prose :where(.btn-link):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-30{opacity:.3}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}@layer daisyui.l1{.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn)){--btn-shadow:"";--btn-bg:#0000;--btn-border:#0000;--btn-noise:none}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn)):not(:disabled,[disabled],.btn-disabled){--btn-fg:var(--btn-color,currentColor);outline-color:currentColor}@media (hover:none){.btn-ghost:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color,currentColor);--btn-border:#0000;--btn-noise:none;outline-color:currentColor}}.btn-outline:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}@media (hover:none){.btn-outline:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a))drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a)drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\[rows\:\%v\]{rows:%v}@media (hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:border-primary:hover{border-color:var(--color-primary)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}@media (min-width:40rem){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}}@media (min-width:48rem){.md\:top-\[18\%\]{top:18%}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-\[calc\(50\%-0\.75rem\)\]{width:calc(50% - .75rem)}.md\:w-md{width:var(--container-md)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (min-width:64rem){.lg\:top-\[40\%\]{top:40%}.lg\:right-\[20\%\]{right:20%}.lg\:w-\[calc\(33\.333\%-1rem\)\]{width:calc(33.333% - 1rem)}.lg\:w-xl{width:var(--container-xl)}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[3fr_2fr\]{grid-template-columns:3fr 2fr}}@media (min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}}}:root{--shadow-card-hover:0 8px 25px oklch(50% .08 230/.25),0 4px 12px #0000001a}[data-theme=dark]{--shadow-card-hover:0 8px 25px oklch(60% .09 230/.2),0 4px 12px #0003}.icon-light{display:block}.icon-dark,[data-theme=dark] .icon-light{display:none}[data-theme=dark] .icon-dark{display:block}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes dropdown{0%{opacity:0}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items)*100%)}to{translate:0 -100%}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes menu{0%{opacity:0}}@keyframes progress{50%{background-position-x:-115%}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}} \ No newline at end of file diff --git a/pkg/appview/routes/routes.go b/pkg/appview/routes/routes.go index 05fba0a..38dc324 100644 --- a/pkg/appview/routes/routes.go +++ b/pkg/appview/routes/routes.go @@ -41,250 +41,138 @@ type UIDependencies struct { // RegisterUIRoutes registers all web UI and API routes on the provided router func RegisterUIRoutes(router chi.Router, deps UIDependencies) { - // Extract trimmed registry URL for templates - registryURL := trimRegistryURL(deps.BaseURL) + // Create base with all dependencies - handlers just embed this + base := uihandlers.BaseUIHandler{ + Templates: deps.Templates, + RegistryURL: trimRegistryURL(deps.BaseURL), + DB: deps.Database, + ReadOnlyDB: deps.ReadOnlyDB, + Refresher: deps.Refresher, + HealthChecker: deps.HealthChecker, + ReadmeFetcher: deps.ReadmeFetcher, + Directory: deps.OAuthClientApp.Dir, + SessionStore: deps.SessionStore, + DeviceStore: deps.DeviceStore, + OAuthStore: deps.OAuthStore, + DefaultHoldDID: deps.DefaultHoldDID, + CompanyName: deps.LegalConfig.CompanyName, + Jurisdiction: deps.LegalConfig.Jurisdiction, + } // OAuth login routes (public) - router.Get("/auth/oauth/login", (&uihandlers.LoginHandler{ - Templates: deps.Templates, - }).ServeHTTP) - - router.Post("/auth/oauth/login", (&uihandlers.LoginSubmitHandler{}).ServeHTTP) + router.Get("/auth/oauth/login", (&uihandlers.LoginHandler{BaseUIHandler: base}).ServeHTTP) + router.Post("/auth/oauth/login", (&uihandlers.LoginSubmitHandler{BaseUIHandler: base}).ServeHTTP) // Public routes (with optional auth for navbar) - // SECURITY: Public pages use read-only DB router.Get("/", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.HomeHandler{ - DB: deps.ReadOnlyDB, - Templates: deps.Templates, - RegistryURL: registryURL, - }, + &uihandlers.HomeHandler{BaseUIHandler: base}, ).ServeHTTP) router.Get("/api/recent-pushes", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.RecentPushesHandler{ - DB: deps.ReadOnlyDB, - Templates: deps.Templates, - RegistryURL: registryURL, - HealthChecker: deps.HealthChecker, - }, + &uihandlers.RecentPushesHandler{BaseUIHandler: base}, ).ServeHTTP) - // SECURITY: Search uses read-only DB to prevent writes and limit access to sensitive tables router.Get("/search", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.SearchHandler{ - DB: deps.ReadOnlyDB, - Templates: deps.Templates, - RegistryURL: registryURL, - }, + &uihandlers.SearchHandler{BaseUIHandler: base}, ).ServeHTTP) router.Get("/api/search-results", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.SearchResultsHandler{ - DB: deps.ReadOnlyDB, - Templates: deps.Templates, - RegistryURL: registryURL, - }, + &uihandlers.SearchResultsHandler{BaseUIHandler: base}, ).ServeHTTP) // Install page (public) router.Get("/install", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.InstallHandler{ - Templates: deps.Templates, - RegistryURL: registryURL, - }, + &uihandlers.InstallHandler{BaseUIHandler: base}, + ).ServeHTTP) + + // Learn more page (public) + router.Get("/learn-more", middleware.OptionalAuth(deps.SessionStore, deps.Database)( + &uihandlers.LearnMoreHandler{BaseUIHandler: base}, ).ServeHTTP) // Legal pages (public) router.Get("/privacy", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.PrivacyPolicyHandler{ - Templates: deps.Templates, - RegistryURL: registryURL, - CompanyName: deps.LegalConfig.CompanyName, - Jurisdiction: deps.LegalConfig.Jurisdiction, - }, + &uihandlers.PrivacyPolicyHandler{BaseUIHandler: base}, ).ServeHTTP) router.Get("/terms", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.TermsOfServiceHandler{ - Templates: deps.Templates, - RegistryURL: registryURL, - CompanyName: deps.LegalConfig.CompanyName, - Jurisdiction: deps.LegalConfig.Jurisdiction, - }, + &uihandlers.TermsOfServiceHandler{BaseUIHandler: base}, ).ServeHTTP) // API route for repository stats (public, read-only) router.Get("/api/stats/{handle}/{repository}", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.GetStatsHandler{ - DB: deps.ReadOnlyDB, - Directory: deps.OAuthClientApp.Dir, - }, + &uihandlers.GetStatsHandler{BaseUIHandler: base}, ).ServeHTTP) // API routes for stars (require authentication) - // Returns HTML for HTMX requests, JSON for API clients router.Post("/api/stars/{handle}/{repository}", middleware.RequireAuth(deps.SessionStore, deps.Database)( - &uihandlers.StarRepositoryHandler{ - DB: deps.Database, // Needs write access - Directory: deps.OAuthClientApp.Dir, - Refresher: deps.Refresher, - Templates: deps.Templates, - }, + &uihandlers.StarRepositoryHandler{BaseUIHandler: base}, ).ServeHTTP) router.Delete("/api/stars/{handle}/{repository}", middleware.RequireAuth(deps.SessionStore, deps.Database)( - &uihandlers.UnstarRepositoryHandler{ - DB: deps.Database, // Needs write access - Directory: deps.OAuthClientApp.Dir, - Refresher: deps.Refresher, - Templates: deps.Templates, - }, + &uihandlers.UnstarRepositoryHandler{BaseUIHandler: base}, ).ServeHTTP) router.Get("/api/stars/{handle}/{repository}", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.CheckStarHandler{ - DB: deps.ReadOnlyDB, // Read-only check - Directory: deps.OAuthClientApp.Dir, - Refresher: deps.Refresher, - }, + &uihandlers.CheckStarHandler{BaseUIHandler: base}, ).ServeHTTP) // Manifest detail API endpoint router.Get("/api/manifests/{handle}/{repository}/{digest}", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.ManifestDetailHandler{ - DB: deps.ReadOnlyDB, - Directory: deps.OAuthClientApp.Dir, - }, + &uihandlers.ManifestDetailHandler{BaseUIHandler: base}, ).ServeHTTP) // Manifest health check API endpoint (HTMX polling) - router.Get("/api/manifest-health", (&uihandlers.ManifestHealthHandler{ - HealthChecker: deps.HealthChecker, - Templates: deps.Templates, - }).ServeHTTP) + router.Get("/api/manifest-health", (&uihandlers.ManifestHealthHandler{BaseUIHandler: base}).ServeHTTP) router.Get("/u/{handle}", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.UserPageHandler{ - DB: deps.ReadOnlyDB, - Templates: deps.Templates, - RegistryURL: registryURL, - }, + &uihandlers.UserPageHandler{BaseUIHandler: base}, ).ServeHTTP) // OpenGraph image generation (public, cacheable) router.Get("/og/home", (&uihandlers.DefaultOGHandler{}).ServeHTTP) - - router.Get("/og/u/{handle}", (&uihandlers.UserOGHandler{ - DB: deps.ReadOnlyDB, - }).ServeHTTP) - - router.Get("/og/r/{handle}/{repository}", (&uihandlers.RepoOGHandler{ - DB: deps.ReadOnlyDB, - }).ServeHTTP) + router.Get("/og/u/{handle}", (&uihandlers.UserOGHandler{BaseUIHandler: base}).ServeHTTP) + router.Get("/og/r/{handle}/{repository}", (&uihandlers.RepoOGHandler{BaseUIHandler: base}).ServeHTTP) router.Get("/r/{handle}/{repository}", middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.RepositoryPageHandler{ - DB: deps.ReadOnlyDB, - Templates: deps.Templates, - RegistryURL: registryURL, - Directory: deps.OAuthClientApp.Dir, - Refresher: deps.Refresher, - HealthChecker: deps.HealthChecker, - ReadmeFetcher: deps.ReadmeFetcher, - }, + &uihandlers.RepositoryPageHandler{BaseUIHandler: base}, ).ServeHTTP) // Authenticated routes router.Group(func(r chi.Router) { r.Use(middleware.RequireAuth(deps.SessionStore, deps.Database)) - r.Get("/settings", (&uihandlers.SettingsHandler{ - Templates: deps.Templates, - Refresher: deps.Refresher, - RegistryURL: registryURL, - DB: deps.Database, - DefaultHoldDID: deps.DefaultHoldDID, - }).ServeHTTP) + r.Get("/settings", (&uihandlers.SettingsHandler{BaseUIHandler: base}).ServeHTTP) + r.Get("/api/storage", (&uihandlers.StorageHandler{BaseUIHandler: base}).ServeHTTP) + r.Post("/api/profile/default-hold", (&uihandlers.UpdateDefaultHoldHandler{BaseUIHandler: base}).ServeHTTP) - r.Get("/api/storage", (&uihandlers.StorageHandler{ - Templates: deps.Templates, - Refresher: deps.Refresher, - }).ServeHTTP) - - r.Post("/api/profile/default-hold", (&uihandlers.UpdateDefaultHoldHandler{ - Refresher: deps.Refresher, - Templates: deps.Templates, - DB: deps.Database, - }).ServeHTTP) - - r.Delete("/api/images/{repository}/tags/{tag}", (&uihandlers.DeleteTagHandler{ - DB: deps.Database, - Refresher: deps.Refresher, - }).ServeHTTP) - - r.Delete("/api/images/{repository}/manifests/{digest}", (&uihandlers.DeleteManifestHandler{ - DB: deps.Database, - Refresher: deps.Refresher, - }).ServeHTTP) - - r.Post("/api/images/{repository}/avatar", (&uihandlers.UploadAvatarHandler{ - DB: deps.Database, - Refresher: deps.Refresher, - Templates: deps.Templates, - }).ServeHTTP) + r.Delete("/api/images/{repository}/tags/{tag}", (&uihandlers.DeleteTagHandler{BaseUIHandler: base}).ServeHTTP) + r.Delete("/api/images/{repository}/manifests/{digest}", (&uihandlers.DeleteManifestHandler{BaseUIHandler: base}).ServeHTTP) + r.Post("/api/images/{repository}/avatar", (&uihandlers.UploadAvatarHandler{BaseUIHandler: base}).ServeHTTP) // Device approval page (authenticated) - r.Get("/device", (&uihandlers.DeviceApprovalPageHandler{ - Store: deps.DeviceStore, - SessionStore: deps.SessionStore, - }).ServeHTTP) - - r.Post("/device/approve", (&uihandlers.DeviceApproveHandler{ - Store: deps.DeviceStore, - SessionStore: deps.SessionStore, - }).ServeHTTP) + r.Get("/device", (&uihandlers.DeviceApprovalPageHandler{BaseUIHandler: base}).ServeHTTP) + r.Post("/device/approve", (&uihandlers.DeviceApproveHandler{BaseUIHandler: base}).ServeHTTP) // Device management routes - r.Get("/api/devices", (&uihandlers.ListDevicesHandler{ - Store: deps.DeviceStore, - SessionStore: deps.SessionStore, - }).ServeHTTP) - - r.Delete("/api/devices/{id}", (&uihandlers.RevokeDeviceHandler{ - Store: deps.DeviceStore, - SessionStore: deps.SessionStore, - }).ServeHTTP) + r.Get("/api/devices", (&uihandlers.ListDevicesHandler{BaseUIHandler: base}).ServeHTTP) + r.Delete("/api/devices/{id}", (&uihandlers.RevokeDeviceHandler{BaseUIHandler: base}).ServeHTTP) // GDPR data export - r.Get("/api/export-data", (&uihandlers.ExportUserDataHandler{ - DB: deps.Database, - Refresher: deps.Refresher, - }).ServeHTTP) + r.Get("/api/export-data", (&uihandlers.ExportUserDataHandler{BaseUIHandler: base}).ServeHTTP) // GDPR account deletion - r.Delete("/api/account", (&uihandlers.DeleteAccountHandler{ - DB: deps.Database, - OAuthStore: deps.OAuthStore, - Refresher: deps.Refresher, - }).ServeHTTP) + r.Delete("/api/account", (&uihandlers.DeleteAccountHandler{BaseUIHandler: base}).ServeHTTP) }) // Logout endpoint (supports both GET and POST) - // Only clears the current UI session cookie - does NOT revoke OAuth tokens - // OAuth sessions remain intact so other browser tabs/devices stay logged in - logoutHandler := &uihandlers.LogoutHandler{ - SessionStore: deps.SessionStore, - } + logoutHandler := &uihandlers.LogoutHandler{BaseUIHandler: base} router.Get("/auth/logout", logoutHandler.ServeHTTP) router.Post("/auth/logout", logoutHandler.ServeHTTP) // Custom 404 handler router.NotFound(middleware.OptionalAuth(deps.SessionStore, deps.Database)( - &uihandlers.NotFoundHandler{ - Templates: deps.Templates, - RegistryURL: registryURL, - }, + &uihandlers.NotFoundHandler{BaseUIHandler: base}, ).ServeHTTP) } diff --git a/pkg/appview/src/css/main.css b/pkg/appview/src/css/main.css index 7383110..357c30d 100644 --- a/pkg/appview/src/css/main.css +++ b/pkg/appview/src/css/main.css @@ -133,7 +133,7 @@ .nav-search-form { @apply absolute right-full mr-2; @apply w-0 opacity-0 overflow-hidden; - @apply transition-all duration-300; + @apply transition-[width,opacity] duration-300; } .nav-search-wrapper.expanded .nav-search-form { diff --git a/pkg/appview/templates/components/head.html b/pkg/appview/templates/components/head.html index eba891a..bdfc013 100644 --- a/pkg/appview/templates/components/head.html +++ b/pkg/appview/templates/components/head.html @@ -2,8 +2,7 @@ - - + @@ -13,6 +12,10 @@ + + + + - + - + {{ end }} diff --git a/pkg/appview/templates/components/hero.html b/pkg/appview/templates/components/hero.html index e11d5bd..2b977a2 100644 --- a/pkg/appview/templates/components/hero.html +++ b/pkg/appview/templates/components/hero.html @@ -5,7 +5,18 @@ */}}
- + + + +

your registry at sea.

@@ -16,12 +27,12 @@

docker login {{ .RegistryURL }}
docker push {{ .RegistryURL }}/you/app
-
same docker, decentralized
+
same docker, decentralized
@@ -37,6 +48,6 @@ {{ end }}
- +
{{ end }} diff --git a/pkg/appview/templates/pages/learn-more.html b/pkg/appview/templates/pages/learn-more.html new file mode 100644 index 0000000..2e846b9 --- /dev/null +++ b/pkg/appview/templates/pages/learn-more.html @@ -0,0 +1,186 @@ +{{ define "learn-more" }} + + + + About ATCR - Decentralized Container Registry on AT Protocol + + + + + + + {{ template "head" . }} + + + {{ template "nav" . }} + +
+ +
+

Docker meets the decentralized web

+

+ ATCR is an OCI-compliant container registry built on the AT Protocol. + Push and pull Docker images using your Bluesky identity. +

+
+ + +
+

How It Works

+ +
+

The Simple Version

+

+ Push and pull container images just like any registry. The difference? + Your image metadata lives in your AT Protocol account, not a corporate database. + Your Bluesky handle becomes your namespace. +

+
+ +
+ +
+ Technical Details +
+
+
+

Manifests (small JSON metadata describing your images) are stored as AT Protocol records in your Personal Data Server (PDS). This means you own them.

+

Blobs (the actual image layers) are stored in S3-compatible object storage. You can use our default storage or bring your own.

+

The AppView ({{ .RegistryURL }}) resolves your identity, routes requests, and speaks the OCI Distribution API that Docker understands.

+
+
+
+
+ + +
+

Why Decentralized?

+ +
+
+
+ +
+

Own Your Data

+

+ Your image manifests are stored in your PDS, not our database. + You control your data. You can export or migrate it anytime. +

+
+ +
+
+ +
+

Portable Identity

+

+ Your Bluesky handle is your namespace. No separate registry account needed. + Your identity follows you across the AT Protocol ecosystem. +

+
+ +
+
+ +
+

Bring Your Own Storage

+

+ Use our default storage or deploy your own hold service. + Connect your own S3, Storj, Minio, or other compatible storage. +

+
+ +
+
+ +
+

Open & Auditable

+

+ Built on open protocols. Fully OCI-compliant. + The source is public. Inspect everything. +

+
+
+
+ + +
+

Architecture Overview

+ +
+
+
+
+ +

Docker Client

+

Push & Pull

+
+
+ + +
+ +
+ +
+
+ +

AppView

+

{{ .RegistryURL }}

+
+
+ + +
+ + +
+ +
+
+ +

Your PDS

+

Manifests

+
+
+ +

Hold Service

+

Blobs

+
+
+
+
+ +

+ The AppView speaks OCI to Docker and ATProto to your PDS. Manifests go to your account. Blobs go to storage. +

+
+ + +
+

Ready to Get Started?

+

+ Install the credential helper and start pushing images in minutes. + All you need is a Bluesky account. +

+ +
+
+ + + + {{ template "footer" . }} + + +{{ end }} diff --git a/pkg/appview/ui.go b/pkg/appview/ui.go index 29af990..6810e96 100644 --- a/pkg/appview/ui.go +++ b/pkg/appview/ui.go @@ -1,6 +1,7 @@ package appview import ( + "crypto/md5" "embed" "fmt" "html/template" @@ -13,6 +14,37 @@ import ( "atcr.io/pkg/appview/licenses" ) +// assetHashes stores MD5 hashes of embedded assets for cache busting +var assetHashes = make(map[string]string) + +func init() { + // Compute MD5 hash of embedded assets at startup + files := []string{"css/style.css", "js/bundle.min.js"} + for _, f := range files { + data, err := publicFS.ReadFile("public/" + f) + if err != nil { + continue + } + assetHashes[f] = fmt.Sprintf("%x", md5.Sum(data))[:8] + } +} + +// AssetHash returns the cache-busting hash for an asset path +func AssetHash(path string) string { + if hash, ok := assetHashes[path]; ok { + return hash + } + return "" +} + +// CacheMiddleware adds Cache-Control headers to static file responses +func CacheMiddleware(h http.Handler, maxAge int) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", fmt.Sprintf("public, max-age=%d", maxAge)) + h.ServeHTTP(w, r) + }) +} + //go:generate sh -c "command -v npm >/dev/null 2>&1 && cd ../.. && npm run build || echo 'npm not found, skipping build'" //go:embed templates/**/*.html @@ -119,6 +151,8 @@ func Templates() (*template.Template, error) { parsed.Path = fmt.Sprintf("/cdn-cgi/image/width=%d%s", width, parsed.Path) return parsed.String() }, + + "assetHash": AssetHash, } tmpl := template.New("").Funcs(funcMap)