diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 00000000..37bba5f8 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "shadcn": { + "command": "sh", + "args": ["-c", "cd web/guard-dashboard && exec npx shadcn@latest mcp"] + } + } +} diff --git a/internal/guard/app/server/server.go b/internal/guard/app/server/server.go index 6ca7525d..b3064a39 100644 --- a/internal/guard/app/server/server.go +++ b/internal/guard/app/server/server.go @@ -5,11 +5,16 @@ import ( "encoding/json" "fmt" "io/fs" + "mime" "net/http" + "net/url" + "path/filepath" "strings" "time" "github.com/kontext-security/kontext-cli/internal/guard/judge" + "github.com/kontext-security/kontext-cli/internal/guard/policy" + "github.com/kontext-security/kontext-cli/internal/guard/policyconfig" "github.com/kontext-security/kontext-cli/internal/guard/risk" "github.com/kontext-security/kontext-cli/internal/guard/store/sqlite" dashboardassets "github.com/kontext-security/kontext-cli/internal/guard/web/assets" @@ -17,13 +22,18 @@ import ( ) const ( - DefaultAddr = "127.0.0.1:4765" + DefaultAddr = "127.0.0.1:4765" + devDashboardOrigin = "http://127.0.0.1:5173" + jsonContentType = "application/json" + unsupportedContentType = "policy profile requests require application/json" + untrustedProfileOrigin = "untrusted policy profile origin" ) type Server struct { - store *sqlite.Store - core *runtimecore.Core - mux *http.ServeMux + store *sqlite.Store + policyStore *policyconfig.Store + core *runtimecore.Core + mux *http.ServeMux } type ProcessResponse struct { @@ -38,6 +48,23 @@ type Options struct { Judge judge.Judge } +type PolicyProfileResponse struct { + Profile policy.Profile `json:"profile"` + RecommendedProfile policy.Profile `json:"recommended_profile"` + Version string `json:"version"` + RulePack string `json:"rule_pack"` + RulePackVersion string `json:"rule_pack_version"` + ConfigDigest string `json:"config_digest"` + ActivationID string `json:"activation_id"` + Source string `json:"source"` + Status string `json:"status"` + LoadedAt time.Time `json:"loaded_at"` +} + +type ActivatePolicyProfileRequest struct { + Profile policy.Profile `json:"profile"` +} + func NewServer(store *sqlite.Store, scorer risk.Scorer) (*Server, error) { return NewServerWithOptions(store, Options{Scorer: scorer}) } @@ -50,15 +77,33 @@ func NewServerWithOptions(store *sqlite.Store, opts Options) (*Server, error) { // A nil interface uses the default local risk policy; callers must not pass a // typed-nil provider because it still satisfies the PolicyProvider interface. func NewServerWithPolicy(store *sqlite.Store, policy PolicyProvider) (*Server, error) { + policyStore, err := openPolicyStoreForSQLite(store) + if err != nil { + return nil, err + } + return NewServerWithPolicyConfig(store, policy, policyStore) +} + +func NewServerWithPolicyConfig(store *sqlite.Store, policy PolicyProvider, policyStore *policyconfig.Store) (*Server, error) { if policy == nil { policy = NewRiskPolicyProvider(nil) } + if policyStore == nil { + var err error + policyStore, err = openPolicyStoreForSQLite(store) + if err != nil { + return nil, err + } + } + if _, err := policyStore.Load(context.Background()); err != nil { + return nil, fmt.Errorf("load policy config: %w", err) + } runtime := newGuardHookRuntime(store, policy) core, err := runtimecore.New(runtime) if err != nil { return nil, fmt.Errorf("create runtime core: %w", err) } - server := &Server{store: store, core: core, mux: http.NewServeMux()} + server := &Server{store: store, policyStore: policyStore, core: core, mux: http.NewServeMux()} server.routes() return server, nil } @@ -88,6 +133,8 @@ func (s *Server) routes() { s.mux.HandleFunc("GET /api/summary", s.handleSummary) s.mux.HandleFunc("GET /api/sessions", s.handleSessions) s.mux.HandleFunc("GET /api/sessions/", s.handleSession) + s.mux.HandleFunc("GET /api/policy/profile", s.handlePolicyProfile) + s.mux.HandleFunc("POST /api/policy/profile", s.handleActivatePolicyProfile) s.mux.HandleFunc("GET /", s.handleDashboard) } @@ -168,6 +215,38 @@ func (s *Server) handleSessions(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, sessions) } +func (s *Server) handlePolicyProfile(w http.ResponseWriter, _ *http.Request) { + writeJSON(w, http.StatusOK, policyProfileResponse(s.policyStore.Current())) +} + +func (s *Server) handleActivatePolicyProfile(w http.ResponseWriter, r *http.Request) { + if !trustedPolicyProfileRequest(r) { + writeError(w, http.StatusForbidden, untrustedProfileOrigin) + return + } + if !hasJSONContentType(r) { + writeError(w, http.StatusUnsupportedMediaType, unsupportedContentType) + return + } + var req ActivatePolicyProfileRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + writeError(w, http.StatusBadRequest, "invalid policy profile request") + return + } + switch req.Profile { + case policy.ProfileRelaxed, policy.ProfileBalanced, policy.ProfileStrict: + default: + writeError(w, http.StatusBadRequest, "unknown policy profile") + return + } + snapshot, err := s.policyStore.ActivateProfile(r.Context(), req.Profile) + if err != nil { + writeError(w, http.StatusInternalServerError, fmt.Sprintf("activate policy profile: %v", err)) + return + } + writeJSON(w, http.StatusOK, policyProfileResponse(snapshot)) +} + func (s *Server) handleSession(w http.ResponseWriter, r *http.Request) { trimmed := strings.TrimPrefix(r.URL.Path, "/api/sessions/") parts := strings.Split(strings.Trim(trimmed, "/"), "/") @@ -205,6 +284,21 @@ func (s *Server) handleDashboard(w http.ResponseWriter, r *http.Request) { http.FileServer(http.FS(dist)).ServeHTTP(w, r) } +func policyProfileResponse(snapshot policyconfig.Snapshot) PolicyProfileResponse { + return PolicyProfileResponse{ + Profile: snapshot.Config.Profile, + RecommendedProfile: policy.ProfileBalanced, + Version: snapshot.PolicyVersion, + RulePack: snapshot.RulePack, + RulePackVersion: snapshot.RulePackVersion, + ConfigDigest: snapshot.ConfigDigest, + ActivationID: snapshot.ActivationID, + Source: string(snapshot.Source), + Status: string(snapshot.Status), + LoadedAt: snapshot.LoadedAt, + } +} + func writeJSON(w http.ResponseWriter, status int, value any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) @@ -215,6 +309,33 @@ func writeError(w http.ResponseWriter, status int, message string) { writeJSON(w, status, map[string]string{"error": message}) } +func trustedPolicyProfileRequest(r *http.Request) bool { + origin := r.Header.Get("Origin") + if origin == "" { + return true + } + if origin == devDashboardOrigin { + return true + } + parsed, err := url.Parse(origin) + if err != nil { + return false + } + return parsed.Scheme == "http" && parsed.Host == r.Host +} + +func hasJSONContentType(r *http.Request) bool { + contentType := r.Header.Get("Content-Type") + if contentType == "" { + return false + } + mediaType, _, err := mime.ParseMediaType(contentType) + if err != nil { + return false + } + return strings.EqualFold(mediaType, jsonContentType) +} + func withCORS(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "http://127.0.0.1:5173") @@ -228,6 +349,13 @@ func withCORS(next http.Handler) http.Handler { }) } +func openPolicyStoreForSQLite(store *sqlite.Store) (*policyconfig.Store, error) { + if store == nil || store.Path() == "" { + return nil, fmt.Errorf("policy config requires sqlite store path") + } + return policyconfig.Open(filepath.Dir(store.Path())) +} + func OpenDefaultServer(dbPath string, scorer risk.Scorer) (*Server, func() error, error) { return OpenDefaultServerWithOptions(dbPath, Options{Scorer: scorer}) } diff --git a/internal/guard/app/server/server_test.go b/internal/guard/app/server/server_test.go index 37c4e3e3..7b6f03dd 100644 --- a/internal/guard/app/server/server_test.go +++ b/internal/guard/app/server/server_test.go @@ -1,12 +1,18 @@ package server import ( + "bytes" "context" + "encoding/json" "errors" + "net/http" + "net/http/httptest" "strings" "testing" "github.com/kontext-security/kontext-cli/internal/guard/judge" + "github.com/kontext-security/kontext-cli/internal/guard/policy" + "github.com/kontext-security/kontext-cli/internal/guard/policyconfig" "github.com/kontext-security/kontext-cli/internal/guard/risk" "github.com/kontext-security/kontext-cli/internal/guard/store/sqlite" ) @@ -29,6 +35,15 @@ func newTestServerWithPolicy(t *testing.T, store *sqlite.Store, policy PolicyPro return server } +func newTestServerWithPolicyConfig(t *testing.T, store *sqlite.Store, policyStore *policyconfig.Store) *Server { + t.Helper() + server, err := NewServerWithPolicyConfig(store, NewRiskPolicyProvider(risk.NoopScorer{}), policyStore) + if err != nil { + t.Fatalf("NewServerWithPolicyConfig() error = %v", err) + } + return server +} + func TestStorePersistsSummaryCounts(t *testing.T) { store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") if err != nil { @@ -122,6 +137,195 @@ func TestProcessHookEventUsesPolicyProvider(t *testing.T) { } } +func TestPolicyProfileGetReturnsLoadedDefault(t *testing.T) { + store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") + if err != nil { + t.Fatal(err) + } + defer store.Close() + policyStore, err := policyconfig.Open(t.TempDir()) + if err != nil { + t.Fatal(err) + } + server := newTestServerWithPolicyConfig(t, store, policyStore) + + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodGet, "/api/policy/profile", nil) + server.Handler().ServeHTTP(recorder, request) + + if recorder.Code != http.StatusOK { + t.Fatalf("status = %d, want %d: %s", recorder.Code, http.StatusOK, recorder.Body.String()) + } + var response PolicyProfileResponse + if err := json.NewDecoder(recorder.Body).Decode(&response); err != nil { + t.Fatal(err) + } + if response.Profile != policy.ProfileBalanced || response.RecommendedProfile != policy.ProfileBalanced { + t.Fatalf("response = %+v, want default balanced profile", response) + } + if response.Version != policy.DefaultPolicyVersion || response.RulePack != policy.DefaultRulePackID || response.ActivationID == "" { + t.Fatalf("response metadata = %+v", response) + } +} + +func TestPolicyProfilePostActivatesProfile(t *testing.T) { + store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") + if err != nil { + t.Fatal(err) + } + defer store.Close() + policyStore, err := policyconfig.Open(t.TempDir()) + if err != nil { + t.Fatal(err) + } + server := newTestServerWithPolicyConfig(t, store, policyStore) + + body := bytes.NewBufferString(`{"profile":"strict"}`) + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodPost, "/api/policy/profile", body) + request.Header.Set("Content-Type", "application/json") + server.Handler().ServeHTTP(recorder, request) + + if recorder.Code != http.StatusOK { + t.Fatalf("status = %d, want %d: %s", recorder.Code, http.StatusOK, recorder.Body.String()) + } + var response PolicyProfileResponse + if err := json.NewDecoder(recorder.Body).Decode(&response); err != nil { + t.Fatal(err) + } + if response.Profile != policy.ProfileStrict { + t.Fatalf("profile = %q, want strict", response.Profile) + } + if policyStore.Current().Config.Profile != policy.ProfileStrict { + t.Fatalf("current profile = %q, want strict", policyStore.Current().Config.Profile) + } +} + +func TestPolicyProfilePostRejectsInvalidProfile(t *testing.T) { + store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") + if err != nil { + t.Fatal(err) + } + defer store.Close() + policyStore, err := policyconfig.Open(t.TempDir()) + if err != nil { + t.Fatal(err) + } + server := newTestServerWithPolicyConfig(t, store, policyStore) + initial := policyStore.Current() + + body := bytes.NewBufferString(`{"profile":"paranoid"}`) + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodPost, "/api/policy/profile", body) + request.Header.Set("Content-Type", "application/json") + server.Handler().ServeHTTP(recorder, request) + + if recorder.Code != http.StatusBadRequest { + t.Fatalf("status = %d, want %d: %s", recorder.Code, http.StatusBadRequest, recorder.Body.String()) + } + current := policyStore.Current() + if current.Config.Profile != initial.Config.Profile || current.ConfigDigest != initial.ConfigDigest { + t.Fatalf("current = %+v, want unchanged %+v", current, initial) + } +} + +func TestPolicyProfilePostRejectsCrossOriginRequest(t *testing.T) { + store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") + if err != nil { + t.Fatal(err) + } + defer store.Close() + policyStore, err := policyconfig.Open(t.TempDir()) + if err != nil { + t.Fatal(err) + } + server := newTestServerWithPolicyConfig(t, store, policyStore) + initial := policyStore.Current() + + body := bytes.NewBufferString(`{"profile":"relaxed"}`) + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodPost, "/api/policy/profile", body) + request.Header.Set("Content-Type", "application/json") + request.Header.Set("Origin", "https://example.test") + server.Handler().ServeHTTP(recorder, request) + + if recorder.Code != http.StatusForbidden { + t.Fatalf("status = %d, want %d: %s", recorder.Code, http.StatusForbidden, recorder.Body.String()) + } + current := policyStore.Current() + if current.Config.Profile != initial.Config.Profile || current.ConfigDigest != initial.ConfigDigest { + t.Fatalf("current = %+v, want unchanged %+v", current, initial) + } +} + +func TestPolicyProfilePostAllowsTrustedDashboardOrigins(t *testing.T) { + tests := []struct { + name string + target string + origin string + }{ + {name: "same origin", target: "http://127.0.0.1:4765/api/policy/profile", origin: "http://127.0.0.1:4765"}, + {name: "vite dev", target: "http://127.0.0.1:4765/api/policy/profile", origin: devDashboardOrigin}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") + if err != nil { + t.Fatal(err) + } + defer store.Close() + policyStore, err := policyconfig.Open(t.TempDir()) + if err != nil { + t.Fatal(err) + } + server := newTestServerWithPolicyConfig(t, store, policyStore) + + body := bytes.NewBufferString(`{"profile":"strict"}`) + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodPost, tt.target, body) + request.Header.Set("Content-Type", "application/json") + request.Header.Set("Origin", tt.origin) + server.Handler().ServeHTTP(recorder, request) + + if recorder.Code != http.StatusOK { + t.Fatalf("status = %d, want %d: %s", recorder.Code, http.StatusOK, recorder.Body.String()) + } + if policyStore.Current().Config.Profile != policy.ProfileStrict { + t.Fatalf("current profile = %q, want strict", policyStore.Current().Config.Profile) + } + }) + } +} + +func TestPolicyProfilePostRejectsSimpleContentType(t *testing.T) { + store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") + if err != nil { + t.Fatal(err) + } + defer store.Close() + policyStore, err := policyconfig.Open(t.TempDir()) + if err != nil { + t.Fatal(err) + } + server := newTestServerWithPolicyConfig(t, store, policyStore) + initial := policyStore.Current() + + body := bytes.NewBufferString(`{"profile":"relaxed"}`) + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodPost, "/api/policy/profile", body) + request.Header.Set("Content-Type", "text/plain") + server.Handler().ServeHTTP(recorder, request) + + if recorder.Code != http.StatusUnsupportedMediaType { + t.Fatalf("status = %d, want %d: %s", recorder.Code, http.StatusUnsupportedMediaType, recorder.Body.String()) + } + current := policyStore.Current() + if current.Config.Profile != initial.Config.Profile || current.ConfigDigest != initial.ConfigDigest { + t.Fatalf("current = %+v, want unchanged %+v", current, initial) + } +} + func TestProcessHookEventEnsuresDaemonObservedSession(t *testing.T) { store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") if err != nil { diff --git a/internal/guard/store/sqlite/store.go b/internal/guard/store/sqlite/store.go index f59c3ae5..301a628c 100644 --- a/internal/guard/store/sqlite/store.go +++ b/internal/guard/store/sqlite/store.go @@ -16,7 +16,8 @@ import ( ) type Store struct { - db *sql.DB + db *sql.DB + path string } type DecisionRecord struct { @@ -71,7 +72,7 @@ func OpenStore(path string) (*Store, error) { return nil, err } db.SetMaxOpenConns(1) - store := &Store{db: db} + store := &Store{db: db, path: path} if err := store.migrate(context.Background()); err != nil { db.Close() return nil, err @@ -79,6 +80,10 @@ func OpenStore(path string) (*Store, error) { return store, nil } +func (s *Store) Path() string { + return s.path +} + func (s *Store) Close() error { return s.db.Close() } diff --git a/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff new file mode 100644 index 00000000..c2939699 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 new file mode 100644 index 00000000..4adaa92a Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 new file mode 100644 index 00000000..5e84b5e3 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff new file mode 100644 index 00000000..ba1e7bdf Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff b/internal/guard/web/assets/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff new file mode 100644 index 00000000..d415a912 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 b/internal/guard/web/assets/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 new file mode 100644 index 00000000..4f11ce24 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 b/internal/guard/web/assets/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 new file mode 100644 index 00000000..1e370b5e Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff b/internal/guard/web/assets/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff new file mode 100644 index 00000000..3b869acc Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 new file mode 100644 index 00000000..91f6df2a Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff new file mode 100644 index 00000000..079e31c8 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 new file mode 100644 index 00000000..bd10e5df Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff new file mode 100644 index 00000000..5ff74675 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-sans-latin-400-normal-BOaIZNA2.woff b/internal/guard/web/assets/dist/assets/geist-sans-latin-400-normal-BOaIZNA2.woff new file mode 100644 index 00000000..4635ea6d Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-sans-latin-400-normal-BOaIZNA2.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-sans-latin-400-normal-gapTbOY8.woff2 b/internal/guard/web/assets/dist/assets/geist-sans-latin-400-normal-gapTbOY8.woff2 new file mode 100644 index 00000000..9867e874 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-sans-latin-400-normal-gapTbOY8.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-sans-latin-500-normal-CN2lyvyL.woff b/internal/guard/web/assets/dist/assets/geist-sans-latin-500-normal-CN2lyvyL.woff new file mode 100644 index 00000000..80acac15 Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-sans-latin-500-normal-CN2lyvyL.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2 b/internal/guard/web/assets/dist/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2 new file mode 100644 index 00000000..f6ee691a Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/geist-sans-latin-600-normal-CA1yjETN.woff b/internal/guard/web/assets/dist/assets/geist-sans-latin-600-normal-CA1yjETN.woff new file mode 100644 index 00000000..f5d9af0f Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-sans-latin-600-normal-CA1yjETN.woff differ diff --git a/internal/guard/web/assets/dist/assets/geist-sans-latin-600-normal-DFOURf8L.woff2 b/internal/guard/web/assets/dist/assets/geist-sans-latin-600-normal-DFOURf8L.woff2 new file mode 100644 index 00000000..416789fc Binary files /dev/null and b/internal/guard/web/assets/dist/assets/geist-sans-latin-600-normal-DFOURf8L.woff2 differ diff --git a/internal/guard/web/assets/dist/assets/index-Boi0hTwe.js b/internal/guard/web/assets/dist/assets/index-Boi0hTwe.js new file mode 100644 index 00000000..77eff63c --- /dev/null +++ b/internal/guard/web/assets/dist/assets/index-Boi0hTwe.js @@ -0,0 +1,52 @@ +function cv(n,l){for(var i=0;ia[c]})}}}return Object.freeze(Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}))}(function(){const l=document.createElement("link").relList;if(l&&l.supports&&l.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))a(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const m of d.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&a(m)}).observe(document,{childList:!0,subtree:!0});function i(c){const d={};return c.integrity&&(d.integrity=c.integrity),c.referrerPolicy&&(d.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?d.credentials="include":c.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function a(c){if(c.ep)return;c.ep=!0;const d=i(c);fetch(c.href,d)}})();function tp(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var ha={exports:{}},ho={},ga={exports:{}},he={};var df;function dv(){if(df)return he;df=1;var n=Symbol.for("react.element"),l=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),d=Symbol.for("react.provider"),m=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),v=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),S=Symbol.iterator;function C(P){return P===null||typeof P!="object"?null:(P=S&&P[S]||P["@@iterator"],typeof P=="function"?P:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,k={};function T(P,I,de){this.props=P,this.context=I,this.refs=k,this.updater=de||_}T.prototype.isReactComponent={},T.prototype.setState=function(P,I){if(typeof P!="object"&&typeof P!="function"&&P!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,P,I,"setState")},T.prototype.forceUpdate=function(P){this.updater.enqueueForceUpdate(this,P,"forceUpdate")};function A(){}A.prototype=T.prototype;function L(P,I,de){this.props=P,this.context=I,this.refs=k,this.updater=de||_}var $=L.prototype=new A;$.constructor=L,b($,T.prototype),$.isPureReactComponent=!0;var M=Array.isArray,U=Object.prototype.hasOwnProperty,Y={current:null},B={key:!0,ref:!0,__self:!0,__source:!0};function ie(P,I,de){var pe,ve={},ye=null,we=null;if(I!=null)for(pe in I.ref!==void 0&&(we=I.ref),I.key!==void 0&&(ye=""+I.key),I)U.call(I,pe)&&!B.hasOwnProperty(pe)&&(ve[pe]=I[pe]);var Se=arguments.length-2;if(Se===1)ve.children=de;else if(1>>1,I=D[P];if(0>>1;Pc(ve,V))yec(we,ve)?(D[P]=we,D[ye]=V,P=ye):(D[P]=ve,D[pe]=V,P=pe);else if(yec(we,V))D[P]=we,D[ye]=V,P=ye;else break e}}return Q}function c(D,Q){var V=D.sortIndex-Q.sortIndex;return V!==0?V:D.id-Q.id}if(typeof performance=="object"&&typeof performance.now=="function"){var d=performance;n.unstable_now=function(){return d.now()}}else{var m=Date,f=m.now();n.unstable_now=function(){return m.now()-f}}var v=[],x=[],y=1,S=null,C=3,_=!1,b=!1,k=!1,T=typeof setTimeout=="function"?setTimeout:null,A=typeof clearTimeout=="function"?clearTimeout:null,L=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function $(D){for(var Q=i(x);Q!==null;){if(Q.callback===null)a(x);else if(Q.startTime<=D)a(x),Q.sortIndex=Q.expirationTime,l(v,Q);else break;Q=i(x)}}function M(D){if(k=!1,$(D),!b)if(i(v)!==null)b=!0,le(U);else{var Q=i(x);Q!==null&&se(M,Q.startTime-D)}}function U(D,Q){b=!1,k&&(k=!1,A(ie),ie=-1),_=!0;var V=C;try{for($(Q),S=i(v);S!==null&&(!(S.expirationTime>Q)||D&&!ue());){var P=S.callback;if(typeof P=="function"){S.callback=null,C=S.priorityLevel;var I=P(S.expirationTime<=Q);Q=n.unstable_now(),typeof I=="function"?S.callback=I:S===i(v)&&a(v),$(Q)}else a(v);S=i(v)}if(S!==null)var de=!0;else{var pe=i(x);pe!==null&&se(M,pe.startTime-Q),de=!1}return de}finally{S=null,C=V,_=!1}}var Y=!1,B=null,ie=-1,te=5,ne=-1;function ue(){return!(n.unstable_now()-neD||125P?(D.sortIndex=V,l(x,D),i(v)===null&&D===i(x)&&(k?(A(ie),ie=-1):k=!0,se(M,V-P))):(D.sortIndex=I,l(v,D),b||_||(b=!0,le(U))),D},n.unstable_shouldYield=ue,n.unstable_wrapCallback=function(D){var Q=C;return function(){var V=C;C=Q;try{return D.apply(this,arguments)}finally{C=V}}}})(xa)),xa}var gf;function hv(){return gf||(gf=1,ya.exports=mv()),ya.exports}var vf;function gv(){if(vf)return lt;vf=1;var n=Ya(),l=hv();function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),v=Object.prototype.hasOwnProperty,x=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,y={},S={};function C(e){return v.call(S,e)?!0:v.call(y,e)?!1:x.test(e)?S[e]=!0:(y[e]=!0,!1)}function _(e,t,r,o){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function b(e,t,r,o){if(t===null||typeof t>"u"||_(e,t,r,o))return!0;if(o)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function k(e,t,r,o,s,u,p){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=s,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=p}var T={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){T[e]=new k(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];T[t]=new k(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){T[e]=new k(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){T[e]=new k(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){T[e]=new k(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){T[e]=new k(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){T[e]=new k(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){T[e]=new k(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){T[e]=new k(e,5,!1,e.toLowerCase(),null,!1,!1)});var A=/[\-:]([a-z])/g;function L(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(A,L);T[t]=new k(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(A,L);T[t]=new k(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(A,L);T[t]=new k(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){T[e]=new k(e,1,!1,e.toLowerCase(),null,!1,!1)}),T.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){T[e]=new k(e,1,!1,e.toLowerCase(),null,!0,!0)});function $(e,t,r,o){var s=T.hasOwnProperty(t)?T[t]:null;(s!==null?s.type!==0:o||!(2w||s[p]!==u[w]){var E=` +`+s[p].replace(" at new "," at ");return e.displayName&&E.includes("")&&(E=E.replace("",e.displayName)),E}while(1<=p&&0<=w);break}}}finally{de=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?I(e):""}function ve(e){switch(e.tag){case 5:return I(e.type);case 16:return I("Lazy");case 13:return I("Suspense");case 19:return I("SuspenseList");case 0:case 2:case 15:return e=pe(e.type,!1),e;case 11:return e=pe(e.type.render,!1),e;case 1:return e=pe(e.type,!0),e;default:return""}}function ye(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case B:return"Fragment";case Y:return"Portal";case te:return"Profiler";case ie:return"StrictMode";case me:return"Suspense";case ce:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ue:return(e.displayName||"Context")+".Consumer";case ne:return(e._context.displayName||"Context")+".Provider";case J:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ee:return t=e.displayName||null,t!==null?t:ye(e.type)||"Memo";case le:t=e._payload,e=e._init;try{return ye(e(t))}catch{}}return null}function we(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ye(t);case 8:return t===ie?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Se(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function _e(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ze(e){var t=_e(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var s=r.get,u=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(p){o=""+p,u.call(this,p)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return o},setValue:function(p){o=""+p},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Hn(e){e._valueTracker||(e._valueTracker=Ze(e))}function No(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),o="";return e&&(o=_e(e)?e.checked?"true":"false":e.value),e=o,e!==r?(t.setValue(e),!0):!1}function Ht(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ci(e,t){var r=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function vu(e,t){var r=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;r=Se(t.value!=null?t.value:r),e._wrapperState={initialChecked:o,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function yu(e,t){t=t.checked,t!=null&&$(e,"checked",t,!1)}function Ei(e,t){yu(e,t);var r=Se(t.value),o=t.type;if(r!=null)o==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ki(e,t.type,r):t.hasOwnProperty("defaultValue")&&ki(e,t.type,Se(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function xu(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function ki(e,t,r){(t!=="number"||Ht(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Rr=Array.isArray;function Un(e,t,r,o){if(e=e.options,t){t={};for(var s=0;s"+t.valueOf().toString()+"",t=Po.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Tr(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var jr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},mh=["Webkit","ms","Moz","O"];Object.keys(jr).forEach(function(e){mh.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),jr[t]=jr[e]})});function _u(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||jr.hasOwnProperty(e)&&jr[e]?(""+t).trim():t+"px"}function Nu(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var o=r.indexOf("--")===0,s=_u(r,t[r],o);r==="float"&&(r="cssFloat"),o?e.setProperty(r,s):e[r]=s}}var hh=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Pi(e,t){if(t){if(hh[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function bi(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ri=null;function Ti(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ji=null,Bn=null,Vn=null;function Pu(e){if(e=Jr(e)){if(typeof ji!="function")throw Error(i(280));var t=e.stateNode;t&&(t=Ko(t),ji(e.stateNode,e.type,t))}}function bu(e){Bn?Vn?Vn.push(e):Vn=[e]:Bn=e}function Ru(){if(Bn){var e=Bn,t=Vn;if(Vn=Bn=null,Pu(e),t)for(e=0;e>>=0,e===0?32:31-(Nh(e)/Ph|0)|0}var Oo=64,Ao=4194304;function Dr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Lo(e,t){var r=e.pendingLanes;if(r===0)return 0;var o=0,s=e.suspendedLanes,u=e.pingedLanes,p=r&268435455;if(p!==0){var w=p&~s;w!==0?o=Dr(w):(u&=p,u!==0&&(o=Dr(u)))}else p=r&~s,p!==0?o=Dr(p):u!==0&&(o=Dr(u));if(o===0)return 0;if(t!==0&&t!==o&&(t&s)===0&&(s=o&-o,u=t&-t,s>=u||s===16&&(u&4194240)!==0))return t;if((o&4)!==0&&(o|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0r;r++)t.push(e);return t}function Mr(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-wt(t),e[t]=r}function jh(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Br),rc=" ",oc=!1;function lc(e,t){switch(e){case"keyup":return lg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ic(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Gn=!1;function sg(e,t){switch(e){case"compositionend":return ic(t);case"keypress":return t.which!==32?null:(oc=!0,rc);case"textInput":return e=t.data,e===rc&&oc?null:e;default:return null}}function ag(e,t){if(Gn)return e==="compositionend"||!Xi&&lc(e,t)?(e=Zu(),Fo=Ui=ln=null,Gn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=o}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=pc(r)}}function hc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?hc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function gc(){for(var e=window,t=Ht();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=Ht(e.document)}return t}function qi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function vg(e){var t=gc(),r=e.focusedElem,o=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&hc(r.ownerDocument.documentElement,r)){if(o!==null&&qi(r)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var s=r.textContent.length,u=Math.min(o.start,s);o=o.end===void 0?u:Math.min(o.end,s),!e.extend&&u>o&&(s=o,o=u,u=s),s=mc(r,u);var p=mc(r,o);s&&p&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==p.node||e.focusOffset!==p.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),u>o?(e.addRange(t),e.extend(p.node,p.offset)):(t.setEnd(p.node,p.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Xn=null,Ji=null,Gr=null,es=!1;function vc(e,t,r){var o=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;es||Xn==null||Xn!==Ht(o)||(o=Xn,"selectionStart"in o&&qi(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Gr&&Qr(Gr,o)||(Gr=o,o=Qo(Ji,"onSelect"),0er||(e.current=fs[er],fs[er]=null,er--)}function Ne(e,t){er++,fs[er]=e.current,e.current=t}var cn={},Qe=un(cn),et=un(!1),bn=cn;function tr(e,t){var r=e.type.contextTypes;if(!r)return cn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var s={},u;for(u in r)s[u]=t[u];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function tt(e){return e=e.childContextTypes,e!=null}function Zo(){Re(et),Re(Qe)}function Oc(e,t,r){if(Qe.current!==cn)throw Error(i(168));Ne(Qe,t),Ne(et,r)}function Ac(e,t,r){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return r;o=o.getChildContext();for(var s in o)if(!(s in t))throw Error(i(108,we(e)||"Unknown",s));return V({},r,o)}function qo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||cn,bn=Qe.current,Ne(Qe,e),Ne(et,et.current),!0}function Lc(e,t,r){var o=e.stateNode;if(!o)throw Error(i(169));r?(e=Ac(e,t,bn),o.__reactInternalMemoizedMergedChildContext=e,Re(et),Re(Qe),Ne(Qe,e)):Re(et),Ne(et,r)}var Bt=null,Jo=!1,ps=!1;function Dc(e){Bt===null?Bt=[e]:Bt.push(e)}function Rg(e){Jo=!0,Dc(e)}function dn(){if(!ps&&Bt!==null){ps=!0;var e=0,t=ke;try{var r=Bt;for(ke=1;e>=p,s-=p,Vt=1<<32-wt(t)+s|r<ae?(Be=oe,oe=null):Be=oe.sibling;var Ce=z(R,oe,j[ae],H);if(Ce===null){oe===null&&(oe=Be);break}e&&oe&&Ce.alternate===null&&t(R,oe),N=u(Ce,N,ae),re===null?q=Ce:re.sibling=Ce,re=Ce,oe=Be}if(ae===j.length)return r(R,oe),je&&Tn(R,ae),q;if(oe===null){for(;aeae?(Be=oe,oe=null):Be=oe.sibling;var wn=z(R,oe,Ce.value,H);if(wn===null){oe===null&&(oe=Be);break}e&&oe&&wn.alternate===null&&t(R,oe),N=u(wn,N,ae),re===null?q=wn:re.sibling=wn,re=wn,oe=Be}if(Ce.done)return r(R,oe),je&&Tn(R,ae),q;if(oe===null){for(;!Ce.done;ae++,Ce=j.next())Ce=W(R,Ce.value,H),Ce!==null&&(N=u(Ce,N,ae),re===null?q=Ce:re.sibling=Ce,re=Ce);return je&&Tn(R,ae),q}for(oe=o(R,oe);!Ce.done;ae++,Ce=j.next())Ce=G(oe,R,ae,Ce.value,H),Ce!==null&&(e&&Ce.alternate!==null&&oe.delete(Ce.key===null?ae:Ce.key),N=u(Ce,N,ae),re===null?q=Ce:re.sibling=Ce,re=Ce);return e&&oe.forEach(function(uv){return t(R,uv)}),je&&Tn(R,ae),q}function Ie(R,N,j,H){if(typeof j=="object"&&j!==null&&j.type===B&&j.key===null&&(j=j.props.children),typeof j=="object"&&j!==null){switch(j.$$typeof){case U:e:{for(var q=j.key,re=N;re!==null;){if(re.key===q){if(q=j.type,q===B){if(re.tag===7){r(R,re.sibling),N=s(re,j.props.children),N.return=R,R=N;break e}}else if(re.elementType===q||typeof q=="object"&&q!==null&&q.$$typeof===le&&Wc(q)===re.type){r(R,re.sibling),N=s(re,j.props),N.ref=eo(R,re,j),N.return=R,R=N;break e}r(R,re);break}else t(R,re);re=re.sibling}j.type===B?(N=zn(j.props.children,R.mode,H,j.key),N.return=R,R=N):(H=Pl(j.type,j.key,j.props,null,R.mode,H),H.ref=eo(R,N,j),H.return=R,R=H)}return p(R);case Y:e:{for(re=j.key;N!==null;){if(N.key===re)if(N.tag===4&&N.stateNode.containerInfo===j.containerInfo&&N.stateNode.implementation===j.implementation){r(R,N.sibling),N=s(N,j.children||[]),N.return=R,R=N;break e}else{r(R,N);break}else t(R,N);N=N.sibling}N=ca(j,R.mode,H),N.return=R,R=N}return p(R);case le:return re=j._init,Ie(R,N,re(j._payload),H)}if(Rr(j))return K(R,N,j,H);if(Q(j))return Z(R,N,j,H);rl(R,j)}return typeof j=="string"&&j!==""||typeof j=="number"?(j=""+j,N!==null&&N.tag===6?(r(R,N.sibling),N=s(N,j),N.return=R,R=N):(r(R,N),N=ua(j,R.mode,H),N.return=R,R=N),p(R)):r(R,N)}return Ie}var lr=Hc(!0),Uc=Hc(!1),ol=un(null),ll=null,ir=null,xs=null;function ws(){xs=ir=ll=null}function Ss(e){var t=ol.current;Re(ol),e._currentValue=t}function Cs(e,t,r){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===r)break;e=e.return}}function sr(e,t){ll=e,xs=ir=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(nt=!0),e.firstContext=null)}function ht(e){var t=e._currentValue;if(xs!==e)if(e={context:e,memoizedValue:t,next:null},ir===null){if(ll===null)throw Error(i(308));ir=e,ll.dependencies={lanes:0,firstContext:e}}else ir=ir.next=e;return t}var jn=null;function Es(e){jn===null?jn=[e]:jn.push(e)}function Bc(e,t,r,o){var s=t.interleaved;return s===null?(r.next=r,Es(t)):(r.next=s.next,s.next=r),t.interleaved=r,Qt(e,o)}function Qt(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var fn=!1;function ks(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Vc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Gt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function pn(e,t,r){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,(xe&2)!==0){var s=o.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),o.pending=t,Qt(e,r)}return s=o.interleaved,s===null?(t.next=t,Es(o)):(t.next=s.next,s.next=t),o.interleaved=t,Qt(e,r)}function il(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,r|=o,t.lanes=r,zi(e,r)}}function Yc(e,t){var r=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,r===o)){var s=null,u=null;if(r=r.firstBaseUpdate,r!==null){do{var p={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};u===null?s=u=p:u=u.next=p,r=r.next}while(r!==null);u===null?s=u=t:u=u.next=t}else s=u=t;r={baseState:o.baseState,firstBaseUpdate:s,lastBaseUpdate:u,shared:o.shared,effects:o.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function sl(e,t,r,o){var s=e.updateQueue;fn=!1;var u=s.firstBaseUpdate,p=s.lastBaseUpdate,w=s.shared.pending;if(w!==null){s.shared.pending=null;var E=w,O=E.next;E.next=null,p===null?u=O:p.next=O,p=E;var F=e.alternate;F!==null&&(F=F.updateQueue,w=F.lastBaseUpdate,w!==p&&(w===null?F.firstBaseUpdate=O:w.next=O,F.lastBaseUpdate=E))}if(u!==null){var W=s.baseState;p=0,F=O=E=null,w=u;do{var z=w.lane,G=w.eventTime;if((o&z)===z){F!==null&&(F=F.next={eventTime:G,lane:0,tag:w.tag,payload:w.payload,callback:w.callback,next:null});e:{var K=e,Z=w;switch(z=t,G=r,Z.tag){case 1:if(K=Z.payload,typeof K=="function"){W=K.call(G,W,z);break e}W=K;break e;case 3:K.flags=K.flags&-65537|128;case 0:if(K=Z.payload,z=typeof K=="function"?K.call(G,W,z):K,z==null)break e;W=V({},W,z);break e;case 2:fn=!0}}w.callback!==null&&w.lane!==0&&(e.flags|=64,z=s.effects,z===null?s.effects=[w]:z.push(w))}else G={eventTime:G,lane:z,tag:w.tag,payload:w.payload,callback:w.callback,next:null},F===null?(O=F=G,E=W):F=F.next=G,p|=z;if(w=w.next,w===null){if(w=s.shared.pending,w===null)break;z=w,w=z.next,z.next=null,s.lastBaseUpdate=z,s.shared.pending=null}}while(!0);if(F===null&&(E=W),s.baseState=E,s.firstBaseUpdate=O,s.lastBaseUpdate=F,t=s.shared.interleaved,t!==null){s=t;do p|=s.lane,s=s.next;while(s!==t)}else u===null&&(s.shared.lanes=0);Ln|=p,e.lanes=p,e.memoizedState=W}}function Qc(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var o=Rs.transition;Rs.transition={};try{e(!1),t()}finally{ke=r,Rs.transition=o}}function fd(){return gt().memoizedState}function Ag(e,t,r){var o=vn(e);if(r={lane:o,action:r,hasEagerState:!1,eagerState:null,next:null},pd(e))md(t,r);else if(r=Bc(e,t,r,o),r!==null){var s=Je();Nt(r,e,o,s),hd(r,t,o)}}function Lg(e,t,r){var o=vn(e),s={lane:o,action:r,hasEagerState:!1,eagerState:null,next:null};if(pd(e))md(t,s);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var p=t.lastRenderedState,w=u(p,r);if(s.hasEagerState=!0,s.eagerState=w,St(w,p)){var E=t.interleaved;E===null?(s.next=s,Es(t)):(s.next=E.next,E.next=s),t.interleaved=s;return}}catch{}r=Bc(e,t,s,o),r!==null&&(s=Je(),Nt(r,e,o,s),hd(r,t,o))}}function pd(e){var t=e.alternate;return e===Ae||t!==null&&t===Ae}function md(e,t){oo=cl=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function hd(e,t,r){if((r&4194240)!==0){var o=t.lanes;o&=e.pendingLanes,r|=o,t.lanes=r,zi(e,r)}}var pl={readContext:ht,useCallback:Ge,useContext:Ge,useEffect:Ge,useImperativeHandle:Ge,useInsertionEffect:Ge,useLayoutEffect:Ge,useMemo:Ge,useReducer:Ge,useRef:Ge,useState:Ge,useDebugValue:Ge,useDeferredValue:Ge,useTransition:Ge,useMutableSource:Ge,useSyncExternalStore:Ge,useId:Ge,unstable_isNewReconciler:!1},Dg={readContext:ht,useCallback:function(e,t){return Lt().memoizedState=[e,t===void 0?null:t],e},useContext:ht,useEffect:od,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,dl(4194308,4,sd.bind(null,t,e),r)},useLayoutEffect:function(e,t){return dl(4194308,4,e,t)},useInsertionEffect:function(e,t){return dl(4,2,e,t)},useMemo:function(e,t){var r=Lt();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var o=Lt();return t=r!==void 0?r(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=Ag.bind(null,Ae,e),[o.memoizedState,e]},useRef:function(e){var t=Lt();return e={current:e},t.memoizedState=e},useState:nd,useDebugValue:Ms,useDeferredValue:function(e){return Lt().memoizedState=e},useTransition:function(){var e=nd(!1),t=e[0];return e=Og.bind(null,e[1]),Lt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var o=Ae,s=Lt();if(je){if(r===void 0)throw Error(i(407));r=r()}else{if(r=t(),Ue===null)throw Error(i(349));(An&30)!==0||Zc(o,t,r)}s.memoizedState=r;var u={value:r,getSnapshot:t};return s.queue=u,od(Jc.bind(null,o,u,e),[e]),o.flags|=2048,so(9,qc.bind(null,o,u,r,t),void 0,null),r},useId:function(){var e=Lt(),t=Ue.identifierPrefix;if(je){var r=Yt,o=Vt;r=(o&~(1<<32-wt(o)-1)).toString(32)+r,t=":"+t+"R"+r,r=lo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=p.createElement(r,{is:o.is}):(e=p.createElement(r),r==="select"&&(p=e,o.multiple?p.multiple=!0:o.size&&(p.size=o.size))):e=p.createElementNS(e,r),e[Ot]=t,e[qr]=o,Dd(e,t,!1,!1),t.stateNode=e;e:{switch(p=bi(r,o),r){case"dialog":be("cancel",e),be("close",e),s=o;break;case"iframe":case"object":case"embed":be("load",e),s=o;break;case"video":case"audio":for(s=0;sfr&&(t.flags|=128,o=!0,ao(u,!1),t.lanes=4194304)}else{if(!o)if(e=al(p),e!==null){if(t.flags|=128,o=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),ao(u,!0),u.tail===null&&u.tailMode==="hidden"&&!p.alternate&&!je)return Xe(t),null}else 2*Me()-u.renderingStartTime>fr&&r!==1073741824&&(t.flags|=128,o=!0,ao(u,!1),t.lanes=4194304);u.isBackwards?(p.sibling=t.child,t.child=p):(r=u.last,r!==null?r.sibling=p:t.child=p,u.last=p)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=Me(),t.sibling=null,r=Oe.current,Ne(Oe,o?r&1|2:r&1),t):(Xe(t),null);case 22:case 23:return ia(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&(t.mode&1)!==0?(ut&1073741824)!==0&&(Xe(t),t.subtreeFlags&6&&(t.flags|=8192)):Xe(t),null;case 24:return null;case 25:return null}throw Error(i(156,t.tag))}function Ug(e,t){switch(hs(t),t.tag){case 1:return tt(t.type)&&Zo(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ar(),Re(et),Re(Qe),bs(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ns(t),null;case 13:if(Re(Oe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));or()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Re(Oe),null;case 4:return ar(),null;case 10:return Ss(t.type._context),null;case 22:case 23:return ia(),null;case 24:return null;default:return null}}var vl=!1,Ke=!1,Bg=typeof WeakSet=="function"?WeakSet:Set,X=null;function cr(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(o){De(e,t,o)}else r.current=null}function Gs(e,t,r){try{r()}catch(o){De(e,t,o)}}var zd=!1;function Vg(e,t){if(is=Io,e=gc(),qi(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var o=r.getSelection&&r.getSelection();if(o&&o.rangeCount!==0){r=o.anchorNode;var s=o.anchorOffset,u=o.focusNode;o=o.focusOffset;try{r.nodeType,u.nodeType}catch{r=null;break e}var p=0,w=-1,E=-1,O=0,F=0,W=e,z=null;t:for(;;){for(var G;W!==r||s!==0&&W.nodeType!==3||(w=p+s),W!==u||o!==0&&W.nodeType!==3||(E=p+o),W.nodeType===3&&(p+=W.nodeValue.length),(G=W.firstChild)!==null;)z=W,W=G;for(;;){if(W===e)break t;if(z===r&&++O===s&&(w=p),z===u&&++F===o&&(E=p),(G=W.nextSibling)!==null)break;W=z,z=W.parentNode}W=G}r=w===-1||E===-1?null:{start:w,end:E}}else r=null}r=r||{start:0,end:0}}else r=null;for(ss={focusedElem:e,selectionRange:r},Io=!1,X=t;X!==null;)if(t=X,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,X=e;else for(;X!==null;){t=X;try{var K=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(K!==null){var Z=K.memoizedProps,Ie=K.memoizedState,R=t.stateNode,N=R.getSnapshotBeforeUpdate(t.elementType===t.type?Z:Et(t.type,Z),Ie);R.__reactInternalSnapshotBeforeUpdate=N}break;case 3:var j=t.stateNode.containerInfo;j.nodeType===1?j.textContent="":j.nodeType===9&&j.documentElement&&j.removeChild(j.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(H){De(t,t.return,H)}if(e=t.sibling,e!==null){e.return=t.return,X=e;break}X=t.return}return K=zd,zd=!1,K}function uo(e,t,r){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var s=o=o.next;do{if((s.tag&e)===e){var u=s.destroy;s.destroy=void 0,u!==void 0&&Gs(t,r,u)}s=s.next}while(s!==o)}}function yl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var o=r.create;r.destroy=o()}r=r.next}while(r!==t)}}function Xs(e){var t=e.ref;if(t!==null){var r=e.stateNode;e.tag,e=r,typeof t=="function"?t(e):t.current=e}}function Fd(e){var t=e.alternate;t!==null&&(e.alternate=null,Fd(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ot],delete t[qr],delete t[ds],delete t[Pg],delete t[bg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function $d(e){return e.tag===5||e.tag===3||e.tag===4}function Wd(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||$d(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ks(e,t,r){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=Xo));else if(o!==4&&(e=e.child,e!==null))for(Ks(e,t,r),e=e.sibling;e!==null;)Ks(e,t,r),e=e.sibling}function Zs(e,t,r){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(Zs(e,t,r),e=e.sibling;e!==null;)Zs(e,t,r),e=e.sibling}var Ve=null,kt=!1;function mn(e,t,r){for(r=r.child;r!==null;)Hd(e,t,r),r=r.sibling}function Hd(e,t,r){if(jt&&typeof jt.onCommitFiberUnmount=="function")try{jt.onCommitFiberUnmount(jo,r)}catch{}switch(r.tag){case 5:Ke||cr(r,t);case 6:var o=Ve,s=kt;Ve=null,mn(e,t,r),Ve=o,kt=s,Ve!==null&&(kt?(e=Ve,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Ve.removeChild(r.stateNode));break;case 18:Ve!==null&&(kt?(e=Ve,r=r.stateNode,e.nodeType===8?cs(e.parentNode,r):e.nodeType===1&&cs(e,r),Wr(e)):cs(Ve,r.stateNode));break;case 4:o=Ve,s=kt,Ve=r.stateNode.containerInfo,kt=!0,mn(e,t,r),Ve=o,kt=s;break;case 0:case 11:case 14:case 15:if(!Ke&&(o=r.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){s=o=o.next;do{var u=s,p=u.destroy;u=u.tag,p!==void 0&&((u&2)!==0||(u&4)!==0)&&Gs(r,t,p),s=s.next}while(s!==o)}mn(e,t,r);break;case 1:if(!Ke&&(cr(r,t),o=r.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=r.memoizedProps,o.state=r.memoizedState,o.componentWillUnmount()}catch(w){De(r,t,w)}mn(e,t,r);break;case 21:mn(e,t,r);break;case 22:r.mode&1?(Ke=(o=Ke)||r.memoizedState!==null,mn(e,t,r),Ke=o):mn(e,t,r);break;default:mn(e,t,r)}}function Ud(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new Bg),t.forEach(function(o){var s=ev.bind(null,e,o);r.has(o)||(r.add(o),o.then(s,s))})}}function _t(e,t){var r=t.deletions;if(r!==null)for(var o=0;os&&(s=p),o&=~u}if(o=s,o=Me()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Qg(o/1960))-o,10e?16:e,gn===null)var o=!1;else{if(e=gn,gn=null,El=0,(xe&6)!==0)throw Error(i(331));var s=xe;for(xe|=4,X=e.current;X!==null;){var u=X,p=u.child;if((X.flags&16)!==0){var w=u.deletions;if(w!==null){for(var E=0;EMe()-ea?Mn(e,0):Js|=r),ot(e,t)}function nf(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ao,Ao<<=1,(Ao&130023424)===0&&(Ao=4194304)));var r=Je();e=Qt(e,t),e!==null&&(Mr(e,t,r),ot(e,r))}function Jg(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),nf(e,r)}function ev(e,t){var r=0;switch(e.tag){case 13:var o=e.stateNode,s=e.memoizedState;s!==null&&(r=s.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(i(314))}o!==null&&o.delete(t),nf(e,r)}var rf;rf=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||et.current)nt=!0;else{if((e.lanes&r)===0&&(t.flags&128)===0)return nt=!1,Wg(e,t,r);nt=(e.flags&131072)!==0}else nt=!1,je&&(t.flags&1048576)!==0&&Mc(t,tl,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;gl(e,t),e=t.pendingProps;var s=tr(t,Qe.current);sr(t,r),s=js(null,t,o,e,s,r);var u=Os();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,tt(o)?(u=!0,qo(t)):u=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,ks(t),s.updater=ml,t.stateNode=s,s._reactInternals=t,zs(t,o,e,r),t=Hs(null,t,o,!0,u,r)):(t.tag=0,je&&u&&ms(t),qe(null,t,s,r),t=t.child),t;case 16:o=t.elementType;e:{switch(gl(e,t),e=t.pendingProps,s=o._init,o=s(o._payload),t.type=o,s=t.tag=nv(o),e=Et(o,e),s){case 0:t=Ws(null,t,o,e,r);break e;case 1:t=Rd(null,t,o,e,r);break e;case 11:t=kd(null,t,o,e,r);break e;case 14:t=_d(null,t,o,Et(o.type,e),r);break e}throw Error(i(306,o,""))}return t;case 0:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),Ws(e,t,o,s,r);case 1:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),Rd(e,t,o,s,r);case 3:e:{if(Td(t),e===null)throw Error(i(387));o=t.pendingProps,u=t.memoizedState,s=u.element,Vc(e,t),sl(t,o,null,r);var p=t.memoizedState;if(o=p.element,u.isDehydrated)if(u={element:o,isDehydrated:!1,cache:p.cache,pendingSuspenseBoundaries:p.pendingSuspenseBoundaries,transitions:p.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){s=ur(Error(i(423)),t),t=jd(e,t,o,r,s);break e}else if(o!==s){s=ur(Error(i(424)),t),t=jd(e,t,o,r,s);break e}else for(at=an(t.stateNode.containerInfo.firstChild),st=t,je=!0,Ct=null,r=Uc(t,null,o,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(or(),o===s){t=Xt(e,t,r);break e}qe(e,t,o,r)}t=t.child}return t;case 5:return Gc(t),e===null&&vs(t),o=t.type,s=t.pendingProps,u=e!==null?e.memoizedProps:null,p=s.children,as(o,s)?p=null:u!==null&&as(o,u)&&(t.flags|=32),bd(e,t),qe(e,t,p,r),t.child;case 6:return e===null&&vs(t),null;case 13:return Od(e,t,r);case 4:return _s(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=lr(t,null,o,r):qe(e,t,o,r),t.child;case 11:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),kd(e,t,o,s,r);case 7:return qe(e,t,t.pendingProps,r),t.child;case 8:return qe(e,t,t.pendingProps.children,r),t.child;case 12:return qe(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(o=t.type._context,s=t.pendingProps,u=t.memoizedProps,p=s.value,Ne(ol,o._currentValue),o._currentValue=p,u!==null)if(St(u.value,p)){if(u.children===s.children&&!et.current){t=Xt(e,t,r);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var w=u.dependencies;if(w!==null){p=u.child;for(var E=w.firstContext;E!==null;){if(E.context===o){if(u.tag===1){E=Gt(-1,r&-r),E.tag=2;var O=u.updateQueue;if(O!==null){O=O.shared;var F=O.pending;F===null?E.next=E:(E.next=F.next,F.next=E),O.pending=E}}u.lanes|=r,E=u.alternate,E!==null&&(E.lanes|=r),Cs(u.return,r,t),w.lanes|=r;break}E=E.next}}else if(u.tag===10)p=u.type===t.type?null:u.child;else if(u.tag===18){if(p=u.return,p===null)throw Error(i(341));p.lanes|=r,w=p.alternate,w!==null&&(w.lanes|=r),Cs(p,r,t),p=u.sibling}else p=u.child;if(p!==null)p.return=u;else for(p=u;p!==null;){if(p===t){p=null;break}if(u=p.sibling,u!==null){u.return=p.return,p=u;break}p=p.return}u=p}qe(e,t,s.children,r),t=t.child}return t;case 9:return s=t.type,o=t.pendingProps.children,sr(t,r),s=ht(s),o=o(s),t.flags|=1,qe(e,t,o,r),t.child;case 14:return o=t.type,s=Et(o,t.pendingProps),s=Et(o.type,s),_d(e,t,o,s,r);case 15:return Nd(e,t,t.type,t.pendingProps,r);case 17:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),gl(e,t),t.tag=1,tt(o)?(e=!0,qo(t)):e=!1,sr(t,r),vd(t,o,s),zs(t,o,s,r),Hs(null,t,o,!0,e,r);case 19:return Ld(e,t,r);case 22:return Pd(e,t,r)}throw Error(i(156,t.tag))};function of(e,t){return Iu(e,t)}function tv(e,t,r,o){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function yt(e,t,r,o){return new tv(e,t,r,o)}function aa(e){return e=e.prototype,!(!e||!e.isReactComponent)}function nv(e){if(typeof e=="function")return aa(e)?1:0;if(e!=null){if(e=e.$$typeof,e===J)return 11;if(e===ee)return 14}return 2}function xn(e,t){var r=e.alternate;return r===null?(r=yt(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function Pl(e,t,r,o,s,u){var p=2;if(o=e,typeof e=="function")aa(e)&&(p=1);else if(typeof e=="string")p=5;else e:switch(e){case B:return zn(r.children,s,u,t);case ie:p=8,s|=8;break;case te:return e=yt(12,r,t,s|2),e.elementType=te,e.lanes=u,e;case me:return e=yt(13,r,t,s),e.elementType=me,e.lanes=u,e;case ce:return e=yt(19,r,t,s),e.elementType=ce,e.lanes=u,e;case se:return bl(r,s,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ne:p=10;break e;case ue:p=9;break e;case J:p=11;break e;case ee:p=14;break e;case le:p=16,o=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return t=yt(p,r,t,s),t.elementType=e,t.type=o,t.lanes=u,t}function zn(e,t,r,o){return e=yt(7,e,o,t),e.lanes=r,e}function bl(e,t,r,o){return e=yt(22,e,o,t),e.elementType=se,e.lanes=r,e.stateNode={isHidden:!1},e}function ua(e,t,r){return e=yt(6,e,null,t),e.lanes=r,e}function ca(e,t,r){return t=yt(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function rv(e,t,r,o,s){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ii(0),this.expirationTimes=Ii(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ii(0),this.identifierPrefix=o,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function da(e,t,r,o,s,u,p,w,E){return e=new rv(e,t,r,w,E),t===1?(t=1,u===!0&&(t|=8)):t=0,u=yt(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:o,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},ks(u),e}function ov(e,t,r){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(l){console.error(l)}}return n(),va.exports=gv(),va.exports}var xf;function vv(){if(xf)return Dl;xf=1;var n=op();return Dl.createRoot=n.createRoot,Dl.hydrateRoot=n.hydrateRoot,Dl}var yv=vv();const xv=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),wv=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(l,i,a)=>a?a.toUpperCase():i.toLowerCase()),wf=n=>{const l=wv(n);return l.charAt(0).toUpperCase()+l.slice(1)},lp=(...n)=>n.filter((l,i,a)=>!!l&&l.trim()!==""&&a.indexOf(l)===i).join(" ").trim(),Sv=n=>{for(const l in n)if(l.startsWith("aria-")||l==="role"||l==="title")return!0};var Cv={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Ev=g.forwardRef(({color:n="currentColor",size:l=24,strokeWidth:i=2,absoluteStrokeWidth:a,className:c="",children:d,iconNode:m,...f},v)=>g.createElement("svg",{ref:v,...Cv,width:l,height:l,stroke:n,strokeWidth:a?Number(i)*24/Number(l):i,className:lp("lucide",c),...!d&&!Sv(f)&&{"aria-hidden":"true"},...f},[...m.map(([x,y])=>g.createElement(x,y)),...Array.isArray(d)?d:[d]]));const kr=(n,l)=>{const i=g.forwardRef(({className:a,...c},d)=>g.createElement(Ev,{ref:d,iconNode:l,className:lp(`lucide-${xv(wf(n))}`,`lucide-${n}`,a),...c}));return i.displayName=wf(n),i};const kv=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],ip=kr("chevron-down",kv);const _v=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],sp=kr("circle-alert",_v);const Nv=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Pv=kr("info",Nv);const bv=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],Rv=kr("loader-circle",bv);const Tv=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],jv=kr("shield",Tv);const Ov=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Av=kr("x",Ov);var Qa=op();const Lv=tp(Qa);function Sf(n,l){if(typeof n=="function")return n(l);n!=null&&(n.current=l)}function ap(...n){return l=>{let i=!1;const a=n.map(c=>{const d=Sf(c,l);return!i&&typeof d=="function"&&(i=!0),d});if(i)return()=>{for(let c=0;c{const{children:d,...m}=a,f=g.Children.toArray(d),v=f.find(Iv);if(v){const x=v.props.children,y=f.map(S=>S===v?g.Children.count(x)>1?g.Children.only(null):g.isValidElement(x)?x.props.children:null:S);return h.jsx(l,{...m,ref:c,children:g.isValidElement(x)?g.cloneElement(x,void 0,y):null})}return h.jsx(l,{...m,ref:c,children:d})});return i.displayName=`${n}.Slot`,i}function Dv(n){const l=g.forwardRef((i,a)=>{const{children:c,...d}=i;if(g.isValidElement(c)){const m=Fv(c),f=zv(d,c.props);return c.type!==g.Fragment&&(f.ref=a?ap(a,m):m),g.cloneElement(c,f)}return g.Children.count(c)>1?g.Children.only(null):null});return l.displayName=`${n}.SlotClone`,l}var cp=Symbol("radix.slottable");function Mv(n){const l=({children:i})=>h.jsx(h.Fragment,{children:i});return l.displayName=`${n}.Slottable`,l.__radixId=cp,l}function Iv(n){return g.isValidElement(n)&&typeof n.type=="function"&&"__radixId"in n.type&&n.type.__radixId===cp}function zv(n,l){const i={...l};for(const a in l){const c=n[a],d=l[a];/^on[A-Z]/.test(a)?c&&d?i[a]=(...f)=>{const v=d(...f);return c(...f),v}:c&&(i[a]=c):a==="style"?i[a]={...c,...d}:a==="className"&&(i[a]=[c,d].filter(Boolean).join(" "))}return{...n,...i}}function Fv(n){let l=Object.getOwnPropertyDescriptor(n.props,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning;return i?n.ref:(l=Object.getOwnPropertyDescriptor(n,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning,i?n.props.ref:n.props.ref||n.ref)}var $v=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Le=$v.reduce((n,l)=>{const i=up(`Primitive.${l}`),a=g.forwardRef((c,d)=>{const{asChild:m,...f}=c,v=m?i:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),h.jsx(v,{...f,ref:d})});return a.displayName=`Primitive.${l}`,{...n,[l]:a}},{});function Wv(n,l){n&&Qa.flushSync(()=>n.dispatchEvent(l))}var Ft=globalThis?.document?g.useLayoutEffect:()=>{};function Hv(n,l){return g.useReducer((i,a)=>l[i][a]??i,n)}var Rt=n=>{const{present:l,children:i}=n,a=Uv(l),c=typeof i=="function"?i({present:a.isPresent}):g.Children.only(i),d=We(a.ref,Bv(c));return typeof i=="function"||a.isPresent?g.cloneElement(c,{ref:d}):null};Rt.displayName="Presence";function Uv(n){const[l,i]=g.useState(),a=g.useRef(null),c=g.useRef(n),d=g.useRef("none"),m=n?"mounted":"unmounted",[f,v]=Hv(m,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return g.useEffect(()=>{const x=Ml(a.current);d.current=f==="mounted"?x:"none"},[f]),Ft(()=>{const x=a.current,y=c.current;if(y!==n){const C=d.current,_=Ml(x);n?v("MOUNT"):_==="none"||x?.display==="none"?v("UNMOUNT"):v(y&&C!==_?"ANIMATION_OUT":"UNMOUNT"),c.current=n}},[n,v]),Ft(()=>{if(l){let x;const y=l.ownerDocument.defaultView??window,S=_=>{const k=Ml(a.current).includes(CSS.escape(_.animationName));if(_.target===l&&k&&(v("ANIMATION_END"),!c.current)){const T=l.style.animationFillMode;l.style.animationFillMode="forwards",x=y.setTimeout(()=>{l.style.animationFillMode==="forwards"&&(l.style.animationFillMode=T)})}},C=_=>{_.target===l&&(d.current=Ml(a.current))};return l.addEventListener("animationstart",C),l.addEventListener("animationcancel",S),l.addEventListener("animationend",S),()=>{y.clearTimeout(x),l.removeEventListener("animationstart",C),l.removeEventListener("animationcancel",S),l.removeEventListener("animationend",S)}}else v("ANIMATION_END")},[l,v]),{isPresent:["mounted","unmountSuspended"].includes(f),ref:g.useCallback(x=>{a.current=x?getComputedStyle(x):null,i(x)},[])}}function Ml(n){return n?.animationName||"none"}function Bv(n){let l=Object.getOwnPropertyDescriptor(n.props,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning;return i?n.ref:(l=Object.getOwnPropertyDescriptor(n,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning,i?n.props.ref:n.props.ref||n.ref)}function Vv(n,l){const i=g.createContext(l),a=d=>{const{children:m,...f}=d,v=g.useMemo(()=>f,Object.values(f));return h.jsx(i.Provider,{value:v,children:m})};a.displayName=n+"Provider";function c(d){const m=g.useContext(i);if(m)return m;if(l!==void 0)return l;throw new Error(`\`${d}\` must be used within \`${n}\``)}return[a,c]}function _r(n,l=[]){let i=[];function a(d,m){const f=g.createContext(m),v=i.length;i=[...i,m];const x=S=>{const{scope:C,children:_,...b}=S,k=C?.[n]?.[v]||f,T=g.useMemo(()=>b,Object.values(b));return h.jsx(k.Provider,{value:T,children:_})};x.displayName=d+"Provider";function y(S,C){const _=C?.[n]?.[v]||f,b=g.useContext(_);if(b)return b;if(m!==void 0)return m;throw new Error(`\`${S}\` must be used within \`${d}\``)}return[x,y]}const c=()=>{const d=i.map(m=>g.createContext(m));return function(f){const v=f?.[n]||d;return g.useMemo(()=>({[`__scope${n}`]:{...f,[n]:v}}),[f,v])}};return c.scopeName=n,[a,Yv(c,...l)]}function Yv(...n){const l=n[0];if(n.length===1)return l;const i=()=>{const a=n.map(c=>({useScope:c(),scopeName:c.scopeName}));return function(d){const m=a.reduce((f,{useScope:v,scopeName:x})=>{const S=v(d)[`__scope${x}`];return{...f,...S}},{});return g.useMemo(()=>({[`__scope${l.scopeName}`]:m}),[m])}};return i.scopeName=l.scopeName,i}function dt(n){const l=g.useRef(n);return g.useEffect(()=>{l.current=n}),g.useMemo(()=>(...i)=>l.current?.(...i),[])}var Qv=g.createContext(void 0);function Gv(n){const l=g.useContext(Qv);return n||l||"ltr"}function Xv(n,[l,i]){return Math.min(i,Math.max(l,n))}function Ee(n,l,{checkForDefaultPrevented:i=!0}={}){return function(c){if(n?.(c),i===!1||!c.defaultPrevented)return l?.(c)}}function Kv(n,l){return g.useReducer((i,a)=>l[i][a]??i,n)}var Ga="ScrollArea",[dp]=_r(Ga),[Zv,xt]=dp(Ga),fp=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,type:a="hover",dir:c,scrollHideDelay:d=600,...m}=n,[f,v]=g.useState(null),[x,y]=g.useState(null),[S,C]=g.useState(null),[_,b]=g.useState(null),[k,T]=g.useState(null),[A,L]=g.useState(0),[$,M]=g.useState(0),[U,Y]=g.useState(!1),[B,ie]=g.useState(!1),te=We(l,ue=>v(ue)),ne=Gv(c);return h.jsx(Zv,{scope:i,type:a,dir:ne,scrollHideDelay:d,scrollArea:f,viewport:x,onViewportChange:y,content:S,onContentChange:C,scrollbarX:_,onScrollbarXChange:b,scrollbarXEnabled:U,onScrollbarXEnabledChange:Y,scrollbarY:k,onScrollbarYChange:T,scrollbarYEnabled:B,onScrollbarYEnabledChange:ie,onCornerWidthChange:L,onCornerHeightChange:M,children:h.jsx(Le.div,{dir:ne,...m,ref:te,style:{position:"relative","--radix-scroll-area-corner-width":A+"px","--radix-scroll-area-corner-height":$+"px",...n.style}})})});fp.displayName=Ga;var pp="ScrollAreaViewport",mp=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,children:a,nonce:c,...d}=n,m=xt(pp,i),f=g.useRef(null),v=We(l,f,m.onViewportChange);return h.jsxs(h.Fragment,{children:[h.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:c}),h.jsx(Le.div,{"data-radix-scroll-area-viewport":"",...d,ref:v,style:{overflowX:m.scrollbarXEnabled?"scroll":"hidden",overflowY:m.scrollbarYEnabled?"scroll":"hidden",...n.style},children:h.jsx("div",{ref:m.onContentChange,style:{minWidth:"100%",display:"table"},children:a})})]})});mp.displayName=pp;var $t="ScrollAreaScrollbar",Xa=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=xt($t,n.__scopeScrollArea),{onScrollbarXEnabledChange:d,onScrollbarYEnabledChange:m}=c,f=n.orientation==="horizontal";return g.useEffect(()=>(f?d(!0):m(!0),()=>{f?d(!1):m(!1)}),[f,d,m]),c.type==="hover"?h.jsx(qv,{...a,ref:l,forceMount:i}):c.type==="scroll"?h.jsx(Jv,{...a,ref:l,forceMount:i}):c.type==="auto"?h.jsx(hp,{...a,ref:l,forceMount:i}):c.type==="always"?h.jsx(Ka,{...a,ref:l}):null});Xa.displayName=$t;var qv=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=xt($t,n.__scopeScrollArea),[d,m]=g.useState(!1);return g.useEffect(()=>{const f=c.scrollArea;let v=0;if(f){const x=()=>{window.clearTimeout(v),m(!0)},y=()=>{v=window.setTimeout(()=>m(!1),c.scrollHideDelay)};return f.addEventListener("pointerenter",x),f.addEventListener("pointerleave",y),()=>{window.clearTimeout(v),f.removeEventListener("pointerenter",x),f.removeEventListener("pointerleave",y)}}},[c.scrollArea,c.scrollHideDelay]),h.jsx(Rt,{present:i||d,children:h.jsx(hp,{"data-state":d?"visible":"hidden",...a,ref:l})})}),Jv=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=xt($t,n.__scopeScrollArea),d=n.orientation==="horizontal",m=ti(()=>v("SCROLL_END"),100),[f,v]=Kv("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return g.useEffect(()=>{if(f==="idle"){const x=window.setTimeout(()=>v("HIDE"),c.scrollHideDelay);return()=>window.clearTimeout(x)}},[f,c.scrollHideDelay,v]),g.useEffect(()=>{const x=c.viewport,y=d?"scrollLeft":"scrollTop";if(x){let S=x[y];const C=()=>{const _=x[y];S!==_&&(v("SCROLL"),m()),S=_};return x.addEventListener("scroll",C),()=>x.removeEventListener("scroll",C)}},[c.viewport,d,v,m]),h.jsx(Rt,{present:i||f!=="hidden",children:h.jsx(Ka,{"data-state":f==="hidden"?"hidden":"visible",...a,ref:l,onPointerEnter:Ee(n.onPointerEnter,()=>v("POINTER_ENTER")),onPointerLeave:Ee(n.onPointerLeave,()=>v("POINTER_LEAVE"))})})}),hp=g.forwardRef((n,l)=>{const i=xt($t,n.__scopeScrollArea),{forceMount:a,...c}=n,[d,m]=g.useState(!1),f=n.orientation==="horizontal",v=ti(()=>{if(i.viewport){const x=i.viewport.offsetWidth{const{orientation:i="vertical",...a}=n,c=xt($t,n.__scopeScrollArea),d=g.useRef(null),m=g.useRef(0),[f,v]=g.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),x=wp(f.viewport,f.content),y={...a,sizes:f,onSizesChange:v,hasThumb:x>0&&x<1,onThumbChange:C=>d.current=C,onThumbPointerUp:()=>m.current=0,onThumbPointerDown:C=>m.current=C};function S(C,_){return ly(C,m.current,f,_)}return i==="horizontal"?h.jsx(ey,{...y,ref:l,onThumbPositionChange:()=>{if(c.viewport&&d.current){const C=c.viewport.scrollLeft,_=Cf(C,f,c.dir);d.current.style.transform=`translate3d(${_}px, 0, 0)`}},onWheelScroll:C=>{c.viewport&&(c.viewport.scrollLeft=C)},onDragScroll:C=>{c.viewport&&(c.viewport.scrollLeft=S(C,c.dir))}}):i==="vertical"?h.jsx(ty,{...y,ref:l,onThumbPositionChange:()=>{if(c.viewport&&d.current){const C=c.viewport.scrollTop,_=Cf(C,f);d.current.style.transform=`translate3d(0, ${_}px, 0)`}},onWheelScroll:C=>{c.viewport&&(c.viewport.scrollTop=C)},onDragScroll:C=>{c.viewport&&(c.viewport.scrollTop=S(C))}}):null}),ey=g.forwardRef((n,l)=>{const{sizes:i,onSizesChange:a,...c}=n,d=xt($t,n.__scopeScrollArea),[m,f]=g.useState(),v=g.useRef(null),x=We(l,v,d.onScrollbarXChange);return g.useEffect(()=>{v.current&&f(getComputedStyle(v.current))},[v]),h.jsx(vp,{"data-orientation":"horizontal",...c,ref:x,sizes:i,style:{bottom:0,left:d.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:d.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":ei(i)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.x),onDragScroll:y=>n.onDragScroll(y.x),onWheelScroll:(y,S)=>{if(d.viewport){const C=d.viewport.scrollLeft+y.deltaX;n.onWheelScroll(C),Cp(C,S)&&y.preventDefault()}},onResize:()=>{v.current&&d.viewport&&m&&a({content:d.viewport.scrollWidth,viewport:d.viewport.offsetWidth,scrollbar:{size:v.current.clientWidth,paddingStart:Yl(m.paddingLeft),paddingEnd:Yl(m.paddingRight)}})}})}),ty=g.forwardRef((n,l)=>{const{sizes:i,onSizesChange:a,...c}=n,d=xt($t,n.__scopeScrollArea),[m,f]=g.useState(),v=g.useRef(null),x=We(l,v,d.onScrollbarYChange);return g.useEffect(()=>{v.current&&f(getComputedStyle(v.current))},[v]),h.jsx(vp,{"data-orientation":"vertical",...c,ref:x,sizes:i,style:{top:0,right:d.dir==="ltr"?0:void 0,left:d.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":ei(i)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.y),onDragScroll:y=>n.onDragScroll(y.y),onWheelScroll:(y,S)=>{if(d.viewport){const C=d.viewport.scrollTop+y.deltaY;n.onWheelScroll(C),Cp(C,S)&&y.preventDefault()}},onResize:()=>{v.current&&d.viewport&&m&&a({content:d.viewport.scrollHeight,viewport:d.viewport.offsetHeight,scrollbar:{size:v.current.clientHeight,paddingStart:Yl(m.paddingTop),paddingEnd:Yl(m.paddingBottom)}})}})}),[ny,gp]=dp($t),vp=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,sizes:a,hasThumb:c,onThumbChange:d,onThumbPointerUp:m,onThumbPointerDown:f,onThumbPositionChange:v,onDragScroll:x,onWheelScroll:y,onResize:S,...C}=n,_=xt($t,i),[b,k]=g.useState(null),T=We(l,te=>k(te)),A=g.useRef(null),L=g.useRef(""),$=_.viewport,M=a.content-a.viewport,U=dt(y),Y=dt(v),B=ti(S,10);function ie(te){if(A.current){const ne=te.clientX-A.current.left,ue=te.clientY-A.current.top;x({x:ne,y:ue})}}return g.useEffect(()=>{const te=ne=>{const ue=ne.target;b?.contains(ue)&&U(ne,M)};return document.addEventListener("wheel",te,{passive:!1}),()=>document.removeEventListener("wheel",te,{passive:!1})},[$,b,M,U]),g.useEffect(Y,[a,Y]),Sr(b,B),Sr(_.content,B),h.jsx(ny,{scope:i,scrollbar:b,hasThumb:c,onThumbChange:dt(d),onThumbPointerUp:dt(m),onThumbPositionChange:Y,onThumbPointerDown:dt(f),children:h.jsx(Le.div,{...C,ref:T,style:{position:"absolute",...C.style},onPointerDown:Ee(n.onPointerDown,te=>{te.button===0&&(te.target.setPointerCapture(te.pointerId),A.current=b.getBoundingClientRect(),L.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",_.viewport&&(_.viewport.style.scrollBehavior="auto"),ie(te))}),onPointerMove:Ee(n.onPointerMove,ie),onPointerUp:Ee(n.onPointerUp,te=>{const ne=te.target;ne.hasPointerCapture(te.pointerId)&&ne.releasePointerCapture(te.pointerId),document.body.style.webkitUserSelect=L.current,_.viewport&&(_.viewport.style.scrollBehavior=""),A.current=null})})})}),Vl="ScrollAreaThumb",yp=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=gp(Vl,n.__scopeScrollArea);return h.jsx(Rt,{present:i||c.hasThumb,children:h.jsx(ry,{ref:l,...a})})}),ry=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,style:a,...c}=n,d=xt(Vl,i),m=gp(Vl,i),{onThumbPositionChange:f}=m,v=We(l,S=>m.onThumbChange(S)),x=g.useRef(void 0),y=ti(()=>{x.current&&(x.current(),x.current=void 0)},100);return g.useEffect(()=>{const S=d.viewport;if(S){const C=()=>{if(y(),!x.current){const _=iy(S,f);x.current=_,f()}};return f(),S.addEventListener("scroll",C),()=>S.removeEventListener("scroll",C)}},[d.viewport,y,f]),h.jsx(Le.div,{"data-state":m.hasThumb?"visible":"hidden",...c,ref:v,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...a},onPointerDownCapture:Ee(n.onPointerDownCapture,S=>{const _=S.target.getBoundingClientRect(),b=S.clientX-_.left,k=S.clientY-_.top;m.onThumbPointerDown({x:b,y:k})}),onPointerUp:Ee(n.onPointerUp,m.onThumbPointerUp)})});yp.displayName=Vl;var Za="ScrollAreaCorner",xp=g.forwardRef((n,l)=>{const i=xt(Za,n.__scopeScrollArea),a=!!(i.scrollbarX&&i.scrollbarY);return i.type!=="scroll"&&a?h.jsx(oy,{...n,ref:l}):null});xp.displayName=Za;var oy=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,...a}=n,c=xt(Za,i),[d,m]=g.useState(0),[f,v]=g.useState(0),x=!!(d&&f);return Sr(c.scrollbarX,()=>{const y=c.scrollbarX?.offsetHeight||0;c.onCornerHeightChange(y),v(y)}),Sr(c.scrollbarY,()=>{const y=c.scrollbarY?.offsetWidth||0;c.onCornerWidthChange(y),m(y)}),x?h.jsx(Le.div,{...a,ref:l,style:{width:d,height:f,position:"absolute",right:c.dir==="ltr"?0:void 0,left:c.dir==="rtl"?0:void 0,bottom:0,...n.style}}):null});function Yl(n){return n?parseInt(n,10):0}function wp(n,l){const i=n/l;return isNaN(i)?0:i}function ei(n){const l=wp(n.viewport,n.content),i=n.scrollbar.paddingStart+n.scrollbar.paddingEnd,a=(n.scrollbar.size-i)*l;return Math.max(a,18)}function ly(n,l,i,a="ltr"){const c=ei(i),d=c/2,m=l||d,f=c-m,v=i.scrollbar.paddingStart+m,x=i.scrollbar.size-i.scrollbar.paddingEnd-f,y=i.content-i.viewport,S=a==="ltr"?[0,y]:[y*-1,0];return Sp([v,x],S)(n)}function Cf(n,l,i="ltr"){const a=ei(l),c=l.scrollbar.paddingStart+l.scrollbar.paddingEnd,d=l.scrollbar.size-c,m=l.content-l.viewport,f=d-a,v=i==="ltr"?[0,m]:[m*-1,0],x=Xv(n,v);return Sp([0,m],[0,f])(x)}function Sp(n,l){return i=>{if(n[0]===n[1]||l[0]===l[1])return l[0];const a=(l[1]-l[0])/(n[1]-n[0]);return l[0]+a*(i-n[0])}}function Cp(n,l){return n>0&&n{})=>{let i={left:n.scrollLeft,top:n.scrollTop},a=0;return(function c(){const d={left:n.scrollLeft,top:n.scrollTop},m=i.left!==d.left,f=i.top!==d.top;(m||f)&&l(),i=d,a=window.requestAnimationFrame(c)})(),()=>window.cancelAnimationFrame(a)};function ti(n,l){const i=dt(n),a=g.useRef(0);return g.useEffect(()=>()=>window.clearTimeout(a.current),[]),g.useCallback(()=>{window.clearTimeout(a.current),a.current=window.setTimeout(i,l)},[i,l])}function Sr(n,l){const i=dt(l);Ft(()=>{let a=0;if(n){const c=new ResizeObserver(()=>{cancelAnimationFrame(a),a=window.requestAnimationFrame(i)});return c.observe(n),()=>{window.cancelAnimationFrame(a),c.unobserve(n)}}},[n,i])}var Ep=fp,sy=mp,ay=xp;function kp(n){var l,i,a="";if(typeof n=="string"||typeof n=="number")a+=n;else if(typeof n=="object")if(Array.isArray(n)){var c=n.length;for(l=0;l{const l=dy(n),{conflictingClassGroups:i,conflictingClassGroupModifiers:a}=n;return{getClassGroupId:m=>{const f=m.split(qa);return f[0]===""&&f.length!==1&&f.shift(),Np(f,l)||cy(m)},getConflictingClassGroupIds:(m,f)=>{const v=i[m]||[];return f&&a[m]?[...v,...a[m]]:v}}},Np=(n,l)=>{if(n.length===0)return l.classGroupId;const i=n[0],a=l.nextPart.get(i),c=a?Np(n.slice(1),a):void 0;if(c)return c;if(l.validators.length===0)return;const d=n.join(qa);return l.validators.find(({validator:m})=>m(d))?.classGroupId},Ef=/^\[(.+)\]$/,cy=n=>{if(Ef.test(n)){const l=Ef.exec(n)[1],i=l?.substring(0,l.indexOf(":"));if(i)return"arbitrary.."+i}},dy=n=>{const{theme:l,prefix:i}=n,a={nextPart:new Map,validators:[]};return py(Object.entries(n.classGroups),i).forEach(([d,m])=>{Ma(m,a,d,l)}),a},Ma=(n,l,i,a)=>{n.forEach(c=>{if(typeof c=="string"){const d=c===""?l:kf(l,c);d.classGroupId=i;return}if(typeof c=="function"){if(fy(c)){Ma(c(a),l,i,a);return}l.validators.push({validator:c,classGroupId:i});return}Object.entries(c).forEach(([d,m])=>{Ma(m,kf(l,d),i,a)})})},kf=(n,l)=>{let i=n;return l.split(qa).forEach(a=>{i.nextPart.has(a)||i.nextPart.set(a,{nextPart:new Map,validators:[]}),i=i.nextPart.get(a)}),i},fy=n=>n.isThemeGetter,py=(n,l)=>l?n.map(([i,a])=>{const c=a.map(d=>typeof d=="string"?l+d:typeof d=="object"?Object.fromEntries(Object.entries(d).map(([m,f])=>[l+m,f])):d);return[i,c]}):n,my=n=>{if(n<1)return{get:()=>{},set:()=>{}};let l=0,i=new Map,a=new Map;const c=(d,m)=>{i.set(d,m),l++,l>n&&(l=0,a=i,i=new Map)};return{get(d){let m=i.get(d);if(m!==void 0)return m;if((m=a.get(d))!==void 0)return c(d,m),m},set(d,m){i.has(d)?i.set(d,m):c(d,m)}}},Pp="!",hy=n=>{const{separator:l,experimentalParseClassName:i}=n,a=l.length===1,c=l[0],d=l.length,m=f=>{const v=[];let x=0,y=0,S;for(let T=0;Ty?S-y:void 0;return{modifiers:v,hasImportantModifier:_,baseClassName:b,maybePostfixModifierPosition:k}};return i?f=>i({className:f,parseClassName:m}):m},gy=n=>{if(n.length<=1)return n;const l=[];let i=[];return n.forEach(a=>{a[0]==="["?(l.push(...i.sort(),a),i=[]):i.push(a)}),l.push(...i.sort()),l},vy=n=>({cache:my(n.cacheSize),parseClassName:hy(n),...uy(n)}),yy=/\s+/,xy=(n,l)=>{const{parseClassName:i,getClassGroupId:a,getConflictingClassGroupIds:c}=l,d=[],m=n.trim().split(yy);let f="";for(let v=m.length-1;v>=0;v-=1){const x=m[v],{modifiers:y,hasImportantModifier:S,baseClassName:C,maybePostfixModifierPosition:_}=i(x);let b=!!_,k=a(b?C.substring(0,_):C);if(!k){if(!b){f=x+(f.length>0?" "+f:f);continue}if(k=a(C),!k){f=x+(f.length>0?" "+f:f);continue}b=!1}const T=gy(y).join(":"),A=S?T+Pp:T,L=A+k;if(d.includes(L))continue;d.push(L);const $=c(k,b);for(let M=0;M<$.length;++M){const U=$[M];d.push(A+U)}f=x+(f.length>0?" "+f:f)}return f};function wy(){let n=0,l,i,a="";for(;n{if(typeof n=="string")return n;let l,i="";for(let a=0;aS(y),n());return i=vy(x),a=i.cache.get,c=i.cache.set,d=f,f(v)}function f(v){const x=a(v);if(x)return x;const y=xy(v,i);return c(v,y),y}return function(){return d(wy.apply(null,arguments))}}const Te=n=>{const l=i=>i[n]||[];return l.isThemeGetter=!0,l},Rp=/^\[(?:([a-z-]+):)?(.+)\]$/i,Cy=/^\d+\/\d+$/,Ey=new Set(["px","full","screen"]),ky=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,_y=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Ny=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Py=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,by=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Zt=n=>yr(n)||Ey.has(n)||Cy.test(n),Sn=n=>Nr(n,"length",My),yr=n=>!!n&&!Number.isNaN(Number(n)),wa=n=>Nr(n,"number",yr),go=n=>!!n&&Number.isInteger(Number(n)),Ry=n=>n.endsWith("%")&&yr(n.slice(0,-1)),fe=n=>Rp.test(n),Cn=n=>ky.test(n),Ty=new Set(["length","size","percentage"]),jy=n=>Nr(n,Ty,Tp),Oy=n=>Nr(n,"position",Tp),Ay=new Set(["image","url"]),Ly=n=>Nr(n,Ay,zy),Dy=n=>Nr(n,"",Iy),vo=()=>!0,Nr=(n,l,i)=>{const a=Rp.exec(n);return a?a[1]?typeof l=="string"?a[1]===l:l.has(a[1]):i(a[2]):!1},My=n=>_y.test(n)&&!Ny.test(n),Tp=()=>!1,Iy=n=>Py.test(n),zy=n=>by.test(n),Fy=()=>{const n=Te("colors"),l=Te("spacing"),i=Te("blur"),a=Te("brightness"),c=Te("borderColor"),d=Te("borderRadius"),m=Te("borderSpacing"),f=Te("borderWidth"),v=Te("contrast"),x=Te("grayscale"),y=Te("hueRotate"),S=Te("invert"),C=Te("gap"),_=Te("gradientColorStops"),b=Te("gradientColorStopPositions"),k=Te("inset"),T=Te("margin"),A=Te("opacity"),L=Te("padding"),$=Te("saturate"),M=Te("scale"),U=Te("sepia"),Y=Te("skew"),B=Te("space"),ie=Te("translate"),te=()=>["auto","contain","none"],ne=()=>["auto","hidden","clip","visible","scroll"],ue=()=>["auto",fe,l],J=()=>[fe,l],me=()=>["",Zt,Sn],ce=()=>["auto",yr,fe],ee=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],le=()=>["solid","dashed","dotted","double","none"],se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],D=()=>["start","end","center","between","around","evenly","stretch"],Q=()=>["","0",fe],V=()=>["auto","avoid","all","avoid-page","page","left","right","column"],P=()=>[yr,fe];return{cacheSize:500,separator:":",theme:{colors:[vo],spacing:[Zt,Sn],blur:["none","",Cn,fe],brightness:P(),borderColor:[n],borderRadius:["none","","full",Cn,fe],borderSpacing:J(),borderWidth:me(),contrast:P(),grayscale:Q(),hueRotate:P(),invert:Q(),gap:J(),gradientColorStops:[n],gradientColorStopPositions:[Ry,Sn],inset:ue(),margin:ue(),opacity:P(),padding:J(),saturate:P(),scale:P(),sepia:Q(),skew:P(),space:J(),translate:J()},classGroups:{aspect:[{aspect:["auto","square","video",fe]}],container:["container"],columns:[{columns:[Cn]}],"break-after":[{"break-after":V()}],"break-before":[{"break-before":V()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ee(),fe]}],overflow:[{overflow:ne()}],"overflow-x":[{"overflow-x":ne()}],"overflow-y":[{"overflow-y":ne()}],overscroll:[{overscroll:te()}],"overscroll-x":[{"overscroll-x":te()}],"overscroll-y":[{"overscroll-y":te()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[k]}],"inset-x":[{"inset-x":[k]}],"inset-y":[{"inset-y":[k]}],start:[{start:[k]}],end:[{end:[k]}],top:[{top:[k]}],right:[{right:[k]}],bottom:[{bottom:[k]}],left:[{left:[k]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",go,fe]}],basis:[{basis:ue()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",fe]}],grow:[{grow:Q()}],shrink:[{shrink:Q()}],order:[{order:["first","last","none",go,fe]}],"grid-cols":[{"grid-cols":[vo]}],"col-start-end":[{col:["auto",{span:["full",go,fe]},fe]}],"col-start":[{"col-start":ce()}],"col-end":[{"col-end":ce()}],"grid-rows":[{"grid-rows":[vo]}],"row-start-end":[{row:["auto",{span:[go,fe]},fe]}],"row-start":[{"row-start":ce()}],"row-end":[{"row-end":ce()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",fe]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",fe]}],gap:[{gap:[C]}],"gap-x":[{"gap-x":[C]}],"gap-y":[{"gap-y":[C]}],"justify-content":[{justify:["normal",...D()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...D(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...D(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[L]}],px:[{px:[L]}],py:[{py:[L]}],ps:[{ps:[L]}],pe:[{pe:[L]}],pt:[{pt:[L]}],pr:[{pr:[L]}],pb:[{pb:[L]}],pl:[{pl:[L]}],m:[{m:[T]}],mx:[{mx:[T]}],my:[{my:[T]}],ms:[{ms:[T]}],me:[{me:[T]}],mt:[{mt:[T]}],mr:[{mr:[T]}],mb:[{mb:[T]}],ml:[{ml:[T]}],"space-x":[{"space-x":[B]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[B]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",fe,l]}],"min-w":[{"min-w":[fe,l,"min","max","fit"]}],"max-w":[{"max-w":[fe,l,"none","full","min","max","fit","prose",{screen:[Cn]},Cn]}],h:[{h:[fe,l,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[fe,l,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[fe,l,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[fe,l,"auto","min","max","fit"]}],"font-size":[{text:["base",Cn,Sn]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",wa]}],"font-family":[{font:[vo]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",fe]}],"line-clamp":[{"line-clamp":["none",yr,wa]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Zt,fe]}],"list-image":[{"list-image":["none",fe]}],"list-style-type":[{list:["none","disc","decimal",fe]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[n]}],"placeholder-opacity":[{"placeholder-opacity":[A]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[n]}],"text-opacity":[{"text-opacity":[A]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...le(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Zt,Sn]}],"underline-offset":[{"underline-offset":["auto",Zt,fe]}],"text-decoration-color":[{decoration:[n]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:J()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",fe]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",fe]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[A]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ee(),Oy]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",jy]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Ly]}],"bg-color":[{bg:[n]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[_]}],"gradient-via":[{via:[_]}],"gradient-to":[{to:[_]}],rounded:[{rounded:[d]}],"rounded-s":[{"rounded-s":[d]}],"rounded-e":[{"rounded-e":[d]}],"rounded-t":[{"rounded-t":[d]}],"rounded-r":[{"rounded-r":[d]}],"rounded-b":[{"rounded-b":[d]}],"rounded-l":[{"rounded-l":[d]}],"rounded-ss":[{"rounded-ss":[d]}],"rounded-se":[{"rounded-se":[d]}],"rounded-ee":[{"rounded-ee":[d]}],"rounded-es":[{"rounded-es":[d]}],"rounded-tl":[{"rounded-tl":[d]}],"rounded-tr":[{"rounded-tr":[d]}],"rounded-br":[{"rounded-br":[d]}],"rounded-bl":[{"rounded-bl":[d]}],"border-w":[{border:[f]}],"border-w-x":[{"border-x":[f]}],"border-w-y":[{"border-y":[f]}],"border-w-s":[{"border-s":[f]}],"border-w-e":[{"border-e":[f]}],"border-w-t":[{"border-t":[f]}],"border-w-r":[{"border-r":[f]}],"border-w-b":[{"border-b":[f]}],"border-w-l":[{"border-l":[f]}],"border-opacity":[{"border-opacity":[A]}],"border-style":[{border:[...le(),"hidden"]}],"divide-x":[{"divide-x":[f]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[f]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[A]}],"divide-style":[{divide:le()}],"border-color":[{border:[c]}],"border-color-x":[{"border-x":[c]}],"border-color-y":[{"border-y":[c]}],"border-color-s":[{"border-s":[c]}],"border-color-e":[{"border-e":[c]}],"border-color-t":[{"border-t":[c]}],"border-color-r":[{"border-r":[c]}],"border-color-b":[{"border-b":[c]}],"border-color-l":[{"border-l":[c]}],"divide-color":[{divide:[c]}],"outline-style":[{outline:["",...le()]}],"outline-offset":[{"outline-offset":[Zt,fe]}],"outline-w":[{outline:[Zt,Sn]}],"outline-color":[{outline:[n]}],"ring-w":[{ring:me()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[n]}],"ring-opacity":[{"ring-opacity":[A]}],"ring-offset-w":[{"ring-offset":[Zt,Sn]}],"ring-offset-color":[{"ring-offset":[n]}],shadow:[{shadow:["","inner","none",Cn,Dy]}],"shadow-color":[{shadow:[vo]}],opacity:[{opacity:[A]}],"mix-blend":[{"mix-blend":[...se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":se()}],filter:[{filter:["","none"]}],blur:[{blur:[i]}],brightness:[{brightness:[a]}],contrast:[{contrast:[v]}],"drop-shadow":[{"drop-shadow":["","none",Cn,fe]}],grayscale:[{grayscale:[x]}],"hue-rotate":[{"hue-rotate":[y]}],invert:[{invert:[S]}],saturate:[{saturate:[$]}],sepia:[{sepia:[U]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[i]}],"backdrop-brightness":[{"backdrop-brightness":[a]}],"backdrop-contrast":[{"backdrop-contrast":[v]}],"backdrop-grayscale":[{"backdrop-grayscale":[x]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[y]}],"backdrop-invert":[{"backdrop-invert":[S]}],"backdrop-opacity":[{"backdrop-opacity":[A]}],"backdrop-saturate":[{"backdrop-saturate":[$]}],"backdrop-sepia":[{"backdrop-sepia":[U]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[m]}],"border-spacing-x":[{"border-spacing-x":[m]}],"border-spacing-y":[{"border-spacing-y":[m]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",fe]}],duration:[{duration:P()}],ease:[{ease:["linear","in","out","in-out",fe]}],delay:[{delay:P()}],animate:[{animate:["none","spin","ping","pulse","bounce",fe]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[M]}],"scale-x":[{"scale-x":[M]}],"scale-y":[{"scale-y":[M]}],rotate:[{rotate:[go,fe]}],"translate-x":[{"translate-x":[ie]}],"translate-y":[{"translate-y":[ie]}],"skew-x":[{"skew-x":[Y]}],"skew-y":[{"skew-y":[Y]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",fe]}],accent:[{accent:["auto",n]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",fe]}],"caret-color":[{caret:[n]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":J()}],"scroll-mx":[{"scroll-mx":J()}],"scroll-my":[{"scroll-my":J()}],"scroll-ms":[{"scroll-ms":J()}],"scroll-me":[{"scroll-me":J()}],"scroll-mt":[{"scroll-mt":J()}],"scroll-mr":[{"scroll-mr":J()}],"scroll-mb":[{"scroll-mb":J()}],"scroll-ml":[{"scroll-ml":J()}],"scroll-p":[{"scroll-p":J()}],"scroll-px":[{"scroll-px":J()}],"scroll-py":[{"scroll-py":J()}],"scroll-ps":[{"scroll-ps":J()}],"scroll-pe":[{"scroll-pe":J()}],"scroll-pt":[{"scroll-pt":J()}],"scroll-pr":[{"scroll-pr":J()}],"scroll-pb":[{"scroll-pb":J()}],"scroll-pl":[{"scroll-pl":J()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",fe]}],fill:[{fill:[n,"none"]}],"stroke-w":[{stroke:[Zt,Sn,wa]}],stroke:[{stroke:[n,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},$y=Sy(Fy);function ge(...n){return $y(_p(n))}const ni=g.forwardRef(({className:n,children:l,...i},a)=>h.jsxs(Ep,{ref:a,className:ge("relative overflow-hidden",n),...i,children:[h.jsx(sy,{className:"h-full w-full rounded-[inherit]",children:l}),h.jsx(jp,{}),h.jsx(ay,{})]}));ni.displayName=Ep.displayName;const jp=g.forwardRef(({className:n,orientation:l="vertical",...i},a)=>h.jsx(Xa,{ref:a,orientation:l,className:ge("flex touch-none select-none transition-colors",l==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",l==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",n),...i,children:h.jsx(yp,{className:"relative flex-1 rounded-full bg-border"})}));jp.displayName=Xa.displayName;var Wy=rp[" useId ".trim().toString()]||(()=>{}),Hy=0;function xo(n){const[l,i]=g.useState(Wy());return Ft(()=>{i(a=>a??String(Hy++))},[n]),n||(l?`radix-${l}`:"")}var Uy=rp[" useInsertionEffect ".trim().toString()]||Ft;function ri({prop:n,defaultProp:l,onChange:i=()=>{},caller:a}){const[c,d,m]=By({defaultProp:l,onChange:i}),f=n!==void 0,v=f?n:c;{const y=g.useRef(n!==void 0);g.useEffect(()=>{const S=y.current;S!==f&&console.warn(`${a} is changing from ${S?"controlled":"uncontrolled"} to ${f?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),y.current=f},[f,a])}const x=g.useCallback(y=>{if(f){const S=Vy(y)?y(n):y;S!==n&&m.current?.(S)}else d(y)},[f,n,d,m]);return[v,x]}function By({defaultProp:n,onChange:l}){const[i,a]=g.useState(n),c=g.useRef(i),d=g.useRef(l);return Uy(()=>{d.current=l},[l]),g.useEffect(()=>{c.current!==i&&(d.current?.(i),c.current=i)},[i,c]),[i,a,d]}function Vy(n){return typeof n=="function"}function Yy(n,l=globalThis?.document){const i=dt(n);g.useEffect(()=>{const a=c=>{c.key==="Escape"&&i(c)};return l.addEventListener("keydown",a,{capture:!0}),()=>l.removeEventListener("keydown",a,{capture:!0})},[i,l])}var Qy="DismissableLayer",Ia="dismissableLayer.update",Gy="dismissableLayer.pointerDownOutside",Xy="dismissableLayer.focusOutside",_f,Op=g.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),oi=g.forwardRef((n,l)=>{const{disableOutsidePointerEvents:i=!1,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:m,onDismiss:f,...v}=n,x=g.useContext(Op),[y,S]=g.useState(null),C=y?.ownerDocument??globalThis?.document,[,_]=g.useState({}),b=We(l,B=>S(B)),k=Array.from(x.layers),[T]=[...x.layersWithOutsidePointerEventsDisabled].slice(-1),A=k.indexOf(T),L=y?k.indexOf(y):-1,$=x.layersWithOutsidePointerEventsDisabled.size>0,M=L>=A,U=qy(B=>{const ie=B.target,te=[...x.branches].some(ne=>ne.contains(ie));!M||te||(c?.(B),m?.(B),B.defaultPrevented||f?.())},C),Y=Jy(B=>{const ie=B.target;[...x.branches].some(ne=>ne.contains(ie))||(d?.(B),m?.(B),B.defaultPrevented||f?.())},C);return Yy(B=>{L===x.layers.size-1&&(a?.(B),!B.defaultPrevented&&f&&(B.preventDefault(),f()))},C),g.useEffect(()=>{if(y)return i&&(x.layersWithOutsidePointerEventsDisabled.size===0&&(_f=C.body.style.pointerEvents,C.body.style.pointerEvents="none"),x.layersWithOutsidePointerEventsDisabled.add(y)),x.layers.add(y),Nf(),()=>{i&&x.layersWithOutsidePointerEventsDisabled.size===1&&(C.body.style.pointerEvents=_f)}},[y,C,i,x]),g.useEffect(()=>()=>{y&&(x.layers.delete(y),x.layersWithOutsidePointerEventsDisabled.delete(y),Nf())},[y,x]),g.useEffect(()=>{const B=()=>_({});return document.addEventListener(Ia,B),()=>document.removeEventListener(Ia,B)},[]),h.jsx(Le.div,{...v,ref:b,style:{pointerEvents:$?M?"auto":"none":void 0,...n.style},onFocusCapture:Ee(n.onFocusCapture,Y.onFocusCapture),onBlurCapture:Ee(n.onBlurCapture,Y.onBlurCapture),onPointerDownCapture:Ee(n.onPointerDownCapture,U.onPointerDownCapture)})});oi.displayName=Qy;var Ky="DismissableLayerBranch",Zy=g.forwardRef((n,l)=>{const i=g.useContext(Op),a=g.useRef(null),c=We(l,a);return g.useEffect(()=>{const d=a.current;if(d)return i.branches.add(d),()=>{i.branches.delete(d)}},[i.branches]),h.jsx(Le.div,{...n,ref:c})});Zy.displayName=Ky;function qy(n,l=globalThis?.document){const i=dt(n),a=g.useRef(!1),c=g.useRef(()=>{});return g.useEffect(()=>{const d=f=>{if(f.target&&!a.current){let v=function(){Ap(Gy,i,x,{discrete:!0})};const x={originalEvent:f};f.pointerType==="touch"?(l.removeEventListener("click",c.current),c.current=v,l.addEventListener("click",c.current,{once:!0})):v()}else l.removeEventListener("click",c.current);a.current=!1},m=window.setTimeout(()=>{l.addEventListener("pointerdown",d)},0);return()=>{window.clearTimeout(m),l.removeEventListener("pointerdown",d),l.removeEventListener("click",c.current)}},[l,i]),{onPointerDownCapture:()=>a.current=!0}}function Jy(n,l=globalThis?.document){const i=dt(n),a=g.useRef(!1);return g.useEffect(()=>{const c=d=>{d.target&&!a.current&&Ap(Xy,i,{originalEvent:d},{discrete:!1})};return l.addEventListener("focusin",c),()=>l.removeEventListener("focusin",c)},[l,i]),{onFocusCapture:()=>a.current=!0,onBlurCapture:()=>a.current=!1}}function Nf(){const n=new CustomEvent(Ia);document.dispatchEvent(n)}function Ap(n,l,i,{discrete:a}){const c=i.originalEvent.target,d=new CustomEvent(n,{bubbles:!1,cancelable:!0,detail:i});l&&c.addEventListener(n,l,{once:!0}),a?Wv(c,d):c.dispatchEvent(d)}var Sa="focusScope.autoFocusOnMount",Ca="focusScope.autoFocusOnUnmount",Pf={bubbles:!1,cancelable:!0},ex="FocusScope",Lp=g.forwardRef((n,l)=>{const{loop:i=!1,trapped:a=!1,onMountAutoFocus:c,onUnmountAutoFocus:d,...m}=n,[f,v]=g.useState(null),x=dt(c),y=dt(d),S=g.useRef(null),C=We(l,k=>v(k)),_=g.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;g.useEffect(()=>{if(a){let k=function($){if(_.paused||!f)return;const M=$.target;f.contains(M)?S.current=M:En(S.current,{select:!0})},T=function($){if(_.paused||!f)return;const M=$.relatedTarget;M!==null&&(f.contains(M)||En(S.current,{select:!0}))},A=function($){if(document.activeElement===document.body)for(const U of $)U.removedNodes.length>0&&En(f)};document.addEventListener("focusin",k),document.addEventListener("focusout",T);const L=new MutationObserver(A);return f&&L.observe(f,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",T),L.disconnect()}}},[a,f,_.paused]),g.useEffect(()=>{if(f){Rf.add(_);const k=document.activeElement;if(!f.contains(k)){const A=new CustomEvent(Sa,Pf);f.addEventListener(Sa,x),f.dispatchEvent(A),A.defaultPrevented||(tx(ix(Dp(f)),{select:!0}),document.activeElement===k&&En(f))}return()=>{f.removeEventListener(Sa,x),setTimeout(()=>{const A=new CustomEvent(Ca,Pf);f.addEventListener(Ca,y),f.dispatchEvent(A),A.defaultPrevented||En(k??document.body,{select:!0}),f.removeEventListener(Ca,y),Rf.remove(_)},0)}}},[f,x,y,_]);const b=g.useCallback(k=>{if(!i&&!a||_.paused)return;const T=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,A=document.activeElement;if(T&&A){const L=k.currentTarget,[$,M]=nx(L);$&&M?!k.shiftKey&&A===M?(k.preventDefault(),i&&En($,{select:!0})):k.shiftKey&&A===$&&(k.preventDefault(),i&&En(M,{select:!0})):A===L&&k.preventDefault()}},[i,a,_.paused]);return h.jsx(Le.div,{tabIndex:-1,...m,ref:C,onKeyDown:b})});Lp.displayName=ex;function tx(n,{select:l=!1}={}){const i=document.activeElement;for(const a of n)if(En(a,{select:l}),document.activeElement!==i)return}function nx(n){const l=Dp(n),i=bf(l,n),a=bf(l.reverse(),n);return[i,a]}function Dp(n){const l=[],i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>{const c=a.tagName==="INPUT"&&a.type==="hidden";return a.disabled||a.hidden||c?NodeFilter.FILTER_SKIP:a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;i.nextNode();)l.push(i.currentNode);return l}function bf(n,l){for(const i of n)if(!rx(i,{upTo:l}))return i}function rx(n,{upTo:l}){if(getComputedStyle(n).visibility==="hidden")return!0;for(;n;){if(l!==void 0&&n===l)return!1;if(getComputedStyle(n).display==="none")return!0;n=n.parentElement}return!1}function ox(n){return n instanceof HTMLInputElement&&"select"in n}function En(n,{select:l=!1}={}){if(n&&n.focus){const i=document.activeElement;n.focus({preventScroll:!0}),n!==i&&ox(n)&&l&&n.select()}}var Rf=lx();function lx(){let n=[];return{add(l){const i=n[0];l!==i&&i?.pause(),n=Tf(n,l),n.unshift(l)},remove(l){n=Tf(n,l),n[0]?.resume()}}}function Tf(n,l){const i=[...n],a=i.indexOf(l);return a!==-1&&i.splice(a,1),i}function ix(n){return n.filter(l=>l.tagName!=="A")}var sx="Portal",Mp=g.forwardRef((n,l)=>{const{container:i,...a}=n,[c,d]=g.useState(!1);Ft(()=>d(!0),[]);const m=i||c&&globalThis?.document?.body;return m?Lv.createPortal(h.jsx(Le.div,{...a,ref:l}),m):null});Mp.displayName=sx;var Ea=0;function ax(){g.useEffect(()=>{const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",n[0]??jf()),document.body.insertAdjacentElement("beforeend",n[1]??jf()),Ea++,()=>{Ea===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(l=>l.remove()),Ea--}},[])}function jf(){const n=document.createElement("span");return n.setAttribute("data-radix-focus-guard",""),n.tabIndex=0,n.style.outline="none",n.style.opacity="0",n.style.position="fixed",n.style.pointerEvents="none",n}var Mt=function(){return Mt=Object.assign||function(l){for(var i,a=1,c=arguments.length;a"u")return _x;var l=Nx(n),i=document.documentElement.clientWidth,a=window.innerWidth;return{left:l[0],top:l[1],right:l[2],gap:Math.max(0,a-i+l[2]-l[0])}},bx=$p(),xr="data-scroll-locked",Rx=function(n,l,i,a){var c=n.left,d=n.top,m=n.right,f=n.gap;return i===void 0&&(i="margin"),` + .`.concat(cx,` { + overflow: hidden `).concat(a,`; + padding-right: `).concat(f,"px ").concat(a,`; + } + body[`).concat(xr,`] { + overflow: hidden `).concat(a,`; + overscroll-behavior: contain; + `).concat([l&&"position: relative ".concat(a,";"),i==="margin"&&` + padding-left: `.concat(c,`px; + padding-top: `).concat(d,`px; + padding-right: `).concat(m,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(f,"px ").concat(a,`; + `),i==="padding"&&"padding-right: ".concat(f,"px ").concat(a,";")].filter(Boolean).join(""),` + } + + .`).concat(Hl,` { + right: `).concat(f,"px ").concat(a,`; + } + + .`).concat(Ul,` { + margin-right: `).concat(f,"px ").concat(a,`; + } + + .`).concat(Hl," .").concat(Hl,` { + right: 0 `).concat(a,`; + } + + .`).concat(Ul," .").concat(Ul,` { + margin-right: 0 `).concat(a,`; + } + + body[`).concat(xr,`] { + `).concat(dx,": ").concat(f,`px; + } +`)},Af=function(){var n=parseInt(document.body.getAttribute(xr)||"0",10);return isFinite(n)?n:0},Tx=function(){g.useEffect(function(){return document.body.setAttribute(xr,(Af()+1).toString()),function(){var n=Af()-1;n<=0?document.body.removeAttribute(xr):document.body.setAttribute(xr,n.toString())}},[])},jx=function(n){var l=n.noRelative,i=n.noImportant,a=n.gapMode,c=a===void 0?"margin":a;Tx();var d=g.useMemo(function(){return Px(c)},[c]);return g.createElement(bx,{styles:Rx(d,!l,c,i?"":"!important")})},za=!1;if(typeof window<"u")try{var Il=Object.defineProperty({},"passive",{get:function(){return za=!0,!0}});window.addEventListener("test",Il,Il),window.removeEventListener("test",Il,Il)}catch{za=!1}var mr=za?{passive:!1}:!1,Ox=function(n){return n.tagName==="TEXTAREA"},Wp=function(n,l){if(!(n instanceof Element))return!1;var i=window.getComputedStyle(n);return i[l]!=="hidden"&&!(i.overflowY===i.overflowX&&!Ox(n)&&i[l]==="visible")},Ax=function(n){return Wp(n,"overflowY")},Lx=function(n){return Wp(n,"overflowX")},Lf=function(n,l){var i=l.ownerDocument,a=l;do{typeof ShadowRoot<"u"&&a instanceof ShadowRoot&&(a=a.host);var c=Hp(n,a);if(c){var d=Up(n,a),m=d[1],f=d[2];if(m>f)return!0}a=a.parentNode}while(a&&a!==i.body);return!1},Dx=function(n){var l=n.scrollTop,i=n.scrollHeight,a=n.clientHeight;return[l,i,a]},Mx=function(n){var l=n.scrollLeft,i=n.scrollWidth,a=n.clientWidth;return[l,i,a]},Hp=function(n,l){return n==="v"?Ax(l):Lx(l)},Up=function(n,l){return n==="v"?Dx(l):Mx(l)},Ix=function(n,l){return n==="h"&&l==="rtl"?-1:1},zx=function(n,l,i,a,c){var d=Ix(n,window.getComputedStyle(l).direction),m=d*a,f=i.target,v=l.contains(f),x=!1,y=m>0,S=0,C=0;do{if(!f)break;var _=Up(n,f),b=_[0],k=_[1],T=_[2],A=k-T-d*b;(b||A)&&Hp(n,f)&&(S+=A,C+=b);var L=f.parentNode;f=L&&L.nodeType===Node.DOCUMENT_FRAGMENT_NODE?L.host:L}while(!v&&f!==document.body||v&&(l.contains(f)||l===f));return(y&&Math.abs(S)<1||!y&&Math.abs(C)<1)&&(x=!0),x},zl=function(n){return"changedTouches"in n?[n.changedTouches[0].clientX,n.changedTouches[0].clientY]:[0,0]},Df=function(n){return[n.deltaX,n.deltaY]},Mf=function(n){return n&&"current"in n?n.current:n},Fx=function(n,l){return n[0]===l[0]&&n[1]===l[1]},$x=function(n){return` + .block-interactivity-`.concat(n,` {pointer-events: none;} + .allow-interactivity-`).concat(n,` {pointer-events: all;} +`)},Wx=0,hr=[];function Hx(n){var l=g.useRef([]),i=g.useRef([0,0]),a=g.useRef(),c=g.useState(Wx++)[0],d=g.useState($p)[0],m=g.useRef(n);g.useEffect(function(){m.current=n},[n]),g.useEffect(function(){if(n.inert){document.body.classList.add("block-interactivity-".concat(c));var k=ux([n.lockRef.current],(n.shards||[]).map(Mf),!0).filter(Boolean);return k.forEach(function(T){return T.classList.add("allow-interactivity-".concat(c))}),function(){document.body.classList.remove("block-interactivity-".concat(c)),k.forEach(function(T){return T.classList.remove("allow-interactivity-".concat(c))})}}},[n.inert,n.lockRef.current,n.shards]);var f=g.useCallback(function(k,T){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!m.current.allowPinchZoom;var A=zl(k),L=i.current,$="deltaX"in k?k.deltaX:L[0]-A[0],M="deltaY"in k?k.deltaY:L[1]-A[1],U,Y=k.target,B=Math.abs($)>Math.abs(M)?"h":"v";if("touches"in k&&B==="h"&&Y.type==="range")return!1;var ie=window.getSelection(),te=ie&&ie.anchorNode,ne=te?te===Y||te.contains(Y):!1;if(ne)return!1;var ue=Lf(B,Y);if(!ue)return!0;if(ue?U=B:(U=B==="v"?"h":"v",ue=Lf(B,Y)),!ue)return!1;if(!a.current&&"changedTouches"in k&&($||M)&&(a.current=U),!U)return!0;var J=a.current||U;return zx(J,T,k,J==="h"?$:M)},[]),v=g.useCallback(function(k){var T=k;if(!(!hr.length||hr[hr.length-1]!==d)){var A="deltaY"in T?Df(T):zl(T),L=l.current.filter(function(U){return U.name===T.type&&(U.target===T.target||T.target===U.shadowParent)&&Fx(U.delta,A)})[0];if(L&&L.should){T.cancelable&&T.preventDefault();return}if(!L){var $=(m.current.shards||[]).map(Mf).filter(Boolean).filter(function(U){return U.contains(T.target)}),M=$.length>0?f(T,$[0]):!m.current.noIsolation;M&&T.cancelable&&T.preventDefault()}}},[]),x=g.useCallback(function(k,T,A,L){var $={name:k,delta:T,target:A,should:L,shadowParent:Ux(A)};l.current.push($),setTimeout(function(){l.current=l.current.filter(function(M){return M!==$})},1)},[]),y=g.useCallback(function(k){i.current=zl(k),a.current=void 0},[]),S=g.useCallback(function(k){x(k.type,Df(k),k.target,f(k,n.lockRef.current))},[]),C=g.useCallback(function(k){x(k.type,zl(k),k.target,f(k,n.lockRef.current))},[]);g.useEffect(function(){return hr.push(d),n.setCallbacks({onScrollCapture:S,onWheelCapture:S,onTouchMoveCapture:C}),document.addEventListener("wheel",v,mr),document.addEventListener("touchmove",v,mr),document.addEventListener("touchstart",y,mr),function(){hr=hr.filter(function(k){return k!==d}),document.removeEventListener("wheel",v,mr),document.removeEventListener("touchmove",v,mr),document.removeEventListener("touchstart",y,mr)}},[]);var _=n.removeScrollBar,b=n.inert;return g.createElement(g.Fragment,null,b?g.createElement(d,{styles:$x(c)}):null,_?g.createElement(jx,{noRelative:n.noRelative,gapMode:n.gapMode}):null)}function Ux(n){for(var l=null;n!==null;)n instanceof ShadowRoot&&(l=n.host,n=n.host),n=n.parentNode;return l}const Bx=yx(Fp,Hx);var Bp=g.forwardRef(function(n,l){return g.createElement(li,Mt({},n,{ref:l,sideCar:Bx}))});Bp.classNames=li.classNames;var Vx=function(n){if(typeof document>"u")return null;var l=Array.isArray(n)?n[0]:n;return l.ownerDocument.body},gr=new WeakMap,Fl=new WeakMap,$l={},Pa=0,Vp=function(n){return n&&(n.host||Vp(n.parentNode))},Yx=function(n,l){return l.map(function(i){if(n.contains(i))return i;var a=Vp(i);return a&&n.contains(a)?a:(console.error("aria-hidden",i,"in not contained inside",n,". Doing nothing"),null)}).filter(function(i){return!!i})},Qx=function(n,l,i,a){var c=Yx(l,Array.isArray(n)?n:[n]);$l[i]||($l[i]=new WeakMap);var d=$l[i],m=[],f=new Set,v=new Set(c),x=function(S){!S||f.has(S)||(f.add(S),x(S.parentNode))};c.forEach(x);var y=function(S){!S||v.has(S)||Array.prototype.forEach.call(S.children,function(C){if(f.has(C))y(C);else try{var _=C.getAttribute(a),b=_!==null&&_!=="false",k=(gr.get(C)||0)+1,T=(d.get(C)||0)+1;gr.set(C,k),d.set(C,T),m.push(C),k===1&&b&&Fl.set(C,!0),T===1&&C.setAttribute(i,"true"),b||C.setAttribute(a,"true")}catch(A){console.error("aria-hidden: cannot operate on ",C,A)}})};return y(l),f.clear(),Pa++,function(){m.forEach(function(S){var C=gr.get(S)-1,_=d.get(S)-1;gr.set(S,C),d.set(S,_),C||(Fl.has(S)||S.removeAttribute(a),Fl.delete(S)),_||S.removeAttribute(i)}),Pa--,Pa||(gr=new WeakMap,gr=new WeakMap,Fl=new WeakMap,$l={})}},Gx=function(n,l,i){i===void 0&&(i="data-aria-hidden");var a=Array.from(Array.isArray(n)?n:[n]),c=Vx(n);return c?(a.push.apply(a,Array.from(c.querySelectorAll("[aria-live], script"))),Qx(a,c,i,"aria-hidden")):function(){return null}},ii="Dialog",[Yp]=_r(ii),[Xx,Tt]=Yp(ii),Qp=n=>{const{__scopeDialog:l,children:i,open:a,defaultOpen:c,onOpenChange:d,modal:m=!0}=n,f=g.useRef(null),v=g.useRef(null),[x,y]=ri({prop:a,defaultProp:c??!1,onChange:d,caller:ii});return h.jsx(Xx,{scope:l,triggerRef:f,contentRef:v,contentId:xo(),titleId:xo(),descriptionId:xo(),open:x,onOpenChange:y,onOpenToggle:g.useCallback(()=>y(S=>!S),[y]),modal:m,children:i})};Qp.displayName=ii;var Gp="DialogTrigger",Kx=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(Gp,i),d=We(l,c.triggerRef);return h.jsx(Le.button,{type:"button","aria-haspopup":"dialog","aria-expanded":c.open,"aria-controls":c.contentId,"data-state":tu(c.open),...a,ref:d,onClick:Ee(n.onClick,c.onOpenToggle)})});Kx.displayName=Gp;var Ja="DialogPortal",[Zx,Xp]=Yp(Ja,{forceMount:void 0}),Kp=n=>{const{__scopeDialog:l,forceMount:i,children:a,container:c}=n,d=Tt(Ja,l);return h.jsx(Zx,{scope:l,forceMount:i,children:g.Children.map(a,m=>h.jsx(Rt,{present:i||d.open,children:h.jsx(Mp,{asChild:!0,container:c,children:m})}))})};Kp.displayName=Ja;var Ql="DialogOverlay",Zp=g.forwardRef((n,l)=>{const i=Xp(Ql,n.__scopeDialog),{forceMount:a=i.forceMount,...c}=n,d=Tt(Ql,n.__scopeDialog);return d.modal?h.jsx(Rt,{present:a||d.open,children:h.jsx(Jx,{...c,ref:l})}):null});Zp.displayName=Ql;var qx=up("DialogOverlay.RemoveScroll"),Jx=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(Ql,i);return h.jsx(Bp,{as:qx,allowPinchZoom:!0,shards:[c.contentRef],children:h.jsx(Le.div,{"data-state":tu(c.open),...a,ref:l,style:{pointerEvents:"auto",...a.style}})})}),$n="DialogContent",qp=g.forwardRef((n,l)=>{const i=Xp($n,n.__scopeDialog),{forceMount:a=i.forceMount,...c}=n,d=Tt($n,n.__scopeDialog);return h.jsx(Rt,{present:a||d.open,children:d.modal?h.jsx(e0,{...c,ref:l}):h.jsx(t0,{...c,ref:l})})});qp.displayName=$n;var e0=g.forwardRef((n,l)=>{const i=Tt($n,n.__scopeDialog),a=g.useRef(null),c=We(l,i.contentRef,a);return g.useEffect(()=>{const d=a.current;if(d)return Gx(d)},[]),h.jsx(Jp,{...n,ref:c,trapFocus:i.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Ee(n.onCloseAutoFocus,d=>{d.preventDefault(),i.triggerRef.current?.focus()}),onPointerDownOutside:Ee(n.onPointerDownOutside,d=>{const m=d.detail.originalEvent,f=m.button===0&&m.ctrlKey===!0;(m.button===2||f)&&d.preventDefault()}),onFocusOutside:Ee(n.onFocusOutside,d=>d.preventDefault())})}),t0=g.forwardRef((n,l)=>{const i=Tt($n,n.__scopeDialog),a=g.useRef(!1),c=g.useRef(!1);return h.jsx(Jp,{...n,ref:l,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:d=>{n.onCloseAutoFocus?.(d),d.defaultPrevented||(a.current||i.triggerRef.current?.focus(),d.preventDefault()),a.current=!1,c.current=!1},onInteractOutside:d=>{n.onInteractOutside?.(d),d.defaultPrevented||(a.current=!0,d.detail.originalEvent.type==="pointerdown"&&(c.current=!0));const m=d.target;i.triggerRef.current?.contains(m)&&d.preventDefault(),d.detail.originalEvent.type==="focusin"&&c.current&&d.preventDefault()}})}),Jp=g.forwardRef((n,l)=>{const{__scopeDialog:i,trapFocus:a,onOpenAutoFocus:c,onCloseAutoFocus:d,...m}=n,f=Tt($n,i),v=g.useRef(null),x=We(l,v);return ax(),h.jsxs(h.Fragment,{children:[h.jsx(Lp,{asChild:!0,loop:!0,trapped:a,onMountAutoFocus:c,onUnmountAutoFocus:d,children:h.jsx(oi,{role:"dialog",id:f.contentId,"aria-describedby":f.descriptionId,"aria-labelledby":f.titleId,"data-state":tu(f.open),...m,ref:x,onDismiss:()=>f.onOpenChange(!1)})}),h.jsxs(h.Fragment,{children:[h.jsx(n0,{titleId:f.titleId}),h.jsx(o0,{contentRef:v,descriptionId:f.descriptionId})]})]})}),eu="DialogTitle",em=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(eu,i);return h.jsx(Le.h2,{id:c.titleId,...a,ref:l})});em.displayName=eu;var tm="DialogDescription",nm=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(tm,i);return h.jsx(Le.p,{id:c.descriptionId,...a,ref:l})});nm.displayName=tm;var rm="DialogClose",om=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(rm,i);return h.jsx(Le.button,{type:"button",...a,ref:l,onClick:Ee(n.onClick,()=>c.onOpenChange(!1))})});om.displayName=rm;function tu(n){return n?"open":"closed"}var lm="DialogTitleWarning",[rS,im]=Vv(lm,{contentName:$n,titleName:eu,docsSlug:"dialog"}),n0=({titleId:n})=>{const l=im(lm),i=`\`${l.contentName}\` requires a \`${l.titleName}\` for the component to be accessible for screen reader users. + +If you want to hide the \`${l.titleName}\`, you can wrap it with our VisuallyHidden component. + +For more information, see https://radix-ui.com/primitives/docs/components/${l.docsSlug}`;return g.useEffect(()=>{n&&(document.getElementById(n)||console.error(i))},[i,n]),null},r0="DialogDescriptionWarning",o0=({contentRef:n,descriptionId:l})=>{const a=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${im(r0).contentName}}.`;return g.useEffect(()=>{const c=n.current?.getAttribute("aria-describedby");l&&c&&(document.getElementById(l)||console.warn(a))},[a,n,l]),null},l0=Qp,i0=Kp,sm=Zp,am=qp,um=em,cm=nm,s0=om;const If=n=>typeof n=="boolean"?`${n}`:n===0?"0":n,zf=_p,a0=(n,l)=>i=>{var a;if(l?.variants==null)return zf(n,i?.class,i?.className);const{variants:c,defaultVariants:d}=l,m=Object.keys(c).map(x=>{const y=i?.[x],S=d?.[x];if(y===null)return null;const C=If(y)||If(S);return c[x][C]}),f=i&&Object.entries(i).reduce((x,y)=>{let[S,C]=y;return C===void 0||(x[S]=C),x},{}),v=l==null||(a=l.compoundVariants)===null||a===void 0?void 0:a.reduce((x,y)=>{let{class:S,className:C,..._}=y;return Object.entries(_).every(b=>{let[k,T]=b;return Array.isArray(T)?T.includes({...d,...f}[k]):{...d,...f}[k]===T})?[...x,S,C]:x},[]);return zf(n,m,v,i?.class,i?.className)},u0=l0,c0=i0,dm=g.forwardRef(({className:n,...l},i)=>h.jsx(sm,{className:ge("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",n),...l,ref:i}));dm.displayName=sm.displayName;const d0=a0("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),fm=g.forwardRef(({side:n="right",className:l,children:i,...a},c)=>h.jsxs(c0,{children:[h.jsx(dm,{}),h.jsxs(am,{ref:c,className:ge(d0({side:n}),l),...a,children:[i,h.jsxs(s0,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",children:[h.jsx(Av,{className:"h-4 w-4"}),h.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));fm.displayName=am.displayName;const pm=({className:n,...l})=>h.jsx("div",{className:ge("flex flex-col space-y-2 text-center sm:text-left",n),...l});pm.displayName="SheetHeader";const mm=g.forwardRef(({className:n,...l},i)=>h.jsx(um,{ref:i,className:ge("text-lg font-semibold text-foreground",n),...l}));mm.displayName=um.displayName;const f0=g.forwardRef(({className:n,...l},i)=>h.jsx(cm,{ref:i,className:ge("text-sm text-muted-foreground",n),...l}));f0.displayName=cm.displayName;const p0=["top","right","bottom","left"],kn=Math.min,ct=Math.max,Gl=Math.round,Wl=Math.floor,zt=n=>({x:n,y:n}),m0={left:"right",right:"left",bottom:"top",top:"bottom"};function Fa(n,l,i){return ct(n,kn(l,i))}function qt(n,l){return typeof n=="function"?n(l):n}function Jt(n){return n.split("-")[0]}function Pr(n){return n.split("-")[1]}function nu(n){return n==="x"?"y":"x"}function ru(n){return n==="y"?"height":"width"}function It(n){const l=n[0];return l==="t"||l==="b"?"y":"x"}function ou(n){return nu(It(n))}function h0(n,l,i){i===void 0&&(i=!1);const a=Pr(n),c=ou(n),d=ru(c);let m=c==="x"?a===(i?"end":"start")?"right":"left":a==="start"?"bottom":"top";return l.reference[d]>l.floating[d]&&(m=Xl(m)),[m,Xl(m)]}function g0(n){const l=Xl(n);return[$a(n),l,$a(l)]}function $a(n){return n.includes("start")?n.replace("start","end"):n.replace("end","start")}const Ff=["left","right"],$f=["right","left"],v0=["top","bottom"],y0=["bottom","top"];function x0(n,l,i){switch(n){case"top":case"bottom":return i?l?$f:Ff:l?Ff:$f;case"left":case"right":return l?v0:y0;default:return[]}}function w0(n,l,i,a){const c=Pr(n);let d=x0(Jt(n),i==="start",a);return c&&(d=d.map(m=>m+"-"+c),l&&(d=d.concat(d.map($a)))),d}function Xl(n){const l=Jt(n);return m0[l]+n.slice(l.length)}function S0(n){return{top:0,right:0,bottom:0,left:0,...n}}function hm(n){return typeof n!="number"?S0(n):{top:n,right:n,bottom:n,left:n}}function Kl(n){const{x:l,y:i,width:a,height:c}=n;return{width:a,height:c,top:i,left:l,right:l+a,bottom:i+c,x:l,y:i}}function Wf(n,l,i){let{reference:a,floating:c}=n;const d=It(l),m=ou(l),f=ru(m),v=Jt(l),x=d==="y",y=a.x+a.width/2-c.width/2,S=a.y+a.height/2-c.height/2,C=a[f]/2-c[f]/2;let _;switch(v){case"top":_={x:y,y:a.y-c.height};break;case"bottom":_={x:y,y:a.y+a.height};break;case"right":_={x:a.x+a.width,y:S};break;case"left":_={x:a.x-c.width,y:S};break;default:_={x:a.x,y:a.y}}switch(Pr(l)){case"start":_[m]-=C*(i&&x?-1:1);break;case"end":_[m]+=C*(i&&x?-1:1);break}return _}async function C0(n,l){var i;l===void 0&&(l={});const{x:a,y:c,platform:d,rects:m,elements:f,strategy:v}=n,{boundary:x="clippingAncestors",rootBoundary:y="viewport",elementContext:S="floating",altBoundary:C=!1,padding:_=0}=qt(l,n),b=hm(_),T=f[C?S==="floating"?"reference":"floating":S],A=Kl(await d.getClippingRect({element:(i=await(d.isElement==null?void 0:d.isElement(T)))==null||i?T:T.contextElement||await(d.getDocumentElement==null?void 0:d.getDocumentElement(f.floating)),boundary:x,rootBoundary:y,strategy:v})),L=S==="floating"?{x:a,y:c,width:m.floating.width,height:m.floating.height}:m.reference,$=await(d.getOffsetParent==null?void 0:d.getOffsetParent(f.floating)),M=await(d.isElement==null?void 0:d.isElement($))?await(d.getScale==null?void 0:d.getScale($))||{x:1,y:1}:{x:1,y:1},U=Kl(d.convertOffsetParentRelativeRectToViewportRelativeRect?await d.convertOffsetParentRelativeRectToViewportRelativeRect({elements:f,rect:L,offsetParent:$,strategy:v}):L);return{top:(A.top-U.top+b.top)/M.y,bottom:(U.bottom-A.bottom+b.bottom)/M.y,left:(A.left-U.left+b.left)/M.x,right:(U.right-A.right+b.right)/M.x}}const E0=50,k0=async(n,l,i)=>{const{placement:a="bottom",strategy:c="absolute",middleware:d=[],platform:m}=i,f=m.detectOverflow?m:{...m,detectOverflow:C0},v=await(m.isRTL==null?void 0:m.isRTL(l));let x=await m.getElementRects({reference:n,floating:l,strategy:c}),{x:y,y:S}=Wf(x,a,v),C=a,_=0;const b={};for(let k=0;k({name:"arrow",options:n,async fn(l){const{x:i,y:a,placement:c,rects:d,platform:m,elements:f,middlewareData:v}=l,{element:x,padding:y=0}=qt(n,l)||{};if(x==null)return{};const S=hm(y),C={x:i,y:a},_=ou(c),b=ru(_),k=await m.getDimensions(x),T=_==="y",A=T?"top":"left",L=T?"bottom":"right",$=T?"clientHeight":"clientWidth",M=d.reference[b]+d.reference[_]-C[_]-d.floating[b],U=C[_]-d.reference[_],Y=await(m.getOffsetParent==null?void 0:m.getOffsetParent(x));let B=Y?Y[$]:0;(!B||!await(m.isElement==null?void 0:m.isElement(Y)))&&(B=f.floating[$]||d.floating[b]);const ie=M/2-U/2,te=B/2-k[b]/2-1,ne=kn(S[A],te),ue=kn(S[L],te),J=ne,me=B-k[b]-ue,ce=B/2-k[b]/2+ie,ee=Fa(J,ce,me),le=!v.arrow&&Pr(c)!=null&&ce!==ee&&d.reference[b]/2-(cece<=0)){var ue,J;const ce=(((ue=d.flip)==null?void 0:ue.index)||0)+1,ee=B[ce];if(ee&&(!(S==="alignment"?L!==It(ee):!1)||ne.every(D=>It(D.placement)===L?D.overflows[0]>0:!0)))return{data:{index:ce,overflows:ne},reset:{placement:ee}};let le=(J=ne.filter(se=>se.overflows[0]<=0).sort((se,D)=>se.overflows[1]-D.overflows[1])[0])==null?void 0:J.placement;if(!le)switch(_){case"bestFit":{var me;const se=(me=ne.filter(D=>{if(Y){const Q=It(D.placement);return Q===L||Q==="y"}return!0}).map(D=>[D.placement,D.overflows.filter(Q=>Q>0).reduce((Q,V)=>Q+V,0)]).sort((D,Q)=>D[1]-Q[1])[0])==null?void 0:me[0];se&&(le=se);break}case"initialPlacement":le=f;break}if(c!==le)return{reset:{placement:le}}}return{}}}};function Hf(n,l){return{top:n.top-l.height,right:n.right-l.width,bottom:n.bottom-l.height,left:n.left-l.width}}function Uf(n){return p0.some(l=>n[l]>=0)}const P0=function(n){return n===void 0&&(n={}),{name:"hide",options:n,async fn(l){const{rects:i,platform:a}=l,{strategy:c="referenceHidden",...d}=qt(n,l);switch(c){case"referenceHidden":{const m=await a.detectOverflow(l,{...d,elementContext:"reference"}),f=Hf(m,i.reference);return{data:{referenceHiddenOffsets:f,referenceHidden:Uf(f)}}}case"escaped":{const m=await a.detectOverflow(l,{...d,altBoundary:!0}),f=Hf(m,i.floating);return{data:{escapedOffsets:f,escaped:Uf(f)}}}default:return{}}}}},gm=new Set(["left","top"]);async function b0(n,l){const{placement:i,platform:a,elements:c}=n,d=await(a.isRTL==null?void 0:a.isRTL(c.floating)),m=Jt(i),f=Pr(i),v=It(i)==="y",x=gm.has(m)?-1:1,y=d&&v?-1:1,S=qt(l,n);let{mainAxis:C,crossAxis:_,alignmentAxis:b}=typeof S=="number"?{mainAxis:S,crossAxis:0,alignmentAxis:null}:{mainAxis:S.mainAxis||0,crossAxis:S.crossAxis||0,alignmentAxis:S.alignmentAxis};return f&&typeof b=="number"&&(_=f==="end"?b*-1:b),v?{x:_*y,y:C*x}:{x:C*x,y:_*y}}const R0=function(n){return n===void 0&&(n=0),{name:"offset",options:n,async fn(l){var i,a;const{x:c,y:d,placement:m,middlewareData:f}=l,v=await b0(l,n);return m===((i=f.offset)==null?void 0:i.placement)&&(a=f.arrow)!=null&&a.alignmentOffset?{}:{x:c+v.x,y:d+v.y,data:{...v,placement:m}}}}},T0=function(n){return n===void 0&&(n={}),{name:"shift",options:n,async fn(l){const{x:i,y:a,placement:c,platform:d}=l,{mainAxis:m=!0,crossAxis:f=!1,limiter:v={fn:A=>{let{x:L,y:$}=A;return{x:L,y:$}}},...x}=qt(n,l),y={x:i,y:a},S=await d.detectOverflow(l,x),C=It(Jt(c)),_=nu(C);let b=y[_],k=y[C];if(m){const A=_==="y"?"top":"left",L=_==="y"?"bottom":"right",$=b+S[A],M=b-S[L];b=Fa($,b,M)}if(f){const A=C==="y"?"top":"left",L=C==="y"?"bottom":"right",$=k+S[A],M=k-S[L];k=Fa($,k,M)}const T=v.fn({...l,[_]:b,[C]:k});return{...T,data:{x:T.x-i,y:T.y-a,enabled:{[_]:m,[C]:f}}}}}},j0=function(n){return n===void 0&&(n={}),{options:n,fn(l){const{x:i,y:a,placement:c,rects:d,middlewareData:m}=l,{offset:f=0,mainAxis:v=!0,crossAxis:x=!0}=qt(n,l),y={x:i,y:a},S=It(c),C=nu(S);let _=y[C],b=y[S];const k=qt(f,l),T=typeof k=="number"?{mainAxis:k,crossAxis:0}:{mainAxis:0,crossAxis:0,...k};if(v){const $=C==="y"?"height":"width",M=d.reference[C]-d.floating[$]+T.mainAxis,U=d.reference[C]+d.reference[$]-T.mainAxis;_U&&(_=U)}if(x){var A,L;const $=C==="y"?"width":"height",M=gm.has(Jt(c)),U=d.reference[S]-d.floating[$]+(M&&((A=m.offset)==null?void 0:A[S])||0)+(M?0:T.crossAxis),Y=d.reference[S]+d.reference[$]+(M?0:((L=m.offset)==null?void 0:L[S])||0)-(M?T.crossAxis:0);bY&&(b=Y)}return{[C]:_,[S]:b}}}},O0=function(n){return n===void 0&&(n={}),{name:"size",options:n,async fn(l){var i,a;const{placement:c,rects:d,platform:m,elements:f}=l,{apply:v=()=>{},...x}=qt(n,l),y=await m.detectOverflow(l,x),S=Jt(c),C=Pr(c),_=It(c)==="y",{width:b,height:k}=d.floating;let T,A;S==="top"||S==="bottom"?(T=S,A=C===(await(m.isRTL==null?void 0:m.isRTL(f.floating))?"start":"end")?"left":"right"):(A=S,T=C==="end"?"top":"bottom");const L=k-y.top-y.bottom,$=b-y.left-y.right,M=kn(k-y[T],L),U=kn(b-y[A],$),Y=!l.middlewareData.shift;let B=M,ie=U;if((i=l.middlewareData.shift)!=null&&i.enabled.x&&(ie=$),(a=l.middlewareData.shift)!=null&&a.enabled.y&&(B=L),Y&&!C){const ne=ct(y.left,0),ue=ct(y.right,0),J=ct(y.top,0),me=ct(y.bottom,0);_?ie=b-2*(ne!==0||ue!==0?ne+ue:ct(y.left,y.right)):B=k-2*(J!==0||me!==0?J+me:ct(y.top,y.bottom))}await v({...l,availableWidth:ie,availableHeight:B});const te=await m.getDimensions(f.floating);return b!==te.width||k!==te.height?{reset:{rects:!0}}:{}}}};function si(){return typeof window<"u"}function br(n){return vm(n)?(n.nodeName||"").toLowerCase():"#document"}function ft(n){var l;return(n==null||(l=n.ownerDocument)==null?void 0:l.defaultView)||window}function Wt(n){var l;return(l=(vm(n)?n.ownerDocument:n.document)||window.document)==null?void 0:l.documentElement}function vm(n){return si()?n instanceof Node||n instanceof ft(n).Node:!1}function Pt(n){return si()?n instanceof Element||n instanceof ft(n).Element:!1}function en(n){return si()?n instanceof HTMLElement||n instanceof ft(n).HTMLElement:!1}function Bf(n){return!si()||typeof ShadowRoot>"u"?!1:n instanceof ShadowRoot||n instanceof ft(n).ShadowRoot}function Co(n){const{overflow:l,overflowX:i,overflowY:a,display:c}=bt(n);return/auto|scroll|overlay|hidden|clip/.test(l+a+i)&&c!=="inline"&&c!=="contents"}function A0(n){return/^(table|td|th)$/.test(br(n))}function ai(n){try{if(n.matches(":popover-open"))return!0}catch{}try{return n.matches(":modal")}catch{return!1}}const L0=/transform|translate|scale|rotate|perspective|filter/,D0=/paint|layout|strict|content/,Fn=n=>!!n&&n!=="none";let ba;function lu(n){const l=Pt(n)?bt(n):n;return Fn(l.transform)||Fn(l.translate)||Fn(l.scale)||Fn(l.rotate)||Fn(l.perspective)||!iu()&&(Fn(l.backdropFilter)||Fn(l.filter))||L0.test(l.willChange||"")||D0.test(l.contain||"")}function M0(n){let l=_n(n);for(;en(l)&&!Cr(l);){if(lu(l))return l;if(ai(l))return null;l=_n(l)}return null}function iu(){return ba==null&&(ba=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),ba}function Cr(n){return/^(html|body|#document)$/.test(br(n))}function bt(n){return ft(n).getComputedStyle(n)}function ui(n){return Pt(n)?{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}:{scrollLeft:n.scrollX,scrollTop:n.scrollY}}function _n(n){if(br(n)==="html")return n;const l=n.assignedSlot||n.parentNode||Bf(n)&&n.host||Wt(n);return Bf(l)?l.host:l}function ym(n){const l=_n(n);return Cr(l)?n.ownerDocument?n.ownerDocument.body:n.body:en(l)&&Co(l)?l:ym(l)}function wo(n,l,i){var a;l===void 0&&(l=[]),i===void 0&&(i=!0);const c=ym(n),d=c===((a=n.ownerDocument)==null?void 0:a.body),m=ft(c);if(d){const f=Wa(m);return l.concat(m,m.visualViewport||[],Co(c)?c:[],f&&i?wo(f):[])}else return l.concat(c,wo(c,[],i))}function Wa(n){return n.parent&&Object.getPrototypeOf(n.parent)?n.frameElement:null}function xm(n){const l=bt(n);let i=parseFloat(l.width)||0,a=parseFloat(l.height)||0;const c=en(n),d=c?n.offsetWidth:i,m=c?n.offsetHeight:a,f=Gl(i)!==d||Gl(a)!==m;return f&&(i=d,a=m),{width:i,height:a,$:f}}function su(n){return Pt(n)?n:n.contextElement}function wr(n){const l=su(n);if(!en(l))return zt(1);const i=l.getBoundingClientRect(),{width:a,height:c,$:d}=xm(l);let m=(d?Gl(i.width):i.width)/a,f=(d?Gl(i.height):i.height)/c;return(!m||!Number.isFinite(m))&&(m=1),(!f||!Number.isFinite(f))&&(f=1),{x:m,y:f}}const I0=zt(0);function wm(n){const l=ft(n);return!iu()||!l.visualViewport?I0:{x:l.visualViewport.offsetLeft,y:l.visualViewport.offsetTop}}function z0(n,l,i){return l===void 0&&(l=!1),!i||l&&i!==ft(n)?!1:l}function Wn(n,l,i,a){l===void 0&&(l=!1),i===void 0&&(i=!1);const c=n.getBoundingClientRect(),d=su(n);let m=zt(1);l&&(a?Pt(a)&&(m=wr(a)):m=wr(n));const f=z0(d,i,a)?wm(d):zt(0);let v=(c.left+f.x)/m.x,x=(c.top+f.y)/m.y,y=c.width/m.x,S=c.height/m.y;if(d){const C=ft(d),_=a&&Pt(a)?ft(a):a;let b=C,k=Wa(b);for(;k&&a&&_!==b;){const T=wr(k),A=k.getBoundingClientRect(),L=bt(k),$=A.left+(k.clientLeft+parseFloat(L.paddingLeft))*T.x,M=A.top+(k.clientTop+parseFloat(L.paddingTop))*T.y;v*=T.x,x*=T.y,y*=T.x,S*=T.y,v+=$,x+=M,b=ft(k),k=Wa(b)}}return Kl({width:y,height:S,x:v,y:x})}function ci(n,l){const i=ui(n).scrollLeft;return l?l.left+i:Wn(Wt(n)).left+i}function Sm(n,l){const i=n.getBoundingClientRect(),a=i.left+l.scrollLeft-ci(n,i),c=i.top+l.scrollTop;return{x:a,y:c}}function F0(n){let{elements:l,rect:i,offsetParent:a,strategy:c}=n;const d=c==="fixed",m=Wt(a),f=l?ai(l.floating):!1;if(a===m||f&&d)return i;let v={scrollLeft:0,scrollTop:0},x=zt(1);const y=zt(0),S=en(a);if((S||!S&&!d)&&((br(a)!=="body"||Co(m))&&(v=ui(a)),S)){const _=Wn(a);x=wr(a),y.x=_.x+a.clientLeft,y.y=_.y+a.clientTop}const C=m&&!S&&!d?Sm(m,v):zt(0);return{width:i.width*x.x,height:i.height*x.y,x:i.x*x.x-v.scrollLeft*x.x+y.x+C.x,y:i.y*x.y-v.scrollTop*x.y+y.y+C.y}}function $0(n){return Array.from(n.getClientRects())}function W0(n){const l=Wt(n),i=ui(n),a=n.ownerDocument.body,c=ct(l.scrollWidth,l.clientWidth,a.scrollWidth,a.clientWidth),d=ct(l.scrollHeight,l.clientHeight,a.scrollHeight,a.clientHeight);let m=-i.scrollLeft+ci(n);const f=-i.scrollTop;return bt(a).direction==="rtl"&&(m+=ct(l.clientWidth,a.clientWidth)-c),{width:c,height:d,x:m,y:f}}const Vf=25;function H0(n,l){const i=ft(n),a=Wt(n),c=i.visualViewport;let d=a.clientWidth,m=a.clientHeight,f=0,v=0;if(c){d=c.width,m=c.height;const y=iu();(!y||y&&l==="fixed")&&(f=c.offsetLeft,v=c.offsetTop)}const x=ci(a);if(x<=0){const y=a.ownerDocument,S=y.body,C=getComputedStyle(S),_=y.compatMode==="CSS1Compat"&&parseFloat(C.marginLeft)+parseFloat(C.marginRight)||0,b=Math.abs(a.clientWidth-S.clientWidth-_);b<=Vf&&(d-=b)}else x<=Vf&&(d+=x);return{width:d,height:m,x:f,y:v}}function U0(n,l){const i=Wn(n,!0,l==="fixed"),a=i.top+n.clientTop,c=i.left+n.clientLeft,d=en(n)?wr(n):zt(1),m=n.clientWidth*d.x,f=n.clientHeight*d.y,v=c*d.x,x=a*d.y;return{width:m,height:f,x:v,y:x}}function Yf(n,l,i){let a;if(l==="viewport")a=H0(n,i);else if(l==="document")a=W0(Wt(n));else if(Pt(l))a=U0(l,i);else{const c=wm(n);a={x:l.x-c.x,y:l.y-c.y,width:l.width,height:l.height}}return Kl(a)}function Cm(n,l){const i=_n(n);return i===l||!Pt(i)||Cr(i)?!1:bt(i).position==="fixed"||Cm(i,l)}function B0(n,l){const i=l.get(n);if(i)return i;let a=wo(n,[],!1).filter(f=>Pt(f)&&br(f)!=="body"),c=null;const d=bt(n).position==="fixed";let m=d?_n(n):n;for(;Pt(m)&&!Cr(m);){const f=bt(m),v=lu(m);!v&&f.position==="fixed"&&(c=null),(d?!v&&!c:!v&&f.position==="static"&&!!c&&(c.position==="absolute"||c.position==="fixed")||Co(m)&&!v&&Cm(n,m))?a=a.filter(y=>y!==m):c=f,m=_n(m)}return l.set(n,a),a}function V0(n){let{element:l,boundary:i,rootBoundary:a,strategy:c}=n;const m=[...i==="clippingAncestors"?ai(l)?[]:B0(l,this._c):[].concat(i),a],f=Yf(l,m[0],c);let v=f.top,x=f.right,y=f.bottom,S=f.left;for(let C=1;C{m(!1,1e-7)},1e3)}B===1&&!km(x,n.getBoundingClientRect())&&m(),M=!1}try{i=new IntersectionObserver(U,{...$,root:c.ownerDocument})}catch{i=new IntersectionObserver(U,$)}i.observe(n)}return m(!0),d}function q0(n,l,i,a){a===void 0&&(a={});const{ancestorScroll:c=!0,ancestorResize:d=!0,elementResize:m=typeof ResizeObserver=="function",layoutShift:f=typeof IntersectionObserver=="function",animationFrame:v=!1}=a,x=su(n),y=c||d?[...x?wo(x):[],...l?wo(l):[]]:[];y.forEach(A=>{c&&A.addEventListener("scroll",i,{passive:!0}),d&&A.addEventListener("resize",i)});const S=x&&f?Z0(x,i):null;let C=-1,_=null;m&&(_=new ResizeObserver(A=>{let[L]=A;L&&L.target===x&&_&&l&&(_.unobserve(l),cancelAnimationFrame(C),C=requestAnimationFrame(()=>{var $;($=_)==null||$.observe(l)})),i()}),x&&!v&&_.observe(x),l&&_.observe(l));let b,k=v?Wn(n):null;v&&T();function T(){const A=Wn(n);k&&!km(k,A)&&i(),k=A,b=requestAnimationFrame(T)}return i(),()=>{var A;y.forEach(L=>{c&&L.removeEventListener("scroll",i),d&&L.removeEventListener("resize",i)}),S?.(),(A=_)==null||A.disconnect(),_=null,v&&cancelAnimationFrame(b)}}const J0=R0,ew=T0,tw=N0,nw=O0,rw=P0,Gf=_0,ow=j0,lw=(n,l,i)=>{const a=new Map,c={platform:K0,...i},d={...c.platform,_c:a};return k0(n,l,{...c,platform:d})};var iw=typeof document<"u",sw=function(){},Bl=iw?g.useLayoutEffect:sw;function Zl(n,l){if(n===l)return!0;if(typeof n!=typeof l)return!1;if(typeof n=="function"&&n.toString()===l.toString())return!0;let i,a,c;if(n&&l&&typeof n=="object"){if(Array.isArray(n)){if(i=n.length,i!==l.length)return!1;for(a=i;a--!==0;)if(!Zl(n[a],l[a]))return!1;return!0}if(c=Object.keys(n),i=c.length,i!==Object.keys(l).length)return!1;for(a=i;a--!==0;)if(!{}.hasOwnProperty.call(l,c[a]))return!1;for(a=i;a--!==0;){const d=c[a];if(!(d==="_owner"&&n.$$typeof)&&!Zl(n[d],l[d]))return!1}return!0}return n!==n&&l!==l}function _m(n){return typeof window>"u"?1:(n.ownerDocument.defaultView||window).devicePixelRatio||1}function Xf(n,l){const i=_m(n);return Math.round(l*i)/i}function Ta(n){const l=g.useRef(n);return Bl(()=>{l.current=n}),l}function aw(n){n===void 0&&(n={});const{placement:l="bottom",strategy:i="absolute",middleware:a=[],platform:c,elements:{reference:d,floating:m}={},transform:f=!0,whileElementsMounted:v,open:x}=n,[y,S]=g.useState({x:0,y:0,strategy:i,placement:l,middlewareData:{},isPositioned:!1}),[C,_]=g.useState(a);Zl(C,a)||_(a);const[b,k]=g.useState(null),[T,A]=g.useState(null),L=g.useCallback(D=>{D!==Y.current&&(Y.current=D,k(D))},[]),$=g.useCallback(D=>{D!==B.current&&(B.current=D,A(D))},[]),M=d||b,U=m||T,Y=g.useRef(null),B=g.useRef(null),ie=g.useRef(y),te=v!=null,ne=Ta(v),ue=Ta(c),J=Ta(x),me=g.useCallback(()=>{if(!Y.current||!B.current)return;const D={placement:l,strategy:i,middleware:C};ue.current&&(D.platform=ue.current),lw(Y.current,B.current,D).then(Q=>{const V={...Q,isPositioned:J.current!==!1};ce.current&&!Zl(ie.current,V)&&(ie.current=V,Qa.flushSync(()=>{S(V)}))})},[C,l,i,ue,J]);Bl(()=>{x===!1&&ie.current.isPositioned&&(ie.current.isPositioned=!1,S(D=>({...D,isPositioned:!1})))},[x]);const ce=g.useRef(!1);Bl(()=>(ce.current=!0,()=>{ce.current=!1}),[]),Bl(()=>{if(M&&(Y.current=M),U&&(B.current=U),M&&U){if(ne.current)return ne.current(M,U,me);me()}},[M,U,me,ne,te]);const ee=g.useMemo(()=>({reference:Y,floating:B,setReference:L,setFloating:$}),[L,$]),le=g.useMemo(()=>({reference:M,floating:U}),[M,U]),se=g.useMemo(()=>{const D={position:i,left:0,top:0};if(!le.floating)return D;const Q=Xf(le.floating,y.x),V=Xf(le.floating,y.y);return f?{...D,transform:"translate("+Q+"px, "+V+"px)",..._m(le.floating)>=1.5&&{willChange:"transform"}}:{position:i,left:Q,top:V}},[i,f,le.floating,y.x,y.y]);return g.useMemo(()=>({...y,update:me,refs:ee,elements:le,floatingStyles:se}),[y,me,ee,le,se])}const uw=n=>{function l(i){return{}.hasOwnProperty.call(i,"current")}return{name:"arrow",options:n,fn(i){const{element:a,padding:c}=typeof n=="function"?n(i):n;return a&&l(a)?a.current!=null?Gf({element:a.current,padding:c}).fn(i):{}:a?Gf({element:a,padding:c}).fn(i):{}}}},cw=(n,l)=>{const i=J0(n);return{name:i.name,fn:i.fn,options:[n,l]}},dw=(n,l)=>{const i=ew(n);return{name:i.name,fn:i.fn,options:[n,l]}},fw=(n,l)=>({fn:ow(n).fn,options:[n,l]}),pw=(n,l)=>{const i=tw(n);return{name:i.name,fn:i.fn,options:[n,l]}},mw=(n,l)=>{const i=nw(n);return{name:i.name,fn:i.fn,options:[n,l]}},hw=(n,l)=>{const i=rw(n);return{name:i.name,fn:i.fn,options:[n,l]}},gw=(n,l)=>{const i=uw(n);return{name:i.name,fn:i.fn,options:[n,l]}};var vw="Arrow",Nm=g.forwardRef((n,l)=>{const{children:i,width:a=10,height:c=5,...d}=n;return h.jsx(Le.svg,{...d,ref:l,width:a,height:c,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:n.asChild?i:h.jsx("polygon",{points:"0,0 30,0 15,10"})})});Nm.displayName=vw;var yw=Nm;function xw(n){const[l,i]=g.useState(void 0);return Ft(()=>{if(n){i({width:n.offsetWidth,height:n.offsetHeight});const a=new ResizeObserver(c=>{if(!Array.isArray(c)||!c.length)return;const d=c[0];let m,f;if("borderBoxSize"in d){const v=d.borderBoxSize,x=Array.isArray(v)?v[0]:v;m=x.inlineSize,f=x.blockSize}else m=n.offsetWidth,f=n.offsetHeight;i({width:m,height:f})});return a.observe(n,{box:"border-box"}),()=>a.unobserve(n)}else i(void 0)},[n]),l}var au="Popper",[Pm,di]=_r(au),[ww,bm]=Pm(au),Rm=n=>{const{__scopePopper:l,children:i}=n,[a,c]=g.useState(null);return h.jsx(ww,{scope:l,anchor:a,onAnchorChange:c,children:i})};Rm.displayName=au;var Tm="PopperAnchor",jm=g.forwardRef((n,l)=>{const{__scopePopper:i,virtualRef:a,...c}=n,d=bm(Tm,i),m=g.useRef(null),f=We(l,m),v=g.useRef(null);return g.useEffect(()=>{const x=v.current;v.current=a?.current||m.current,x!==v.current&&d.onAnchorChange(v.current)}),a?null:h.jsx(Le.div,{...c,ref:f})});jm.displayName=Tm;var uu="PopperContent",[Sw,Cw]=Pm(uu),Om=g.forwardRef((n,l)=>{const{__scopePopper:i,side:a="bottom",sideOffset:c=0,align:d="center",alignOffset:m=0,arrowPadding:f=0,avoidCollisions:v=!0,collisionBoundary:x=[],collisionPadding:y=0,sticky:S="partial",hideWhenDetached:C=!1,updatePositionStrategy:_="optimized",onPlaced:b,...k}=n,T=bm(uu,i),[A,L]=g.useState(null),$=We(l,we=>L(we)),[M,U]=g.useState(null),Y=xw(M),B=Y?.width??0,ie=Y?.height??0,te=a+(d!=="center"?"-"+d:""),ne=typeof y=="number"?y:{top:0,right:0,bottom:0,left:0,...y},ue=Array.isArray(x)?x:[x],J=ue.length>0,me={padding:ne,boundary:ue.filter(kw),altBoundary:J},{refs:ce,floatingStyles:ee,placement:le,isPositioned:se,middlewareData:D}=aw({strategy:"fixed",placement:te,whileElementsMounted:(...we)=>q0(...we,{animationFrame:_==="always"}),elements:{reference:T.anchor},middleware:[cw({mainAxis:c+ie,alignmentAxis:m}),v&&dw({mainAxis:!0,crossAxis:!1,limiter:S==="partial"?fw():void 0,...me}),v&&pw({...me}),mw({...me,apply:({elements:we,rects:Se,availableWidth:_e,availableHeight:Ze})=>{const{width:Hn,height:No}=Se.reference,Ht=we.floating.style;Ht.setProperty("--radix-popper-available-width",`${_e}px`),Ht.setProperty("--radix-popper-available-height",`${Ze}px`),Ht.setProperty("--radix-popper-anchor-width",`${Hn}px`),Ht.setProperty("--radix-popper-anchor-height",`${No}px`)}}),M&&gw({element:M,padding:f}),_w({arrowWidth:B,arrowHeight:ie}),C&&hw({strategy:"referenceHidden",...me})]}),[Q,V]=Dm(le),P=dt(b);Ft(()=>{se&&P?.()},[se,P]);const I=D.arrow?.x,de=D.arrow?.y,pe=D.arrow?.centerOffset!==0,[ve,ye]=g.useState();return Ft(()=>{A&&ye(window.getComputedStyle(A).zIndex)},[A]),h.jsx("div",{ref:ce.setFloating,"data-radix-popper-content-wrapper":"",style:{...ee,transform:se?ee.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:ve,"--radix-popper-transform-origin":[D.transformOrigin?.x,D.transformOrigin?.y].join(" "),...D.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:n.dir,children:h.jsx(Sw,{scope:i,placedSide:Q,onArrowChange:U,arrowX:I,arrowY:de,shouldHideArrow:pe,children:h.jsx(Le.div,{"data-side":Q,"data-align":V,...k,ref:$,style:{...k.style,animation:se?void 0:"none"}})})})});Om.displayName=uu;var Am="PopperArrow",Ew={top:"bottom",right:"left",bottom:"top",left:"right"},Lm=g.forwardRef(function(l,i){const{__scopePopper:a,...c}=l,d=Cw(Am,a),m=Ew[d.placedSide];return h.jsx("span",{ref:d.onArrowChange,style:{position:"absolute",left:d.arrowX,top:d.arrowY,[m]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[d.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[d.placedSide],visibility:d.shouldHideArrow?"hidden":void 0},children:h.jsx(yw,{...c,ref:i,style:{...c.style,display:"block"}})})});Lm.displayName=Am;function kw(n){return n!==null}var _w=n=>({name:"transformOrigin",options:n,fn(l){const{placement:i,rects:a,middlewareData:c}=l,m=c.arrow?.centerOffset!==0,f=m?0:n.arrowWidth,v=m?0:n.arrowHeight,[x,y]=Dm(i),S={start:"0%",center:"50%",end:"100%"}[y],C=(c.arrow?.x??0)+f/2,_=(c.arrow?.y??0)+v/2;let b="",k="";return x==="bottom"?(b=m?S:`${C}px`,k=`${-v}px`):x==="top"?(b=m?S:`${C}px`,k=`${a.floating.height+v}px`):x==="right"?(b=`${-v}px`,k=m?S:`${_}px`):x==="left"&&(b=`${a.floating.width+v}px`,k=m?S:`${_}px`),{data:{x:b,y:k}}}});function Dm(n){const[l,i="center"]=n.split("-");return[l,i]}var Mm=Rm,Im=jm,zm=Om,Fm=Lm,Nw=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),Pw="VisuallyHidden",$m=g.forwardRef((n,l)=>h.jsx(Le.span,{...n,ref:l,style:{...Nw,...n.style}}));$m.displayName=Pw;var bw=$m,[fi]=_r("Tooltip",[di]),pi=di(),Wm="TooltipProvider",Rw=700,Ha="tooltip.open",[Tw,cu]=fi(Wm),Hm=n=>{const{__scopeTooltip:l,delayDuration:i=Rw,skipDelayDuration:a=300,disableHoverableContent:c=!1,children:d}=n,m=g.useRef(!0),f=g.useRef(!1),v=g.useRef(0);return g.useEffect(()=>{const x=v.current;return()=>window.clearTimeout(x)},[]),h.jsx(Tw,{scope:l,isOpenDelayedRef:m,delayDuration:i,onOpen:g.useCallback(()=>{window.clearTimeout(v.current),m.current=!1},[]),onClose:g.useCallback(()=>{window.clearTimeout(v.current),v.current=window.setTimeout(()=>m.current=!0,a)},[a]),isPointerInTransitRef:f,onPointerInTransitChange:g.useCallback(x=>{f.current=x},[]),disableHoverableContent:c,children:d})};Hm.displayName=Wm;var So="Tooltip",[jw,mi]=fi(So),Um=n=>{const{__scopeTooltip:l,children:i,open:a,defaultOpen:c,onOpenChange:d,disableHoverableContent:m,delayDuration:f}=n,v=cu(So,n.__scopeTooltip),x=pi(l),[y,S]=g.useState(null),C=xo(),_=g.useRef(0),b=m??v.disableHoverableContent,k=f??v.delayDuration,T=g.useRef(!1),[A,L]=ri({prop:a,defaultProp:c??!1,onChange:B=>{B?(v.onOpen(),document.dispatchEvent(new CustomEvent(Ha))):v.onClose(),d?.(B)},caller:So}),$=g.useMemo(()=>A?T.current?"delayed-open":"instant-open":"closed",[A]),M=g.useCallback(()=>{window.clearTimeout(_.current),_.current=0,T.current=!1,L(!0)},[L]),U=g.useCallback(()=>{window.clearTimeout(_.current),_.current=0,L(!1)},[L]),Y=g.useCallback(()=>{window.clearTimeout(_.current),_.current=window.setTimeout(()=>{T.current=!0,L(!0),_.current=0},k)},[k,L]);return g.useEffect(()=>()=>{_.current&&(window.clearTimeout(_.current),_.current=0)},[]),h.jsx(Mm,{...x,children:h.jsx(jw,{scope:l,contentId:C,open:A,stateAttribute:$,trigger:y,onTriggerChange:S,onTriggerEnter:g.useCallback(()=>{v.isOpenDelayedRef.current?Y():M()},[v.isOpenDelayedRef,Y,M]),onTriggerLeave:g.useCallback(()=>{b?U():(window.clearTimeout(_.current),_.current=0)},[U,b]),onOpen:M,onClose:U,disableHoverableContent:b,children:i})})};Um.displayName=So;var Ua="TooltipTrigger",Bm=g.forwardRef((n,l)=>{const{__scopeTooltip:i,...a}=n,c=mi(Ua,i),d=cu(Ua,i),m=pi(i),f=g.useRef(null),v=We(l,f,c.onTriggerChange),x=g.useRef(!1),y=g.useRef(!1),S=g.useCallback(()=>x.current=!1,[]);return g.useEffect(()=>()=>document.removeEventListener("pointerup",S),[S]),h.jsx(Im,{asChild:!0,...m,children:h.jsx(Le.button,{"aria-describedby":c.open?c.contentId:void 0,"data-state":c.stateAttribute,...a,ref:v,onPointerMove:Ee(n.onPointerMove,C=>{C.pointerType!=="touch"&&!y.current&&!d.isPointerInTransitRef.current&&(c.onTriggerEnter(),y.current=!0)}),onPointerLeave:Ee(n.onPointerLeave,()=>{c.onTriggerLeave(),y.current=!1}),onPointerDown:Ee(n.onPointerDown,()=>{c.open&&c.onClose(),x.current=!0,document.addEventListener("pointerup",S,{once:!0})}),onFocus:Ee(n.onFocus,()=>{x.current||c.onOpen()}),onBlur:Ee(n.onBlur,c.onClose),onClick:Ee(n.onClick,c.onClose)})})});Bm.displayName=Ua;var Ow="TooltipPortal",[oS,Aw]=fi(Ow,{forceMount:void 0}),Er="TooltipContent",Vm=g.forwardRef((n,l)=>{const i=Aw(Er,n.__scopeTooltip),{forceMount:a=i.forceMount,side:c="top",...d}=n,m=mi(Er,n.__scopeTooltip);return h.jsx(Rt,{present:a||m.open,children:m.disableHoverableContent?h.jsx(Ym,{side:c,...d,ref:l}):h.jsx(Lw,{side:c,...d,ref:l})})}),Lw=g.forwardRef((n,l)=>{const i=mi(Er,n.__scopeTooltip),a=cu(Er,n.__scopeTooltip),c=g.useRef(null),d=We(l,c),[m,f]=g.useState(null),{trigger:v,onClose:x}=i,y=c.current,{onPointerInTransitChange:S}=a,C=g.useCallback(()=>{f(null),S(!1)},[S]),_=g.useCallback((b,k)=>{const T=b.currentTarget,A={x:b.clientX,y:b.clientY},L=Fw(A,T.getBoundingClientRect()),$=$w(A,L),M=Ww(k.getBoundingClientRect()),U=Uw([...$,...M]);f(U),S(!0)},[S]);return g.useEffect(()=>()=>C(),[C]),g.useEffect(()=>{if(v&&y){const b=T=>_(T,y),k=T=>_(T,v);return v.addEventListener("pointerleave",b),y.addEventListener("pointerleave",k),()=>{v.removeEventListener("pointerleave",b),y.removeEventListener("pointerleave",k)}}},[v,y,_,C]),g.useEffect(()=>{if(m){const b=k=>{const T=k.target,A={x:k.clientX,y:k.clientY},L=v?.contains(T)||y?.contains(T),$=!Hw(A,m);L?C():$&&(C(),x())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[v,y,m,x,C]),h.jsx(Ym,{...n,ref:d})}),[Dw,Mw]=fi(So,{isInside:!1}),Iw=Mv("TooltipContent"),Ym=g.forwardRef((n,l)=>{const{__scopeTooltip:i,children:a,"aria-label":c,onEscapeKeyDown:d,onPointerDownOutside:m,...f}=n,v=mi(Er,i),x=pi(i),{onClose:y}=v;return g.useEffect(()=>(document.addEventListener(Ha,y),()=>document.removeEventListener(Ha,y)),[y]),g.useEffect(()=>{if(v.trigger){const S=C=>{C.target?.contains(v.trigger)&&y()};return window.addEventListener("scroll",S,{capture:!0}),()=>window.removeEventListener("scroll",S,{capture:!0})}},[v.trigger,y]),h.jsx(oi,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:d,onPointerDownOutside:m,onFocusOutside:S=>S.preventDefault(),onDismiss:y,children:h.jsxs(zm,{"data-state":v.stateAttribute,...x,...f,ref:l,style:{...f.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[h.jsx(Iw,{children:a}),h.jsx(Dw,{scope:i,isInside:!0,children:h.jsx(bw,{id:v.contentId,role:"tooltip",children:c||a})})]})})});Vm.displayName=Er;var Qm="TooltipArrow",zw=g.forwardRef((n,l)=>{const{__scopeTooltip:i,...a}=n,c=pi(i);return Mw(Qm,i).isInside?null:h.jsx(Fm,{...c,...a,ref:l})});zw.displayName=Qm;function Fw(n,l){const i=Math.abs(l.top-n.y),a=Math.abs(l.bottom-n.y),c=Math.abs(l.right-n.x),d=Math.abs(l.left-n.x);switch(Math.min(i,a,c,d)){case d:return"left";case c:return"right";case i:return"top";case a:return"bottom";default:throw new Error("unreachable")}}function $w(n,l,i=5){const a=[];switch(l){case"top":a.push({x:n.x-i,y:n.y+i},{x:n.x+i,y:n.y+i});break;case"bottom":a.push({x:n.x-i,y:n.y-i},{x:n.x+i,y:n.y-i});break;case"left":a.push({x:n.x+i,y:n.y-i},{x:n.x+i,y:n.y+i});break;case"right":a.push({x:n.x-i,y:n.y-i},{x:n.x-i,y:n.y+i});break}return a}function Ww(n){const{top:l,right:i,bottom:a,left:c}=n;return[{x:c,y:l},{x:i,y:l},{x:i,y:a},{x:c,y:a}]}function Hw(n,l){const{x:i,y:a}=n;let c=!1;for(let d=0,m=l.length-1;da!=C>a&&i<(S-x)*(a-y)/(C-y)+x&&(c=!c)}return c}function Uw(n){const l=n.slice();return l.sort((i,a)=>i.xa.x?1:i.ya.y?1:0),Bw(l)}function Bw(n){if(n.length<=1)return n.slice();const l=[];for(let a=0;a=2;){const d=l[l.length-1],m=l[l.length-2];if((d.x-m.x)*(c.y-m.y)>=(d.y-m.y)*(c.x-m.x))l.pop();else break}l.push(c)}l.pop();const i=[];for(let a=n.length-1;a>=0;a--){const c=n[a];for(;i.length>=2;){const d=i[i.length-1],m=i[i.length-2];if((d.x-m.x)*(c.y-m.y)>=(d.y-m.y)*(c.x-m.x))i.pop();else break}i.push(c)}return i.pop(),l.length===1&&i.length===1&&l[0].x===i[0].x&&l[0].y===i[0].y?l:l.concat(i)}var Vw=Hm,Yw=Um,Qw=Bm,Gm=Vm;const Gw=Vw,hi=Yw,gi=Qw,Eo=g.forwardRef(({className:n,sideOffset:l=4,...i},a)=>h.jsx(Gm,{ref:a,sideOffset:l,className:ge("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",n),...i}));Eo.displayName=Gm.displayName;var vi="Collapsible",[Xw]=_r(vi),[Kw,du]=Xw(vi),Xm=g.forwardRef((n,l)=>{const{__scopeCollapsible:i,open:a,defaultOpen:c,disabled:d,onOpenChange:m,...f}=n,[v,x]=ri({prop:a,defaultProp:c??!1,onChange:m,caller:vi});return h.jsx(Kw,{scope:i,disabled:d,contentId:xo(),open:v,onOpenToggle:g.useCallback(()=>x(y=>!y),[x]),children:h.jsx(Le.div,{"data-state":pu(v),"data-disabled":d?"":void 0,...f,ref:l})})});Xm.displayName=vi;var Km="CollapsibleTrigger",Zm=g.forwardRef((n,l)=>{const{__scopeCollapsible:i,...a}=n,c=du(Km,i);return h.jsx(Le.button,{type:"button","aria-controls":c.contentId,"aria-expanded":c.open||!1,"data-state":pu(c.open),"data-disabled":c.disabled?"":void 0,disabled:c.disabled,...a,ref:l,onClick:Ee(n.onClick,c.onOpenToggle)})});Zm.displayName=Km;var fu="CollapsibleContent",qm=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=du(fu,n.__scopeCollapsible);return h.jsx(Rt,{present:i||c.open,children:({present:d})=>h.jsx(Zw,{...a,ref:l,present:d})})});qm.displayName=fu;var Zw=g.forwardRef((n,l)=>{const{__scopeCollapsible:i,present:a,children:c,...d}=n,m=du(fu,i),[f,v]=g.useState(a),x=g.useRef(null),y=We(l,x),S=g.useRef(0),C=S.current,_=g.useRef(0),b=_.current,k=m.open||f,T=g.useRef(k),A=g.useRef(void 0);return g.useEffect(()=>{const L=requestAnimationFrame(()=>T.current=!1);return()=>cancelAnimationFrame(L)},[]),Ft(()=>{const L=x.current;if(L){A.current=A.current||{transitionDuration:L.style.transitionDuration,animationName:L.style.animationName},L.style.transitionDuration="0s",L.style.animationName="none";const $=L.getBoundingClientRect();S.current=$.height,_.current=$.width,T.current||(L.style.transitionDuration=A.current.transitionDuration,L.style.animationName=A.current.animationName),v(a)}},[m.open,a]),h.jsx(Le.div,{"data-state":pu(m.open),"data-disabled":m.disabled?"":void 0,id:m.contentId,hidden:!k,...d,ref:y,style:{"--radix-collapsible-content-height":C?`${C}px`:void 0,"--radix-collapsible-content-width":b?`${b}px`:void 0,...n.style},children:k&&c})});function pu(n){return n?"open":"closed"}var qw=Xm;const Jw=qw,e1=Zm,t1=qm,n1=new Set(["production_mutation","credential_access_without_intent","destructive_operation_without_intent","direct_infra_api_with_credential","unknown_high_risk_command"]);function r1(n){const l={deny:[],ask:[],allow:[]};for(const i of n)l[i.decision]?.push(i);return{counts:{all:n.length,deny:l.deny.length,ask:l.ask.length,allow:l.allow.length},groups:l}}function mu(n,l="โ€”"){const i=n.risk_event??{};return i.command_summary||i.request_summary||i.path_class||i.type||l}function Jm(n){return n.replace(/_/g," ")}function o1(n,l){if(n===l)return!0;if(n.length!==l.length)return!1;for(let i=0;il.toUpperCase()):"tool"}function th(n){return!!n.risk_event?.guard_id||n1.has(n.reason_code??"")}function l1(n){return n.reason_code==="async_telemetry"?"Recorded after execution.":n.reason_code==="model_risk_threshold"?"Markov sequence risk crossed the local threshold.":n.reason||n.reason_code||"No explanation captured."}function i1(n){const l=n.risk_event??{},i=nh(n),a=u1(n);return n.reason_code==="model_risk_threshold"?`The Markov-chain model scored this normalized action at ${i}, at or above threshold ${a}.`:n.reason_code==="async_telemetry"?"Not a live gate. Recorded after execution to improve future model parameters.":th(n)?`A deterministic rule fired before the model decision mattered. Markov score is ${i} against threshold ${a}.`:l.type==="normal_tool_call"?`Model score is ${i} against threshold ${a}. Routine coding-agent behavior.`:`Normalized as ${l.type||"unknown"} with model score ${i} against threshold ${a}.`}function s1(n){return n.reason_code==="model_risk_threshold"?"Markov-chain model":n.reason_code==="async_telemetry"?"Trace history":th(n)?"Deterministic rule":"Normal scoring"}function a1(n){return mu(n,"No command summary stored.")}function nh(n){return n.risk_score==null?"n/a":n.risk_score.toFixed(3)}function u1(n){return n.threshold==null?"n/a":n.threshold.toFixed(3)}function c1(n){return n==="deny"?"Would deny":n==="ask"?"Would ask":"Allow"}const ko={deny:{text:"text-destructive",bg:"bg-destructive",ring:"ring-destructive/10",border:"border-destructive/20"},ask:{text:"text-amber-700",bg:"bg-amber-500",ring:"ring-amber-500/10",border:"border-amber-300/40"},allow:{text:"text-brand",bg:"bg-brand",ring:"ring-brand/10",border:"border-border"}};function hu({kind:n,className:l}){const i=ko[n];return h.jsx("span",{className:ge("h-2 w-2 shrink-0 rounded-full ring-4",i.bg,i.ring,l)})}function Kf({label:n,description:l,children:i}){return h.jsxs("section",{className:"mt-8 first:mt-0",children:[(n||l)&&h.jsxs("div",{className:"mb-3.5 flex items-baseline gap-3",children:[n&&h.jsx("h2",{className:"text-[15px] font-semibold tracking-tight",children:n}),l&&h.jsx("p",{className:"text-[12.5px] text-muted-foreground",children:l})]}),i]})}function Zf({k:n,v:l}){return h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"text-muted-foreground",children:n}),h.jsx("span",{className:"font-mono",children:l})]})}function ja({children:n}){return h.jsx("dt",{className:"self-center text-[10.5px] font-medium uppercase tracking-wider text-muted-foreground",children:n})}function Oa({children:n,className:l}){return h.jsx("dd",{className:ge("text-foreground/90",l),children:n})}const d1={all:"All actions",deny:"Denied ยท this session",ask:"Needs ask ยท this session",allow:"Allowed ยท this session"},f1={deny:"Would deny",ask:"Needs ask",allow:"Allow"},p1={all:["deny","ask","allow"],deny:["deny"],ask:["ask"],allow:["allow"]};function m1({tab:n,groups:l,openId:i,onOpen:a,hasAny:c}){return h.jsxs("section",{className:"overflow-hidden rounded-xl border bg-card shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsx("div",{className:"flex items-center justify-between gap-3 border-b px-5 py-3",children:h.jsxs("div",{className:"flex items-baseline gap-2.5",children:[h.jsx("h3",{className:"font-mono text-[10.5px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:d1[n]}),n!=="all"&&h.jsxs("span",{className:"text-[11px] text-muted-foreground/80",children:["Click ",h.jsx("span",{className:"text-foreground",children:"Total"})," to clear"]})]})}),c?h.jsx("div",{children:p1[n].map(d=>{const m=l[d];return m.length===0?null:h.jsx(g1,{label:f1[d],kind:d,count:m.length,children:m.map(f=>h.jsx(v1,{event:f,active:i===f.id,onClick:()=>a(f.id)},f.id))},d)})}):h.jsx(h1,{})]})}function h1(){return h.jsxs("div",{className:"flex flex-col items-center gap-2 px-8 py-16 text-center text-muted-foreground",children:[h.jsx(jv,{className:"h-5 w-5 text-muted-foreground/50"}),h.jsx("p",{className:"text-[13px]",children:"No actions captured yet."}),h.jsx("p",{className:"text-[12px] text-muted-foreground/70",children:"Start Claude Code to populate this view."})]})}function g1({label:n,kind:l,count:i,children:a}){const[c,d]=g.useState(!0);return h.jsxs(Jw,{open:c,onOpenChange:d,children:[h.jsxs(e1,{className:"flex w-full items-center gap-2 border-b bg-muted/20 px-5 py-2 text-left text-[12px] font-medium text-muted-foreground transition-colors hover:bg-muted/40",children:[h.jsx(ip,{className:ge("h-3 w-3 transition-transform",!c&&"-rotate-90")}),h.jsx(hu,{kind:l}),h.jsx("span",{className:"text-foreground",children:n}),h.jsx("span",{className:"tabular-nums text-[11px] text-muted-foreground",children:i})]}),h.jsx(t1,{className:"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down",children:h.jsx("div",{className:"ml-8 border-l border-border/80",children:a})})]})}function v1({event:n,active:l,onClick:i}){const a=mu(n),c=n.risk_event?.signals?.[0]?.replace(/_/g," "),d=ko[n.decision];return h.jsxs("button",{onClick:i,className:ge("group relative grid w-full grid-cols-[10px_minmax(0,1fr)_auto] items-center gap-4 border-b px-4 py-3 text-left transition-colors last:border-b-0","hover:bg-muted/40",l&&"bg-accent"),children:[l&&h.jsx("span",{className:"absolute inset-y-0 left-0 w-[2px] bg-brand"}),h.jsx(hu,{kind:n.decision}),h.jsxs("span",{className:"flex min-w-0 items-baseline gap-2.5",children:[h.jsx("span",{className:"text-[13px] font-medium text-foreground",children:eh(n.tool_name)}),h.jsx("span",{className:"truncate font-mono text-[12px] text-muted-foreground",children:a})]}),h.jsxs("span",{className:"flex items-center gap-3",children:[c&&h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsx("span",{className:"hidden max-w-[180px] truncate text-[11px] text-muted-foreground md:inline",children:c})}),h.jsxs(Eo,{side:"top",children:["Primary signal: ",c]})]}),h.jsx("span",{className:ge("rounded-md border bg-background/60 px-1.5 py-0.5 font-mono text-[11px] font-medium tabular-nums",d.border,n.decision==="allow"?"text-muted-foreground":d.text),children:nh(n)}),h.jsx(ip,{className:ge("h-3 w-3 -rotate-90 text-muted-foreground/0 transition-all group-hover:text-muted-foreground/70",l&&"text-muted-foreground/70")})]})]})}const y1={},x1=y1,yi=x1.VITE_KONTEXT_API??"";function yo(n){return n instanceof Error?n.message:String(n)}async function qf(n){return n.json()}async function xi(n){if(n.ok)return qf(n);const l=`${n.status} ${n.statusText}`.trim();if(!(n.headers.get("content-type")??"").includes("application/json"))throw new Error(l);let a;try{a=await qf(n)}catch(d){throw new Error(`API error response was not valid JSON: ${l}; ${yo(d)}`)}const c=_o(a)&&typeof a.error=="string"?a.error:l;throw new Error(c)}function _o(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function Pe(n){return typeof n=="string"?n:void 0}function Aa(n){return typeof n=="boolean"?n:void 0}function rh(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function Ba(n){return n===null?null:rh(n)}function w1(n){if(!Array.isArray(n))return;const l=n.filter(i=>typeof i=="string");return l.length>0?l:void 0}function oh(n){switch(n){case"allow":case"ask":case"deny":return n;default:return}}function Jf(n){switch(n){case"relaxed":case"balanced":case"strict":return n;default:return}}function S1(n){if(_o(n))return{type:Pe(n.type),provider:Pe(n.provider),provider_category:Pe(n.provider_category),operation:Pe(n.operation),operation_class:Pe(n.operation_class),resource_class:Pe(n.resource_class),environment:Pe(n.environment),credential_observed:Aa(n.credential_observed),credential_source:Pe(n.credential_source),direct_api_call:Aa(n.direct_api_call),explicit_user_intent:Aa(n.explicit_user_intent),command_summary:Pe(n.command_summary),request_summary:Pe(n.request_summary),path_class:Pe(n.path_class),decision:oh(n.decision),reason_code:Pe(n.reason_code),model_version:Pe(n.model_version),signals:w1(n.signals),guard_id:Pe(n.guard_id),risk_score:Ba(n.risk_score),confidence:rh(n.confidence)}}function C1(n){if(!(!_o(n)||typeof n.session_id!="string"||typeof n.actions!="number"))return{session_id:n.session_id,actions:n.actions}}function E1(n){if(!_o(n)||typeof n.id!="string")return;const l=oh(n.decision);if(l)return{id:n.id,session_id:Pe(n.session_id),tool_name:Pe(n.tool_name),decision:l,reason:Pe(n.reason),reason_code:Pe(n.reason_code),risk_score:Ba(n.risk_score),threshold:Ba(n.threshold),risk_event:S1(n.risk_event)}}function lh(n){if(!_o(n))throw new Error("invalid policy profile response");const l=Jf(n.profile);if(!l)throw new Error("invalid policy profile response");return{profile:l,recommended_profile:Jf(n.recommended_profile),version:Pe(n.version),rule_pack:Pe(n.rule_pack),rule_pack_version:Pe(n.rule_pack_version),config_digest:Pe(n.config_digest),activation_id:Pe(n.activation_id),source:Pe(n.source),status:Pe(n.status),loaded_at:Pe(n.loaded_at)}}function ih(n,l){if(n==null)return[];if(!Array.isArray(n))throw new Error("invalid API response");const i=[];for(const a of n){const c=l(a);if(!c)throw new Error("invalid API response");i.push(c)}return i}async function k1(){return ih(await fetch(`${yi}/api/sessions`).then(xi),C1)}async function _1(n){return ih(await fetch(`${yi}/api/sessions/${encodeURIComponent(n)}/events`).then(xi),E1)}async function N1(){return lh(await fetch(`${yi}/api/policy/profile`).then(xi))}async function P1(n){const l=await fetch(`${yi}/api/policy/profile`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:n})}).then(xi);return lh(l)}function b1({event:n}){const l=n.risk_event??{},i=n.risk_score??null,a=n.threshold??null,c=i!=null&&a!=null&&a>0?Math.min(1.2,i/a):null,d=ko[n.decision];return h.jsxs("div",{className:"flex h-full flex-col bg-background",children:[h.jsxs(pm,{className:"flex flex-row items-center gap-2 border-b bg-background px-6 py-3.5 pr-14 space-y-0",children:[h.jsx(hu,{kind:n.decision}),h.jsx(mm,{className:ge("text-[13px] font-medium",d.text),children:c1(n.decision)}),h.jsx("span",{className:"ml-2 font-mono text-[10.5px] uppercase tracking-[0.2em] text-muted-foreground",children:eh(n.tool_name)})]}),h.jsx(ni,{className:"flex-1",children:h.jsxs("div",{className:"space-y-7 px-7 py-7",children:[h.jsxs("div",{className:"space-y-3",children:[h.jsx("pre",{className:"whitespace-pre-wrap break-words font-mono text-[15px] font-medium leading-snug tracking-tight text-foreground",children:mu(n)}),h.jsx("p",{className:"text-[13.5px] leading-relaxed text-foreground/75",children:l1(n)})]}),i!=null&&a!=null&&h.jsx(R1,{tone:d,score:i,threshold:a,ratio:c}),h.jsxs("dl",{className:"grid grid-cols-[120px_1fr] gap-y-3 text-[13px]",children:[h.jsx(ja,{children:"Operation"}),h.jsx(Oa,{children:l.operation||l.operation_class||"unknown"}),h.jsx(ja,{children:"Source"}),h.jsx(Oa,{children:s1(n)}),h.jsx(ja,{children:"Environment"}),h.jsx(Oa,{children:h.jsx("span",{className:"font-mono text-[12.5px]",children:l.environment||"unknown"})})]}),h.jsx(La,{title:"Analysis",children:h.jsx("p",{className:"text-[13px] leading-relaxed text-foreground/80",children:i1(n)})}),h.jsx(La,{title:"Command",children:h.jsx("pre",{className:"overflow-x-auto rounded-md border bg-muted/40 px-3 py-2.5 font-mono text-[12px] leading-relaxed text-foreground/90",children:a1(n)})}),(l.signals??[]).length>0&&h.jsx(La,{title:"Signals",children:h.jsx("div",{className:"flex flex-wrap gap-1.5",children:(l.signals??[]).map(m=>h.jsxs("span",{className:"inline-flex items-center gap-1.5 rounded-md border bg-card px-2 py-1 font-mono text-[11px] text-foreground/80 shadow-[inset_0_1px_0_rgba(255,255,255,0.7)]",children:[h.jsx("span",{className:ge("h-1 w-1 rounded-full",d.bg)}),Jm(m)]},m))})}),n.reason_code&&h.jsxs("div",{className:"border-t pt-4 font-mono text-[10.5px] uppercase tracking-[0.2em] text-muted-foreground",children:["reason ยท ",h.jsx("span",{className:"text-foreground/70",children:n.reason_code})]})]})})]})}function R1({tone:n,score:l,threshold:i,ratio:a}){return h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsxs("div",{className:"cursor-default rounded-xl border bg-card p-4 shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[h.jsxs("div",{className:"flex flex-col",children:[h.jsx("span",{className:"font-mono text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:"Risk score"}),h.jsx("span",{className:ge("mt-1 font-mono text-[28px] font-semibold leading-none tracking-tight tabular-nums",n.text),children:l.toFixed(3)})]}),h.jsxs("div",{className:"text-right",children:[h.jsx("span",{className:"font-mono text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:"Threshold"}),h.jsx("div",{className:"mt-1 font-mono text-[13px] tabular-nums text-foreground/70",children:i.toFixed(3)})]})]}),a!=null&&h.jsx("div",{className:"mt-3 h-1 overflow-hidden rounded-full bg-muted",children:h.jsx("div",{className:ge("h-full rounded-full transition-all",n.bg),style:{width:`${Math.min(100,a*100)}%`}})})]})}),h.jsx(Eo,{side:"left",children:"Risk score relative to threshold"})]})}function La({title:n,children:l}){return h.jsxs("div",{className:"space-y-2.5",children:[h.jsx("h3",{className:"font-mono text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:n}),l]})}var Da,wi="HoverCard",[sh]=_r(wi,[di]),Si=di(),[T1,gu]=sh(wi),ah=n=>{const{__scopeHoverCard:l,children:i,open:a,defaultOpen:c,onOpenChange:d,openDelay:m=700,closeDelay:f=300}=n,v=Si(l),x=g.useRef(0),y=g.useRef(0),S=g.useRef(!1),C=g.useRef(!1),[_,b]=ri({prop:a,defaultProp:c??!1,onChange:d,caller:wi}),k=g.useCallback(()=>{clearTimeout(y.current),x.current=window.setTimeout(()=>b(!0),m)},[m,b]),T=g.useCallback(()=>{clearTimeout(x.current),!S.current&&!C.current&&(y.current=window.setTimeout(()=>b(!1),f))},[f,b]),A=g.useCallback(()=>b(!1),[b]);return g.useEffect(()=>()=>{clearTimeout(x.current),clearTimeout(y.current)},[]),h.jsx(T1,{scope:l,open:_,onOpenChange:b,onOpen:k,onClose:T,onDismiss:A,hasSelectionRef:S,isPointerDownOnContentRef:C,children:h.jsx(Mm,{...v,children:i})})};ah.displayName=wi;var uh="HoverCardTrigger",ch=g.forwardRef((n,l)=>{const{__scopeHoverCard:i,...a}=n,c=gu(uh,i),d=Si(i);return h.jsx(Im,{asChild:!0,...d,children:h.jsx(Le.a,{"data-state":c.open?"open":"closed",...a,ref:l,onPointerEnter:Ee(n.onPointerEnter,Jl(c.onOpen)),onPointerLeave:Ee(n.onPointerLeave,Jl(c.onClose)),onFocus:Ee(n.onFocus,c.onOpen),onBlur:Ee(n.onBlur,c.onClose),onTouchStart:Ee(n.onTouchStart,m=>m.preventDefault())})})});ch.displayName=uh;var j1="HoverCardPortal",[lS,O1]=sh(j1,{forceMount:void 0}),ql="HoverCardContent",dh=g.forwardRef((n,l)=>{const i=O1(ql,n.__scopeHoverCard),{forceMount:a=i.forceMount,...c}=n,d=gu(ql,n.__scopeHoverCard);return h.jsx(Rt,{present:a||d.open,children:h.jsx(A1,{"data-state":d.open?"open":"closed",...c,onPointerEnter:Ee(n.onPointerEnter,Jl(d.onOpen)),onPointerLeave:Ee(n.onPointerLeave,Jl(d.onClose)),ref:l})})});dh.displayName=ql;var A1=g.forwardRef((n,l)=>{const{__scopeHoverCard:i,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:m,...f}=n,v=gu(ql,i),x=Si(i),y=g.useRef(null),S=We(l,y),[C,_]=g.useState(!1);return g.useEffect(()=>{if(C){const b=document.body;return Da=b.style.userSelect||b.style.webkitUserSelect,b.style.userSelect="none",b.style.webkitUserSelect="none",()=>{b.style.userSelect=Da,b.style.webkitUserSelect=Da}}},[C]),g.useEffect(()=>{if(y.current){const b=()=>{_(!1),v.isPointerDownOnContentRef.current=!1,setTimeout(()=>{document.getSelection()?.toString()!==""&&(v.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",b),()=>{document.removeEventListener("pointerup",b),v.hasSelectionRef.current=!1,v.isPointerDownOnContentRef.current=!1}}},[v.isPointerDownOnContentRef,v.hasSelectionRef]),g.useEffect(()=>{y.current&&M1(y.current).forEach(k=>k.setAttribute("tabindex","-1"))}),h.jsx(oi,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:m,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:Ee(d,b=>{b.preventDefault()}),onDismiss:v.onDismiss,children:h.jsx(zm,{...x,...f,onPointerDown:Ee(f.onPointerDown,b=>{b.currentTarget.contains(b.target)&&_(!0),v.hasSelectionRef.current=!1,v.isPointerDownOnContentRef.current=!0}),ref:S,style:{...f.style,userSelect:C?"text":void 0,WebkitUserSelect:C?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})})}),L1="HoverCardArrow",D1=g.forwardRef((n,l)=>{const{__scopeHoverCard:i,...a}=n,c=Si(i);return h.jsx(Fm,{...c,...a,ref:l})});D1.displayName=L1;function Jl(n){return l=>l.pointerType==="touch"?void 0:n()}function M1(n){const l=[],i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;i.nextNode();)l.push(i.currentNode);return l}var I1=ah,z1=ch,fh=dh;const F1=I1,$1=z1,ph=g.forwardRef(({className:n,align:l="center",sideOffset:i=4,...a},c)=>h.jsx(fh,{ref:c,align:l,sideOffset:i,className:ge("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]",n),...a}));ph.displayName=fh.displayName;function vr({className:n,...l}){return h.jsx("div",{className:ge("animate-pulse rounded-md bg-muted",n),...l})}const Va=[{id:"relaxed",label:"Relaxed",lede:"Fewer blocks, more compatibility.",hint:"Use when iterating on agent behavior."},{id:"balanced",label:"Balanced",recommended:!0,lede:"Good protection with fewer false positives.",hint:"Best default for local development."},{id:"strict",label:"Strict",lede:"Maximum protection, more false positives.",hint:"Use when you can accept breakage."}];function W1(n){return Va.find(l=>l.id===n)?.label??"Balanced"}const H1={relaxed:1,balanced:2,strict:3};function U1({profile:n,pending:l,error:i,onActivate:a,onRetry:c}){const d=n?.profile??"balanced",m=!n&&!i;return h.jsxs("section",{className:"space-y-3.5",children:[h.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[h.jsxs("div",{className:"flex items-baseline gap-3",children:[h.jsx("h2",{className:"text-[15px] font-semibold tracking-tight",children:"Policy profile"}),n&&h.jsxs("span",{className:"font-mono text-[11px] text-muted-foreground",children:[W1(n.profile)," profile"]})]}),n&&h.jsx(B1,{profile:n})]}),h.jsx("div",{className:"grid grid-cols-1 gap-2.5 md:grid-cols-3",children:m?Va.map(f=>h.jsx(V1,{},f.id)):Va.map(f=>h.jsx(Y1,{profile:f,active:f.id===d,pending:f.id===l,disabled:!n||!!l,onActivate:()=>a(f.id)},f.id))}),i&&h.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[12px] text-destructive",children:[h.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[h.jsx(sp,{className:"h-3.5 w-3.5 shrink-0"}),h.jsx("span",{children:i})]}),h.jsx("button",{type:"button",onClick:c,className:"shrink-0 font-mono text-[10.5px] uppercase tracking-[0.18em] text-destructive underline-offset-4 hover:underline",children:"Retry"})]})]})}function B1({profile:n}){return h.jsxs(F1,{openDelay:120,children:[h.jsx($1,{asChild:!0,children:h.jsxs("button",{type:"button",className:"inline-flex items-center gap-1.5 font-mono text-[10.5px] uppercase tracking-[0.18em] text-muted-foreground transition-colors hover:text-foreground",children:[h.jsx(Pv,{className:"h-3 w-3"}),n.version]})}),h.jsx(ph,{side:"left",align:"end",className:"w-[280px] text-[12.5px]",children:h.jsxs("div",{className:"space-y-1.5",children:[h.jsx(Zf,{k:"Version",v:n.version??"โ€”"}),h.jsx(Zf,{k:"Rule pack",v:n.rule_pack??"โ€”"})]})})]})}function V1(){return h.jsxs("div",{className:"rounded-xl border bg-card p-4",children:[h.jsx(vr,{className:"h-3 w-16"}),h.jsx(vr,{className:"mt-3 h-7 w-24"}),h.jsx(vr,{className:"mt-3 h-3 w-full"}),h.jsx(vr,{className:"mt-1.5 h-3 w-3/4"})]})}function Y1({profile:n,active:l,pending:i,disabled:a,onActivate:c}){const d=H1[n.id];return h.jsxs("button",{type:"button",onClick:c,disabled:a,className:ge("group relative flex flex-col overflow-hidden rounded-xl border text-left transition-shadow duration-200","disabled:pointer-events-none disabled:opacity-60",l?ge("bg-brand-gradient border-brand-dark text-brand-foreground","shadow-[inset_0_1px_0_rgba(255,255,255,0.10),inset_0_0_0_1px_rgba(255,255,255,0.04),0_10px_30px_-8px_rgba(21,40,34,0.45)]","hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.14),inset_0_0_0_1px_rgba(255,255,255,0.06),0_18px_48px_-10px_rgba(21,40,34,0.55)]"):ge("bg-card","shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(15,17,21,0.04)]","hover:border-foreground/15 hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_6px_18px_-6px_rgba(15,17,21,0.10)]")),children:[i&&h.jsx("span",{className:"absolute inset-x-0 bottom-0 h-px overflow-hidden",children:h.jsx("span",{className:ge("block h-full w-1/3 animate-[shimmer_1.2s_linear_infinite]",l?"bg-white":"bg-foreground")})}),h.jsxs("div",{className:"flex items-center justify-between px-5 pt-4",children:[h.jsx(Q1,{filled:d,active:l}),h.jsxs("div",{className:"flex items-center gap-2",children:[n.recommended&&!i&&h.jsx("span",{className:ge("font-mono text-[9.5px] font-medium uppercase tracking-[0.18em]",l?"text-white/70":"text-muted-foreground"),children:"Recommended"}),i&&h.jsxs("span",{className:ge("inline-flex items-center gap-1 font-mono text-[9.5px] uppercase tracking-[0.18em]",l?"text-white/70":"text-muted-foreground"),children:[h.jsx(Rv,{className:"h-3 w-3 animate-spin"}),"Activating"]})]})]}),h.jsxs("div",{className:"px-5 pt-2.5",children:[h.jsx("div",{className:"text-[22px] font-semibold leading-tight tracking-tight",children:n.label}),h.jsx("p",{className:ge("mt-1 text-[12.5px] leading-snug",l?"text-white/85":"text-foreground/80"),children:n.lede}),h.jsx("p",{className:ge("mt-0.5 text-[11.5px] leading-snug",l?"text-white/55":"text-muted-foreground"),children:n.hint})]}),h.jsx("div",{className:ge("mt-3 border-t px-5 py-2.5 font-mono text-[10px] uppercase tracking-[0.22em]",l?"border-white/15 text-white":"border-border text-muted-foreground/70"),children:l?"Active profile":"Tap to activate"})]})}function Q1({filled:n,active:l}){return h.jsx("div",{className:"flex items-center gap-1","aria-hidden":"true",children:[1,2,3].map(i=>h.jsx("span",{className:ge("h-1 w-2.5 rounded-full transition-colors",i<=n?l?"bg-white":"bg-foreground":l?"bg-white/25":"bg-muted-foreground/25")},i))})}new Date(Date.now()-120*1e3).toISOString();function G1({session:n,loading:l}){return h.jsxs("header",{className:"flex items-center justify-between gap-4 border-b bg-background px-10 py-5",children:[h.jsx("div",{className:"flex min-w-0 items-center gap-3",children:l?h.jsx(vr,{className:"h-6 w-60"}):h.jsxs(h.Fragment,{children:[h.jsxs("span",{className:"relative flex h-2 w-2 shrink-0",children:[h.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-brand opacity-50"}),h.jsx("span",{className:"relative inline-flex h-2 w-2 rounded-full bg-brand"})]}),h.jsx("span",{className:"truncate font-mono text-[17px] font-medium tracking-tight text-foreground",children:n?.session_id??"-"})]})}),h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsx("span",{className:"cursor-default text-[11px] uppercase tracking-[0.18em] text-muted-foreground",children:"Observe mode"})}),h.jsx(Eo,{side:"bottom",children:"Recording decisions but not enforcing them."})]})]})}function X1({sessions:n,counts:l,selectedID:i,onSelect:a}){return h.jsxs("aside",{className:"flex min-h-0 flex-col border-r",children:[h.jsx("div",{className:"px-5 pb-6 pt-7",children:h.jsx("div",{className:"text-[18px] font-semibold tracking-tight",children:"Kontext"})}),h.jsxs(ni,{className:"flex-1 px-2",children:[h.jsx(K1,{label:"This session",count:l.all,active:!0}),n.length>1&&h.jsxs(h.Fragment,{children:[h.jsx("div",{className:"px-2.5 pb-1.5 pt-6 text-[10.5px] font-medium uppercase tracking-[0.18em] text-muted-foreground",children:"Recent"}),h.jsx("div",{className:"flex flex-col gap-0.5",children:n.slice(0,12).map(c=>h.jsxs("button",{type:"button",onClick:()=>a(c.session_id),className:ge("flex items-center justify-between gap-2 rounded-md px-2.5 py-1.5 text-left text-[12.5px] transition-colors hover:bg-accent/60",c.session_id===i&&"bg-accent text-foreground"),children:[h.jsx("span",{className:"truncate font-mono text-muted-foreground",children:c.session_id}),h.jsx("span",{className:"shrink-0 tabular-nums text-[11px] text-muted-foreground",children:c.actions})]},c.session_id))})]})]})]})}function K1({label:n,count:l,active:i}){return h.jsxs("button",{type:"button",className:ge("flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-left text-[13px] font-medium transition-colors",i?"bg-accent text-foreground":"text-muted-foreground hover:bg-accent/60 hover:text-foreground"),children:[h.jsx("span",{children:n}),h.jsx("span",{className:"font-mono text-[11px] text-muted-foreground",children:l})]})}const Z1=[{id:"all",label:"Total"},{id:"deny",label:"Would deny"},{id:"ask",label:"Needs ask"},{id:"allow",label:"Allowed"}],q1=[{kind:"deny",label:"Would deny"},{kind:"ask",label:"Ask"},{kind:"allow",label:"Allow"}];function J1({counts:n,active:l,onSelect:i,loading:a}){return h.jsxs("section",{className:"overflow-hidden rounded-xl border bg-card shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsx("div",{className:"grid grid-cols-2 divide-x divide-y md:grid-cols-4 md:divide-y-0",children:Z1.map(c=>h.jsx(eS,{id:c.id,label:c.label,count:n[c.id],total:n.all,active:l===c.id,loading:a,onClick:()=>i(c.id)},c.id))}),h.jsx(tS,{counts:n})]})}function eS({id:n,label:l,count:i,total:a,active:c,loading:d,onClick:m}){const f=n==="all"?null:Math.round(i/Math.max(1,a)*100),v=i===0?"text-muted-foreground/40":n==="all"?"":ko[n].text;return h.jsxs("button",{type:"button",onClick:m,className:ge("group relative flex items-baseline gap-4 px-6 py-5 text-left transition-colors","hover:bg-muted/30",c&&"bg-muted/40"),children:[d?h.jsx(vr,{className:"h-9 w-12"}):h.jsx("span",{className:ge("font-mono text-[36px] font-semibold leading-none tracking-tight tabular-nums",v),children:i}),h.jsxs("div",{className:"flex flex-col leading-tight",children:[h.jsx("span",{className:ge("font-mono text-[10px] font-medium uppercase tracking-[0.22em]",c?"text-foreground":"text-muted-foreground"),children:l}),h.jsx("span",{className:"mt-1 text-[11px] text-muted-foreground/70",children:f==null?"Decisions captured":`${f}% of session`})]})]})}function tS({counts:n}){const l=q1.map(i=>({count:n[i.kind],color:ko[i.kind].bg,label:i.label})).filter(i=>i.count>0);return h.jsx("div",{className:"border-t bg-muted/20 px-6 py-3",children:h.jsxs("div",{className:"flex items-center gap-4",children:[h.jsx("div",{className:"flex h-1.5 flex-1 gap-0.5 overflow-hidden rounded-full bg-muted/60",children:l.length===0?h.jsx("div",{className:"w-full bg-muted-foreground/15"}):l.map(i=>h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsx("div",{className:ge("transition-opacity hover:opacity-80",i.color),style:{flex:i.count},"aria-label":`${i.count} ${i.label}`})}),h.jsxs(Eo,{side:"top",children:[i.count," ",i.label.toLowerCase()]})]},i.label))}),h.jsx("div",{className:"flex items-center gap-3 font-mono text-[10px] uppercase tracking-[0.18em] text-muted-foreground",children:l.length===0?h.jsx("span",{children:"No activity yet"}):l.map(i=>h.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[h.jsx("span",{className:ge("h-1.5 w-1.5 rounded-full",i.color)}),i.label,h.jsx("span",{className:"tabular-nums text-foreground/70",children:i.count})]},i.label))})]})})}function nS(){const[n,l]=g.useState([]),[i,a]=g.useState(""),[c,d]=g.useState([]),[m,f]=g.useState("all"),[v,x]=g.useState(null),[y,S]=g.useState(""),[C,_]=g.useState(null),[b,k]=g.useState(null),[T,A]=g.useState(""),L=g.useRef("");g.useEffect(()=>{Y(),ie();const ee=setInterval(Y,3e3);return()=>clearInterval(ee)},[]),g.useEffect(()=>{i&&B(i),L.current=i},[i]);function $(ee){L.current=ee,a(ee)}function M(ee){return l(le=>o1(le,ee)?le:ee),S(""),ee}function U(ee){d(ee),S("")}function Y(){k1().then(ee=>{const le=M(ee),se=L.current,D=le.some(Q=>Q.session_id===se)?se:le[0]?.session_id;D?D!==se?$(D):B(D):(L.current="",a(""),d([]),x(null))}).catch(ee=>S(yo(ee)))}function B(ee){_1(ee).then(le=>{L.current===ee&&U(le)}).catch(le=>S(yo(le)))}function ie(){N1().then(ee=>{_(ee),A("")}).catch(ee=>{A(`Couldn't load policy profile. ${yo(ee)}`)})}function te(ee){ee===C?.profile||b||(k(ee),A(""),P1(ee).then(_).catch(le=>A(`Couldn't update policy profile. ${yo(le)}`)).finally(()=>k(null)))}const{counts:ne,groups:ue}=g.useMemo(()=>r1(c),[c]),J=g.useMemo(()=>v?c.find(ee=>ee.id===v)??null:null,[v,c]),me=g.useMemo(()=>n.find(ee=>ee.session_id===i),[n,i]),ce=n.length===0&&!y;return h.jsx(Gw,{delayDuration:150,children:h.jsxs("div",{className:"grid h-screen grid-cols-[252px_1fr] bg-background text-foreground",children:[h.jsx(X1,{sessions:n,counts:ne,selectedID:i,onSelect:$}),h.jsxs("main",{className:"flex min-h-0 flex-col overflow-hidden",children:[h.jsx(G1,{session:me,loading:ce}),h.jsx(ni,{className:"flex-1",children:h.jsxs("div",{className:"px-10 pb-10 pt-8",children:[h.jsx(U1,{profile:C,pending:b,error:T,onActivate:te,onRetry:ie}),h.jsx(Kf,{label:"Activity",description:"What was decided this session.",children:h.jsx(J1,{counts:ne,active:m,onSelect:f,loading:ce})}),y&&h.jsxs("div",{className:"mt-4 flex items-center gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[12px] text-destructive",children:[h.jsx(sp,{className:"h-3.5 w-3.5 shrink-0"}),h.jsx("span",{children:y})]}),h.jsx(Kf,{label:"Log",description:"Tool calls in chronological order.",children:h.jsx(m1,{tab:m,groups:ue,openId:v,onOpen:x,hasAny:c.length>0})})]})})]}),h.jsx(u0,{open:!!J,onOpenChange:ee=>!ee&&x(null),children:h.jsx(fm,{side:"right",className:"w-[540px] max-w-[92vw] p-0 sm:max-w-[540px]",children:J&&h.jsx(b1,{event:J})})})]})})}const ep=document.getElementById("root");ep&&yv.createRoot(ep).render(h.jsx(np.StrictMode,{children:h.jsx(nS,{})})); diff --git a/internal/guard/web/assets/dist/assets/index-CgbQgif-.css b/internal/guard/web/assets/dist/assets/index-CgbQgif-.css deleted file mode 100644 index 66d000c8..00000000 --- a/internal/guard/web/assets/dist/assets/index-CgbQgif-.css +++ /dev/null @@ -1 +0,0 @@ -:root{color:#171b18;font-synthesis:none;background:#f4f1ea;font-family:Geist,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}body{background:#f4f1ea;min-width:320px;margin:0}button,select{font:inherit}button{cursor:pointer;border:0}main{width:min(1180px,100vw - 32px);margin:0 auto;padding:22px 0 44px}h1,h2,h3,p,dl{margin:0}.topbar,.hero,.funnel,.actionList,.inspector{background:#fffdf8;border:1px solid #171b181f;border-radius:14px}.topbar{justify-content:space-between;align-items:center;gap:14px;padding:12px 14px;display:flex}.topbar strong,.topbar span{display:block}.topbar strong{font-size:15px}.topbar span,.hero p,.hero span,.panelHeader p,.eventReason,.facts dt,.empty{color:#66706a;font-size:13px}.topActions{align-items:center;gap:8px;display:flex}.topActions button,.topActions select{color:#fff;background:#171b18;border:1px solid #171b1824;border-radius:999px;padding:8px 11px}.topActions select{color:#171b18;background:#fff}.hero{justify-content:space-between;align-items:end;gap:18px;margin-top:14px;padding:20px;display:flex}.hero h1{letter-spacing:-.04em;font-size:clamp(32px,5vw,56px);line-height:.95}.funnel{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:14px;padding:10px;display:grid}.funnelStep{text-align:left;color:#171b18;background:#ede8dd;border:1px solid #0000;border-radius:11px;min-height:118px;padding:14px;position:relative;overflow:hidden}.funnelStep:before{content:"";width:var(--w);background:#8b938e;height:5px;position:absolute;inset:auto auto 0 0}.funnelStep.ask:before{background:#c79025}.funnelStep.deny:before{background:#d94f43}.funnelStep.active{background:#fff;border-color:#171b18}.funnelStep span,.funnelStep small{display:block}.funnelStep span{font-size:14px;font-weight:750}.funnelStep strong{margin-top:14px;font-size:42px;line-height:1;display:block}.funnelStep small{color:#66706a;margin-top:8px}.workspace{grid-template-columns:minmax(360px,1fr) minmax(360px,440px);align-items:start;gap:14px;margin-top:14px;display:grid}.actionList,.inspector{padding:16px}.panelHeader{margin-bottom:12px}.panelHeader h2{margin-top:2px;font-size:24px}.rows{gap:8px;display:grid}.eventRow{text-align:left;color:#171b18;background:#fff;border:1px solid #171b181c;border-radius:11px;grid-template-columns:minmax(76px,112px) minmax(0,1fr) 68px;align-items:center;gap:10px;width:100%;padding:11px;display:grid}.eventRow.active{border-color:#171b18;box-shadow:inset 4px 0 #8b938e}.eventRow.ask.active{box-shadow:inset 4px 0 #c79025}.eventRow.deny.active{box-shadow:inset 4px 0 #d94f43}.toolName{font-weight:760}.eventReason{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.riskScore{font-variant-numeric:tabular-nums;justify-self:end}.inspector{position:sticky;top:14px}.decisionLine{justify-content:space-between;align-items:center;gap:12px;display:flex}.decisionLine span,.signals span{background:#fff;border:1px solid #171b1824;border-radius:999px;padding:5px 9px;font-size:12px}.decisionLine strong{font-variant-numeric:tabular-nums;font-size:34px}.inspector h2{letter-spacing:-.02em;margin-top:18px;font-size:28px}.reason{color:#46524b;margin-top:6px}.inspector section,.facts{border-top:1px solid #171b181a;margin-top:18px;padding-top:16px}.inspector h3{color:#66706a;margin-bottom:8px;font-size:13px}.inspector p{line-height:1.5}.inspector code{color:#f8f4ea;overflow-wrap:anywhere;background:#171b18;border-radius:10px;padding:12px;line-height:1.45;display:block}.facts{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.facts dd{overflow-wrap:anywhere;margin:4px 0 0}.signals{flex-wrap:wrap;gap:7px;display:flex}.empty{border:1px dashed #171b1829;border-radius:12px;padding:18px}.emptyInspector{text-align:center;place-content:center;min-height:320px;display:grid}.error{color:#8f2f28;background:#ffe8e3;border-radius:12px;margin-top:14px;padding:12px}@media (width<=860px){.topbar,.hero{flex-direction:column;align-items:stretch}.funnel,.workspace{grid-template-columns:1fr}.inspector{position:static}}@media (width<=560px){main{width:min(100% - 20px,1180px)}.eventRow,.facts{grid-template-columns:1fr}.riskScore{justify-self:start}} diff --git a/internal/guard/web/assets/dist/assets/index-DjwLWOdb.css b/internal/guard/web/assets/dist/assets/index-DjwLWOdb.css new file mode 100644 index 00000000..7b8b6212 --- /dev/null +++ b/internal/guard/web/assets/dist/assets/index-DjwLWOdb.css @@ -0,0 +1 @@ +@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-sans-latin-400-normal-gapTbOY8.woff2) format("woff2"),url(/assets/geist-sans-latin-400-normal-BOaIZNA2.woff) format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2) format("woff2"),url(/assets/geist-sans-latin-500-normal-CN2lyvyL.woff) format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/geist-sans-latin-600-normal-DFOURf8L.woff2) format("woff2"),url(/assets/geist-sans-latin-600-normal-CA1yjETN.woff) format("woff")}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2) format("woff2"),url(/assets/geist-mono-latin-400-normal-CoULgQGM.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2) format("woff2"),url(/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Geist Sans,-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Geist Mono,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--radius: .625rem;--radius-sm: .375rem;--radius-lg: .875rem;--background: 40 11% 97%;--foreground: 24 10% 10%;--card: 0 0% 100%;--card-foreground: 24 10% 10%;--popover: 0 0% 100%;--popover-foreground: 24 10% 10%;--primary: 24 10% 10%;--primary-foreground: 40 11% 97%;--secondary: 40 8% 93%;--secondary-foreground: 24 10% 10%;--muted: 40 8% 93%;--muted-foreground: 30 6% 44%;--accent: 40 8% 91%;--accent-foreground: 24 10% 10%;--destructive: 0 72% 51%;--destructive-foreground: 0 0% 100%;--border: 36 8% 89%;--input: 36 8% 89%;--ring: 161 48% 12%;--brand: 161 48% 12%;--brand-foreground: 0 0% 100%;--brand-light: 161 33% 94%;--brand-dark: 161 53% 9%}*{border-color:hsl(var(--border))}html,body,#root{height:100%}body{background-color:hsl(var(--background));font-family:Geist Sans,-apple-system,BlinkMacSystemFont,system-ui,sans-serif;color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv11","ss01","ss03"}.bg-brand-gradient{background:radial-gradient(120% 90% at 0% 0%,rgba(255,255,255,.1),transparent 55%),linear-gradient(135deg,#102d24,#1c4035,#244c3f)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-4{top:1rem}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-3\.5{margin-bottom:.875rem}.ml-2{margin-left:.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.min-h-0{min-height:0px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/3{width:33.333333%}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-60{width:15rem}.w-64{width:16rem}.w-\[280px\]{width:280px}.w-\[2px\]{width:2px}.w-\[540px\]{width:540px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[8rem\]{min-width:8rem}.max-w-\[180px\]{max-width:180px}.max-w-\[92vw\]{max-width:92vw}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\[--radix-hover-card-content-transform-origin\]{transform-origin:var(--radix-hover-card-content-transform-origin)}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:var(--radix-tooltip-content-transform-origin)}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(400%)}}.animate-\[shimmer_1\.2s_linear_infinite\]{animation:shimmer 1.2s linear infinite}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[10px_minmax\(0\,1fr\)_auto\]{grid-template-columns:10px minmax(0,1fr) auto}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.grid-cols-\[252px_1fr\]{grid-template-columns:252px 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-y-3{row-gap:.75rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-300\/40{border-color:#fcd34d66}.border-border{border-color:hsl(var(--border))}.border-border\/80{border-color:hsl(var(--border) / .8)}.border-brand-dark{--tw-border-opacity: 1;border-color:hsl(var(--brand-dark) / var(--tw-border-opacity, 1))}.border-destructive\/20{border-color:hsl(var(--destructive) / .2)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-white\/15{border-color:#ffffff26}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-background\/60{background-color:hsl(var(--background) / .6)}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand) / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-foreground{background-color:hsl(var(--foreground))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/15{background-color:hsl(var(--muted-foreground) / .15)}.bg-muted-foreground\/25{background-color:hsl(var(--muted-foreground) / .25)}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-muted\/60{background-color:hsl(var(--muted) / .6)}.bg-popover{background-color:hsl(var(--popover))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/25{background-color:#ffffff40}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\[1px\]{padding:1px}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-6{padding-bottom:1.5rem}.pl-8{padding-left:2rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pt-2\.5{padding-top:.625rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:Geist Mono,ui-monospace,monospace}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[22px\]{font-size:22px}.text-\[28px\]{font-size:28px}.text-\[36px\]{font-size:36px}.text-\[9\.5px\]{font-size:9.5px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.22em\]{letter-spacing:.22em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-brand{--tw-text-opacity: 1;color:hsl(var(--brand) / var(--tw-text-opacity, 1))}.text-brand-foreground{--tw-text-opacity: 1;color:hsl(var(--brand-foreground) / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/70{color:hsl(var(--foreground) / .7)}.text-foreground\/75{color:hsl(var(--foreground) / .75)}.text-foreground\/80{color:hsl(var(--foreground) / .8)}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/0{color:hsl(var(--muted-foreground) / 0)}.text-muted-foreground\/40{color:hsl(var(--muted-foreground) / .4)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-muted-foreground\/80{color:hsl(var(--muted-foreground) / .8)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/55{color:#ffffff8c}.text-white\/70{color:#ffffffb3}.text-white\/85{color:#ffffffd9}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.10\)\,inset_0_0_0_1px_rgba\(255\,255\,255\,0\.04\)\,0_10px_30px_-8px_rgba\(21\,40\,34\,0\.45\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.1),inset 0 0 0 1px rgba(255,255,255,.04),0 10px 30px -8px rgba(21,40,34,.45);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), inset 0 0 0 1px var(--tw-shadow-color), 0 10px 30px -8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.7\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.7);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_1px_2px_rgba\(0\,0\,0\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 1px 2px rgba(0,0,0,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_1px_2px_rgba\(15\,17\,21\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 1px 2px rgba(15,17,21,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-amber-500\/10{--tw-ring-color: rgb(245 158 11 / .1)}.ring-brand\/10{--tw-ring-color: hsl(var(--brand) / .1)}.ring-destructive\/10{--tw-ring-color: hsl(var(--destructive) / .1)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.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,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.first\:mt-0:first-child{margin-top:0}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-foreground\/15:hover{border-color:hsl(var(--foreground) / .15)}.hover\:bg-accent\/60:hover{background-color:hsl(var(--accent) / .6)}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted) / .4)}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.14\)\,inset_0_0_0_1px_rgba\(255\,255\,255\,0\.06\)\,0_18px_48px_-10px_rgba\(21\,40\,34\,0\.55\)\]:hover{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.14),inset 0 0 0 1px rgba(255,255,255,.06),0 18px 48px -10px rgba(21,40,34,.55);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), inset 0 0 0 1px var(--tw-shadow-color), 0 18px 48px -10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_6px_18px_-6px_rgba\(15\,17\,21\,0\.10\)\]:hover{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 6px 18px -6px rgba(15,17,21,.1);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 6px 18px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}.data-\[state\=closed\]\:animate-collapsible-up[data-state=closed]{animation:collapsible-up .2s ease-out}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}.data-\[state\=open\]\:animate-collapsible-down[data-state=open]{animation:collapsible-down .2s ease-out}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}@media(min-width:640px){.sm\:max-w-\[540px\]{max-width:540px}.sm\:max-w-sm{max-width:24rem}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:text-left{text-align:left}}@media(min-width:768px){.md\:inline{display:inline}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0} diff --git a/internal/guard/web/assets/dist/assets/index-Mr2yz9MB.js b/internal/guard/web/assets/dist/assets/index-Mr2yz9MB.js deleted file mode 100644 index 9c6e72f1..00000000 --- a/internal/guard/web/assets/dist/assets/index-Mr2yz9MB.js +++ /dev/null @@ -1,9 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.iterator;function p(e){return typeof e!=`object`||!e?null:(e=f&&e[f]||e[`@@iterator`],typeof e==`function`?e:null)}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function _(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}_.prototype.isReactComponent={},_.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},_.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function v(){}v.prototype=_.prototype;function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}var b=y.prototype=new v;b.constructor=y,h(b,_.prototype),b.isPureReactComponent=!0;var ee=Array.isArray,x={H:null,A:null,T:null,S:null},te=Object.prototype.hasOwnProperty;function ne(e,n,r,i,a,o){return r=o.ref,{$$typeof:t,type:e,key:n,ref:r===void 0?null:r,props:o}}function re(e,t){return ne(e.type,t,void 0,void 0,void 0,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function S(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function C(){}function se(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ce(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ce(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+S(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),ce(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=typeof setTimeout==`function`?setTimeout:null,_=typeof clearTimeout==`function`?clearTimeout:null,v=typeof setImmediate<`u`?setImmediate:null;function y(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function b(e){if(h=!1,y(e),!m)if(n(c)!==null)m=!0,C();else{var t=n(l);t!==null&&se(b,t.startTime-e)}}var ee=!1,x=-1,te=5,ne=-1;function re(){return!(e.unstable_now()-net&&re());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,y(t),i=!0;break b}d===n(c)&&r(c),y(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&se(b,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?ae():ee=!1}}}var ae;if(typeof v==`function`)ae=function(){v(ie)};else if(typeof MessageChannel<`u`){var oe=new MessageChannel,S=oe.port2;oe.port1.onmessage=ie,ae=function(){S.postMessage(null)}}else ae=function(){g(ie,0)};function C(){ee||(ee=!0,ae())}function se(t,n){x=g(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_continueExecution=function(){m||p||(m=!0,C())},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(_(x),x=-1):h=!0,se(b,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,C())),r},e.unstable_shouldYield=re,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{ue=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?le(n):``}function fe(e){switch(e.tag){case 26:case 27:case 5:return le(e.type);case 16:return le(`Lazy`);case 13:return le(`Suspense`);case 19:return le(`SuspenseList`);case 0:case 15:return e=de(e.type,!1),e;case 11:return e=de(e.type.render,!1),e;case 1:return e=de(e.type,!0),e;default:return``}}function pe(e){try{var t=``;do t+=fe(e),e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}function me(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function he(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function ge(e){if(me(e)!==e)throw Error(i(188))}function _e(e){var t=e.alternate;if(!t){if(t=me(e),t===null)throw Error(i(188));return t===e?e:null}for(var n=e,r=t;;){var a=n.return;if(a===null)break;var o=a.alternate;if(o===null){if(r=a.return,r!==null){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return ge(a),e;if(o===r)return ge(a),t;o=o.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=o;else{for(var s=!1,c=a.child;c;){if(c===n){s=!0,n=a,r=o;break}if(c===r){s=!0,r=a,n=o;break}c=c.sibling}if(!s){for(c=o.child;c;){if(c===n){s=!0,n=o,r=a;break}if(c===r){s=!0,r=o,n=a;break}c=c.sibling}if(!s)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(n.tag!==3)throw Error(i(188));return n.stateNode.current===n?e:t}function ve(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=ve(e),t!==null)return t;e=e.sibling}return null}var ye=Array.isArray,w=r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,be={pending:!1,data:null,method:null,action:null},xe=[],Se=-1;function Ce(e){return{current:e}}function T(e){0>Se||(e.current=xe[Se],xe[Se]=null,Se--)}function E(e,t){Se++,xe[Se]=e.current,e.current=t}var we=Ce(null),Te=Ce(null),Ee=Ce(null),De=Ce(null);function Oe(e,t){switch(E(Ee,t),E(Te,e),E(we,null),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)&&(t=t.namespaceURI)?bd(t):0;break;default:if(e=e===8?t.parentNode:t,t=e.tagName,e=e.namespaceURI)e=bd(e),t=xd(e,t);else switch(t){case`svg`:t=1;break;case`math`:t=2;break;default:t=0}}T(we),E(we,t)}function ke(){T(we),T(Te),T(Ee)}function Ae(e){e.memoizedState!==null&&E(De,e);var t=we.current,n=xd(t,e.type);t!==n&&(E(Te,e),E(we,n))}function je(e){Te.current===e&&(T(we),T(Te)),De.current===e&&(T(De),Cf._currentValue=be)}var Me=Object.prototype.hasOwnProperty,Ne=t.unstable_scheduleCallback,Pe=t.unstable_cancelCallback,Fe=t.unstable_shouldYield,Ie=t.unstable_requestPaint,Le=t.unstable_now,Re=t.unstable_getCurrentPriorityLevel,ze=t.unstable_ImmediatePriority,Be=t.unstable_UserBlockingPriority,Ve=t.unstable_NormalPriority,He=t.unstable_LowPriority,Ue=t.unstable_IdlePriority,We=t.log,Ge=t.unstable_setDisableYieldValue,Ke=null,qe=null;function Je(e){if(qe&&typeof qe.onCommitFiberRoot==`function`)try{qe.onCommitFiberRoot(Ke,e,void 0,(e.current.flags&128)==128)}catch{}}function Ye(e){if(typeof We==`function`&&Ge(e),qe&&typeof qe.setStrictMode==`function`)try{qe.setStrictMode(Ke,e)}catch{}}var Xe=Math.clz32?Math.clz32:$e,Ze=Math.log,Qe=Math.LN2;function $e(e){return e>>>=0,e===0?32:31-(Ze(e)/Qe|0)|0}var et=128,tt=4194304;function nt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194176;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function rt(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,a=e.pingedLanes,o=e.warmLanes;e=e.finishedLanes!==0;var s=n&134217727;return s===0?(s=n&~i,s===0?a===0?e||(o=n&~o,o!==0&&(r=nt(o))):r=nt(a):r=nt(s)):(n=s&~i,n===0?(a&=s,a===0?e||(o=s&~o,o!==0&&(r=nt(o))):r=nt(a)):r=nt(n)),r===0?0:t!==0&&t!==r&&(t&i)===0&&(i=r&-r,o=t&-t,i>=o||i===32&&o&4194176)?t:r}function it(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function at(e,t){switch(e){case 1:case 2:case 4:case 8:return t+250;case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ot(){var e=et;return et<<=1,!(et&4194176)&&(et=128),e}function st(){var e=tt;return tt<<=1,!(tt&62914560)&&(tt=4194304),e}function ct(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function lt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function ut(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),Pt=RegExp(`^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$`),Ft={},It={};function Lt(e){return Me.call(It,e)?!0:Me.call(Ft,e)?!1:Pt.test(e)?It[e]=!0:(Ft[e]=!0,!1)}function Rt(e,t,n){if(Lt(t))if(n===null)e.removeAttribute(t);else{switch(typeof n){case`undefined`:case`function`:case`symbol`:e.removeAttribute(t);return;case`boolean`:var r=t.toLowerCase().slice(0,5);if(r!==`data-`&&r!==`aria-`){e.removeAttribute(t);return}}e.setAttribute(t,``+n)}}function zt(e,t,n){if(n===null)e.removeAttribute(t);else{switch(typeof n){case`undefined`:case`function`:case`symbol`:case`boolean`:e.removeAttribute(t);return}e.setAttribute(t,``+n)}}function Bt(e,t,n,r){if(r===null)e.removeAttribute(n);else{switch(typeof r){case`undefined`:case`function`:case`symbol`:case`boolean`:e.removeAttribute(n);return}e.setAttributeNS(t,n,``+r)}}function Vt(e){switch(typeof e){case`bigint`:case`boolean`:case`number`:case`string`:case`undefined`:return e;case`object`:return e;default:return``}}function Ht(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()===`input`&&(t===`checkbox`||t===`radio`)}function Ut(e){var t=Ht(e)?`checked`:`value`,n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=``+e[t];if(!e.hasOwnProperty(t)&&n!==void 0&&typeof n.get==`function`&&typeof n.set==`function`){var i=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(e){r=``+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=``+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Wt(e){e._valueTracker||=Ut(e)}function Gt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=``;return e&&(r=Ht(e)?e.checked?`true`:`false`:e.value),e=r,e===n?!1:(t.setValue(e),!0)}function Kt(e){if(e||=typeof document<`u`?document:void 0,e===void 0)return null;try{return e.activeElement||e.body}catch{return e.body}}var qt=/[\n"\\]/g;function Jt(e){return e.replace(qt,function(e){return`\\`+e.charCodeAt(0).toString(16)+` `})}function Yt(e,t,n,r,i,a,o,s){e.name=``,o!=null&&typeof o!=`function`&&typeof o!=`symbol`&&typeof o!=`boolean`?e.type=o:e.removeAttribute(`type`),t==null?o!==`submit`&&o!==`reset`||e.removeAttribute(`value`):o===`number`?(t===0&&e.value===``||e.value!=t)&&(e.value=``+Vt(t)):e.value!==``+Vt(t)&&(e.value=``+Vt(t)),t==null?n==null?r!=null&&e.removeAttribute(`value`):Zt(e,o,Vt(n)):Zt(e,o,Vt(t)),i==null&&a!=null&&(e.defaultChecked=!!a),i!=null&&(e.checked=i&&typeof i!=`function`&&typeof i!=`symbol`),s!=null&&typeof s!=`function`&&typeof s!=`symbol`&&typeof s!=`boolean`?e.name=``+Vt(s):e.removeAttribute(`name`)}function Xt(e,t,n,r,i,a,o,s){if(a!=null&&typeof a!=`function`&&typeof a!=`symbol`&&typeof a!=`boolean`&&(e.type=a),t!=null||n!=null){if(!(a!==`submit`&&a!==`reset`||t!=null))return;n=n==null?``:``+Vt(n),t=t==null?n:``+Vt(t),s||t===e.value||(e.value=t),e.defaultValue=t}r??=i,r=typeof r!=`function`&&typeof r!=`symbol`&&!!r,e.checked=s?e.checked:!!r,e.defaultChecked=!!r,o!=null&&typeof o!=`function`&&typeof o!=`symbol`&&typeof o!=`boolean`&&(e.name=o)}function Zt(e,t,n){t===`number`&&Kt(e.ownerDocument)===e||e.defaultValue===``+n||(e.defaultValue=``+n)}function Qt(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i=tr),ir=` `,ar=!1;function or(e,t){switch(e){case`keyup`:return $n.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function sr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var cr=!1;function lr(e,t){switch(e){case`compositionend`:return sr(t);case`keypress`:return t.which===32?(ar=!0,ir):null;case`textInput`:return e=t.data,e===ir&&ar?null:e;default:return null}}function ur(e,t){if(cr)return e===`compositionend`||!er&&or(e,t)?(e=Cn(),Sn=xn=bn=null,cr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Mr(n)}}function Pr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Pr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Fr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Kt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Kt(e.document)}return t}function Ir(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}function Lr(e,t){var n=Fr(t);t=e.focusedElem;var r=e.selectionRange;if(n!==t&&t&&t.ownerDocument&&Pr(t.ownerDocument.documentElement,t)){if(r!==null&&Ir(t)){if(e=r.start,n=r.end,n===void 0&&(n=e),`selectionStart`in t)t.selectionStart=e,t.selectionEnd=Math.min(n,t.value.length);else if(n=(e=t.ownerDocument||document)&&e.defaultView||window,n.getSelection){n=n.getSelection();var i=t.textContent.length,a=Math.min(r.start,i);r=r.end===void 0?a:Math.min(r.end,i),!n.extend&&a>r&&(i=r,r=a,a=i),i=Nr(t,a);var o=Nr(t,r);i&&o&&(n.rangeCount!==1||n.anchorNode!==i.node||n.anchorOffset!==i.offset||n.focusNode!==o.node||n.focusOffset!==o.offset)&&(e=e.createRange(),e.setStart(i.node,i.offset),n.removeAllRanges(),a>r?(n.addRange(e),n.extend(o.node,o.offset)):(e.setEnd(o.node,o.offset),n.addRange(e)))}}for(e=[],n=t;n=n.parentNode;)n.nodeType===1&&e.push({element:n,left:n.scrollLeft,top:n.scrollTop});for(typeof t.focus==`function`&&t.focus(),t=0;t=document.documentMode,zr=null,Br=null,Vr=null,Hr=!1;function Ur(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Hr||zr==null||zr!==Kt(r)||(r=zr,`selectionStart`in r&&Ir(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Vr&&jr(Vr,r)||(Vr=r,r=sd(Br,`onSelect`),0>=o,i-=o,wi=1<<32-Xe(t)+i|n<f?(p=d,d=null):p=d.sibling;var m=g(i,d,s[f],c);if(m===null){d===null&&(d=p);break}e&&d&&m.alternate===null&&t(i,d),a=o(m,a,f),u===null?l=m:u.sibling=m,u=m,d=p}if(f===s.length)return n(i,d),A&&Ei(i,f),l;if(d===null){for(;fp?(m=f,f=null):m=f.sibling;var y=g(a,f,_.value,l);if(y===null){f===null&&(f=m);break}e&&f&&y.alternate===null&&t(a,f),s=o(y,s,p),d===null?u=y:d.sibling=y,d=y,f=m}if(_.done)return n(a,f),A&&Ei(a,p),u;if(f===null){for(;!_.done;p++,_=c.next())_=h(a,_.value,l),_!==null&&(s=o(_,s,p),d===null?u=_:d.sibling=_,d=_);return A&&Ei(a,p),u}for(f=r(f);!_.done;p++,_=c.next())_=v(f,a,p,_.value,l),_!==null&&(e&&_.alternate!==null&&f.delete(_.key===null?p:_.key),s=o(_,s,p),d===null?u=_:d.sibling=_,d=_);return e&&f.forEach(function(e){return t(a,e)}),A&&Ei(a,p),u}function ee(e,r,o,d){if(typeof o==`object`&&o&&o.type===l&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case s:a:{for(var f=o.key;r!==null;){if(r.key===f){if(f=o.type,f===l){if(r.tag===7){n(e,r.sibling),d=a(r,o.props.children),d.return=e,e=d;break a}}else if(r.elementType===f||typeof f==`object`&&f&&f.$$typeof===x&&$i(f)===r.type){n(e,r.sibling),d=a(r,o.props),Zi(d,o),d.return=e,e=d;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===l?(d=hl(o.props.children,e.mode,d,o.key),d.return=e,e=d):(d=ml(o.type,o.key,o.props,null,e.mode,d),Zi(d,o),d.return=e,e=d)}return u(e);case c:a:{for(f=o.key;r!==null;){if(r.key===f)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),d=a(r,o.children||[]),d.return=e,e=d;break a}else{n(e,r);break}else t(e,r);r=r.sibling}d=vl(o,e.mode,d),d.return=e,e=d}return u(e);case x:return f=o._init,o=f(o._payload),ee(e,r,o,d)}if(ye(o))return y(e,r,o,d);if(ie(o)){if(f=ie(o),typeof f!=`function`)throw Error(i(150));return o=f.call(o),b(e,r,o,d)}if(typeof o.then==`function`)return ee(e,r,Xi(o),d);if(o.$$typeof===_)return ee(e,r,nc(e,o),d);Qi(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),d=a(r,o),d.return=e,e=d):(n(e,r),d=_l(o,e.mode,d),d.return=e,e=d),u(e)):n(e,r)}return function(e,t,n,r){try{Yi=0;var i=ee(e,t,n,r);return Ji=null,i}catch(t){if(t===Bi)throw t;var a=ul(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var ta=ea(!0),na=ea(!1),ra=Ce(null),ia=Ce(0);function aa(e,t){e=Ml,E(ia,e),E(ra,t),Ml=e|t.baseLanes}function oa(){E(ia,Ml),E(ra,ra.current)}function sa(){Ml=ia.current,T(ra),T(ia)}var ca=Ce(null),la=null;function ua(e){var t=e.alternate;E(j,j.current&1),E(ca,e),la===null&&(t===null||ra.current!==null||t.memoizedState!==null)&&(la=e)}function da(e){if(e.tag===22){if(E(j,j.current),E(ca,e),la===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(la=e)}}else fa(e)}function fa(){E(j,j.current),E(ca,ca.current)}function pa(e){T(ca),la===e&&(la=null),T(j)}var j=Ce(0);function ma(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data===`$?`||n.data===`$!`))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ha=typeof AbortController<`u`?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(t,n){e.push(n)}};this.abort=function(){t.aborted=!0,e.forEach(function(e){return e()})}},ga=t.unstable_scheduleCallback,_a=t.unstable_NormalPriority,M={$$typeof:_,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function va(){return{controller:new ha,data:new Map,refCount:0}}function ya(e){e.refCount--,e.refCount===0&&ga(_a,function(){e.controller.abort()})}var ba=null,xa=0,Sa=0,Ca=null;function wa(e,t){if(ba===null){var n=ba=[];xa=0,Sa=Ku(),Ca={status:`pending`,value:void 0,then:function(e){n.push(e)}}}return xa++,t.then(Ta,Ta),t}function Ta(){if(--xa===0&&ba!==null){Ca!==null&&(Ca.status=`fulfilled`);var e=ba;ba=null,Sa=0,Ca=null;for(var t=0;ta?a:8;var o=S.T,s={};S.T=s,Zo(e,!1,t,n);try{var c=i(),l=S.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Xo(e,t,Ea(c,r),Ql(e)):Xo(e,t,r,Ql(e))}catch(n){Xo(e,t,{then:function(){},status:`rejected`,reason:n},Ql())}finally{w.p=a,S.T=o}}function Bo(){}function Vo(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Ho(e).queue;zo(e,a,t,be,n===null?Bo:function(){return Uo(e),n(r)})}function Ho(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:be,baseState:be,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$a,lastRenderedState:be},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$a,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Uo(e){var t=Ho(e).next.queue;Xo(e,t,{},Ql())}function Wo(){return tc(Cf)}function Go(){return L().memoizedState}function Ko(){return L().memoizedState}function qo(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=Ql();e=sc(n);var r=cc(t,e,n);r!==null&&(eu(r,t,n),lc(r,t,n)),t={cache:va()},e.payload=t;return}t=t.return}}function Jo(e,t,n){var r=Ql();n={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Qo(e)?$o(t,n):(n=ui(e,t,n,r),n!==null&&(eu(n,e,r),es(n,t,r)))}function Yo(e,t,n){Xo(e,t,n,Ql())}function Xo(e,t,n,r){var i={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Qo(e))$o(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Ar(s,o))return li(e,t,i,0),G===null&&ci(),!1}catch{}if(n=ui(e,t,i,r),n!==null)return eu(n,e,r),es(n,t,r),!0}return!1}function Zo(e,t,n,r){if(r={lane:2,revertLane:Ku(),action:r,hasEagerState:!1,eagerState:null,next:null},Qo(e)){if(t)throw Error(i(479))}else t=ui(e,n,r,2),t!==null&&eu(t,e,2)}function Qo(e){var t=e.alternate;return e===N||t!==null&&t===N}function $o(e,t){Pa=Na=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function es(e,t,n){if(n&4194176){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ft(e,n)}}var ts={readContext:tc,use:Za,useCallback:I,useContext:I,useEffect:I,useImperativeHandle:I,useLayoutEffect:I,useInsertionEffect:I,useMemo:I,useReducer:I,useRef:I,useState:I,useDebugValue:I,useDeferredValue:I,useTransition:I,useSyncExternalStore:I,useId:I};ts.useCacheRefresh=I,ts.useMemoCache=I,ts.useHostTransitionStatus=I,ts.useFormState=I,ts.useActionState=I,ts.useOptimistic=I;var ns={readContext:tc,use:Za,useCallback:function(e,t){return Ja().memoizedState=[e,t===void 0?null:t],e},useContext:tc,useEffect:Oo,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),Eo(4194308,4,Mo.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Eo(4194308,4,e,t)},useInsertionEffect:function(e,t){Eo(4,2,e,t)},useMemo:function(e,t){var n=Ja();t=t===void 0?null:t;var r=e();if(Fa){Ye(!0);try{e()}finally{Ye(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Ja();if(n!==void 0){var i=n(t);if(Fa){Ye(!0);try{n(t)}finally{Ye(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Jo.bind(null,N,e),[r.memoizedState,e]},useRef:function(e){var t=Ja();return e={current:e},t.memoizedState=e},useState:function(e){e=lo(e);var t=e.queue,n=Yo.bind(null,N,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Po,useDeferredValue:function(e,t){return Lo(Ja(),e,t)},useTransition:function(){var e=lo(!1);return e=zo.bind(null,N,e.queue,!0,!1),Ja().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=N,a=Ja();if(A){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),G===null)throw Error(i(349));q&60||io(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,Oo(oo.bind(null,r,o,e),[e]),r.flags|=2048,wo(9,ao.bind(null,r,o,n,t),{destroy:void 0},null),n},useId:function(){var e=Ja(),t=G.identifierPrefix;if(A){var n=Ti,r=wi;n=(r&~(1<<32-Xe(r)-1)).toString(32)+n,t=`:`+t+`R`+n,n=Ia++,0 title`))),$(o,r,n),o[D]=e,O(o),r=o;break a;case`link`:var s=df(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;c<\/script>`,e=e.removeChild(e.firstChild);break;case`select`:e=typeof r.is==`string`?a.createElement(`select`,{is:r.is}):a.createElement(`select`),r.multiple?e.multiple=!0:r.size&&(e.size=r.size);break;default:e=typeof r.is==`string`?a.createElement(n,{is:r.is}):a.createElement(n)}}e[D]=t,e[_t]=r;a:for(a=t.child;a!==null;){if(a.tag===5||a.tag===6)e.appendChild(a.stateNode);else if(a.tag!==4&&a.tag!==27&&a.child!==null){a.child.return=a,a=a.child;continue}if(a===t)break a;for(;a.sibling===null;){if(a.return===null||a.return===t)break a;a=a.return}a.sibling.return=a.return,a=a.sibling}t.stateNode=e;a:switch($(e,n,r),n){case`button`:case`input`:case`select`:case`textarea`:e=!!r.autoFocus;break a;case`img`:e=!0;break a;default:e=!1}e&&yl(t)}}return U(t),t.flags&=-16777217,null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&yl(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=Ee.current,Li(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ai,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[D]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||pd(e.nodeValue,n)),e||Pi(t)}else e=yd(e).createTextNode(r),e[D]=t,t.stateNode=e}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Li(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[D]=t}else Ri(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else ji!==null&&(nu(ji),ji=null),a=!0;if(!a)return t.flags&256?(pa(t),t):(pa(t),null)}if(pa(t),t.flags&128)return t.lanes=n,t;if(n=r!==null,e=e!==null&&e.memoizedState!==null,n){r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool);var o=null;r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),xl(t,t.updateQueue),U(t),null;case 4:return ke(),e===null&&rd(t.stateNode.containerInfo),U(t),null;case 10:return Ys(t.type),U(t),null;case 19:if(T(j),a=t.memoizedState,a===null)return U(t),null;if(r=(t.flags&128)!=0,o=a.rendering,o===null)if(r)Sl(a,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=ma(e),o!==null){for(t.flags|=128,Sl(a,!1),e=o.updateQueue,t.updateQueue=e,xl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)pl(n,e),n=n.sibling;return E(j,j.current&1|2),t.child}e=e.sibling}a.tail!==null&&Le()>Hl&&(t.flags|=128,r=!0,Sl(a,!1),t.lanes=4194304)}else{if(!r)if(e=ma(o),e!==null){if(t.flags|=128,r=!0,e=e.updateQueue,t.updateQueue=e,xl(t,e),Sl(a,!0),a.tail===null&&a.tailMode===`hidden`&&!o.alternate&&!A)return U(t),null}else 2*Le()-a.renderingStartTime>Hl&&n!==536870912&&(t.flags|=128,r=!0,Sl(a,!1),t.lanes=4194304);a.isBackwards?(o.sibling=t.child,t.child=o):(e=a.last,e===null?t.child=o:e.sibling=o,a.last=o)}return a.tail===null?(U(t),null):(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=Le(),t.sibling=null,e=j.current,E(j,r?e&1|2:e&1),t);case 22:case 23:return pa(t),sa(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&xl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&T(Oa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Ys(M),U(t),null;case 25:return null}throw Error(i(156,t.tag))}function wl(e,t){switch(ki(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Ys(M),ke(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return je(t),null;case 13:if(pa(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Ri()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return T(j),null;case 4:return ke(),null;case 10:return Ys(t.type),null;case 22:case 23:return pa(t),sa(),e!==null&&T(Oa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Ys(M),null;case 25:return null;default:return null}}function Tl(e,t){switch(ki(t),t.tag){case 3:Ys(M),ke();break;case 26:case 27:case 5:je(t);break;case 4:ke();break;case 13:pa(t);break;case 19:T(j);break;case 10:Ys(t.type);break;case 22:case 23:pa(t),sa(),e!==null&&T(Oa);break;case 24:Ys(M)}}var El={getCacheForType:function(e){var t=tc(M),n=t.data.get(e);return n===void 0&&(n=e(),t.data.set(e,n)),n}},Dl=typeof WeakMap==`function`?WeakMap:Map,W=0,G=null,K=null,q=0,J=0,Ol=null,kl=!1,Al=!1,jl=!1,Ml=0,Y=0,Nl=0,Pl=0,Fl=0,Il=0,Ll=0,Rl=null,zl=null,Bl=!1,Vl=0,Hl=1/0,Ul=null,Wl=null,Gl=!1,Kl=null,ql=0,Jl=0,Yl=null,Xl=0,Zl=null;function Ql(){if(W&2&&q!==0)return q&-q;if(S.T!==null){var e=Sa;return e===0?Ku():e}return mt()}function $l(){Il===0&&(Il=!(q&536870912)||A?ot():536870912);var e=ca.current;return e!==null&&(e.flags|=32),Il}function eu(e,t,n){(e===G&&J===2||e.cancelPendingCommit!==null)&&(cu(e,0),au(e,q,Il,!1)),lt(e,n),(!(W&2)||e!==G)&&(e===G&&(!(W&2)&&(Pl|=n),Y===4&&au(e,q,Il,!1)),zu(e))}function tu(e,t,n){if(W&6)throw Error(i(327));var r=!n&&(t&60)==0&&(t&e.expiredLanes)===0||it(e,t),a=r?hu(e,t):pu(e,t,!0),o=r;do{if(a===0){Al&&!r&&au(e,t,0,!1);break}else if(a===6)au(e,t,0,!kl);else{if(n=e.current.alternate,o&&!iu(n)){a=pu(e,t,!1),o=!1;continue}if(a===2){if(o=t,e.errorRecoveryDisabledLanes&o)var s=0;else s=e.pendingLanes&-536870913,s=s===0?s&536870912?536870912:0:s;if(s!==0){t=s;a:{var c=e;a=Rl;var l=c.current.memoizedState.isDehydrated;if(l&&(cu(c,s).flags|=256),s=pu(c,s,!1),s!==2){if(jl&&!l){c.errorRecoveryDisabledLanes|=o,Pl|=o,a=4;break a}o=zl,zl=a,o!==null&&nu(o)}a=s}if(o=!1,a!==2)continue}}if(a===1){cu(e,0),au(e,t,0,!0);break}a:{switch(r=e,a){case 0:case 1:throw Error(i(345));case 4:if((t&4194176)===t){au(r,t,Il,!kl);break a}break;case 2:zl=null;break;case 3:case 5:break;default:throw Error(i(329))}if(r.finishedWork=n,r.finishedLanes=t,(t&62914560)===t&&(o=Vl+300-Le(),10n?32:n,S.T=null,Kl===null)var o=!1;else{n=Yl,Yl=null;var s=Kl,c=ql;if(Kl=null,ql=0,W&6)throw Error(i(331));var l=W;if(W|=4,ol(s.current),Qc(s,s.current,c,n),W=l,Bu(0,!1),qe&&typeof qe.onPostCommitFiberRoot==`function`)try{qe.onPostCommitFiberRoot(Ke,s)}catch{}o=!0}return o}finally{w.p=a,S.T=r,wu(e,t)}}return!1}function Eu(e,t,n){t=gi(n,t),t=gs(e.stateNode,t,2),e=cc(e,t,2),e!==null&&(lt(e,2),zu(e))}function X(e,t,n){if(e.tag===3)Eu(e,e,n);else for(;t!==null;){if(t.tag===3){Eu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(Wl===null||!Wl.has(r))){e=gi(n,e),n=_s(2),r=cc(t,n,2),r!==null&&(vs(n,r,t,e),lt(r,2),zu(r));break}}t=t.return}}function Du(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Dl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(jl=!0,i.add(n),e=Ou.bind(null,e,t,n),t.then(e,e))}function Ou(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Le()-Vl?!(W&2)&&cu(e,0):Fl|=n,Ll===q&&(Ll=0)),zu(e)}function ku(e,t){t===0&&(t=st()),e=di(e,t),e!==null&&(lt(e,t),zu(e))}function Au(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),ku(e,n)}function ju(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),ku(e,n)}function Mu(e,t){return Ne(e,t)}var Nu=null,Pu=null,Fu=!1,Iu=!1,Lu=!1,Ru=0;function zu(e){e!==Pu&&e.next===null&&(Pu===null?Nu=Pu=e:Pu=Pu.next=e),Iu=!0,Fu||(Fu=!0,Gu(Vu))}function Bu(e,t){if(!Lu&&Iu){Lu=!0;do for(var n=!1,r=Nu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Xe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326677?a&201326677|1:a?a|2:0}a!==0&&(n=!0,Wu(r,a))}else a=q,a=rt(r,r===G?a:0),!(a&3)||it(r,a)||(n=!0,Wu(r,a));r=r.next}while(n);Lu=!1}}function Vu(){Iu=Fu=!1;var e=0;Ru!==0&&(wd()&&(e=Ru),Ru=0);for(var t=Le(),n=null,r=Nu;r!==null;){var i=r.next,a=Hu(r,t);a===0?(r.next=null,n===null?Nu=i:n.next=i,i===null&&(Pu=n)):(n=r,(e!==0||a&3)&&(Iu=!0)),r=i}Bu(e,!1)}function Hu(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0`u`?null:document;function Wd(e,t,n){var r=Ud;if(r&&typeof t==`string`&&t){var i=Jt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),Rd.has(i)||(Rd.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),$(t,`link`,e),O(t),r.head.appendChild(t)))}}function Gd(e){Bd.D(e),Wd(`dns-prefetch`,e,null)}function Kd(e,t){Bd.C(e,t),Wd(`preconnect`,e,t)}function qd(e,t,n){Bd.L(e,t,n);var r=Ud;if(r&&e&&t){var i=`link[rel="preload"][as="`+Jt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Jt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Jt(n.imageSizes)+`"]`)):i+=`[href="`+Jt(e)+`"]`;var a=i;switch(t){case`style`:a=$d(e);break;case`script`:a=rf(e)}Ld.has(a)||(e=C({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),Ld.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(ef(a))||t===`script`&&r.querySelector(af(a))||(t=r.createElement(`link`),$(t,`link`,e),O(t),r.head.appendChild(t)))}}function Jd(e,t){Bd.m(e,t);var n=Ud;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Jt(r)+`"][href="`+Jt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=rf(e)}if(!Ld.has(a)&&(e=C({rel:`modulepreload`,href:e},t),Ld.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(af(a)))return}r=n.createElement(`link`),$(r,`link`,e),O(r),n.head.appendChild(r)}}}function Yd(e,t,n){Bd.S(e,t,n);var r=Ud;if(r&&e){var i=Ot(r).hoistableStyles,a=$d(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(ef(a)))s.loading=5;else{e=C({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=Ld.get(a))&&cf(e,n);var c=o=r.createElement(`link`);O(c),$(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,sf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Xd(e,t){Bd.X(e,t);var n=Ud;if(n&&e){var r=Ot(n).hoistableScripts,i=rf(e),a=r.get(i);a||(a=n.querySelector(af(i)),a||(e=C({src:e,async:!0},t),(t=Ld.get(i))&&lf(e,t),a=n.createElement(`script`),O(a),$(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Zd(e,t){Bd.M(e,t);var n=Ud;if(n&&e){var r=Ot(n).hoistableScripts,i=rf(e),a=r.get(i);a||(a=n.querySelector(af(i)),a||(e=C({src:e,async:!0,type:`module`},t),(t=Ld.get(i))&&lf(e,t),a=n.createElement(`script`),O(a),$(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Qd(e,t,n,r){var a=(a=Ee.current)?zd(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=$d(n.href),n=Ot(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=$d(n.href);var o=Ot(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(ef(e)))&&!o._p&&(s.instance=o,s.state.loading=5),Ld.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},Ld.set(e,n),o||nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=rf(n),n=Ot(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function $d(e){return`href="`+Jt(e)+`"`}function ef(e){return`link[rel="stylesheet"][`+e+`]`}function tf(e){return C({},e,{"data-precedence":e.precedence,precedence:null})}function nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),$(t,`link`,n),O(t),e.head.appendChild(t))}function rf(e){return`[src="`+Jt(e)+`"]`}function af(e){return`script[async]`+e}function of(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Jt(n.href)+`"]`);if(r)return t.instance=r,O(r),r;var a=C({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),O(r),$(r,`style`,a),sf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=$d(n.href);var o=e.querySelector(ef(a));if(o)return t.state.loading|=4,t.instance=o,O(o),o;r=tf(n),(a=Ld.get(a))&&cf(r,a),o=(e.ownerDocument||e).createElement(`link`),O(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),$(o,`link`,r),t.state.loading|=4,sf(o,n.precedence,e),t.instance=o;case`script`:return o=rf(n.src),(a=e.querySelector(af(o)))?(t.instance=a,O(a),a):(r=n,(a=Ld.get(o))&&(r=C({},n),lf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),O(a),$(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,sf(r,n.precedence,e));return t.instance}function sf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function pf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function mf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}var hf=null;function gf(){}function _f(e,t,n){if(hf===null)throw Error(i(475));var r=hf;if(t.type===`stylesheet`&&(typeof n.media!=`string`||!1!==matchMedia(n.media).matches)&&!(t.state.loading&4)){if(t.instance===null){var a=$d(n.href),o=e.querySelector(ef(a));if(o){e=o._p,typeof e==`object`&&e&&typeof e.then==`function`&&(r.count++,r=yf.bind(r),e.then(r,r)),t.state.loading|=4,t.instance=o,O(o);return}o=e.ownerDocument||e,n=tf(n),(a=Ld.get(a))&&cf(n,a),o=o.createElement(`link`),O(o);var s=o;s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),$(o,`link`,n),t.instance=o}r.stylesheets===null&&(r.stylesheets=new Map),r.stylesheets.set(t,e),(e=t.state.preload)&&!(t.state.loading&3)&&(r.count++,t=yf.bind(r),e.addEventListener(`load`,t),e.addEventListener(`error`,t))}}function vf(){if(hf===null)throw Error(i(475));var e=hf;return e.stylesheets&&e.count===0&&xf(e,e.stylesheets),0{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=o((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),b=o(((e,t)=>{t.exports=y()}))(),ee=`http://127.0.0.1:4765`;function x(){let[e,t]=(0,_.useState)([]),[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)([]),[o,s]=(0,_.useState)(`ask`),[c,l]=(0,_.useState)(``),[u,d]=(0,_.useState)(``),f=(0,_.useRef)(``);(0,_.useEffect)(()=>{p();let e=setInterval(p,3e3);return()=>clearInterval(e)},[]),(0,_.useEffect)(()=>{n&&m(n),f.current=n},[n]);function p(){fetch(`${ee}/api/sessions`).then(e=>e.ok?e.json():Promise.reject(Error(e.statusText))).then(e=>{let n=e??[];t(n),d(``);let i=f.current,a=n.some(e=>e.session_id===i)?i:n[0]?.session_id;a&&(a!==i&&r(a),m(a))}).catch(e=>d(e.message))}function m(e){fetch(`${ee}/api/sessions/${encodeURIComponent(e)}/events`).then(e=>e.ok?e.json():Promise.reject(Error(e.statusText))).then(e=>{let t=e??[];a(t),d(``),l(e=>e&&t.some(t=>t.id===e)?e:S(t,o)?.id??t[0]?.id??``)}).catch(e=>d(e.message))}function h(e){s(e),l(S(i,e)?.id??``)}let g=(0,_.useMemo)(()=>e.find(e=>e.session_id===n),[e,n]),v=(0,_.useMemo)(()=>ae(i),[i]),y=(0,_.useMemo)(()=>oe(i,o),[i,o]),x=(0,_.useMemo)(()=>y.find(e=>e.id===c)??y[0],[c,y]);return(0,b.jsxs)(`main`,{children:[(0,b.jsxs)(`nav`,{className:`topbar`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`strong`,{children:`Kontext Guard`}),(0,b.jsx)(`span`,{children:`Observe mode ยท local only`})]}),(0,b.jsxs)(`div`,{className:`topActions`,children:[(0,b.jsx)(te,{sessions:e,value:n,onChange:e=>{r(e.target.value),l(``)}}),(0,b.jsx)(`button`,{onClick:p,children:`Refresh`})]})]}),(0,b.jsxs)(`section`,{className:`hero`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`p`,{children:`Current Claude Code session`}),(0,b.jsx)(`h1`,{children:g?he(g.session_id):`No session yet`})]}),(0,b.jsx)(`span`,{children:g?`${g.actions} actions`:`Start Claude Code to capture tool calls`})]}),(0,b.jsx)(ne,{active:o,counts:v,onSelect:h}),u&&(0,b.jsx)(`p`,{className:`error`,children:u}),(0,b.jsxs)(`section`,{className:`workspace`,children:[(0,b.jsx)(re,{bucket:o,events:y,selectedEventID:x?.id,onSelect:l}),(0,b.jsx)(ie,{event:x})]})]})}function te({sessions:e,value:t,onChange:n}){return e.length<=1?null:(0,b.jsx)(`select`,{"aria-label":`Session`,value:t,onChange:n,children:e.map(e=>(0,b.jsx)(`option`,{value:e.session_id,children:he(e.session_id)},e.session_id))})}function ne({active:e,counts:t,onSelect:n}){return(0,b.jsx)(`section`,{className:`funnel`,"aria-label":`Decision funnel`,children:[{id:`all`,label:`All actions`,value:t.all,detail:`Everything Claude Code tried`},{id:`ask`,label:`Needs ask`,value:t.ask,detail:`Review before enforcement`},{id:`deny`,label:`Would deny`,value:t.deny,detail:`Future block queue`}].map(r=>(0,b.jsxs)(`button`,{className:e===r.id?`funnelStep ${r.id} active`:`funnelStep ${r.id}`,onClick:()=>n(r.id),style:{"--w":`${ge(r.value,t.all)}%`},children:[(0,b.jsx)(`span`,{children:r.label}),(0,b.jsx)(`strong`,{children:r.value}),(0,b.jsx)(`small`,{children:r.detail})]},r.id))})}function re({bucket:e,events:t,selectedEventID:n,onSelect:r}){return(0,b.jsxs)(`section`,{className:`actionList`,children:[(0,b.jsx)(`div`,{className:`panelHeader`,children:(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`p`,{children:C(e)}),(0,b.jsxs)(`h2`,{children:[t.length,` actions`]})]})}),(0,b.jsxs)(`div`,{className:`rows`,children:[t.length===0&&(0,b.jsx)(`p`,{className:`empty`,children:`Nothing in this bucket.`}),t.map(e=>(0,b.jsxs)(`button`,{className:e.id===n?`eventRow ${e.decision} active`:`eventRow ${e.decision}`,onClick:()=>r(e.id),children:[(0,b.jsx)(`span`,{className:`toolName`,children:e.tool_name||e.risk_event?.type||`tool`}),(0,b.jsx)(`span`,{className:`eventReason`,children:ce(e)}),(0,b.jsx)(`span`,{className:`riskScore`,children:pe(e)})]},e.id))]})]})}function ie({event:e}){if(!e)return(0,b.jsxs)(`aside`,{className:`inspector emptyInspector`,children:[(0,b.jsx)(`h2`,{children:`Select an action`}),(0,b.jsx)(`p`,{children:`Click a funnel bucket, then click an action.`})]});let t=e.risk_event??{},n=t.signals??[];return(0,b.jsxs)(`aside`,{className:`inspector ${e.decision}`,children:[(0,b.jsxs)(`div`,{className:`decisionLine`,children:[(0,b.jsx)(`span`,{children:se(e.decision)}),(0,b.jsx)(`strong`,{children:pe(e)})]}),(0,b.jsx)(`h2`,{children:e.tool_name||t.type||`Tool call`}),(0,b.jsx)(`p`,{className:`reason`,children:ce(e)}),(0,b.jsxs)(`section`,{children:[(0,b.jsx)(`h3`,{children:`Why this is suspicious`}),(0,b.jsx)(`p`,{children:le(e)})]}),(0,b.jsxs)(`section`,{children:[(0,b.jsx)(`h3`,{children:`What it wanted to do`}),(0,b.jsx)(`code`,{children:fe(e)})]}),(0,b.jsxs)(`dl`,{className:`facts`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`dt`,{children:`Decision source`}),(0,b.jsx)(`dd`,{children:ue(e)})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`dt`,{children:`Reason code`}),(0,b.jsx)(`dd`,{children:e.reason_code||`none`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`dt`,{children:`Operation`}),(0,b.jsx)(`dd`,{children:t.operation||t.operation_class||`unknown`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`dt`,{children:`Environment`}),(0,b.jsx)(`dd`,{children:t.environment||`unknown`})]})]}),(0,b.jsxs)(`section`,{children:[(0,b.jsx)(`h3`,{children:`Signals`}),(0,b.jsxs)(`div`,{className:`signals`,children:[n.length===0&&(0,b.jsx)(`span`,{children:`none`}),n.map(e=>(0,b.jsx)(`span`,{children:e},e))]})]})]})}function ae(e){return{all:e.length,ask:e.filter(e=>e.decision===`ask`).length,deny:e.filter(e=>e.decision===`deny`).length}}function oe(e,t){return t===`ask`?e.filter(e=>e.decision===`ask`):t===`deny`?e.filter(e=>e.decision===`deny`):e}function S(e,t){return oe(e,t)[0]}function C(e){return e===`ask`?`Needs ask`:e===`deny`?`Would deny`:`All actions`}function se(e){return e===`allow`?`would allow`:e===`ask`?`would ask`:e===`deny`?`would deny`:e||`unknown`}function ce(e){return e.reason_code===`async_telemetry`?`Recorded after execution`:e.reason_code===`model_risk_threshold`?`Markov sequence risk crossed threshold`:e.reason||e.reason_code||`No explanation`}function le(e){let t=e.risk_event??{};return e.reason_code===`model_risk_threshold`?`The Markov-chain model scored this normalized action at ${pe(e)}, at or above the local threshold ${me(e)}. In plain terms: actions like this are statistically closer to known unsafe sequences than normal coding flow.`:e.reason_code===`async_telemetry`?`This was not a live gate. It was recorded after execution so the session history can improve future model parameters.`:de(e)?`A deterministic guard fired before the model decision mattered. The Markov score is ${pe(e)} against threshold ${me(e)}, so this specific flag is rule-driven, not a sequence anomaly.`:t.type===`normal_tool_call`?`The model score is ${pe(e)} against threshold ${me(e)}. This currently looks like routine coding-agent behavior.`:`The action was normalized as ${t.type||`unknown`} with model score ${pe(e)} against threshold ${me(e)}.`}function ue(e){return e.reason_code===`model_risk_threshold`?`Markov-chain model`:e.reason_code===`async_telemetry`?`Trace history`:de(e)?`Deterministic guard`:`Normal scoring`}function de(e){return!!e.risk_event?.guard_id||[`production_mutation`,`credential_access_without_intent`,`destructive_operation_without_intent`,`direct_infra_api_with_credential`,`unknown_high_risk_command`].includes(e.reason_code)}function fe(e){let t=e.risk_event??{};return t.command_summary||t.request_summary||t.path_class||`No command summary stored.`}function pe(e){return e.risk_score==null?`n/a`:e.risk_score.toFixed(3)}function me(e){return e.threshold==null?`n/a`:e.threshold.toFixed(3)}function he(e){return e?e.slice(0,8):``}function ge(e,t){return t?Math.max(10,Math.round(e/t*100)):6}(0,v.createRoot)(document.getElementById(`root`)).render((0,b.jsx)(x,{})); \ No newline at end of file diff --git a/internal/guard/web/assets/dist/index.html b/internal/guard/web/assets/dist/index.html index 6f037466..3fbae900 100644 --- a/internal/guard/web/assets/dist/index.html +++ b/internal/guard/web/assets/dist/index.html @@ -4,8 +4,8 @@ Kontext Guard - - + +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index df04d1e1..6473b6b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,398 +10,2229 @@ importers: web/guard-dashboard: dependencies: + '@fontsource/geist-mono': + specifier: ^5.2.7 + version: 5.2.7 + '@fontsource/geist-sans': + specifier: ^5.2.5 + version: 5.2.5 + '@radix-ui/react-collapsible': + specifier: ^1.1.12 + version: 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: 2.1.16 + version: 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-hover-card': + specifier: 1.1.15 + version: 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.10 + version: 1.2.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: 1.2.8 + version: 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.539.0 + version: 0.539.0(react@18.3.1) react: - specifier: 19.0.0 - version: 19.0.0 + specifier: 18.3.1 + version: 18.3.1 react-dom: - specifier: 19.0.0 - version: 19.0.0(react@19.0.0) + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.1 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.19) + devDependencies: + '@types/node': + specifier: ^22.10.5 + version: 22.19.19 + '@types/react': + specifier: ^18.3.18 + version: 18.3.28 + '@types/react-dom': + specifier: ^18.3.5 + version: 18.3.7(@types/react@18.3.28) + '@vitejs/plugin-react-swc': + specifier: ^4.0.0 + version: 4.3.1(vite@7.3.3(@types/node@22.19.19)(jiti@1.21.7)(lightningcss@1.32.0)) + autoprefixer: + specifier: ^10.4.20 + version: 10.5.0(postcss@8.5.12) + postcss: + specifier: ^8.5.1 + version: 8.5.12 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.19 + typescript: + specifier: ^5.7.3 + version: 5.9.3 vite: - specifier: 8.0.10 - version: 8.0.10 + specifier: ^7.1.2 + version: 7.3.3(@types/node@22.19.19)(jiti@1.21.7)(lightningcss@1.32.0) packages: - '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@oxc-project/types@0.127.0': - resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@rolldown/binding-android-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.17': - resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.17': - resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': - resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] os: [linux] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} cpu: [x64] - os: [linux] + os: [netbsd] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': - resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': - resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': - resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} - engines: {node: ^20.19.0 || >=22.12.0} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.17': - resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@fontsource/geist-mono@5.2.7': + resolution: {integrity: sha512-xVPVFISJg/K0VVd+aQN0Y7X/sw9hUcJPyDWFJ5GpyU3bHELhoRsJkPSRSHXW32mOi0xZCUQDOaPj1sqIFJ1FGg==} + + '@fontsource/geist-sans@5.2.5': + resolution: {integrity: sha512-anllOHyJbElRs9fV15TeDRqAeb1IKm4bSknPl6ZMoyPTx1BBy7logudcUwpNjmQLkzn4Q0JGQLRCUKJYoyST6A==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: - picomatch: ^3 || ^4 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - picomatch: + '@types/react': + optional: true + '@types/react-dom': optional: true - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.15': + resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + cpu: [loong64] os: [linux] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + cpu: [loong64] os: [linux] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + cpu: [ppc64] + os: [linux] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + cpu: [x64] + os: [win32] + + '@swc/core-darwin-arm64@1.15.33': + resolution: {integrity: sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.33': + resolution: {integrity: sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.33': + resolution: {integrity: sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.33': + resolution: {integrity: sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.15.33': + resolution: {integrity: sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-ppc64-gnu@1.15.33': + resolution: {integrity: sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + + '@swc/core-linux-s390x-gnu@1.15.33': + resolution: {integrity: sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.33': + resolution: {integrity: sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.15.33': + resolution: {integrity: sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.15.33': + resolution: {integrity: sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.33': + resolution: {integrity: sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.33': + resolution: {integrity: sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.33': + resolution: {integrity: sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.28': + resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==} + + '@vitejs/plugin-react-swc@4.3.1': + resolution: {integrity: sha512-PaeokKjAGraNN+s5SIApgsktnJprIyt3zgEIu7awnEdfn29QiB2crTcCzyi2XGpX9rUnTc0cKU07Wm0N0g7H2w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4 || ^5 || ^6 || ^7 || ^8 + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + autoprefixer@10.5.0: + resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + electron-to-chromium@1.5.357: + resolution: {integrity: sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lucide-react@0.539.0: + resolution: {integrity: sha512-VVISr+VF2krO91FeuCrm1rSOLACQUYVy7NQkzrOty52Y8TlTPcXcMdQFj9bYzBgXbWCiywlwSZ3Z8u6a+6bMlg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.44: + resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.12: + resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} + engines: {node: ^10 || ^12 || >=14} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@2.6.1: + resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@7.3.3: + resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.11': {} + + '@fontsource/geist-mono@5.2.7': {} + + '@fontsource/geist-sans@5.2.5': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.28)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-context@1.1.2(@types/react@18.3.28)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-direction@1.1.1(@types/react@18.3.28)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.28)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-id@1.1.1(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/rect': 1.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-slot@1.2.3(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.28)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.28)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.28)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-use-size@1.1.1(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + + '@radix-ui/rect@1.1.1': {} + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/rollup-android-arm-eabi@4.60.4': + optional: true + + '@rollup/rollup-android-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.4': + optional: true - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} + '@rollup/rollup-darwin-x64@4.60.4': + optional: true - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + '@rollup/rollup-freebsd-arm64@4.60.4': + optional: true - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + '@rollup/rollup-freebsd-x64@4.60.4': + optional: true - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + optional: true - postcss@8.5.12: - resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} - engines: {node: ^10 || ^12 || >=14} + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + optional: true - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} - peerDependencies: - react: ^19.0.0 + '@rollup/rollup-linux-arm64-gnu@4.60.4': + optional: true - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} + '@rollup/rollup-linux-arm64-musl@4.60.4': + optional: true - rolldown@1.0.0-rc.17: - resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true + '@rollup/rollup-linux-loong64-gnu@4.60.4': + optional: true - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + '@rollup/rollup-linux-loong64-musl@4.60.4': + optional: true - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + optional: true - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} + '@rollup/rollup-linux-ppc64-musl@4.60.4': + optional: true - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + optional: true - vite@8.0.10: - resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.0 - esbuild: ^0.27.0 || ^0.28.0 - jiti: '>=1.21.0' - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - '@vitejs/devtools': - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true + '@rollup/rollup-linux-riscv64-musl@4.60.4': + optional: true -snapshots: + '@rollup/rollup-linux-s390x-gnu@4.60.4': + optional: true - '@emnapi/core@1.10.0': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 + '@rollup/rollup-linux-x64-gnu@4.60.4': optional: true - '@emnapi/runtime@1.10.0': - dependencies: - tslib: 2.8.1 + '@rollup/rollup-linux-x64-musl@4.60.4': optional: true - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 + '@rollup/rollup-openbsd-x64@4.60.4': optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.1 + '@rollup/rollup-openharmony-arm64@4.60.4': optional: true - '@oxc-project/types@0.127.0': {} + '@rollup/rollup-win32-arm64-msvc@4.60.4': + optional: true - '@rolldown/binding-android-arm64@1.0.0-rc.17': + '@rollup/rollup-win32-ia32-msvc@4.60.4': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + '@rollup/rollup-win32-x64-gnu@4.60.4': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.17': + '@rollup/rollup-win32-x64-msvc@4.60.4': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + '@swc/core-darwin-arm64@1.15.33': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + '@swc/core-darwin-x64@1.15.33': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + '@swc/core-linux-arm-gnueabihf@1.15.33': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + '@swc/core-linux-arm64-gnu@1.15.33': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + '@swc/core-linux-arm64-musl@1.15.33': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + '@swc/core-linux-ppc64-gnu@1.15.33': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + '@swc/core-linux-s390x-gnu@1.15.33': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + '@swc/core-linux-x64-gnu@1.15.33': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + '@swc/core-linux-x64-musl@1.15.33': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@swc/core-win32-arm64-msvc@1.15.33': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + '@swc/core-win32-ia32-msvc@1.15.33': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + '@swc/core-win32-x64-msvc@1.15.33': optional: true - '@rolldown/pluginutils@1.0.0-rc.17': {} + '@swc/core@1.15.33': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.26 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.33 + '@swc/core-darwin-x64': 1.15.33 + '@swc/core-linux-arm-gnueabihf': 1.15.33 + '@swc/core-linux-arm64-gnu': 1.15.33 + '@swc/core-linux-arm64-musl': 1.15.33 + '@swc/core-linux-ppc64-gnu': 1.15.33 + '@swc/core-linux-s390x-gnu': 1.15.33 + '@swc/core-linux-x64-gnu': 1.15.33 + '@swc/core-linux-x64-musl': 1.15.33 + '@swc/core-win32-arm64-msvc': 1.15.33 + '@swc/core-win32-ia32-msvc': 1.15.33 + '@swc/core-win32-x64-msvc': 1.15.33 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.26': + dependencies: + '@swc/counter': 0.1.3 + + '@types/estree@1.0.8': {} + + '@types/node@22.19.19': + dependencies: + undici-types: 6.21.0 + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.28)': + dependencies: + '@types/react': 18.3.28 + + '@types/react@18.3.28': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@vitejs/plugin-react-swc@4.3.1(vite@7.3.3(@types/node@22.19.19)(jiti@1.21.7)(lightningcss@1.32.0))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + '@swc/core': 1.15.33 + vite: 7.3.3(@types/node@22.19.19)(jiti@1.21.7)(lightningcss@1.32.0) + transitivePeerDependencies: + - '@swc/helpers' + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 - '@tybys/wasm-util@0.10.1': + arg@5.0.2: {} + + aria-hidden@1.2.6: dependencies: tslib: 2.8.1 + + autoprefixer@10.5.0(postcss@8.5.12): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001792 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.12 + postcss-value-parser: 4.2.0 + + baseline-browser-mapping@2.10.29: {} + + binary-extensions@2.3.0: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.29 + caniuse-lite: 1.0.30001792 + electron-to-chromium: 1.5.357 + node-releases: 2.0.44 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001792: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clsx@2.1.1: {} + + commander@4.1.1: {} + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + detect-libc@2.1.2: optional: true - detect-libc@2.1.2: {} + detect-node-es@1.1.0: {} + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + electron-to-chromium@1.5.357: {} + + es-errors@1.3.0: {} + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escalade@3.2.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fraction.js@5.3.4: {} + fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + + get-nonce@1.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.3 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + lightningcss-android-arm64@1.32.0: optional: true @@ -450,65 +2281,293 @@ snapshots: lightningcss-linux-x64-musl: 1.32.0 lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + optional: true + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lucide-react@0.539.0(react@18.3.1): + dependencies: + react: 18.3.1 + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 nanoid@3.3.11: {} + node-releases@2.0.44: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + path-parse@1.0.7: {} + picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.4: {} + pify@2.3.0: {} + + pirates@4.0.7: {} + + postcss-import@15.1.0(postcss@8.5.12): + dependencies: + postcss: 8.5.12 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.12 + + postcss-js@4.1.0(postcss@8.5.12): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.12 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.12): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.12 + + postcss-nested@6.2.0(postcss@8.5.12): + dependencies: + postcss: 8.5.12 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + postcss@8.5.12: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - react-dom@19.0.0(react@19.0.0): + queue-microtask@1.2.3: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-remove-scroll-bar@2.3.8(@types/react@18.3.28)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.28)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.28 + + react-remove-scroll@2.7.2(@types/react@18.3.28)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.28)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.28)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.28)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.28)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + + react-style-singleton@2.2.3(@types/react@18.3.28)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.28 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + resolve@1.22.12: dependencies: - react: 19.0.0 - scheduler: 0.25.0 + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 - react@19.0.0: {} + reusify@1.1.0: {} - rolldown@1.0.0-rc.17: + rollup@4.60.4: dependencies: - '@oxc-project/types': 0.127.0 - '@rolldown/pluginutils': 1.0.0-rc.17 + '@types/estree': 1.0.8 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.17 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 - '@rolldown/binding-darwin-x64': 1.0.0-rc.17 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 - scheduler@0.25.0: {} + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 source-map-js@1.2.1: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.16 + ts-interface-checker: 0.1.13 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@2.6.1: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.19): + dependencies: + tailwindcss: 3.4.19 + + tailwindcss@3.4.19: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.12 + postcss-import: 15.1.0(postcss@8.5.12) + postcss-js: 4.1.0(postcss@8.5.12) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.12) + postcss-nested: 6.2.0(postcss@8.5.12) + postcss-selector-parser: 6.1.2 + resolve: 1.22.12 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tslib@2.8.1: - optional: true + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-interface-checker@0.1.13: {} + + tslib@2.8.1: {} + + typescript@5.9.3: {} - vite@8.0.10: + undici-types@6.21.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - lightningcss: 1.32.0 + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-callback-ref@1.3.3(@types/react@18.3.28)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.28 + + use-sidecar@1.1.3(@types/react@18.3.28)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.28 + + util-deprecate@1.0.2: {} + + vite@7.3.3(@types/node@22.19.19)(jiti@1.21.7)(lightningcss@1.32.0): + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 postcss: 8.5.12 - rolldown: 1.0.0-rc.17 + rollup: 4.60.4 tinyglobby: 0.2.16 optionalDependencies: + '@types/node': 22.19.19 fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.32.0 diff --git a/web/guard-dashboard/components.json b/web/guard-dashboard/components.json new file mode 100644 index 00000000..9bd6ddd8 --- /dev/null +++ b/web/guard-dashboard/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/global.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} diff --git a/web/guard-dashboard/index.html b/web/guard-dashboard/index.html index 58075990..0957c354 100644 --- a/web/guard-dashboard/index.html +++ b/web/guard-dashboard/index.html @@ -7,6 +7,6 @@
- + diff --git a/web/guard-dashboard/package.json b/web/guard-dashboard/package.json index 40f748c9..a51a451c 100644 --- a/web/guard-dashboard/package.json +++ b/web/guard-dashboard/package.json @@ -6,11 +6,35 @@ "scripts": { "dev": "vite --host 127.0.0.1 --port 5173", "build": "vite build", - "preview": "vite preview --host 127.0.0.1 --port 5173" + "preview": "vite preview --host 127.0.0.1 --port 5173", + "typecheck": "tsc --noEmit" }, "dependencies": { - "react": "19.0.0", - "react-dom": "19.0.0", - "vite": "8.0.10" + "@fontsource/geist-mono": "^5.2.7", + "@fontsource/geist-sans": "^5.2.5", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "2.1.16", + "@radix-ui/react-hover-card": "1.1.15", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-tooltip": "1.2.8", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.539.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/node": "^22.10.5", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react-swc": "^4.0.0", + "autoprefixer": "^10.4.20", + "postcss": "^8.5.1", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.3", + "vite": "^7.1.2" } } diff --git a/web/guard-dashboard/postcss.config.js b/web/guard-dashboard/postcss.config.js new file mode 100644 index 00000000..2aa7205d --- /dev/null +++ b/web/guard-dashboard/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/web/guard-dashboard/src/App.tsx b/web/guard-dashboard/src/App.tsx new file mode 100644 index 00000000..c1281356 --- /dev/null +++ b/web/guard-dashboard/src/App.tsx @@ -0,0 +1,216 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import { AlertCircle } from "lucide-react"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Sheet, SheetContent } from "@/components/ui/sheet"; +import { TooltipProvider } from "@/components/ui/tooltip"; +import { ActionList } from "@/dashboard/ActionList"; +import { activatePolicy, errorMessage, fetchEvents, fetchPolicy, fetchSessions } from "@/dashboard/api"; +import { API, USE_SAMPLE_DATA } from "@/dashboard/config"; +import { bucket, sameSessions } from "@/dashboard/helpers"; +import { Inspector } from "@/dashboard/Inspector"; +import { PolicyPanel } from "@/dashboard/PolicyPanel"; +import { + SAMPLE_EVENTS, + SAMPLE_POLICY, + SAMPLE_SESSION_ID, + SAMPLE_SESSIONS, +} from "@/dashboard/sample-data"; +import { SessionHeader } from "@/dashboard/SessionHeader"; +import { Sidebar } from "@/dashboard/Sidebar"; +import { StatRow } from "@/dashboard/StatRow"; +import { Block } from "@/dashboard/shared"; +import type { Event, PolicyProfile, PolicyProfileID, Session, Tab } from "@/dashboard/types"; + +export default function App() { + const [sessions, setSessions] = useState([]); + const [selectedSessionID, setSelectedSessionID] = useState(""); + const [events, setEvents] = useState([]); + const [tab, setTab] = useState("all"); + const [openId, setOpenId] = useState(null); + const [error, setError] = useState(""); + const [policy, setPolicy] = useState(null); + const [policyPending, setPolicyPending] = useState(null); + const [policyError, setPolicyError] = useState(""); + const selectedRef = useRef(""); + const useSampleDashboard = USE_SAMPLE_DATA && API === ""; + + useEffect(() => { + refresh(); + loadPolicy(); + const t = setInterval(refresh, 3000); + return () => clearInterval(t); + }, []); + + useEffect(() => { + if (selectedSessionID) loadEvents(selectedSessionID); + selectedRef.current = selectedSessionID; + }, [selectedSessionID]); + + function selectSession(id: string) { + selectedRef.current = id; + setSelectedSessionID(id); + } + + function applySessions(next: Session[]): Session[] { + setSessions((prev) => (sameSessions(prev, next) ? prev : next)); + setError(""); + return next; + } + + function applyEvents(next: Event[]) { + setEvents(next); + setError(""); + } + + function applySamplePolicy(profile?: PolicyProfileID) { + if (!profile) { + setPolicy(SAMPLE_POLICY); + setPolicyError(""); + return; + } + setPolicy({ ...SAMPLE_POLICY, profile, loaded_at: new Date().toISOString() }); + setPolicyError(""); + } + + function refresh() { + if (useSampleDashboard) { + applySessions(SAMPLE_SESSIONS); + selectSession(SAMPLE_SESSION_ID); + applyEvents(SAMPLE_EVENTS); + return; + } + + fetchSessions() + .then((next) => { + const safe = applySessions(next); + const current = selectedRef.current; + const toLoad = safe.some((s) => s.session_id === current) ? current : safe[0]?.session_id; + if (toLoad) { + if (toLoad !== current) { + selectSession(toLoad); + } else { + loadEvents(toLoad); + } + } else { + selectedRef.current = ""; + setSelectedSessionID(""); + setEvents([]); + setOpenId(null); + } + }) + .catch((e: unknown) => setError(errorMessage(e))); + } + + function loadEvents(id: string) { + if (useSampleDashboard && id === SAMPLE_SESSION_ID) { + applyEvents(SAMPLE_EVENTS); + return; + } + fetchEvents(id) + .then((next) => { + if (selectedRef.current !== id) return; + applyEvents(next); + }) + .catch((e: unknown) => setError(errorMessage(e))); + } + + function loadPolicy() { + if (useSampleDashboard) { + applySamplePolicy(); + return; + } + + fetchPolicy() + .then((p) => { + setPolicy(p); + setPolicyError(""); + }) + .catch((e: unknown) => { + setPolicyError(`Couldn't load policy profile. ${errorMessage(e)}`); + }); + } + + function activate(id: PolicyProfileID) { + if (id === policy?.profile || policyPending) return; + if (useSampleDashboard && selectedSessionID === SAMPLE_SESSION_ID) { + applySamplePolicy(id); + return; + } + setPolicyPending(id); + setPolicyError(""); + activatePolicy(id) + .then(setPolicy) + .catch((e: unknown) => setPolicyError(`Couldn't update policy profile. ${errorMessage(e)}`)) + .finally(() => setPolicyPending(null)); + } + + const { counts, groups } = useMemo(() => bucket(events), [events]); + const opened = useMemo( + () => (openId ? events.find((e) => e.id === openId) ?? null : null), + [openId, events], + ); + const selectedSession = useMemo( + () => sessions.find((s) => s.session_id === selectedSessionID), + [sessions, selectedSessionID], + ); + const loading = sessions.length === 0 && !error; + + return ( + +
+ + +
+ + + +
+ + + + + + + {error && ( +
+ + {error} +
+ )} + + + 0} + /> + +
+
+
+ + !open && setOpenId(null)}> + + {opened && } + + +
+
+ ); +} diff --git a/web/guard-dashboard/src/components/ui/collapsible.tsx b/web/guard-dashboard/src/components/ui/collapsible.tsx new file mode 100644 index 00000000..9fa48946 --- /dev/null +++ b/web/guard-dashboard/src/components/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/web/guard-dashboard/src/components/ui/dropdown-menu.tsx b/web/guard-dashboard/src/components/ui/dropdown-menu.tsx new file mode 100644 index 00000000..fc790a80 --- /dev/null +++ b/web/guard-dashboard/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,198 @@ +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/web/guard-dashboard/src/components/ui/hover-card.tsx b/web/guard-dashboard/src/components/ui/hover-card.tsx new file mode 100644 index 00000000..95643d9c --- /dev/null +++ b/web/guard-dashboard/src/components/ui/hover-card.tsx @@ -0,0 +1,27 @@ +import * as React from "react" +import * as HoverCardPrimitive from "@radix-ui/react-hover-card" + +import { cn } from "@/lib/utils" + +const HoverCard = HoverCardPrimitive.Root + +const HoverCardTrigger = HoverCardPrimitive.Trigger + +const HoverCardContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + +)) +HoverCardContent.displayName = HoverCardPrimitive.Content.displayName + +export { HoverCard, HoverCardTrigger, HoverCardContent } diff --git a/web/guard-dashboard/src/components/ui/scroll-area.tsx b/web/guard-dashboard/src/components/ui/scroll-area.tsx new file mode 100644 index 00000000..0b4a48d8 --- /dev/null +++ b/web/guard-dashboard/src/components/ui/scroll-area.tsx @@ -0,0 +1,48 @@ +"use client" + +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/web/guard-dashboard/src/components/ui/sheet.tsx b/web/guard-dashboard/src/components/ui/sheet.tsx new file mode 100644 index 00000000..d64a6fa7 --- /dev/null +++ b/web/guard-dashboard/src/components/ui/sheet.tsx @@ -0,0 +1,138 @@ +import * as React from "react" +import * as SheetPrimitive from "@radix-ui/react-dialog" +import { cva, type VariantProps } from "class-variance-authority" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Sheet = SheetPrimitive.Root + +const SheetTrigger = SheetPrimitive.Trigger + +const SheetClose = SheetPrimitive.Close + +const SheetPortal = SheetPrimitive.Portal + +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName + +const sheetVariants = cva( + "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", + { + variants: { + side: { + top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", + bottom: + "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", + left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", + right: + "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", + }, + }, + defaultVariants: { + side: "right", + }, + } +) + +interface SheetContentProps + extends React.ComponentPropsWithoutRef, + VariantProps {} + +const SheetContent = React.forwardRef< + React.ElementRef, + SheetContentProps +>(({ side = "right", className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +SheetContent.displayName = SheetPrimitive.Content.displayName + +const SheetHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +SheetHeader.displayName = "SheetHeader" + +const SheetFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +SheetFooter.displayName = "SheetFooter" + +const SheetTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetTitle.displayName = SheetPrimitive.Title.displayName + +const SheetDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetDescription.displayName = SheetPrimitive.Description.displayName + +export { + Sheet, + SheetPortal, + SheetOverlay, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} diff --git a/web/guard-dashboard/src/components/ui/skeleton.tsx b/web/guard-dashboard/src/components/ui/skeleton.tsx new file mode 100644 index 00000000..01b8b6d4 --- /dev/null +++ b/web/guard-dashboard/src/components/ui/skeleton.tsx @@ -0,0 +1,15 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
+ ) +} + +export { Skeleton } diff --git a/web/guard-dashboard/src/components/ui/tooltip.tsx b/web/guard-dashboard/src/components/ui/tooltip.tsx new file mode 100644 index 00000000..e1ae87b9 --- /dev/null +++ b/web/guard-dashboard/src/components/ui/tooltip.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/web/guard-dashboard/src/dashboard/ActionList.tsx b/web/guard-dashboard/src/dashboard/ActionList.tsx new file mode 100644 index 00000000..32c53c73 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/ActionList.tsx @@ -0,0 +1,180 @@ +import { useState } from "react"; +import { ChevronDown, Shield } from "lucide-react"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/components/ui/collapsible"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { cn } from "@/lib/utils"; +import { decisionTone, prettyTool, scoreLabel, summaryOf } from "./helpers"; +import { DecisionDot } from "./shared"; +import type { Decision, Event, EventGroups, Tab } from "./types"; + +const TITLES: Record = { + all: "All actions", + deny: "Denied ยท this session", + ask: "Needs ask ยท this session", + allow: "Allowed ยท this session", +}; + +const GROUP_LABELS: Record = { + deny: "Would deny", + ask: "Needs ask", + allow: "Allow", +}; + +const VISIBLE_KINDS: Record = { + all: ["deny", "ask", "allow"], + deny: ["deny"], + ask: ["ask"], + allow: ["allow"], +}; + +export function ActionList({ + tab, + groups, + openId, + onOpen, + hasAny, +}: { + tab: Tab; + groups: EventGroups; + openId: string | null; + onOpen: (id: string) => void; + hasAny: boolean; +}) { + return ( +
+
+
+

+ {TITLES[tab]} +

+ {tab !== "all" && ( + + Click Total to clear + + )} +
+
+ + {!hasAny ? ( + + ) : ( +
+ {VISIBLE_KINDS[tab].map((kind) => { + const items = groups[kind]; + if (items.length === 0) return null; + return ( + + {items.map((e) => ( + onOpen(e.id)} /> + ))} + + ); + })} +
+ )} +
+ ); +} + +function Empty() { + return ( +
+ +

No actions captured yet.

+

+ Start Claude Code to populate this view. +

+
+ ); +} + +function Group({ + label, + kind, + count, + children, +}: { + label: string; + kind: Decision; + count: number; + children: React.ReactNode; +}) { + const [open, setOpen] = useState(true); + return ( + + + + + {label} + {count} + + +
{children}
+
+
+ ); +} + +function Row({ + event, + active, + onClick, +}: { + event: Event; + active: boolean; + onClick: () => void; +}) { + const target = summaryOf(event); + const signal = event.risk_event?.signals?.[0]?.replace(/_/g, " "); + const tone = decisionTone[event.decision]; + return ( + + ); +} diff --git a/web/guard-dashboard/src/dashboard/Inspector.tsx b/web/guard-dashboard/src/dashboard/Inspector.tsx new file mode 100644 index 00000000..f053e748 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/Inspector.tsx @@ -0,0 +1,167 @@ +import { ScrollArea } from "@/components/ui/scroll-area"; +import { SheetHeader, SheetTitle } from "@/components/ui/sheet"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { cn } from "@/lib/utils"; +import { + actionSummary, + decisionLabel, + decisionSource, + decisionTone, + humanize, + humanReason, + prettyTool, + summaryOf, + technicalExplanation, +} from "./helpers"; +import { Dd, DecisionDot, Dt } from "./shared"; +import type { Event } from "./types"; + +export function Inspector({ event }: { event: Event }) { + const r = event.risk_event ?? {}; + const score = event.risk_score ?? null; + const threshold = event.threshold ?? null; + const ratio = + score != null && threshold != null && threshold > 0 ? Math.min(1.2, score / threshold) : null; + const tone = decisionTone[event.decision]; + + return ( +
+ + + + {decisionLabel(event.decision)} + + + {prettyTool(event.tool_name)} + + + + +
+
+
+              {summaryOf(event)}
+            
+

+ {humanReason(event)} +

+
+ + {score != null && threshold != null && ( + + )} + +
+
Operation
+
{r.operation || r.operation_class || "unknown"}
+
Source
+
{decisionSource(event)}
+
Environment
+
+ {r.environment || "unknown"} +
+
+ +
+

+ {technicalExplanation(event)} +

+
+ +
+
+              {actionSummary(event)}
+            
+
+ + {(r.signals ?? []).length > 0 && ( +
+
+ {(r.signals ?? []).map((s) => ( + + + {humanize(s)} + + ))} +
+
+ )} + + {event.reason_code && ( +
+ reason ยท {event.reason_code} +
+ )} +
+
+
+ ); +} + +function RiskMeter({ + tone, + score, + threshold, + ratio, +}: { + tone: { text: string; bg: string }; + score: number; + threshold: number; + ratio: number | null; +}) { + return ( + + +
+
+
+ + Risk score + + + {score.toFixed(3)} + +
+
+ + Threshold + +
+ {threshold.toFixed(3)} +
+
+
+ {ratio != null && ( +
+
+
+ )} +
+ + Risk score relative to threshold + + ); +} + +function Section({ title, children }: { title: string; children: React.ReactNode }) { + return ( +
+

+ {title} +

+ {children} +
+ ); +} + diff --git a/web/guard-dashboard/src/dashboard/PolicyPanel.tsx b/web/guard-dashboard/src/dashboard/PolicyPanel.tsx new file mode 100644 index 00000000..d818d424 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/PolicyPanel.tsx @@ -0,0 +1,236 @@ +import { AlertCircle, Info, Loader2 } from "lucide-react"; +import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card"; +import { Skeleton } from "@/components/ui/skeleton"; +import { cn } from "@/lib/utils"; +import { POLICY_PROFILES, profileLabel } from "./policy"; +import { Kv } from "./shared"; +import type { PolicyProfile, PolicyProfileDef, PolicyProfileID } from "./types"; + +const STEP_DOTS: Record = { relaxed: 1, balanced: 2, strict: 3 }; + +export function PolicyPanel({ + profile, + pending, + error, + onActivate, + onRetry, +}: { + profile: PolicyProfile | null; + pending: PolicyProfileID | null; + error: string; + onActivate: (id: PolicyProfileID) => void; + onRetry: () => void; +}) { + const active = profile?.profile ?? "balanced"; + const isLoading = !profile && !error; + + return ( +
+
+
+

Policy profile

+ {profile && ( + + {profileLabel(profile.profile)} profile + + )} +
+ {profile && } +
+ +
+ {isLoading + ? POLICY_PROFILES.map((p) => ) + : POLICY_PROFILES.map((p) => ( + onActivate(p.id)} + /> + ))} +
+ + {error && ( +
+ + + {error} + + +
+ )} +
+ ); +} + +function PolicyVersionChip({ profile }: { profile: PolicyProfile }) { + return ( + + + + + +
+ + +
+
+
+ ); +} + +function PolicyCardSkeleton() { + return ( +
+ + + + +
+ ); +} + +function PolicyCard({ + profile, + active, + pending, + disabled, + onActivate, +}: { + profile: PolicyProfileDef; + active: boolean; + pending: boolean; + disabled: boolean; + onActivate: () => void; +}) { + const steps = STEP_DOTS[profile.id]; + + return ( + + ); +} + +function StepDots({ filled, active }: { filled: number; active: boolean }) { + return ( + + ); +} diff --git a/web/guard-dashboard/src/dashboard/SessionHeader.tsx b/web/guard-dashboard/src/dashboard/SessionHeader.tsx new file mode 100644 index 00000000..664c7521 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/SessionHeader.tsx @@ -0,0 +1,40 @@ +import { Skeleton } from "@/components/ui/skeleton"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import type { Session } from "./types"; + +export function SessionHeader({ + session, + loading, +}: { + session?: Session; + loading: boolean; +}) { + return ( +
+
+ {loading ? ( + + ) : ( + <> + + + + + + {session?.session_id ?? "-"} + + + )} +
+ + + + + Observe mode + + + Recording decisions but not enforcing them. + +
+ ); +} diff --git a/web/guard-dashboard/src/dashboard/Sidebar.tsx b/web/guard-dashboard/src/dashboard/Sidebar.tsx new file mode 100644 index 00000000..1cfde5fc --- /dev/null +++ b/web/guard-dashboard/src/dashboard/Sidebar.tsx @@ -0,0 +1,72 @@ +import { ScrollArea } from "@/components/ui/scroll-area"; +import { cn } from "@/lib/utils"; +import type { Counts, Session } from "./types"; + +export function Sidebar({ + sessions, + counts, + selectedID, + onSelect, +}: { + sessions: Session[]; + counts: Counts; + selectedID: string; + onSelect: (id: string) => void; +}) { + return ( + + ); +} + +function NavItem({ label, count, active }: { label: string; count: number; active?: boolean }) { + return ( + + ); +} diff --git a/web/guard-dashboard/src/dashboard/StatRow.tsx b/web/guard-dashboard/src/dashboard/StatRow.tsx new file mode 100644 index 00000000..cb280fef --- /dev/null +++ b/web/guard-dashboard/src/dashboard/StatRow.tsx @@ -0,0 +1,161 @@ +import { Skeleton } from "@/components/ui/skeleton"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { cn } from "@/lib/utils"; +import { decisionTone } from "./helpers"; +import type { Counts, Decision, Tab } from "./types"; + +const TILES: { id: Tab; label: string }[] = [ + { id: "all", label: "Total" }, + { id: "deny", label: "Would deny" }, + { id: "ask", label: "Needs ask" }, + { id: "allow", label: "Allowed" }, +]; + +const RATIO_KINDS: { kind: Decision; label: string }[] = [ + { kind: "deny", label: "Would deny" }, + { kind: "ask", label: "Ask" }, + { kind: "allow", label: "Allow" }, +]; + +export function StatRow({ + counts, + active, + onSelect, + loading, +}: { + counts: Counts; + active: Tab; + onSelect: (t: Tab) => void; + loading: boolean; +}) { + return ( +
+
+ {TILES.map((t) => ( + onSelect(t.id)} + /> + ))} +
+ +
+ ); +} + +function StatTile({ + id, + label, + count, + total, + active, + loading, + onClick, +}: { + id: Tab; + label: string; + count: number; + total: number; + active: boolean; + loading: boolean; + onClick: () => void; +}) { + const pct = id === "all" ? null : Math.round((count / Math.max(1, total)) * 100); + const numberColor = + count === 0 + ? "text-muted-foreground/40" + : id === "all" + ? "" + : decisionTone[id].text; + return ( + + ); +} + +function RatioStrip({ counts }: { counts: Counts }) { + const segments = RATIO_KINDS.map((k) => ({ + count: counts[k.kind], + color: decisionTone[k.kind].bg, + label: k.label, + })).filter((s) => s.count > 0); + + return ( +
+
+
+ {segments.length === 0 ? ( +
+ ) : ( + segments.map((s) => ( + + +
+ + + {s.count} {s.label.toLowerCase()} + + + )) + )} +
+
+ {segments.length === 0 ? ( + No activity yet + ) : ( + segments.map((s) => ( + + + {s.label} + {s.count} + + )) + )} +
+
+
+ ); +} diff --git a/web/guard-dashboard/src/dashboard/api.ts b/web/guard-dashboard/src/dashboard/api.ts new file mode 100644 index 00000000..ab9e33ad --- /dev/null +++ b/web/guard-dashboard/src/dashboard/api.ts @@ -0,0 +1,190 @@ +import { API } from "./config"; +import type { Decision, Event, PolicyProfile, PolicyProfileID, RiskEvent, Session } from "./types"; + +export function errorMessage(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +async function responseJSON(r: Response): Promise { + return r.json(); +} + +async function ok(r: Response): Promise { + if (r.ok) return responseJSON(r); + const fallback = `${r.status} ${r.statusText}`.trim(); + const contentType = r.headers.get("content-type") ?? ""; + if (!contentType.includes("application/json")) { + throw new Error(fallback); + } + + let body: unknown; + try { + body = await responseJSON(r); + } catch (error) { + throw new Error(`API error response was not valid JSON: ${fallback}; ${errorMessage(error)}`); + } + + const reason = isObject(body) && typeof body.error === "string" ? body.error : fallback; + throw new Error(reason); +} + +function isObject(value: unknown): value is Record { + return value !== null && typeof value === "object" && !Array.isArray(value); +} + +function optionalString(value: unknown): string | undefined { + return typeof value === "string" ? value : undefined; +} + +function optionalBoolean(value: unknown): boolean | undefined { + return typeof value === "boolean" ? value : undefined; +} + +function optionalNumber(value: unknown): number | undefined { + return typeof value === "number" && Number.isFinite(value) ? value : undefined; +} + +function nullableNumber(value: unknown): number | null | undefined { + if (value === null) return null; + return optionalNumber(value); +} + +function stringList(value: unknown): string[] | undefined { + if (!Array.isArray(value)) return undefined; + const strings = value.filter((item): item is string => typeof item === "string"); + return strings.length > 0 ? strings : undefined; +} + +function decision(value: unknown): Decision | undefined { + switch (value) { + case "allow": + case "ask": + case "deny": + return value; + default: + return undefined; + } +} + +function policyProfileID(value: unknown): PolicyProfileID | undefined { + switch (value) { + case "relaxed": + case "balanced": + case "strict": + return value; + default: + return undefined; + } +} + +function parseRiskEvent(value: unknown): RiskEvent | undefined { + if (!isObject(value)) return undefined; + return { + type: optionalString(value.type), + provider: optionalString(value.provider), + provider_category: optionalString(value.provider_category), + operation: optionalString(value.operation), + operation_class: optionalString(value.operation_class), + resource_class: optionalString(value.resource_class), + environment: optionalString(value.environment), + credential_observed: optionalBoolean(value.credential_observed), + credential_source: optionalString(value.credential_source), + direct_api_call: optionalBoolean(value.direct_api_call), + explicit_user_intent: optionalBoolean(value.explicit_user_intent), + command_summary: optionalString(value.command_summary), + request_summary: optionalString(value.request_summary), + path_class: optionalString(value.path_class), + decision: decision(value.decision), + reason_code: optionalString(value.reason_code), + model_version: optionalString(value.model_version), + signals: stringList(value.signals), + guard_id: optionalString(value.guard_id), + risk_score: nullableNumber(value.risk_score), + confidence: optionalNumber(value.confidence), + }; +} + +function parseSession(value: unknown): Session | undefined { + if ( + !isObject(value) || + typeof value.session_id !== "string" || + typeof value.actions !== "number" + ) { + return undefined; + } + return { + session_id: value.session_id, + actions: value.actions, + }; +} + +function parseEvent(value: unknown): Event | undefined { + if (!isObject(value) || typeof value.id !== "string") return undefined; + const parsedDecision = decision(value.decision); + if (!parsedDecision) return undefined; + return { + id: value.id, + session_id: optionalString(value.session_id), + tool_name: optionalString(value.tool_name), + decision: parsedDecision, + reason: optionalString(value.reason), + reason_code: optionalString(value.reason_code), + risk_score: nullableNumber(value.risk_score), + threshold: nullableNumber(value.threshold), + risk_event: parseRiskEvent(value.risk_event), + }; +} + +function parsePolicyProfile(value: unknown): PolicyProfile { + if (!isObject(value)) throw new Error("invalid policy profile response"); + const profile = policyProfileID(value.profile); + if (!profile) throw new Error("invalid policy profile response"); + return { + profile, + recommended_profile: policyProfileID(value.recommended_profile), + version: optionalString(value.version), + rule_pack: optionalString(value.rule_pack), + rule_pack_version: optionalString(value.rule_pack_version), + config_digest: optionalString(value.config_digest), + activation_id: optionalString(value.activation_id), + source: optionalString(value.source), + status: optionalString(value.status), + loaded_at: optionalString(value.loaded_at), + }; +} + +function parseList(value: unknown, parse: (item: unknown) => T | undefined): T[] { + if (value == null) return []; + if (!Array.isArray(value)) throw new Error("invalid API response"); + const items: T[] = []; + for (const item of value) { + const parsed = parse(item); + if (!parsed) throw new Error("invalid API response"); + items.push(parsed); + } + return items; +} + +export async function fetchSessions(): Promise { + return parseList(await fetch(`${API}/api/sessions`).then(ok), parseSession); +} + +export async function fetchEvents(sessionID: string): Promise { + return parseList( + await fetch(`${API}/api/sessions/${encodeURIComponent(sessionID)}/events`).then(ok), + parseEvent, + ); +} + +export async function fetchPolicy(): Promise { + return parsePolicyProfile(await fetch(`${API}/api/policy/profile`).then(ok)); +} + +export async function activatePolicy(profile: PolicyProfileID): Promise { + const response = await fetch(`${API}/api/policy/profile`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ profile }), + }).then(ok); + return parsePolicyProfile(response); +} diff --git a/web/guard-dashboard/src/dashboard/config.ts b/web/guard-dashboard/src/dashboard/config.ts new file mode 100644 index 00000000..7336b363 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/config.ts @@ -0,0 +1,4 @@ +const env = import.meta.env; + +export const API = env.VITE_KONTEXT_API ?? ""; +export const USE_SAMPLE_DATA = env.DEV && env.VITE_KONTEXT_SAMPLE_DATA === "1"; diff --git a/web/guard-dashboard/src/dashboard/helpers.ts b/web/guard-dashboard/src/dashboard/helpers.ts new file mode 100644 index 00000000..00be2204 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/helpers.ts @@ -0,0 +1,139 @@ +import type { Decision, Event, EventBuckets, EventGroups, Session } from "./types"; + +const DETERMINISTIC_REASON_CODES = new Set([ + "production_mutation", + "credential_access_without_intent", + "destructive_operation_without_intent", + "direct_infra_api_with_credential", + "unknown_high_risk_command", +]); + +export function bucket(events: Event[]): EventBuckets { + const groups: EventGroups = { deny: [], ask: [], allow: [] }; + for (const e of events) groups[e.decision]?.push(e); + return { + counts: { + all: events.length, + deny: groups.deny.length, + ask: groups.ask.length, + allow: groups.allow.length, + }, + groups, + }; +} + +export function summaryOf(e: Event, fallback = "โ€”"): string { + const r = e.risk_event ?? {}; + return r.command_summary || r.request_summary || r.path_class || r.type || fallback; +} + +export function humanize(s: string): string { + return s.replace(/_/g, " "); +} + +export function sameSessions(a: Session[], b: Session[]): boolean { + if (a === b) return true; + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) { + if (a[i].session_id !== b[i].session_id || a[i].actions !== b[i].actions) return false; + } + return true; +} + +export function prettyTool(t?: string): string { + if (!t) return "tool"; + return humanize(t).replace(/\b\w/g, (c) => c.toUpperCase()); +} + +export function isDeterministicGuard(e: Event): boolean { + return Boolean(e.risk_event?.guard_id) || DETERMINISTIC_REASON_CODES.has(e.reason_code ?? ""); +} + +export function humanReason(e: Event): string { + if (e.reason_code === "async_telemetry") return "Recorded after execution."; + if (e.reason_code === "model_risk_threshold") { + return "Markov sequence risk crossed the local threshold."; + } + return e.reason || e.reason_code || "No explanation captured."; +} + +export function technicalExplanation(e: Event): string { + const r = e.risk_event ?? {}; + const score = scoreLabel(e); + const threshold = thresholdLabel(e); + if (e.reason_code === "model_risk_threshold") { + return `The Markov-chain model scored this normalized action at ${score}, at or above threshold ${threshold}.`; + } + if (e.reason_code === "async_telemetry") { + return "Not a live gate. Recorded after execution to improve future model parameters."; + } + if (isDeterministicGuard(e)) { + return `A deterministic rule fired before the model decision mattered. Markov score is ${score} against threshold ${threshold}.`; + } + if (r.type === "normal_tool_call") { + return `Model score is ${score} against threshold ${threshold}. Routine coding-agent behavior.`; + } + return `Normalized as ${r.type || "unknown"} with model score ${score} against threshold ${threshold}.`; +} + +export function decisionSource(e: Event): string { + if (e.reason_code === "model_risk_threshold") return "Markov-chain model"; + if (e.reason_code === "async_telemetry") return "Trace history"; + if (isDeterministicGuard(e)) return "Deterministic rule"; + return "Normal scoring"; +} + +export function actionSummary(e: Event): string { + return summaryOf(e, "No command summary stored."); +} + +export function scoreLabel(e: Event): string { + return e.risk_score == null ? "n/a" : e.risk_score.toFixed(3); +} + +export function thresholdLabel(e: Event): string { + return e.threshold == null ? "n/a" : e.threshold.toFixed(3); +} + +export function relativeTime(value?: string): string { + if (!value) return "just now"; + const ts = Date.parse(value); + if (Number.isNaN(ts)) return "just now"; + const s = Math.max(0, Math.floor((Date.now() - ts) / 1000)); + if (s < 60) return "just now"; + const m = Math.floor(s / 60); + if (m < 60) return `${m}m ago`; + const h = Math.floor(m / 60); + if (h < 24) return `${h}h ago`; + return `${Math.floor(h / 24)}d ago`; +} + +export function decisionLabel(decision: Event["decision"]): string { + if (decision === "deny") return "Would deny"; + if (decision === "ask") return "Would ask"; + return "Allow"; +} + +export const decisionTone: Record< + Decision, + { text: string; bg: string; ring: string; border: string } +> = { + deny: { + text: "text-destructive", + bg: "bg-destructive", + ring: "ring-destructive/10", + border: "border-destructive/20", + }, + ask: { + text: "text-amber-700", + bg: "bg-amber-500", + ring: "ring-amber-500/10", + border: "border-amber-300/40", + }, + allow: { + text: "text-brand", + bg: "bg-brand", + ring: "ring-brand/10", + border: "border-border", + }, +}; diff --git a/web/guard-dashboard/src/dashboard/policy.ts b/web/guard-dashboard/src/dashboard/policy.ts new file mode 100644 index 00000000..29ab6f3f --- /dev/null +++ b/web/guard-dashboard/src/dashboard/policy.ts @@ -0,0 +1,27 @@ +import type { PolicyProfileDef, PolicyProfileID } from "./types"; + +export const POLICY_PROFILES: PolicyProfileDef[] = [ + { + id: "relaxed", + label: "Relaxed", + lede: "Fewer blocks, more compatibility.", + hint: "Use when iterating on agent behavior.", + }, + { + id: "balanced", + label: "Balanced", + recommended: true, + lede: "Good protection with fewer false positives.", + hint: "Best default for local development.", + }, + { + id: "strict", + label: "Strict", + lede: "Maximum protection, more false positives.", + hint: "Use when you can accept breakage.", + }, +]; + +export function profileLabel(id: PolicyProfileID): string { + return POLICY_PROFILES.find((p) => p.id === id)?.label ?? "Balanced"; +} diff --git a/web/guard-dashboard/src/dashboard/sample-data.ts b/web/guard-dashboard/src/dashboard/sample-data.ts new file mode 100644 index 00000000..0a90be23 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/sample-data.ts @@ -0,0 +1,148 @@ +import type { Event, PolicyProfile, Session } from "./types"; + +export const SAMPLE_SESSION_ID = "session-local-guard-preview"; + +export const SAMPLE_POLICY: PolicyProfile = { + profile: "balanced", + recommended_profile: "balanced", + version: "guard-policy-v1", + rule_pack: "guard-default", + loaded_at: new Date(Date.now() - 2 * 60 * 1000).toISOString(), +}; + +export const SAMPLE_SESSIONS: Session[] = [ + { session_id: SAMPLE_SESSION_ID, actions: 9 }, +]; + +export const SAMPLE_EVENTS: Event[] = [ + { + id: "evt-prod-mutation-001", + session_id: SAMPLE_SESSION_ID, + tool_name: "Bash", + decision: "deny", + reason_code: "production_mutation", + reason: "Production mutation blocked by deterministic policy.", + risk_score: 0.982, + threshold: 0.8, + risk_event: { + type: "provider_operation", + operation: "delete", + operation_class: "write", + environment: "production", + command_summary: "kubectl delete deployment checkout-api -n production", + signals: ["production", "mutation", "persistent_resource"], + guard_id: "guard.production_mutation.v1", + }, + }, + { + id: "evt-credential-read-001", + session_id: SAMPLE_SESSION_ID, + tool_name: "Read", + decision: "deny", + reason_code: "credential_access_without_intent", + reason: "Credential access blocked by deterministic policy.", + risk_score: 0.944, + threshold: 0.8, + risk_event: { + type: "credential_access", + operation: "read", + environment: "local", + path_class: "~/.aws/credentials", + command_summary: "Read local AWS credentials without explicit user intent", + signals: ["credential_path", "credential_observed"], + guard_id: "guard.credential_access.v1", + }, + }, + { + id: "evt-admin-reindex-001", + session_id: SAMPLE_SESSION_ID, + tool_name: "Bash", + decision: "ask", + reason_code: "model_risk_threshold", + reason: "Markov sequence risk crossed the local threshold.", + risk_score: 0.836, + threshold: 0.8, + risk_event: { + type: "normal_tool_call", + operation: "network_write", + operation_class: "write", + environment: "staging", + command_summary: "curl -X POST $PAYMENTS_ADMIN_URL/reindex", + signals: ["network_call", "admin_endpoint"], + }, + }, + { + id: "evt-private-key-decrypt-001", + session_id: SAMPLE_SESSION_ID, + tool_name: "Bash", + decision: "ask", + reason_code: "unknown_high_risk_command", + reason: "Unknown high-risk command needs review.", + risk_score: 0.791, + threshold: 0.8, + risk_event: { + type: "unknown", + operation: "shell", + operation_class: "unknown", + environment: "local", + command_summary: "openssl rsautl -decrypt -inkey private.pem -in payload.bin", + signals: ["unknown_high_risk", "credential_observed"], + guard_id: "guard.unknown_high_risk.v1", + }, + }, + { + id: "evt-source-read-001", + session_id: SAMPLE_SESSION_ID, + tool_name: "Read", + decision: "allow", + reason_code: "async_telemetry", + reason: "Recorded after execution.", + risk_score: 0.071, + threshold: 0.8, + risk_event: { + type: "normal_tool_call", + operation: "read", + environment: "local", + path_class: "source_code", + command_summary: "Read internal/guard/app/server/server.go", + signals: ["source_code_read"], + }, + }, + { + id: "evt-dashboard-edit-001", + session_id: SAMPLE_SESSION_ID, + tool_name: "Edit", + decision: "allow", + reason_code: "async_telemetry", + reason: "Recorded after execution.", + risk_score: 0.118, + threshold: 0.8, + risk_event: { + type: "normal_tool_call", + operation: "write", + operation_class: "write", + environment: "local", + path_class: "source_code", + command_summary: "Edit web/guard-dashboard/src/App.tsx", + signals: ["workspace_file", "source_code_write"], + }, + }, + { + id: "evt-dashboard-build-001", + session_id: SAMPLE_SESSION_ID, + tool_name: "Bash", + decision: "allow", + reason_code: "async_telemetry", + reason: "Recorded after execution.", + risk_score: 0.203, + threshold: 0.8, + risk_event: { + type: "normal_tool_call", + operation: "test", + operation_class: "read", + environment: "local", + command_summary: "pnpm --dir web/guard-dashboard build", + signals: ["local_build", "known_safe_command"], + }, + }, +]; diff --git a/web/guard-dashboard/src/dashboard/shared.tsx b/web/guard-dashboard/src/dashboard/shared.tsx new file mode 100644 index 00000000..32c107d7 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/shared.tsx @@ -0,0 +1,57 @@ +import { cn } from "@/lib/utils"; +import { decisionTone } from "./helpers"; +import type { Decision } from "./types"; + +export function DecisionDot({ kind, className }: { kind: Decision; className?: string }) { + const tone = decisionTone[kind]; + return ( + + ); +} + +export function Block({ + label, + description, + children, +}: { + label?: string; + description?: string; + children: React.ReactNode; +}) { + return ( +
+ {(label || description) && ( +
+ {label &&

{label}

} + {description && ( +

{description}

+ )} +
+ )} + {children} +
+ ); +} + +export function Kv({ k, v }: { k: string; v: string }) { + return ( +
+ {k} + {v} +
+ ); +} + +export function Dt({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} + +export function Dd({ children, className }: { children: React.ReactNode; className?: string }) { + return
{children}
; +} diff --git a/web/guard-dashboard/src/dashboard/types.ts b/web/guard-dashboard/src/dashboard/types.ts new file mode 100644 index 00000000..b6974a66 --- /dev/null +++ b/web/guard-dashboard/src/dashboard/types.ts @@ -0,0 +1,81 @@ +export type Decision = "allow" | "ask" | "deny"; + +export type Tab = "all" | "deny" | "ask" | "allow"; + +export type PolicyProfileID = "relaxed" | "balanced" | "strict"; + +export type RiskEvent = { + type?: string; + provider?: string; + provider_category?: string; + operation?: string; + operation_class?: string; + resource_class?: string; + environment?: string; + credential_observed?: boolean; + credential_source?: string; + direct_api_call?: boolean; + explicit_user_intent?: boolean; + command_summary?: string; + request_summary?: string; + path_class?: string; + decision?: Decision; + reason_code?: string; + model_version?: string; + signals?: string[]; + guard_id?: string; + risk_score?: number | null; + confidence?: number; +}; + +export type Event = { + id: string; + session_id?: string; + tool_name?: string; + decision: Decision; + reason?: string; + reason_code?: string; + risk_score?: number | null; + threshold?: number | null; + risk_event?: RiskEvent; +}; + +export type Session = { + session_id: string; + actions: number; +}; + +export type PolicyProfile = { + profile: PolicyProfileID; + recommended_profile?: PolicyProfileID; + version?: string; + rule_pack?: string; + rule_pack_version?: string; + config_digest?: string; + activation_id?: string; + source?: string; + status?: string; + loaded_at?: string; +}; + +export type PolicyProfileDef = { + id: PolicyProfileID; + label: string; + lede: string; + hint: string; + recommended?: boolean; +}; + +export type Counts = { + all: number; + ask: number; + deny: number; + allow: number; +}; + +export type EventGroups = Record; + +export type EventBuckets = { + counts: Counts; + groups: EventGroups; +}; diff --git a/web/guard-dashboard/src/global.css b/web/guard-dashboard/src/global.css new file mode 100644 index 00000000..084f4a1f --- /dev/null +++ b/web/guard-dashboard/src/global.css @@ -0,0 +1,79 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --radius: 0.625rem; + --radius-sm: 0.375rem; + --radius-lg: 0.875rem; + + --background: 40 11% 97%; + --foreground: 24 10% 10%; + + --card: 0 0% 100%; + --card-foreground: 24 10% 10%; + + --popover: 0 0% 100%; + --popover-foreground: 24 10% 10%; + + --primary: 24 10% 10%; + --primary-foreground: 40 11% 97%; + + --secondary: 40 8% 93%; + --secondary-foreground: 24 10% 10%; + + --muted: 40 8% 93%; + --muted-foreground: 30 6% 44%; + + --accent: 40 8% 91%; + --accent-foreground: 24 10% 10%; + + --destructive: 0 72% 51%; + --destructive-foreground: 0 0% 100%; + + --border: 36 8% 89%; + --input: 36 8% 89%; + --ring: 161 48% 12%; + + --brand: 161 48% 12%; + --brand-foreground: 0 0% 100%; + --brand-light: 161 33% 94%; + --brand-dark: 161 53% 9%; + } +} + +@layer components { + .shadow-card { + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.035), + 0 1px 2px rgba(0, 0, 0, 0.04), + 0 4px 10px rgba(0, 0, 0, 0.04), + 0 12px 28px rgba(0, 0, 0, 0.03); + } + .shadow-card-hover { + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.055), + 0 1px 3px rgba(0, 0, 0, 0.06), + 0 8px 20px rgba(0, 0, 0, 0.07), + 0 24px 48px rgba(0, 0, 0, 0.05); + } + .bg-brand-gradient { + background: + radial-gradient(120% 90% at 0% 0%, rgba(255, 255, 255, 0.10), transparent 55%), + linear-gradient(135deg, hsl(161 48% 12%) 0%, hsl(161 40% 18%) 50%, hsl(161 35% 22%) 100%); + } +} + +@layer base { + * { + @apply border-border; + } + html, body, #root { + @apply h-full; + } + body { + @apply bg-background text-foreground font-sans antialiased; + font-feature-settings: "cv11", "ss01", "ss03"; + } +} diff --git a/web/guard-dashboard/src/lib/utils.ts b/web/guard-dashboard/src/lib/utils.ts new file mode 100644 index 00000000..a5ef1935 --- /dev/null +++ b/web/guard-dashboard/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/web/guard-dashboard/src/main.jsx b/web/guard-dashboard/src/main.jsx deleted file mode 100644 index 263c8ea1..00000000 --- a/web/guard-dashboard/src/main.jsx +++ /dev/null @@ -1,331 +0,0 @@ -import React, { useEffect, useMemo, useRef, useState } from "react"; -import { createRoot } from "react-dom/client"; -import "./styles.css"; - -const API = import.meta.env.VITE_KONTEXT_API ?? "http://127.0.0.1:4765"; - -function App() { - const [sessions, setSessions] = useState([]); - const [selectedSessionID, setSelectedSessionID] = useState(""); - const [events, setEvents] = useState([]); - const [bucket, setBucket] = useState("ask"); - const [selectedEventID, setSelectedEventID] = useState(""); - const [error, setError] = useState(""); - const selectedSessionRef = useRef(""); - - useEffect(() => { - refresh(); - const timer = setInterval(refresh, 3000); - return () => clearInterval(timer); - }, []); - - useEffect(() => { - if (selectedSessionID) loadEvents(selectedSessionID); - selectedSessionRef.current = selectedSessionID; - }, [selectedSessionID]); - - function refresh() { - fetch(`${API}/api/sessions`) - .then((res) => res.ok ? res.json() : Promise.reject(new Error(res.statusText))) - .then((nextSessions) => { - const safeSessions = nextSessions ?? []; - setSessions(safeSessions); - setError(""); - const currentSessionID = selectedSessionRef.current; - const sessionToLoad = safeSessions.some((session) => session.session_id === currentSessionID) - ? currentSessionID - : safeSessions[0]?.session_id; - if (sessionToLoad) { - if (sessionToLoad !== currentSessionID) setSelectedSessionID(sessionToLoad); - loadEvents(sessionToLoad); - } - }) - .catch((err) => setError(err.message)); - } - - function loadEvents(sessionID) { - fetch(`${API}/api/sessions/${encodeURIComponent(sessionID)}/events`) - .then((res) => res.ok ? res.json() : Promise.reject(new Error(res.statusText))) - .then((nextEvents) => { - const safeEvents = nextEvents ?? []; - setEvents(safeEvents); - setError(""); - setSelectedEventID((current) => { - if (current && safeEvents.some((event) => event.id === current)) return current; - return firstEventForBucket(safeEvents, bucket)?.id ?? safeEvents[0]?.id ?? ""; - }); - }) - .catch((err) => setError(err.message)); - } - - function selectBucket(nextBucket) { - setBucket(nextBucket); - setSelectedEventID(firstEventForBucket(events, nextBucket)?.id ?? ""); - } - - const selectedSession = useMemo( - () => sessions.find((session) => session.session_id === selectedSessionID), - [sessions, selectedSessionID], - ); - const counts = useMemo(() => bucketCounts(events), [events]); - const visibleEvents = useMemo(() => eventsForBucket(events, bucket), [events, bucket]); - const selectedEvent = useMemo( - () => visibleEvents.find((event) => event.id === selectedEventID) ?? visibleEvents[0], - [selectedEventID, visibleEvents], - ); - - return ( -
- - -
-
-

Current Claude Code session

-

{selectedSession ? shortSession(selectedSession.session_id) : "No session yet"}

-
- {selectedSession ? `${selectedSession.actions} actions` : "Start Claude Code to capture tool calls"} -
- - - - {error &&

{error}

} - -
- - -
-
- ); -} - -function SessionPicker({ sessions, value, onChange }) { - if (sessions.length <= 1) return null; - return ( - - ); -} - -function DecisionFunnel({ active, counts, onSelect }) { - const items = [ - { id: "all", label: "All actions", value: counts.all, detail: "Everything Claude Code tried" }, - { id: "ask", label: "Needs ask", value: counts.ask, detail: "Review before enforcement" }, - { id: "deny", label: "Would deny", value: counts.deny, detail: "Future block queue" }, - ]; - - return ( -
- {items.map((item) => ( - - ))} -
- ); -} - -function ActionList({ bucket, events, selectedEventID, onSelect }) { - return ( -
-
-
-

{bucketTitle(bucket)}

-

{events.length} actions

-
-
-
- {events.length === 0 &&

Nothing in this bucket.

} - {events.map((event) => ( - - ))} -
-
- ); -} - -function EventInspector({ event }) { - if (!event) { - return ( - - ); - } - - const riskEvent = event.risk_event ?? {}; - const signals = riskEvent.signals ?? []; - - return ( - - ); -} - -function bucketCounts(events) { - return { - all: events.length, - ask: events.filter((event) => event.decision === "ask").length, - deny: events.filter((event) => event.decision === "deny").length, - }; -} - -function eventsForBucket(events, bucket) { - if (bucket === "ask") return events.filter((event) => event.decision === "ask"); - if (bucket === "deny") return events.filter((event) => event.decision === "deny"); - return events; -} - -function firstEventForBucket(events, bucket) { - return eventsForBucket(events, bucket)[0]; -} - -function bucketTitle(bucket) { - if (bucket === "ask") return "Needs ask"; - if (bucket === "deny") return "Would deny"; - return "All actions"; -} - -function decisionLabel(decision) { - if (decision === "allow") return "would allow"; - if (decision === "ask") return "would ask"; - if (decision === "deny") return "would deny"; - return decision || "unknown"; -} - -function humanReason(event) { - if (event.reason_code === "async_telemetry") return "Recorded after execution"; - if (event.reason_code === "model_risk_threshold") return "Markov sequence risk crossed threshold"; - return event.reason || event.reason_code || "No explanation"; -} - -function technicalExplanation(event) { - const riskEvent = event.risk_event ?? {}; - if (event.reason_code === "model_risk_threshold") { - return `The Markov-chain model scored this normalized action at ${scoreLabel(event)}, at or above the local threshold ${thresholdLabel(event)}. In plain terms: actions like this are statistically closer to known unsafe sequences than normal coding flow.`; - } - if (event.reason_code === "async_telemetry") { - return "This was not a live gate. It was recorded after execution so the session history can improve future model parameters."; - } - if (isDeterministicGuard(event)) { - return `A deterministic guard fired before the model decision mattered. The Markov score is ${scoreLabel(event)} against threshold ${thresholdLabel(event)}, so this specific flag is rule-driven, not a sequence anomaly.`; - } - if (riskEvent.type === "normal_tool_call") { - return `The model score is ${scoreLabel(event)} against threshold ${thresholdLabel(event)}. This currently looks like routine coding-agent behavior.`; - } - return `The action was normalized as ${riskEvent.type || "unknown"} with model score ${scoreLabel(event)} against threshold ${thresholdLabel(event)}.`; -} - -function decisionSource(event) { - if (event.reason_code === "model_risk_threshold") return "Markov-chain model"; - if (event.reason_code === "async_telemetry") return "Trace history"; - if (isDeterministicGuard(event)) return "Deterministic guard"; - return "Normal scoring"; -} - -function isDeterministicGuard(event) { - return Boolean(event.risk_event?.guard_id) || [ - "production_mutation", - "credential_access_without_intent", - "destructive_operation_without_intent", - "direct_infra_api_with_credential", - "unknown_high_risk_command", - ].includes(event.reason_code); -} - -function actionSummary(event) { - const riskEvent = event.risk_event ?? {}; - return riskEvent.command_summary || riskEvent.request_summary || riskEvent.path_class || "No command summary stored."; -} - -function scoreLabel(event) { - return event.risk_score == null ? "n/a" : event.risk_score.toFixed(3); -} - -function thresholdLabel(event) { - return event.threshold == null ? "n/a" : event.threshold.toFixed(3); -} - -function shortSession(sessionID) { - return sessionID ? sessionID.slice(0, 8) : ""; -} - -function barWidth(value, total) { - if (!total) return 6; - return Math.max(10, Math.round((value / total) * 100)); -} - -createRoot(document.getElementById("root")).render(); diff --git a/web/guard-dashboard/src/main.tsx b/web/guard-dashboard/src/main.tsx new file mode 100644 index 00000000..f776688c --- /dev/null +++ b/web/guard-dashboard/src/main.tsx @@ -0,0 +1,19 @@ +import "@fontsource/geist-sans/400.css"; +import "@fontsource/geist-sans/500.css"; +import "@fontsource/geist-sans/600.css"; +import "@fontsource/geist-mono/400.css"; +import "@fontsource/geist-mono/500.css"; + +import React from "react"; +import { createRoot } from "react-dom/client"; +import "./global.css"; +import App from "./App"; + +const root = document.getElementById("root"); +if (root) { + createRoot(root).render( + + + , + ); +} diff --git a/web/guard-dashboard/src/styles.css b/web/guard-dashboard/src/styles.css deleted file mode 100644 index 721d69ef..00000000 --- a/web/guard-dashboard/src/styles.css +++ /dev/null @@ -1,380 +0,0 @@ -:root { - color: #171b18; - background: #f4f1ea; - font-family: Geist, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; - font-synthesis: none; -} - -* { - box-sizing: border-box; -} - -body { - margin: 0; - min-width: 320px; - background: #f4f1ea; -} - -button, -select { - font: inherit; -} - -button { - border: 0; - cursor: pointer; -} - -main { - width: min(1180px, calc(100vw - 32px)); - margin: 0 auto; - padding: 22px 0 44px; -} - -h1, -h2, -h3, -p, -dl { - margin: 0; -} - -.topbar, -.hero, -.funnel, -.actionList, -.inspector { - border: 1px solid rgba(23, 27, 24, 0.12); - background: #fffdf8; - border-radius: 14px; -} - -.topbar { - display: flex; - align-items: center; - justify-content: space-between; - gap: 14px; - padding: 12px 14px; -} - -.topbar strong, -.topbar span { - display: block; -} - -.topbar strong { - font-size: 15px; -} - -.topbar span, -.hero p, -.hero span, -.panelHeader p, -.eventReason, -.facts dt, -.empty { - color: #66706a; - font-size: 13px; -} - -.topActions { - display: flex; - align-items: center; - gap: 8px; -} - -.topActions button, -.topActions select { - border-radius: 999px; - border: 1px solid rgba(23, 27, 24, 0.14); - background: #171b18; - color: #fff; - padding: 8px 11px; -} - -.topActions select { - background: #fff; - color: #171b18; -} - -.hero { - display: flex; - align-items: end; - justify-content: space-between; - gap: 18px; - margin-top: 14px; - padding: 20px; -} - -.hero h1 { - font-size: clamp(32px, 5vw, 56px); - line-height: 0.95; - letter-spacing: -0.04em; -} - -.funnel { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 10px; - margin-top: 14px; - padding: 10px; -} - -.funnelStep { - min-height: 118px; - text-align: left; - color: #171b18; - border-radius: 11px; - background: #ede8dd; - padding: 14px; - position: relative; - overflow: hidden; - border: 1px solid transparent; -} - -.funnelStep::before { - content: ""; - position: absolute; - inset: auto auto 0 0; - width: var(--w); - height: 5px; - background: #8b938e; -} - -.funnelStep.ask::before { - background: #c79025; -} - -.funnelStep.deny::before { - background: #d94f43; -} - -.funnelStep.active { - background: #fff; - border-color: #171b18; -} - -.funnelStep span, -.funnelStep small { - display: block; -} - -.funnelStep span { - font-size: 14px; - font-weight: 750; -} - -.funnelStep strong { - display: block; - margin-top: 14px; - font-size: 42px; - line-height: 1; -} - -.funnelStep small { - color: #66706a; - margin-top: 8px; -} - -.workspace { - display: grid; - grid-template-columns: minmax(360px, 1fr) minmax(360px, 440px); - gap: 14px; - align-items: start; - margin-top: 14px; -} - -.actionList, -.inspector { - padding: 16px; -} - -.panelHeader { - margin-bottom: 12px; -} - -.panelHeader h2 { - margin-top: 2px; - font-size: 24px; -} - -.rows { - display: grid; - gap: 8px; -} - -.eventRow { - display: grid; - grid-template-columns: minmax(76px, 112px) minmax(0, 1fr) 68px; - gap: 10px; - align-items: center; - width: 100%; - text-align: left; - border: 1px solid rgba(23, 27, 24, 0.11); - background: #fff; - color: #171b18; - border-radius: 11px; - padding: 11px; -} - -.eventRow.active { - border-color: #171b18; - box-shadow: inset 4px 0 0 #8b938e; -} - -.eventRow.ask.active { - box-shadow: inset 4px 0 0 #c79025; -} - -.eventRow.deny.active { - box-shadow: inset 4px 0 0 #d94f43; -} - -.toolName { - font-weight: 760; -} - -.eventReason { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.riskScore { - justify-self: end; - font-variant-numeric: tabular-nums; -} - -.inspector { - position: sticky; - top: 14px; -} - -.decisionLine { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; -} - -.decisionLine span, -.signals span { - border: 1px solid rgba(23, 27, 24, 0.14); - border-radius: 999px; - padding: 5px 9px; - font-size: 12px; - background: #fff; -} - -.decisionLine strong { - font-size: 34px; - font-variant-numeric: tabular-nums; -} - -.inspector h2 { - margin-top: 18px; - font-size: 28px; - letter-spacing: -0.02em; -} - -.reason { - margin-top: 6px; - color: #46524b; -} - -.inspector section, -.facts { - border-top: 1px solid rgba(23, 27, 24, 0.1); - margin-top: 18px; - padding-top: 16px; -} - -.inspector h3 { - margin-bottom: 8px; - color: #66706a; - font-size: 13px; -} - -.inspector p { - line-height: 1.5; -} - -.inspector code { - display: block; - padding: 12px; - color: #f8f4ea; - background: #171b18; - border-radius: 10px; - line-height: 1.45; - overflow-wrap: anywhere; -} - -.facts { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; -} - -.facts dd { - margin: 4px 0 0; - overflow-wrap: anywhere; -} - -.signals { - display: flex; - flex-wrap: wrap; - gap: 7px; -} - -.empty { - padding: 18px; - border: 1px dashed rgba(23, 27, 24, 0.16); - border-radius: 12px; -} - -.emptyInspector { - display: grid; - min-height: 320px; - place-content: center; - text-align: center; -} - -.error { - margin-top: 14px; - padding: 12px; - border-radius: 12px; - color: #8f2f28; - background: #ffe8e3; -} - -@media (max-width: 860px) { - .topbar, - .hero { - align-items: stretch; - flex-direction: column; - } - - .funnel, - .workspace { - grid-template-columns: 1fr; - } - - .inspector { - position: static; - } -} - -@media (max-width: 560px) { - main { - width: min(100% - 20px, 1180px); - } - - .eventRow, - .facts { - grid-template-columns: 1fr; - } - - .riskScore { - justify-self: start; - } -} diff --git a/web/guard-dashboard/src/vite-env.d.ts b/web/guard-dashboard/src/vite-env.d.ts new file mode 100644 index 00000000..2dc3217e --- /dev/null +++ b/web/guard-dashboard/src/vite-env.d.ts @@ -0,0 +1,10 @@ +/// + +interface ImportMetaEnv { + readonly VITE_KONTEXT_API?: string; + readonly VITE_KONTEXT_SAMPLE_DATA?: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/web/guard-dashboard/tailwind.config.ts b/web/guard-dashboard/tailwind.config.ts new file mode 100644 index 00000000..6d2c58e9 --- /dev/null +++ b/web/guard-dashboard/tailwind.config.ts @@ -0,0 +1,77 @@ +import type { Config } from "tailwindcss"; + +export default { + darkMode: ["class"], + content: ["./src/**/*.{ts,tsx}", "./index.html"], + theme: { + extend: { + fontFamily: { + sans: ["Geist Sans", "-apple-system", "BlinkMacSystemFont", "system-ui", "sans-serif"], + mono: ["Geist Mono", "ui-monospace", "monospace"], + }, + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + brand: { + DEFAULT: "hsl(var(--brand) / )", + foreground: "hsl(var(--brand-foreground) / )", + light: "hsl(var(--brand-light) / )", + dark: "hsl(var(--brand-dark) / )", + }, + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius-lg)", + md: "var(--radius)", + sm: "var(--radius-sm)", + }, + keyframes: { + "accordion-down": { from: { height: "0" }, to: { height: "var(--radix-accordion-content-height)" } }, + "accordion-up": { from: { height: "var(--radix-accordion-content-height)" }, to: { height: "0" } }, + "collapsible-down": { from: { height: "0" }, to: { height: "var(--radix-collapsible-content-height)" } }, + "collapsible-up": { from: { height: "var(--radix-collapsible-content-height)" }, to: { height: "0" } }, + shimmer: { + "0%": { transform: "translateX(-100%)" }, + "100%": { transform: "translateX(400%)" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "collapsible-down": "collapsible-down 0.2s ease-out", + "collapsible-up": "collapsible-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +} satisfies Config; diff --git a/web/guard-dashboard/tsconfig.json b/web/guard-dashboard/tsconfig.json new file mode 100644 index 00000000..324887d7 --- /dev/null +++ b/web/guard-dashboard/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": false, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "types": ["vite/client"], + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "vite.config.ts", "tailwind.config.ts"] +} diff --git a/web/guard-dashboard/vite.config.ts b/web/guard-dashboard/vite.config.ts new file mode 100644 index 00000000..d75fb287 --- /dev/null +++ b/web/guard-dashboard/vite.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import path from "node:path"; + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, + server: { + proxy: { + "/api": "http://127.0.0.1:4765", + }, + }, +});