From e497022fc8b6cd2d2d77bd8ab9a803c2e05d0e6b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Aug 2026 23:54:34 +0000 Subject: [PATCH] feat: detect and report schema (DDL) changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PostgreSQL's logical decoding does not stream DDL, but pgoutput re-describes a published table whenever its shape changed, right before that table's next row change. Diffing consecutive relation descriptions turns that into a first-class feature with no DDL triggers, no schema-history topic and no superuser: - Detects columns added, dropped and retyped, primary key / replica identity changes, and renames (the table OID survives a rename, which is how a rename is told apart from a new table). Type OIDs resolve to names. - Classifies each change: adding a column is additive, everything else can break consumers holding documents for the table. - Reports through every channel the product already uses — WARN logs for breaking changes, cdc_schema_changes_total{schema,table,kind}, a rolling history at GET /api/schema, a new dashboard page, and (with REDIS_URL) a ":schema" notification stream gated by CDC_SCHEMA_EVENTS. Schema notifications are deliberately best-effort, unlike row events: a reconnect re-describes tables with nothing to diff against, so a change cannot be re-derived on redelivery. ports.SchemaObserver therefore returns no error and a failed publish is counted in cdc_schema_publish_errors_total instead of stalling replication. Row delivery keeps at-least-once unchanged. Relation messages carry no WAL position of their own, so a change is stamped with the commit LSN of the transaction it arrived in, and documented as the position where the change was detected rather than where the DDL committed. The integration test now performs real DDL against PostgreSQL and asserts both the API and the notification stream see it. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_019dEj24Ta2o9QxzW9ZrSPtb --- .gitignore | 1 + CLAUDE.md | 9 + README.md | 61 ++++- cmd/gateway/modules.go | 43 ++++ internal/adapters/primary/wal/decoder.go | 143 ++++++++++++ internal/adapters/primary/wal/reader.go | 12 + internal/adapters/primary/wal/schema_test.go | 217 ++++++++++++++++++ internal/core/domain/schema.go | 148 ++++++++++++ internal/core/ports/schema.go | 17 ++ internal/infrastructure/config/config.go | 4 + internal/infrastructure/config/loader.go | 3 +- internal/infrastructure/metrics/metrics.go | 18 ++ internal/infrastructure/schema/publisher.go | 102 ++++++++ internal/infrastructure/schema/recorder.go | 86 +++++++ .../infrastructure/schema/recorder_test.go | 79 +++++++ internal/infrastructure/server/schema.go | 37 +++ internal/infrastructure/server/server.go | 10 + test/integration/integration_test.go | 93 +++++++- ui/dist/assets/index-BtNhVEm3.js | 49 ---- ui/dist/assets/index-DD7dZXNj.css | 1 - ui/dist/assets/index-DofAKR1r.js | 49 ++++ ui/dist/assets/index-LCMTR3-U.css | 1 + ui/dist/index.html | 4 +- ui/src/app.tsx | 3 + ui/src/components/shell.tsx | 4 +- ui/src/lib/api.ts | 40 ++++ ui/src/lib/hooks.ts | 11 +- ui/src/pages/schema.tsx | 144 ++++++++++++ 28 files changed, 1331 insertions(+), 58 deletions(-) create mode 100644 internal/adapters/primary/wal/schema_test.go create mode 100644 internal/core/domain/schema.go create mode 100644 internal/core/ports/schema.go create mode 100644 internal/infrastructure/schema/publisher.go create mode 100644 internal/infrastructure/schema/recorder.go create mode 100644 internal/infrastructure/schema/recorder_test.go create mode 100644 internal/infrastructure/server/schema.go delete mode 100644 ui/dist/assets/index-BtNhVEm3.js delete mode 100644 ui/dist/assets/index-DD7dZXNj.css create mode 100644 ui/dist/assets/index-DofAKR1r.js create mode 100644 ui/dist/assets/index-LCMTR3-U.css create mode 100644 ui/src/pages/schema.tsx diff --git a/.gitignore b/.gitignore index 7a7f1dc..6df1434 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.exe /gateway tmp/ +dump.rdb diff --git a/CLAUDE.md b/CLAUDE.md index 19b5af8..fe111ba 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -59,6 +59,12 @@ Consequences to keep in mind: placeholder strings) and listed in `UnchangedToastColumns`. Sinks handle this with partial updates (Meilisearch `UpdateDocuments`, RedisJSON `JSON.MERGE`). +- Schema (DDL) changes are detected by diffing pgoutput relation + descriptions, which PostgreSQL re-sends before a changed table's next row + change. They are **best-effort**, not at-least-once: a reconnect + re-describes tables with nothing to diff against, so a missed change cannot + be redelivered. Observers must therefore never fail the WAL stream — + `ports.SchemaObserver` returns no error by design. - Backfill emits `READ` events for existing rows, interleaved with the live stream via WAL watermarks (`pg_logical_emit_message`, prefix `gtc-backfill`). Chunk rows superseded by live events between the low and @@ -95,6 +101,7 @@ Consequences to keep in mind: | CDC_DLQ_THRESHOLD | 3 | Failure cycles for the same event before it is parked | | CDC_DLQ_MAX_ENTRIES | 10000 | DLQ cap; when full, parking fails and the pipeline stalls | | CDC_MASK_HMAC_KEY | - | Secret key for the hmac256 mask strategy (startup fails if a transform uses hmac256 without it) | +| CDC_SCHEMA_EVENTS | true | Publish detected DDL changes to the :schema Redis stream (detection/metrics/API always on) | | SINK_CONFIG_FILE | - | Path to per-table sink YAML (see config/sinks.example.yaml). Without it, Redis sinks mirror all tables | | REDIS_URL | - | Redis connection (enables stream sink if set) | | REDIS_STREAM_PREFIX | cdc | Stream key prefix | @@ -147,6 +154,8 @@ internal/ transform/ # Declarative per-sink transforms (CEL filters, masking) resilience/ # Circuit breaker and retry wrapper for sinks dlq/ # Dead-letter queue (Redis store, parking decorator, triage) + doctor/ # `gtc doctor` preflight checks + schema/ # DDL change history, logging, and Redis notification stream server/ # HTTP server: health/readiness/metrics, APIs, dashboard metrics/ # Prometheus metrics ui/ # React 19 + Tailwind dashboard; dist/ committed + embedded diff --git a/README.md b/README.md index a3a1bf8..8ff1aff 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,11 @@ PostgreSQL ──logical replication──▶ GTC ──▶ Redis Streams (eve `last4`, `redact`, `null`), column dropping, and CEL row filters, configured per sink and per table in YAML. The stream can carry full rows while the search index gets masked ones — no plugin code, no SMT classes. +- **Schema-change awareness** — GTC notices when a published table gains, + loses or retypes a column, changes replica identity, or is renamed, and + reports it on the dashboard, in `/api/schema`, in Prometheus, and on a + Redis notification stream — flagging changes that can break consumers. No + DDL triggers, no schema-history topic, no superuser. - **First-class transactional outbox** — write domain events to an outbox table in the same transaction as your business writes, and GTC publishes them to per-topic Redis streams with optional delete-after-publish. Five @@ -62,8 +67,9 @@ PostgreSQL ──logical replication──▶ GTC ──▶ Redis Streams (eve silently dropped. - **Embedded live dashboard** — a React dashboard served from the binary at `/` (PocketBase-style, no separate deployment): live throughput, WAL lag, - sink health and breaker states, per-table activity, backfill progress, and - DLQ triage with one-click retry/discard. Light and dark themes. + sink health and breaker states, per-table activity, schema-change history, + backfill progress, and DLQ triage with one-click retry/discard. Light and + dark themes. - **Observability** — Prometheus metrics (events, per-sink latency, errors, retries, breaker state, WAL lag in bytes), health and readiness endpoints, structured JSON logs. @@ -224,6 +230,7 @@ lives in an optional YAML file. | `CDC_DLQ_THRESHOLD` | `3` | Failure cycles for the same event before it is parked | | `CDC_DLQ_MAX_ENTRIES` | `10000` | DLQ cap; when full, parking fails and the pipeline stalls | | `CDC_MASK_HMAC_KEY` | – | Secret key for the `hmac256` mask strategy (required when a transform uses it) | +| `CDC_SCHEMA_EVENTS` | `true` | Publish detected DDL changes to the `:schema` Redis stream (detection, metrics and `/api/schema` are always on) | | `SINK_CONFIG_FILE` | – | Path to the per-table sink YAML (below) | | `REDIS_URL` | – | Enables the Redis Stream sink | | `REDIS_STREAM_PREFIX` | `cdc` | Stream key prefix | @@ -349,6 +356,55 @@ Behavior worth knowing: - Delivery is at-least-once like everything else; consumers dedupe by the `id` field. +## Schema changes (DDL) + +PostgreSQL's logical decoding does not stream DDL statements — there is no +`ALTER TABLE` event to subscribe to. What it *does* do is re-describe a +published table whenever its shape has changed, immediately before that +table's next row change. GTC diffs those descriptions and reports the +**effect** of the DDL: + +| Detected | Kind | Breaking? | +|----------|------|-----------| +| New column | `column_added` | no — additive | +| Column removed | `column_dropped` | yes | +| Column type altered | `column_type_changed` | yes | +| Primary key / identity index replaced | `key_changed` | yes | +| `REPLICA IDENTITY` altered | `replica_identity_changed` | yes | +| Table renamed or moved schema | `table_renamed` | yes | + +Every change is counted in `cdc_schema_changes_total{schema,table,kind}`, +logged (breaking ones at WARN, so existing log alerting picks them up), kept +in a rolling in-memory history behind `GET /api/schema`, and shown on the +dashboard's **Schema** page. With `REDIS_URL` set, it is also published to +the `:schema` stream so consumers can react +programmatically: + +```bash +redis-cli XRANGE cdc:schema - + +# fields: table, lsn, breaking, payload (full JSON diff) +``` + +Set `CDC_SCHEMA_EVENTS=false` to keep detection, metrics and the API while +skipping the Redis stream. + +None of this needs DDL triggers, a schema-history topic, or superuser — it +falls out of the replication stream you are already reading. Two honest +limitations follow from that: + +- **Detection is tied to the next row change.** A table altered at 02:00 and + first written at 09:00 reports its change at 09:00. The LSN on the change + is where GTC *detected* it, not where the DDL committed. +- **Several statements can collapse into one change.** If a column is added + and another dropped between two row changes, they arrive as a single + combined change — the net effect, not a statement log. + +Unlike row events, schema notifications are **best-effort**: a change cannot +be re-derived on redelivery (a reconnect re-describes the table with nothing +to diff against), so a failed Redis publish is counted in +`cdc_schema_publish_errors_total` and logged rather than stalling the +pipeline. Row delivery keeps its at-least-once guarantee regardless. + ## Backfill and replay GTC syncs *existing* data, not just new changes. When the replication slot is @@ -453,6 +509,7 @@ networks. |----------|---------| | `GET /` | Embedded dashboard | | `GET /api/stats` | Dashboard's JSON snapshot (uptime, lag, sinks, tables, backfill, DLQ) | +| `GET /api/schema` | Recently detected schema (DDL) changes, newest first | | `GET /health` | Liveness — process is up | | `GET /readiness` | Readiness — live replication stream **and** all sinks healthy | | `GET /metrics` | Prometheus metrics | diff --git a/cmd/gateway/modules.go b/cmd/gateway/modules.go index b0f5a64..aa282e9 100644 --- a/cmd/gateway/modules.go +++ b/cmd/gateway/modules.go @@ -19,6 +19,7 @@ import ( "github.com/emoss08/gtc/internal/infrastructure/config" "github.com/emoss08/gtc/internal/infrastructure/dlq" "github.com/emoss08/gtc/internal/infrastructure/resilience" + "github.com/emoss08/gtc/internal/infrastructure/schema" "github.com/emoss08/gtc/internal/infrastructure/server" "github.com/emoss08/gtc/internal/infrastructure/transform" "github.com/emoss08/gtc/ui" @@ -34,6 +35,8 @@ func Module() fx.Option { config.LoadSinksConfig, newBackfillCoordinator, newDLQManager, + newSchemaRecorder, + newSchemaObserver, newWALReader, func(r *wal.Reader) ports.WALReader { return r }, newSinks, @@ -107,9 +110,46 @@ func newDLQManager(cfg *config.Config, logger *slog.Logger) (*dlq.Manager, error }), nil } +// newSchemaRecorder keeps the in-memory DDL history that /api/schema and the +// dashboard read. +func newSchemaRecorder(logger *slog.Logger) *schema.Recorder { + return schema.NewRecorder(logger) +} + +// newSchemaObserver fans schema changes to the recorder and, when Redis is +// configured, to the ":schema" notification stream. +func newSchemaObserver( + cfg *config.Config, + recorder *schema.Recorder, + lc fx.Lifecycle, + logger *slog.Logger, +) (ports.SchemaObserver, error) { + observers := schema.Observers{recorder} + + if rc := redissink.LoadConfig(); rc.Enabled && cfg.SchemaEvents { + publisher, err := schema.NewRedisPublisher(schema.RedisPublisherParams{ + URL: rc.URL, + Prefix: rc.StreamPrefix, + MaxLen: rc.MaxStreamLen, + Logger: logger, + }) + if err != nil { + return nil, err + } + logger.Info("publishing schema changes", slog.String("stream", publisher.Stream())) + observers = append(observers, publisher) + lc.Append(fx.Hook{ + OnStop: func(context.Context) error { return publisher.Close() }, + }) + } + + return observers, nil +} + func newWALReader( cfg *config.Config, coordinator *backfill.Coordinator, + schemaObserver ports.SchemaObserver, logger *slog.Logger, ) *wal.Reader { walCfg := wal.Config{ @@ -121,6 +161,7 @@ func newWALReader( AutoCreatePub: cfg.AutoCreatePub, SlotRetryInterval: cfg.SlotRetryInterval, SlotRetryTimeout: cfg.SlotRetryTimeout, + SchemaObserver: schemaObserver, } if coordinator != nil { @@ -326,6 +367,7 @@ func newHTTPServer( dlqManager *dlq.Manager, reader *wal.Reader, health *server.HealthStatus, + schemaRecorder *schema.Recorder, logger *slog.Logger, ) *server.Server { var backfillManager ports.BackfillManager @@ -343,6 +385,7 @@ func newHTTPServer( Backfill: backfillManager, DLQ: dlqPort, WAL: reader, + Schema: schemaRecorder, Info: server.InstanceInfo{ Version: version, SlotName: cfg.SlotName, diff --git a/internal/adapters/primary/wal/decoder.go b/internal/adapters/primary/wal/decoder.go index 66df138..82cd834 100644 --- a/internal/adapters/primary/wal/decoder.go +++ b/internal/adapters/primary/wal/decoder.go @@ -23,6 +23,9 @@ type txnState struct { inTxn bool xid uint32 commitTime time.Time + // finalLSN is the transaction's commit position, used to place messages + // that PostgreSQL sends without a WAL position of their own. + finalLSN pglogrepl.LSN } func NewDecoder() *Decoder { @@ -34,6 +37,9 @@ func NewDecoder() *Decoder { type DecodeResult struct { Events []domain.CDCEvent + // SchemaChanges are DDL changes detected by diffing this position's + // relation descriptions against the previously seen ones. + SchemaChanges []domain.SchemaChange // Message is a logical decoding message (pg_logical_emit_message) // found at this stream position; used for backfill watermarks. Message *LogicalMessage @@ -109,6 +115,7 @@ func (d *Decoder) decodeWALData(walData []byte, lsn pglogrepl.LSN) (*DecodeResul d.txn.inTxn = true d.txn.xid = msg.Xid d.txn.commitTime = msg.CommitTime + d.txn.finalLSN = msg.FinalLSN case *pglogrepl.CommitMessage: d.txn.inTxn = false @@ -117,6 +124,14 @@ func (d *Decoder) decodeWALData(walData []byte, lsn pglogrepl.LSN) (*DecodeResul result.AckLSN = msg.TransactionEndLSN case *pglogrepl.RelationMessageV2: + // PostgreSQL re-sends a relation description whenever a published + // table's shape changed, just before the next row change for it. + // Diffing against the previous one is how GTC detects DDL. + if prev, ok := d.relations[msg.RelationID]; ok { + if change := d.diffRelation(prev, msg, lsn); change != nil { + result.SchemaChanges = append(result.SchemaChanges, *change) + } + } d.relations[msg.RelationID] = msg case *pglogrepl.InsertMessageV2: @@ -175,6 +190,134 @@ func (d *Decoder) decodeWALData(walData []byte, lsn pglogrepl.LSN) (*DecodeResul return result, nil } +// diffRelation reports what changed between two descriptions of the same +// table, or nil when they are identical (PostgreSQL re-sends an unchanged +// relation after a reconnect, and that is not a DDL change). +func (d *Decoder) diffRelation( + prev, cur *pglogrepl.RelationMessageV2, + lsn pglogrepl.LSN, +) *domain.SchemaChange { + // PostgreSQL sends relation descriptions without a WAL position of their + // own. Fall back to the commit position of the transaction they arrived + // in, so the change can still be ordered against row events. + if lsn == 0 { + lsn = d.txn.finalLSN + } + change := domain.SchemaChange{ + Schema: cur.Namespace, + Table: cur.RelationName, + RelationID: cur.RelationID, + KeyColumns: keyColumns(cur), + PreviousKeyColumns: keyColumns(prev), + ReplicaIdentity: string(cur.ReplicaIdentity), + LSN: lsn.String(), + TransactionID: d.txn.xid, + Timestamp: d.txn.commitTime, + } + + if prev.Namespace != cur.Namespace || prev.RelationName != cur.RelationName { + change.PreviousSchema = prev.Namespace + change.PreviousTable = prev.RelationName + change.Kinds = append(change.Kinds, domain.SchemaChangeTableRenamed) + } + + prevCols := make(map[string]*pglogrepl.RelationMessageColumn, len(prev.Columns)) + for i := range prev.Columns { + prevCols[prev.Columns[i].Name] = prev.Columns[i] + } + curCols := make(map[string]*pglogrepl.RelationMessageColumn, len(cur.Columns)) + for i := range cur.Columns { + curCols[cur.Columns[i].Name] = cur.Columns[i] + } + + // Iterate the relation's own column order so output is deterministic. + for i := range cur.Columns { + col := cur.Columns[i] + before, existed := prevCols[col.Name] + if !existed { + change.AddedColumns = append(change.AddedColumns, d.columnDef(col)) + continue + } + if before.DataType != col.DataType { + change.ChangedColumns = append(change.ChangedColumns, domain.ColumnTypeChange{ + Name: col.Name, + From: d.columnDef(before), + To: d.columnDef(col), + }) + } + } + for i := range prev.Columns { + col := prev.Columns[i] + if _, stillThere := curCols[col.Name]; !stillThere { + change.DroppedColumns = append(change.DroppedColumns, d.columnDef(col)) + } + } + + if len(change.AddedColumns) > 0 { + change.Kinds = append(change.Kinds, domain.SchemaChangeColumnAdded) + } + if len(change.DroppedColumns) > 0 { + change.Kinds = append(change.Kinds, domain.SchemaChangeColumnDropped) + } + if len(change.ChangedColumns) > 0 { + change.Kinds = append(change.Kinds, domain.SchemaChangeColumnTypeChanged) + } + if prev.ReplicaIdentity != cur.ReplicaIdentity { + change.PreviousReplicaIdentity = string(prev.ReplicaIdentity) + change.Kinds = append(change.Kinds, domain.SchemaChangeReplicaIdentity) + } else if !equalStrings(change.PreviousKeyColumns, change.KeyColumns) { + // The identity setting is unchanged but its columns are not: the + // primary key or the identity index itself was altered. + change.Kinds = append(change.Kinds, domain.SchemaChangeKeyChanged) + } + + if len(change.Kinds) == 0 { + return nil + } + return &change +} + +func (d *Decoder) columnDef(col *pglogrepl.RelationMessageColumn) domain.ColumnDef { + return domain.ColumnDef{ + Name: col.Name, + Type: d.typeName(col.DataType), + TypeOID: col.DataType, + PartOfKey: col.Flags&1 == 1, + } +} + +// typeName resolves a type OID to its PostgreSQL name, falling back to the +// raw OID for types the client does not know (extensions, user-defined types). +func (d *Decoder) typeName(oid uint32) string { + if dt, ok := d.typeMap.TypeForOID(oid); ok { + return dt.Name + } + return fmt.Sprintf("oid:%d", oid) +} + +// keyColumns returns the columns PostgreSQL marks as the replica identity. +func keyColumns(rel *pglogrepl.RelationMessageV2) []string { + var keys []string + for i := range rel.Columns { + if rel.Columns[i].Flags&1 == 1 { + keys = append(keys, rel.Columns[i].Name) + } + } + return keys +} + +func equalStrings(a, b []string) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + func (d *Decoder) relation(relationID uint32) (*pglogrepl.RelationMessageV2, error) { rel, ok := d.relations[relationID] if !ok { diff --git a/internal/adapters/primary/wal/reader.go b/internal/adapters/primary/wal/reader.go index 35640d9..05cd442 100644 --- a/internal/adapters/primary/wal/reader.go +++ b/internal/adapters/primary/wal/reader.go @@ -35,6 +35,9 @@ type Config struct { // Controller, when set, interleaves backfill chunks with the live // stream (see ports.BackfillController). Controller ports.BackfillController + // SchemaObserver, when set, is notified of DDL changes detected on + // published tables. + SchemaObserver ports.SchemaObserver // StreamStarted, when set, is called after replication is (re)established. // slotCreated reports whether this run created the replication slot — // true only on the very first start against a fresh database. @@ -408,6 +411,15 @@ func (r *Reader) streamLoop(ctx context.Context, handler ports.WALEventHandler) return fmt.Errorf("decode failed: %w", err) } + // Schema changes are advisory and never fail the stream: they + // cannot be re-derived on redelivery, so a failing observer would + // stall replication forever without recovering the notification. + if r.config.SchemaObserver != nil { + for _, change := range result.SchemaChanges { + r.config.SchemaObserver.OnSchemaChange(ctx, change) + } + } + for _, event := range result.Events { r.logger.Debug("event received", slog.String("operation", event.Operation.String()), diff --git a/internal/adapters/primary/wal/schema_test.go b/internal/adapters/primary/wal/schema_test.go new file mode 100644 index 0000000..f45e937 --- /dev/null +++ b/internal/adapters/primary/wal/schema_test.go @@ -0,0 +1,217 @@ +package wal + +import ( + "slices" + "strings" + "testing" + + "github.com/emoss08/gtc/internal/core/domain" + "github.com/jackc/pglogrepl" + "github.com/jackc/pgx/v5/pgtype" +) + +// rel builds a relation description; use key() for columns in the replica +// identity and plain() for the rest. +func rel(namespace, name string, identity uint8, cols ...column) *pglogrepl.RelationMessageV2 { + msg := &pglogrepl.RelationMessageV2{ + RelationMessage: pglogrepl.RelationMessage{ + RelationID: 42, + Namespace: namespace, + RelationName: name, + ReplicaIdentity: identity, + }, + } + for _, c := range cols { + var flags uint8 + if c.key { + flags = 1 + } + msg.Columns = append(msg.Columns, &pglogrepl.RelationMessageColumn{ + Name: c.name, + DataType: c.oid, + Flags: flags, + }) + } + return msg +} + +type column struct { + name string + oid uint32 + key bool +} + +func key(name string, oid uint32) column { return column{name: name, oid: oid, key: true} } +func plain(name string, oid uint32) column { return column{name: name, oid: oid} } + +const identityDefault, identityFull = 'd', 'f' + +func diff(prev, cur *pglogrepl.RelationMessageV2) *domain.SchemaChange { + return NewDecoder().diffRelation(prev, cur, pglogrepl.LSN(0x1000)) +} + +func TestDiffDetectsAddedColumn(t *testing.T) { + change := diff( + rel("public", "users", identityDefault, key("id", pgtype.Int4OID)), + rel("public", "users", identityDefault, key("id", pgtype.Int4OID), plain("email", pgtype.TextOID)), + ) + if change == nil { + t.Fatal("adding a column must be reported") + } + if !slices.Equal(change.Kinds, []string{domain.SchemaChangeColumnAdded}) { + t.Fatalf("kinds = %v", change.Kinds) + } + if len(change.AddedColumns) != 1 || change.AddedColumns[0].Name != "email" { + t.Fatalf("added = %+v", change.AddedColumns) + } + if got := change.AddedColumns[0].Type; got != "text" { + t.Errorf("type name = %q, want text", got) + } + if change.Breaking() { + t.Error("adding a column is additive and must not be flagged breaking") + } +} + +func TestDiffDetectsDroppedAndRetypedColumns(t *testing.T) { + change := diff( + rel("public", "users", identityDefault, + key("id", pgtype.Int4OID), plain("nickname", pgtype.TextOID), plain("age", pgtype.Int4OID)), + rel("public", "users", identityDefault, + key("id", pgtype.Int4OID), plain("age", pgtype.Int8OID)), + ) + if change == nil { + t.Fatal("dropping and retyping columns must be reported") + } + if len(change.DroppedColumns) != 1 || change.DroppedColumns[0].Name != "nickname" { + t.Errorf("dropped = %+v", change.DroppedColumns) + } + if len(change.ChangedColumns) != 1 { + t.Fatalf("changed = %+v", change.ChangedColumns) + } + got := change.ChangedColumns[0] + if got.Name != "age" || got.From.Type != "int4" || got.To.Type != "int8" { + t.Errorf("type change = %+v", got) + } + if !change.Breaking() { + t.Error("dropping a column must be flagged breaking") + } +} + +func TestDiffDetectsReplicaIdentityChange(t *testing.T) { + change := diff( + rel("public", "users", identityDefault, key("id", pgtype.Int4OID), plain("email", pgtype.TextOID)), + rel("public", "users", identityFull, key("id", pgtype.Int4OID), key("email", pgtype.TextOID)), + ) + if change == nil { + t.Fatal("a replica identity change must be reported") + } + if !slices.Contains(change.Kinds, domain.SchemaChangeReplicaIdentity) { + t.Fatalf("kinds = %v", change.Kinds) + } + if change.PreviousReplicaIdentity != "d" || change.ReplicaIdentity != "f" { + t.Errorf("identity %q -> %q", change.PreviousReplicaIdentity, change.ReplicaIdentity) + } + if !slices.Equal(change.KeyColumns, []string{"id", "email"}) { + t.Errorf("key columns = %v", change.KeyColumns) + } + if !change.Breaking() { + t.Error("a replica identity change alters how rows are addressed; must be breaking") + } +} + +// The identity setting can stay "default" while the primary key itself is +// replaced, which changes how DELETEs identify rows. +func TestDiffDetectsKeyChangeWithSameIdentitySetting(t *testing.T) { + change := diff( + rel("public", "users", identityDefault, key("id", pgtype.Int4OID), plain("uuid", pgtype.UUIDOID)), + rel("public", "users", identityDefault, plain("id", pgtype.Int4OID), key("uuid", pgtype.UUIDOID)), + ) + if change == nil { + t.Fatal("a primary key swap must be reported") + } + if !slices.Contains(change.Kinds, domain.SchemaChangeKeyChanged) { + t.Fatalf("kinds = %v", change.Kinds) + } + if !change.Breaking() { + t.Error("a key change must be breaking") + } +} + +func TestDiffDetectsRename(t *testing.T) { + change := diff( + rel("public", "users", identityDefault, key("id", pgtype.Int4OID)), + rel("app", "accounts", identityDefault, key("id", pgtype.Int4OID)), + ) + if change == nil { + t.Fatal("a rename must be reported") + } + if !slices.Contains(change.Kinds, domain.SchemaChangeTableRenamed) { + t.Fatalf("kinds = %v", change.Kinds) + } + if change.PreviousSchema != "public" || change.PreviousTable != "users" { + t.Errorf("previous = %s.%s", change.PreviousSchema, change.PreviousTable) + } + if change.Schema != "app" || change.Table != "accounts" { + t.Errorf("current = %s.%s", change.Schema, change.Table) + } +} + +// PostgreSQL re-sends the current relation after a reconnect; an identical +// description is not a DDL change and must stay silent. +func TestDiffIgnoresIdenticalRelation(t *testing.T) { + cols := []column{key("id", pgtype.Int4OID), plain("email", pgtype.TextOID)} + if change := diff( + rel("public", "users", identityDefault, cols...), + rel("public", "users", identityDefault, cols...), + ); change != nil { + t.Fatalf("identical relations must not produce a change: %+v", change) + } +} + +// The first relation for a table describes it; there is nothing to diff +// against, so it must not look like a DDL change. +func TestFirstRelationIsNotAChange(t *testing.T) { + d := NewDecoder() + msg := rel("public", "users", identityDefault, key("id", pgtype.Int4OID)) + + body := relationBody(msg.RelationID, msg.Namespace, msg.RelationName, + []relCol{{name: "id", oid: pgtype.Int4OID}}) + result, err := d.decodeWALData(body, 0x1000) + if err != nil { + t.Fatalf("decode: %v", err) + } + if len(result.SchemaChanges) != 0 { + t.Fatalf("first relation reported as a change: %+v", result.SchemaChanges) + } + if _, ok := d.relations[msg.RelationID]; !ok { + t.Error("relation was not remembered for later diffs") + } +} + +func TestUnknownTypeOIDFallsBackToOID(t *testing.T) { + change := diff( + rel("public", "t", identityDefault, key("id", pgtype.Int4OID)), + rel("public", "t", identityDefault, key("id", pgtype.Int4OID), plain("geom", 999999)), + ) + if change == nil || len(change.AddedColumns) != 1 { + t.Fatalf("expected one added column, got %+v", change) + } + if got := change.AddedColumns[0].Type; got != "oid:999999" { + t.Errorf("unknown type = %q, want oid:999999", got) + } +} + +func TestSummaryDescribesTheChange(t *testing.T) { + change := diff( + rel("public", "users", identityDefault, + key("id", pgtype.Int4OID), plain("nickname", pgtype.TextOID), plain("age", pgtype.Int4OID)), + rel("public", "users", identityDefault, + key("id", pgtype.Int4OID), plain("age", pgtype.Int8OID), plain("email", pgtype.TextOID)), + ) + summary := change.Summary() + for _, want := range []string{"added email", "dropped nickname", "age int4->int8"} { + if !strings.Contains(summary, want) { + t.Errorf("summary %q missing %q", summary, want) + } + } +} diff --git a/internal/core/domain/schema.go b/internal/core/domain/schema.go new file mode 100644 index 0000000..150305b --- /dev/null +++ b/internal/core/domain/schema.go @@ -0,0 +1,148 @@ +package domain + +import ( + "fmt" + "strings" + "time" +) + +// Schema-change kinds, used as metric labels and in the JSON payload. +const ( + SchemaChangeColumnAdded = "column_added" + SchemaChangeColumnDropped = "column_dropped" + SchemaChangeColumnTypeChanged = "column_type_changed" + SchemaChangeKeyChanged = "key_changed" + SchemaChangeReplicaIdentity = "replica_identity_changed" + SchemaChangeTableRenamed = "table_renamed" +) + +// ColumnDef describes one column of a published table. +type ColumnDef struct { + Name string `json:"name"` + // Type is the PostgreSQL type name (e.g. "int4", "text"), resolved from + // TypeOID; it falls back to "oid:" for types the client cannot name. + Type string `json:"type"` + TypeOID uint32 `json:"type_oid"` + // PartOfKey reports membership in the replica identity — the columns + // PostgreSQL sends as the old tuple on UPDATE and DELETE. + PartOfKey bool `json:"part_of_key"` +} + +// ColumnTypeChange records a column whose type changed in place. +type ColumnTypeChange struct { + Name string `json:"name"` + From ColumnDef `json:"from"` + To ColumnDef `json:"to"` +} + +// SchemaChange is a DDL change detected on a published table. +// +// PostgreSQL's logical decoding does not emit DDL statements. It does re-send +// a relation description whenever a published table's shape changes, just +// before the next row change for that table, so GTC reports the *effect* of +// the DDL (columns added, dropped, retyped, replica identity, renames) rather +// than the statement text. Several statements that land between two row +// changes are therefore reported as one combined change. +type SchemaChange struct { + Schema string `json:"schema"` + Table string `json:"table"` + // RelationID is PostgreSQL's table OID; it survives renames, which is + // how a rename is told apart from a new table. + RelationID uint32 `json:"relation_id"` + // PreviousSchema and PreviousTable are set only when the table was + // renamed or moved between schemas. + PreviousSchema string `json:"previous_schema,omitempty"` + PreviousTable string `json:"previous_table,omitempty"` + + AddedColumns []ColumnDef `json:"added_columns,omitempty"` + DroppedColumns []ColumnDef `json:"dropped_columns,omitempty"` + ChangedColumns []ColumnTypeChange `json:"changed_columns,omitempty"` + + // KeyColumns is the replica identity after the change; PreviousKeyColumns + // is what it was before. + KeyColumns []string `json:"key_columns,omitempty"` + PreviousKeyColumns []string `json:"previous_key_columns,omitempty"` + // ReplicaIdentity is PostgreSQL's setting: "d" (default), "n" (nothing), + // "f" (full), or "i" (index). + ReplicaIdentity string `json:"replica_identity"` + PreviousReplicaIdentity string `json:"previous_replica_identity,omitempty"` + + // Kinds lists what changed, in a stable order. + Kinds []string `json:"kinds"` + + LSN string `json:"lsn"` + TransactionID uint32 `json:"transaction_id"` + Timestamp time.Time `json:"timestamp"` +} + +func (s *SchemaChange) FullTableName() string { + return fmt.Sprintf("%s.%s", s.Schema, s.Table) +} + +// Breaking reports whether the change can break consumers that already hold +// documents for this table: data disappears (dropped column), is reinterpreted +// (type change), or is addressed differently (key or identity change). +// Adding a column is additive and never breaking. +func (s *SchemaChange) Breaking() bool { + for _, kind := range s.Kinds { + switch kind { + case SchemaChangeColumnDropped, + SchemaChangeColumnTypeChanged, + SchemaChangeKeyChanged, + SchemaChangeReplicaIdentity, + SchemaChangeTableRenamed: + return true + } + } + return false +} + +// Summary is a one-line human-readable description, used in logs and the +// dashboard. +func (s *SchemaChange) Summary() string { + var parts []string + if s.PreviousTable != "" { + parts = append(parts, fmt.Sprintf("renamed from %s.%s", + s.PreviousSchema, s.PreviousTable)) + } + if names := columnNames(s.AddedColumns); len(names) > 0 { + parts = append(parts, "added "+strings.Join(names, ", ")) + } + if names := columnNames(s.DroppedColumns); len(names) > 0 { + parts = append(parts, "dropped "+strings.Join(names, ", ")) + } + for _, c := range s.ChangedColumns { + parts = append(parts, fmt.Sprintf("%s %s->%s", c.Name, c.From.Type, c.To.Type)) + } + if s.PreviousReplicaIdentity != "" { + parts = append(parts, fmt.Sprintf("replica identity %s->%s", + s.PreviousReplicaIdentity, s.ReplicaIdentity)) + } else if slicesDiffer(s.PreviousKeyColumns, s.KeyColumns) { + parts = append(parts, fmt.Sprintf("key [%s]->[%s]", + strings.Join(s.PreviousKeyColumns, " "), strings.Join(s.KeyColumns, " "))) + } + if len(parts) == 0 { + return "no change" + } + return strings.Join(parts, "; ") +} + +func columnNames(cols []ColumnDef) []string { + names := make([]string, 0, len(cols)) + for _, c := range cols { + names = append(names, c.Name) + } + return names +} + +func slicesDiffer(a, b []string) bool { + if len(a) != len(b) { + return true + } + for i := range a { + if a[i] != b[i] { + return true + } + } + return false +} diff --git a/internal/core/ports/schema.go b/internal/core/ports/schema.go new file mode 100644 index 0000000..680ea41 --- /dev/null +++ b/internal/core/ports/schema.go @@ -0,0 +1,17 @@ +package ports + +import ( + "context" + + "github.com/emoss08/gtc/internal/core/domain" +) + +// SchemaObserver is notified when a published table's shape changes. +// +// Observers are advisory: unlike row events, a failing observer must not tear +// down replication, because the change cannot be re-derived on redelivery (a +// reconnect re-sends the current relation description with nothing to diff it +// against). Implementations report their own failures via metrics and logs. +type SchemaObserver interface { + OnSchemaChange(ctx context.Context, change domain.SchemaChange) +} diff --git a/internal/infrastructure/config/config.go b/internal/infrastructure/config/config.go index e043cd7..2a4e5ad 100644 --- a/internal/infrastructure/config/config.go +++ b/internal/infrastructure/config/config.go @@ -26,6 +26,10 @@ type Config struct { // MaskHMACKey keys the hmac256 mask strategy in sink transforms. Empty // means the strategy is unavailable (configs using it fail at startup). MaskHMACKey string + // SchemaEvents publishes detected DDL changes to the Redis stream + // ":schema". Detection, metrics, logging and the + // /api/schema history are always on; this only controls publishing. + SchemaEvents bool } type DLQConfig struct { diff --git a/internal/infrastructure/config/loader.go b/internal/infrastructure/config/loader.go index 4472544..48abe8b 100644 --- a/internal/infrastructure/config/loader.go +++ b/internal/infrastructure/config/loader.go @@ -33,7 +33,8 @@ func Load() (*Config, error) { ChunkDelay: getDuration("CDC_BACKFILL_CHUNK_DELAY", 0), StateTable: backfillStateTable(), }, - MaskHMACKey: os.Getenv("CDC_MASK_HMAC_KEY"), + MaskHMACKey: os.Getenv("CDC_MASK_HMAC_KEY"), + SchemaEvents: getBool("CDC_SCHEMA_EVENTS", true), DLQ: DLQConfig{ Enabled: getBool("CDC_DLQ_ENABLED", true), Threshold: getInt("CDC_DLQ_THRESHOLD", 3), diff --git a/internal/infrastructure/metrics/metrics.go b/internal/infrastructure/metrics/metrics.go index c0b419e..dde1f95 100644 --- a/internal/infrastructure/metrics/metrics.go +++ b/internal/infrastructure/metrics/metrics.go @@ -145,4 +145,22 @@ var ( }, []string{"sink", "status"}, ) + + SchemaChangesTotal = promauto.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "cdc", + Name: "schema_changes_total", + Help: "Detected DDL changes on published tables, by kind", + }, + []string{"schema", "table", "kind"}, + ) + + SchemaPublishErrors = promauto.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "cdc", + Name: "schema_publish_errors_total", + Help: "Failures publishing a schema-change notification", + }, + []string{"target"}, + ) ) diff --git a/internal/infrastructure/schema/publisher.go b/internal/infrastructure/schema/publisher.go new file mode 100644 index 0000000..9dc5782 --- /dev/null +++ b/internal/infrastructure/schema/publisher.go @@ -0,0 +1,102 @@ +package schema + +import ( + "context" + "encoding/json" + "fmt" + "log/slog" + "time" + + "github.com/redis/go-redis/v9" + + "github.com/emoss08/gtc/internal/core/domain" + "github.com/emoss08/gtc/internal/core/ports" + "github.com/emoss08/gtc/internal/infrastructure/metrics" +) + +// publishTimeout bounds a publish so a slow Redis cannot stall the WAL +// stream; schema notifications are advisory and a drop is reported loudly. +const publishTimeout = 5 * time.Second + +// RedisPublisher writes schema changes to a single Redis stream, +// ":schema", so consumers can subscribe to DDL without parsing every +// table's row stream. Ordering relative to row events is conveyed by the LSN +// carried in each entry. +type RedisPublisher struct { + client *redis.Client + stream string + maxLen int64 + logger *slog.Logger +} + +var _ ports.SchemaObserver = (*RedisPublisher)(nil) + +type RedisPublisherParams struct { + URL string + Prefix string + MaxLen int64 + Logger *slog.Logger +} + +func NewRedisPublisher(p RedisPublisherParams) (*RedisPublisher, error) { + opts, err := redis.ParseURL(p.URL) + if err != nil { + return nil, fmt.Errorf("invalid redis URL: %w", err) + } + return &RedisPublisher{ + client: redis.NewClient(opts), + stream: p.Prefix + ":schema", + maxLen: p.MaxLen, + logger: p.Logger.With(slog.String("component", "schema_publisher")), + }, nil +} + +// Stream is the Redis stream key schema changes are written to. +func (p *RedisPublisher) Stream() string { return p.stream } + +func (p *RedisPublisher) OnSchemaChange(ctx context.Context, change domain.SchemaChange) { + payload, err := json.Marshal(change) + if err != nil { + p.fail("marshal schema change", change, err) + return + } + + ctx, cancel := context.WithTimeout(ctx, publishTimeout) + defer cancel() + + if err := p.client.XAdd(ctx, &redis.XAddArgs{ + Stream: p.stream, + MaxLen: p.maxLen, + Approx: true, + Values: map[string]any{ + "table": change.FullTableName(), + "lsn": change.LSN, + "breaking": fmt.Sprint(change.Breaking()), + "payload": string(payload), + }, + }).Err(); err != nil { + p.fail("publish schema change", change, err) + return + } + + p.logger.Debug("schema change published", + slog.String("stream", p.stream), + slog.String("table", change.FullTableName()), + ) +} + +// fail reports a dropped notification. Schema changes are best-effort by +// design (see ports.SchemaObserver), so this never propagates: it must not +// tear down replication, and the change survives in the in-memory history +// and the metrics either way. +func (p *RedisPublisher) fail(what string, change domain.SchemaChange, err error) { + metrics.SchemaPublishErrors.WithLabelValues("redis").Inc() + p.logger.Error("schema change notification dropped", + slog.String("operation", what), + slog.String("table", change.FullTableName()), + slog.String("lsn", change.LSN), + slog.String("error", err.Error()), + ) +} + +func (p *RedisPublisher) Close() error { return p.client.Close() } diff --git a/internal/infrastructure/schema/recorder.go b/internal/infrastructure/schema/recorder.go new file mode 100644 index 0000000..7a75a9c --- /dev/null +++ b/internal/infrastructure/schema/recorder.go @@ -0,0 +1,86 @@ +// Package schema records and publishes DDL changes detected on published +// tables: an in-memory history for the dashboard and API, and an optional +// Redis stream for downstream consumers that need to react to them. +package schema + +import ( + "context" + "log/slog" + "strings" + "sync" + + "github.com/emoss08/gtc/internal/core/domain" + "github.com/emoss08/gtc/internal/core/ports" + "github.com/emoss08/gtc/internal/infrastructure/metrics" +) + +// historyCapacity bounds the in-memory schema history. DDL is rare, so this +// covers a long window while staying trivially small. +const historyCapacity = 200 + +// Recorder keeps recent schema changes, counts them, and logs them — +// breaking changes at WARN so they surface in ordinary log alerting. +type Recorder struct { + mu sync.RWMutex + history []domain.SchemaChange + logger *slog.Logger +} + +var _ ports.SchemaObserver = (*Recorder)(nil) + +func NewRecorder(logger *slog.Logger) *Recorder { + return &Recorder{ + history: make([]domain.SchemaChange, 0, historyCapacity), + logger: logger.With(slog.String("component", "schema")), + } +} + +func (r *Recorder) OnSchemaChange(_ context.Context, change domain.SchemaChange) { + for _, kind := range change.Kinds { + metrics.SchemaChangesTotal.WithLabelValues(change.Schema, change.Table, kind).Inc() + } + + attrs := []any{ + slog.String("table", change.FullTableName()), + slog.String("kinds", strings.Join(change.Kinds, ",")), + slog.String("change", change.Summary()), + slog.String("lsn", change.LSN), + } + if change.Breaking() { + // Consumers holding documents for this table may need attention: + // data was removed, retyped, or is addressed differently now. + r.logger.Warn("breaking schema change detected", attrs...) + } else { + r.logger.Info("schema change detected", attrs...) + } + + r.mu.Lock() + defer r.mu.Unlock() + r.history = append(r.history, change) + if len(r.history) > historyCapacity { + r.history = r.history[len(r.history)-historyCapacity:] + } +} + +// History returns the recorded changes, newest first. +func (r *Recorder) History() []domain.SchemaChange { + r.mu.RLock() + defer r.mu.RUnlock() + + out := make([]domain.SchemaChange, len(r.history)) + for i, change := range r.history { + out[len(r.history)-1-i] = change + } + return out +} + +// Observers fans a change out to several observers in order. +type Observers []ports.SchemaObserver + +var _ ports.SchemaObserver = (Observers)(nil) + +func (o Observers) OnSchemaChange(ctx context.Context, change domain.SchemaChange) { + for _, observer := range o { + observer.OnSchemaChange(ctx, change) + } +} diff --git a/internal/infrastructure/schema/recorder_test.go b/internal/infrastructure/schema/recorder_test.go new file mode 100644 index 0000000..4b04c1e --- /dev/null +++ b/internal/infrastructure/schema/recorder_test.go @@ -0,0 +1,79 @@ +package schema + +import ( + "context" + "fmt" + "io" + "log/slog" + "testing" + + "github.com/emoss08/gtc/internal/core/domain" +) + +func testRecorder() *Recorder { + return NewRecorder(slog.New(slog.NewTextHandler(io.Discard, nil))) +} + +func change(table string, kinds ...string) domain.SchemaChange { + return domain.SchemaChange{Schema: "public", Table: table, Kinds: kinds} +} + +func TestRecorderReturnsNewestFirst(t *testing.T) { + r := testRecorder() + for _, name := range []string{"a", "b", "c"} { + r.OnSchemaChange(context.Background(), change(name, domain.SchemaChangeColumnAdded)) + } + + history := r.History() + if len(history) != 3 { + t.Fatalf("history length = %d, want 3", len(history)) + } + for i, want := range []string{"c", "b", "a"} { + if history[i].Table != want { + t.Errorf("history[%d] = %s, want %s", i, history[i].Table, want) + } + } +} + +func TestRecorderCapsHistory(t *testing.T) { + r := testRecorder() + for i := range historyCapacity + 25 { + r.OnSchemaChange(context.Background(), + change(fmt.Sprintf("t%d", i), domain.SchemaChangeColumnAdded)) + } + + history := r.History() + if len(history) != historyCapacity { + t.Fatalf("history length = %d, want %d", len(history), historyCapacity) + } + // The oldest entries are evicted, so the newest must still be first. + if want := fmt.Sprintf("t%d", historyCapacity+24); history[0].Table != want { + t.Errorf("newest = %s, want %s", history[0].Table, want) + } +} + +// History must hand out a copy: a caller mutating the result (or a concurrent +// append) must not corrupt the recorder's own buffer. +func TestHistoryIsACopy(t *testing.T) { + r := testRecorder() + r.OnSchemaChange(context.Background(), change("users", domain.SchemaChangeColumnAdded)) + + history := r.History() + history[0].Table = "mutated" + + if again := r.History(); again[0].Table != "users" { + t.Errorf("recorder state was mutated through History(): %s", again[0].Table) + } +} + +func TestObserversFanOut(t *testing.T) { + first, second := testRecorder(), testRecorder() + observers := Observers{first, second} + + observers.OnSchemaChange(context.Background(), change("users", domain.SchemaChangeColumnAdded)) + + if len(first.History()) != 1 || len(second.History()) != 1 { + t.Errorf("fan-out missed an observer: %d, %d", + len(first.History()), len(second.History())) + } +} diff --git a/internal/infrastructure/server/schema.go b/internal/infrastructure/server/schema.go new file mode 100644 index 0000000..195785b --- /dev/null +++ b/internal/infrastructure/server/schema.go @@ -0,0 +1,37 @@ +package server + +import ( + "encoding/json" + "net/http" + + "github.com/emoss08/gtc/internal/core/domain" +) + +type schemaChangeResponse struct { + domain.SchemaChange + // Breaking and Summary are derived; the dashboard renders them directly + // instead of reimplementing the rules. + Breaking bool `json:"breaking"` + Summary string `json:"summary"` +} + +// handleSchema returns recently detected DDL changes, newest first. +func (s *Server) handleSchema(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + + changes := []schemaChangeResponse{} + if s.schema != nil { + for _, change := range s.schema.History() { + changes = append(changes, schemaChangeResponse{ + SchemaChange: change, + Breaking: change.Breaking(), + Summary: change.Summary(), + }) + } + } + + _ = json.NewEncoder(w).Encode(map[string]any{ + "total": len(changes), + "changes": changes, + }) +} diff --git a/internal/infrastructure/server/server.go b/internal/infrastructure/server/server.go index a30033d..94c58b0 100644 --- a/internal/infrastructure/server/server.go +++ b/internal/infrastructure/server/server.go @@ -11,6 +11,7 @@ import ( "strings" "time" + "github.com/emoss08/gtc/internal/core/domain" "github.com/emoss08/gtc/internal/core/ports" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" @@ -29,6 +30,12 @@ type Server struct { startedAt time.Time sampler *sampler info InstanceInfo + schema SchemaHistory +} + +// SchemaHistory exposes recently detected DDL changes to the dashboard. +type SchemaHistory interface { + History() []domain.SchemaChange } // InstanceInfo is static build/config context surfaced to the dashboard. @@ -54,6 +61,7 @@ type ServerParams struct { DLQ ports.DLQManager // nil when the DLQ is disabled WAL WALInfo // reader state for /api/stats UI fs.FS // embedded dashboard; nil disables it + Schema SchemaHistory // detected DDL changes; nil disables /api/schema Info InstanceInfo Logger *slog.Logger } @@ -77,6 +85,7 @@ func New(p ServerParams) *Server { startedAt: time.Now(), sampler: newSampler(), info: p.Info, + schema: p.Schema, httpServer: &http.Server{ Addr: fmt.Sprintf(":%d", p.Config.Port), Handler: r, @@ -101,6 +110,7 @@ func (s *Server) registerRoutes() { s.router.Post("/dlq/discard", s.handleDLQDiscard) s.router.Get("/api/stats", s.handleStats) s.router.Get("/api/history", s.handleHistory) + s.router.Get("/api/schema", s.handleSchema) if s.ui != nil { s.router.Get("/*", s.handleUI()) diff --git a/test/integration/integration_test.go b/test/integration/integration_test.go index 01f9a40..ffdc733 100644 --- a/test/integration/integration_test.go +++ b/test/integration/integration_test.go @@ -82,7 +82,7 @@ func TestEndToEnd(t *testing.T) { _, _ = db.Exec(context.Background(), "SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name = $1", slotName) - _ = rdb.Del(context.Background(), stream).Err() + _ = rdb.Del(context.Background(), stream, prefix+":schema").Err() } cleanup() // leftovers from an aborted previous run t.Cleanup(cleanup) // called after the gateway has been stopped @@ -156,6 +156,41 @@ func TestEndToEnd(t *testing.T) { t.Fatalf("row 4 operations = %v, want %v (per-key order must hold)", ops, want) } + // DDL: PostgreSQL re-describes the table before the next row change, and + // GTC turns that into a schema-change notification. + mustExec(t, ctx, db, fmt.Sprintf("ALTER TABLE %s ADD COLUMN nickname text", table)) + mustExec(t, ctx, db, fmt.Sprintf("ALTER TABLE %s DROP COLUMN email", table)) + mustExec(t, ctx, db, fmt.Sprintf( + "INSERT INTO %s (id, name, nickname) VALUES (5, 'grace', 'amazing grace')", table)) + + ddl := awaitSchemaChange(t, ctx, gw.baseURL, fmt.Sprintf("public.%s", table)) + if !ddl.Breaking { + t.Errorf("dropping a column must be reported as breaking: %+v", ddl) + } + if !slices.Contains(ddl.Kinds, "column_added") || !slices.Contains(ddl.Kinds, "column_dropped") { + t.Errorf("kinds = %v, want both column_added and column_dropped", ddl.Kinds) + } + if len(ddl.AddedColumns) != 1 || ddl.AddedColumns[0].Name != "nickname" { + t.Errorf("added columns = %+v", ddl.AddedColumns) + } + if ddl.AddedColumns[0].Type != "text" { + t.Errorf("added column type = %q, want text", ddl.AddedColumns[0].Type) + } + if len(ddl.DroppedColumns) != 1 || ddl.DroppedColumns[0].Name != "email" { + t.Errorf("dropped columns = %+v", ddl.DroppedColumns) + } + + // The same change reaches the schema notification stream. The recorder + // behind /api/schema and the Redis publisher are independent observers, + // so the API can be ahead of the stream by a few hundred microseconds. + last := awaitSchemaStreamEntry(t, ctx, rdb) + if got := last["table"]; got != "public."+table { + t.Errorf("schema entry table = %v", got) + } + if got := last["breaking"]; got != "true" { + t.Errorf("schema entry breaking = %v, want true", got) + } + // The dashboard's stats endpoint sees the same pipeline. var stats struct { Streaming bool `json:"streaming"` @@ -348,6 +383,62 @@ func awaitEvents( } } +type schemaChange struct { + Schema string `json:"schema"` + Table string `json:"table"` + Kinds []string `json:"kinds"` + Breaking bool `json:"breaking"` + Summary string `json:"summary"` + AddedColumns []column `json:"added_columns"` + DroppedColumns []column `json:"dropped_columns"` +} + +type column struct { + Name string `json:"name"` + Type string `json:"type"` +} + +// awaitSchemaStreamEntry polls the schema notification stream until it has an +// entry, returning the newest one. +func awaitSchemaStreamEntry(t *testing.T, ctx context.Context, rdb *redis.Client) map[string]any { + t.Helper() + deadline := time.Now().Add(30 * time.Second) + for { + msgs, err := rdb.XRange(ctx, prefix+":schema", "-", "+").Result() + if err != nil && err != redis.Nil { + t.Fatalf("xrange schema stream: %v", err) + } + if len(msgs) > 0 { + return msgs[len(msgs)-1].Values + } + if time.Now().After(deadline) { + t.Fatal("no entries on the schema notification stream") + } + time.Sleep(100 * time.Millisecond) + } +} + +// awaitSchemaChange polls /api/schema until a change for the table shows up. +func awaitSchemaChange(t *testing.T, ctx context.Context, baseURL, table string) schemaChange { + t.Helper() + deadline := time.Now().Add(60 * time.Second) + for { + var resp struct { + Changes []schemaChange `json:"changes"` + } + getJSON(t, ctx, baseURL+"/api/schema", &resp) + for _, change := range resp.Changes { + if change.Schema+"."+change.Table == table { + return change + } + } + if time.Now().After(deadline) { + t.Fatalf("timed out waiting for a schema change on %s; saw %+v", table, resp.Changes) + } + time.Sleep(200 * time.Millisecond) + } +} + func eventRowID(p payload) string { if v, ok := p.NewData["id"]; ok { return fmt.Sprint(v) diff --git a/ui/dist/assets/index-BtNhVEm3.js b/ui/dist/assets/index-BtNhVEm3.js deleted file mode 100644 index c8781ed..0000000 --- a/ui/dist/assets/index-BtNhVEm3.js +++ /dev/null @@ -1,49 +0,0 @@ -import{r as ob,a as E,R as Ji,j as f,o as ya,b as Sv,s as Be,_ as ub,n as Te,d as To,e as Zi,u as rb,f as Dc,F as Pr,t as cb,h as fb,i as db,k as mb,l as hb,m as vb,p as gb,q as pb,v as bb,x as yb,y as xb,z as Mo,A as dc,B as ec,C as Ev,D as q,E as Sb,G as Eb,H as Nb,I as zb,J as wc,K as Tb,L as wo,Q as jb,M as Ab}from"./data-DHjwm5_s.js";import{r as Db,c as Nv,R as zv,A as Tv,C as jv,X as Av,Y as Dv,T as wv,a as Cv,t as wb,b as Cb,d as _b,e as _v}from"./charts-Bt2W3tNT.js";(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))r(d);new MutationObserver(d=>{for(const h of d)if(h.type==="childList")for(const g of h.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&r(g)}).observe(document,{childList:!0,subtree:!0});function u(d){const h={};return d.integrity&&(h.integrity=d.integrity),d.referrerPolicy&&(h.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?h.credentials="include":d.crossOrigin==="anonymous"?h.credentials="omit":h.credentials="same-origin",h}function r(d){if(d.ep)return;d.ep=!0;const h=u(d);fetch(d.href,h)}})();var tc={exports:{}},Vi={},ac={exports:{}},lc={};var Gh;function Mb(){return Gh||(Gh=1,(function(n){function o(j,B){var F=j.length;j.push(B);e:for(;0>>1,L=j[se];if(0>>1;sed(ce,F))Wd(te,ce)?(j[se]=te,j[W]=F,se=W):(j[se]=ce,j[be]=F,se=be);else if(Wd(te,F))j[se]=te,j[W]=F,se=W;else break e}}return B}function d(j,B){var F=j.sortIndex-B.sortIndex;return F!==0?F:j.id-B.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var h=performance;n.unstable_now=function(){return h.now()}}else{var g=Date,y=g.now();n.unstable_now=function(){return g.now()-y}}var N=[],S=[],O=1,v=null,C=3,H=!1,R=!1,U=!1,k=!1,G=typeof setTimeout=="function"?setTimeout:null,Z=typeof clearTimeout=="function"?clearTimeout:null,K=typeof setImmediate<"u"?setImmediate:null;function P(j){for(var B=u(S);B!==null;){if(B.callback===null)r(S);else if(B.startTime<=j)r(S),B.sortIndex=B.expirationTime,o(N,B);else break;B=u(S)}}function ee(j){if(U=!1,P(j),!R)if(u(N)!==null)R=!0,oe||(oe=!0,le());else{var B=u(S);B!==null&&Re(ee,B.startTime-j)}}var oe=!1,fe=-1,Y=5,pe=-1;function mt(){return k?!0:!(n.unstable_now()-pej&&mt());){var se=v.callback;if(typeof se=="function"){v.callback=null,C=v.priorityLevel;var L=se(v.expirationTime<=j);if(j=n.unstable_now(),typeof L=="function"){v.callback=L,P(j),B=!0;break t}v===u(N)&&r(N),P(j)}else r(N);v=u(N)}if(v!==null)B=!0;else{var Ae=u(S);Ae!==null&&Re(ee,Ae.startTime-j),B=!1}}break e}finally{v=null,C=F,H=!1}B=void 0}}finally{B?le():oe=!1}}}var le;if(typeof K=="function")le=function(){K(ke)};else if(typeof MessageChannel<"u"){var it=new MessageChannel,Le=it.port2;it.port1.onmessage=ke,le=function(){Le.postMessage(null)}}else le=function(){G(ke,0)};function Re(j,B){fe=G(function(){j(n.unstable_now())},B)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(j){j.callback=null},n.unstable_forceFrameRate=function(j){0>j||125se?(j.sortIndex=F,o(S,j),u(N)===null&&j===u(S)&&(U?(Z(fe),fe=-1):U=!0,Re(ee,F-se))):(j.sortIndex=L,o(N,j),R||H||(R=!0,oe||(oe=!0,le()))),j},n.unstable_shouldYield=mt,n.unstable_wrapCallback=function(j){var B=C;return function(){var F=C;C=B;try{return j.apply(this,arguments)}finally{C=F}}}})(lc)),lc}var Vh;function Ob(){return Vh||(Vh=1,ac.exports=Mb()),ac.exports}var Xh;function Rb(){if(Xh)return Vi;Xh=1;var n=Ob(),o=ob(),u=Db();function r(e){var t="https://react.dev/errors/"+e;if(1L||(e.current=se[L],se[L]=null,L--)}function ce(e,t){L++,se[L]=e.current,e.current=t}var W=Ae(null),te=Ae(null),ne=Ae(null),qe=Ae(null);function ht(e,t){switch(ce(ne,t),ce(te,e),ce(W,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?fh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=fh(t),e=dh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}be(W),ce(W,e)}function ae(){be(W),be(te),be(ne)}function Vt(e){e.memoizedState!==null&&ce(qe,e);var t=W.current,a=dh(t,e.type);t!==a&&(ce(te,e),ce(W,a))}function St(e){te.current===e&&(be(W),be(te)),qe.current===e&&(be(qe),Li._currentValue=F)}var Et,Xt;function vt(e){if(Et===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Et=t&&t[1]||"",Xt=-1)":-1i||p[l]!==T[i]){var w=` -`+p[l].replace(" at new "," at ");return e.displayName&&w.includes("")&&(w=w.replace("",e.displayName)),w}while(1<=l&&0<=i);break}}}finally{$n=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?vt(a):""}function zl(e,t){switch(e.tag){case 26:case 27:case 5:return vt(e.type);case 16:return vt("Lazy");case 13:return e.child!==t&&t!==null?vt("Suspense Fallback"):vt("Suspense");case 19:return vt("SuspenseList");case 0:case 15:return Wl(e.type,!1);case 11:return Wl(e.type.render,!1);case 1:return Wl(e.type,!0);case 31:return vt("Activity");default:return""}}function Wn(e){try{var t="",a=null;do t+=zl(e,a),a=e,e=e.return;while(e);return t}catch(l){return` -Error generating stack: `+l.message+` -`+l.stack}}var Mt=Object.prototype.hasOwnProperty,In=n.unstable_scheduleCallback,Pn=n.unstable_cancelCallback,st=n.unstable_shouldYield,$i=n.unstable_requestPaint,Ze=n.unstable_now,Go=n.unstable_getCurrentPriorityLevel,Wi=n.unstable_ImmediatePriority,Tl=n.unstable_UserBlockingPriority,Il=n.unstable_NormalPriority,Ii=n.unstable_LowPriority,Pl=n.unstable_IdlePriority,Za=n.log,Pi=n.unstable_setDisableYieldValue,Qt=null,pt=null;function ra(e){if(typeof Za=="function"&&Pi(e),pt&&typeof pt.setStrictMode=="function")try{pt.setStrictMode(Qt,e)}catch{}}var gt=Math.clz32?Math.clz32:Vo,es=Math.log,Zt=Math.LN2;function Vo(e){return e>>>=0,e===0?32:31-(es(e)/Zt|0)|0}var Ka=256,Ot=262144,jl=4194304;function xa(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:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;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 Al(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var i=0,s=e.suspendedLanes,c=e.pingedLanes;e=e.warmLanes;var m=l&134217727;return m!==0?(l=m&~s,l!==0?i=xa(l):(c&=m,c!==0?i=xa(c):a||(a=m&~e,a!==0&&(i=xa(a))))):(m=l&~s,m!==0?i=xa(m):c!==0?i=xa(c):a||(a=l&~e,a!==0&&(i=xa(a)))),i===0?0:t!==0&&t!==i&&(t&s)===0&&(s=i&-i,a=t&-t,s>=a||s===32&&(a&4194048)!==0)?t:i}function Ja(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function ie(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32: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 Ve(){var e=jl;return jl<<=1,(jl&62914560)===0&&(jl=4194304),e}function Ke(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Je(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Dl(e,t,a,l,i,s){var c=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var m=e.entanglements,p=e.expirationTimes,T=e.hiddenUpdates;for(a=c&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var t0=/[\n"\\]/g;function Jt(e){return e.replace(t0,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Ko(e,t,a,l,i,s,c,m){e.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?e.type=c:e.removeAttribute("type"),t!=null?c==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Kt(t)):e.value!==""+Kt(t)&&(e.value=""+Kt(t)):c!=="submit"&&c!=="reset"||e.removeAttribute("value"),t!=null?Jo(e,c,Kt(t)):a!=null?Jo(e,c,Kt(a)):l!=null&&e.removeAttribute("value"),i==null&&s!=null&&(e.defaultChecked=!!s),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"?e.name=""+Kt(m):e.removeAttribute("name")}function nf(e,t,a,l,i,s,c,m){if(s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"&&(e.type=s),t!=null||a!=null){if(!(s!=="submit"&&s!=="reset"||t!=null)){Zo(e);return}a=a!=null?""+Kt(a):"",t=t!=null?""+Kt(t):a,m||t===e.value||(e.value=t),e.defaultValue=t}l=l??i,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=m?e.checked:!!l,e.defaultChecked=!!l,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(e.name=c),Zo(e)}function Jo(e,t,a){t==="number"&&ls(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function on(e,t,a,l){if(e=e.options,t){t={};for(var i=0;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Po=!1;if(Na)try{var li={};Object.defineProperty(li,"passive",{get:function(){Po=!0}}),window.addEventListener("test",li,li),window.removeEventListener("test",li,li)}catch{Po=!1}var $a=null,eu=null,is=null;function df(){if(is)return is;var e,t=eu,a=t.length,l,i="value"in $a?$a.value:$a.textContent,s=i.length;for(e=0;e=si),bf=" ",yf=!1;function xf(e,t){switch(e){case"keyup":return w0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Sf(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var fn=!1;function _0(e,t){switch(e){case"compositionend":return Sf(t);case"keypress":return t.which!==32?null:(yf=!0,bf);case"textInput":return e=t.data,e===bf&&yf?null:e;default:return null}}function M0(e,t){if(fn)return e==="compositionend"||!iu&&xf(e,t)?(e=df(),is=eu=$a=null,fn=!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:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=wf(a)}}function _f(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?_f(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Mf(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ls(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=ls(e.document)}return t}function uu(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")}var q0=Na&&"documentMode"in document&&11>=document.documentMode,dn=null,ru=null,ci=null,cu=!1;function Of(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;cu||dn==null||dn!==ls(l)||(l=dn,"selectionStart"in l&&uu(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),ci&&ri(ci,l)||(ci=l,l=Is(ru,"onSelect"),0>=c,i-=c,ca=1<<32-gt(t)+i|a<re?(ge=J,J=null):ge=J.sibling;var Se=A(x,J,z[re],_);if(Se===null){J===null&&(J=ge);break}e&&J&&Se.alternate===null&&t(x,J),b=s(Se,b,re),xe===null?$=Se:xe.sibling=Se,xe=Se,J=ge}if(re===z.length)return a(x,J),ye&&Ta(x,re),$;if(J===null){for(;rere?(ge=J,J=null):ge=J.sibling;var bl=A(x,J,Se.value,_);if(bl===null){J===null&&(J=ge);break}e&&J&&bl.alternate===null&&t(x,J),b=s(bl,b,re),xe===null?$=bl:xe.sibling=bl,xe=bl,J=ge}if(Se.done)return a(x,J),ye&&Ta(x,re),$;if(J===null){for(;!Se.done;re++,Se=z.next())Se=M(x,Se.value,_),Se!==null&&(b=s(Se,b,re),xe===null?$=Se:xe.sibling=Se,xe=Se);return ye&&Ta(x,re),$}for(J=l(J);!Se.done;re++,Se=z.next())Se=D(J,x,re,Se.value,_),Se!==null&&(e&&Se.alternate!==null&&J.delete(Se.key===null?re:Se.key),b=s(Se,b,re),xe===null?$=Se:xe.sibling=Se,xe=Se);return e&&J.forEach(function(sb){return t(x,sb)}),ye&&Ta(x,re),$}function Ce(x,b,z,_){if(typeof z=="object"&&z!==null&&z.type===U&&z.key===null&&(z=z.props.children),typeof z=="object"&&z!==null){switch(z.$$typeof){case H:e:{for(var $=z.key;b!==null;){if(b.key===$){if($=z.type,$===U){if(b.tag===7){a(x,b.sibling),_=i(b,z.props.children),_.return=x,x=_;break e}}else if(b.elementType===$||typeof $=="object"&&$!==null&&$.$$typeof===Y&&ql($)===b.type){a(x,b.sibling),_=i(b,z.props),gi(_,z),_.return=x,x=_;break e}a(x,b);break}else t(x,b);b=b.sibling}z.type===U?(_=Ul(z.props.children,x.mode,_,z.key),_.return=x,x=_):(_=vs(z.type,z.key,z.props,null,x.mode,_),gi(_,z),_.return=x,x=_)}return c(x);case R:e:{for($=z.key;b!==null;){if(b.key===$)if(b.tag===4&&b.stateNode.containerInfo===z.containerInfo&&b.stateNode.implementation===z.implementation){a(x,b.sibling),_=i(b,z.children||[]),_.return=x,x=_;break e}else{a(x,b);break}else t(x,b);b=b.sibling}_=pu(z,x.mode,_),_.return=x,x=_}return c(x);case Y:return z=ql(z),Ce(x,b,z,_)}if(Re(z))return Q(x,b,z,_);if(le(z)){if($=le(z),typeof $!="function")throw Error(r(150));return z=$.call(z),I(x,b,z,_)}if(typeof z.then=="function")return Ce(x,b,Es(z),_);if(z.$$typeof===K)return Ce(x,b,bs(x,z),_);Ns(x,z)}return typeof z=="string"&&z!==""||typeof z=="number"||typeof z=="bigint"?(z=""+z,b!==null&&b.tag===6?(a(x,b.sibling),_=i(b,z),_.return=x,x=_):(a(x,b),_=gu(z,x.mode,_),_.return=x,x=_),c(x)):a(x,b)}return function(x,b,z,_){try{vi=0;var $=Ce(x,b,z,_);return Nn=null,$}catch(J){if(J===En||J===xs)throw J;var xe=kt(29,J,null,x.mode);return xe.lanes=_,xe.return=x,xe}}}var Gl=ad(!0),ld=ad(!1),tl=!1;function wu(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Cu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function al(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ll(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(Ee&2)!==0){var i=l.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),l.pending=t,t=hs(e),qf(e,null,a),t}return ms(e,l,t,a),hs(e)}function pi(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,bt(e,a)}}function _u(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var i=null,s=null;if(a=a.firstBaseUpdate,a!==null){do{var c={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};s===null?i=s=c:s=s.next=c,a=a.next}while(a!==null);s===null?i=s=t:s=s.next=t}else i=s=t;a={baseState:l.baseState,firstBaseUpdate:i,lastBaseUpdate:s,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var Mu=!1;function bi(){if(Mu){var e=Sn;if(e!==null)throw e}}function yi(e,t,a,l){Mu=!1;var i=e.updateQueue;tl=!1;var s=i.firstBaseUpdate,c=i.lastBaseUpdate,m=i.shared.pending;if(m!==null){i.shared.pending=null;var p=m,T=p.next;p.next=null,c===null?s=T:c.next=T,c=p;var w=e.alternate;w!==null&&(w=w.updateQueue,m=w.lastBaseUpdate,m!==c&&(m===null?w.firstBaseUpdate=T:m.next=T,w.lastBaseUpdate=p))}if(s!==null){var M=i.baseState;c=0,w=T=p=null,m=s;do{var A=m.lane&-536870913,D=A!==m.lane;if(D?(ve&A)===A:(l&A)===A){A!==0&&A===xn&&(Mu=!0),w!==null&&(w=w.next={lane:0,tag:m.tag,payload:m.payload,callback:null,next:null});e:{var Q=e,I=m;A=t;var Ce=a;switch(I.tag){case 1:if(Q=I.payload,typeof Q=="function"){M=Q.call(Ce,M,A);break e}M=Q;break e;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=I.payload,A=typeof Q=="function"?Q.call(Ce,M,A):Q,A==null)break e;M=v({},M,A);break e;case 2:tl=!0}}A=m.callback,A!==null&&(e.flags|=64,D&&(e.flags|=8192),D=i.callbacks,D===null?i.callbacks=[A]:D.push(A))}else D={lane:A,tag:m.tag,payload:m.payload,callback:m.callback,next:null},w===null?(T=w=D,p=M):w=w.next=D,c|=A;if(m=m.next,m===null){if(m=i.shared.pending,m===null)break;D=m,m=D.next,D.next=null,i.lastBaseUpdate=D,i.shared.pending=null}}while(!0);w===null&&(p=M),i.baseState=p,i.firstBaseUpdate=T,i.lastBaseUpdate=w,s===null&&(i.shared.lanes=0),ul|=c,e.lanes=c,e.memoizedState=M}}function nd(e,t){if(typeof e!="function")throw Error(r(191,e));e.call(t)}function id(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;es?s:8;var c=j.T,m={};j.T=m,Wu(e,!1,t,a);try{var p=i(),T=j.S;if(T!==null&&T(m,p),p!==null&&typeof p=="object"&&typeof p.then=="function"){var w=F0(p,l);Ei(e,t,w,Yt(e))}else Ei(e,t,l,Yt(e))}catch(M){Ei(e,t,{then:function(){},status:"rejected",reason:M},Yt())}finally{B.p=s,c!==null&&m.types!==null&&(c.types=m.types),j.T=c}}function tp(){}function Fu(e,t,a,l){if(e.tag!==5)throw Error(r(476));var i=Bd(e).queue;kd(e,i,t,F,a===null?tp:function(){return Hd(e),a(l)})}function Bd(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:F,baseState:F,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:wa,lastRenderedState:F},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:wa,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Hd(e){var t=Bd(e);t.next===null&&(t=e.alternate.memoizedState),Ei(e,t.next.queue,{},Yt())}function $u(){return rt(Li)}function Ld(){return Qe().memoizedState}function qd(){return Qe().memoizedState}function ap(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=Yt();e=al(a);var l=ll(t,e,a);l!==null&&(Ct(l,t,a),pi(l,t,a)),t={cache:Tu()},e.payload=t;return}t=t.return}}function lp(e,t,a){var l=Yt();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Os(e)?Gd(t,a):(a=hu(e,t,a,l),a!==null&&(Ct(a,e,l),Vd(a,t,l)))}function Yd(e,t,a){var l=Yt();Ei(e,t,a,l)}function Ei(e,t,a,l){var i={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(Os(e))Gd(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var c=t.lastRenderedState,m=s(c,a);if(i.hasEagerState=!0,i.eagerState=m,Ut(m,c))return ms(e,t,i,0),_e===null&&ds(),!1}catch{}if(a=hu(e,t,i,l),a!==null)return Ct(a,e,l),Vd(a,t,l),!0}return!1}function Wu(e,t,a,l){if(l={lane:2,revertLane:wr(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Os(e)){if(t)throw Error(r(479))}else t=hu(e,a,l,2),t!==null&&Ct(t,e,2)}function Os(e){var t=e.alternate;return e===ue||t!==null&&t===ue}function Gd(e,t){Tn=js=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function Vd(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,bt(e,a)}}var Ni={readContext:rt,use:ws,useCallback:Ye,useContext:Ye,useEffect:Ye,useImperativeHandle:Ye,useLayoutEffect:Ye,useInsertionEffect:Ye,useMemo:Ye,useReducer:Ye,useRef:Ye,useState:Ye,useDebugValue:Ye,useDeferredValue:Ye,useTransition:Ye,useSyncExternalStore:Ye,useId:Ye,useHostTransitionStatus:Ye,useFormState:Ye,useActionState:Ye,useOptimistic:Ye,useMemoCache:Ye,useCacheRefresh:Ye};Ni.useEffectEvent=Ye;var Xd={readContext:rt,use:ws,useCallback:function(e,t){return yt().memoizedState=[e,t===void 0?null:t],e},useContext:rt,useEffect:Ad,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,_s(4194308,4,_d.bind(null,t,e),a)},useLayoutEffect:function(e,t){return _s(4194308,4,e,t)},useInsertionEffect:function(e,t){_s(4,2,e,t)},useMemo:function(e,t){var a=yt();t=t===void 0?null:t;var l=e();if(Vl){ra(!0);try{e()}finally{ra(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=yt();if(a!==void 0){var i=a(t);if(Vl){ra(!0);try{a(t)}finally{ra(!1)}}}else i=t;return l.memoizedState=l.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},l.queue=e,e=e.dispatch=lp.bind(null,ue,e),[l.memoizedState,e]},useRef:function(e){var t=yt();return e={current:e},t.memoizedState=e},useState:function(e){e=Xu(e);var t=e.queue,a=Yd.bind(null,ue,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:Ku,useDeferredValue:function(e,t){var a=yt();return Ju(a,e,t)},useTransition:function(){var e=Xu(!1);return e=kd.bind(null,ue,e.queue,!0,!1),yt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=ue,i=yt();if(ye){if(a===void 0)throw Error(r(407));a=a()}else{if(a=t(),_e===null)throw Error(r(349));(ve&127)!==0||fd(l,t,a)}i.memoizedState=a;var s={value:a,getSnapshot:t};return i.queue=s,Ad(md.bind(null,l,s,e),[e]),l.flags|=2048,An(9,{destroy:void 0},dd.bind(null,l,s,a,t),null),a},useId:function(){var e=yt(),t=_e.identifierPrefix;if(ye){var a=fa,l=ca;a=(l&~(1<<32-gt(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=As++,0<\/script>",s=s.removeChild(s.firstChild);break;case"select":s=typeof l.is=="string"?c.createElement("select",{is:l.is}):c.createElement("select"),l.multiple?s.multiple=!0:l.size&&(s.size=l.size);break;default:s=typeof l.is=="string"?c.createElement(i,{is:l.is}):c.createElement(i)}}s[ot]=t,s[zt]=l;e:for(c=t.child;c!==null;){if(c.tag===5||c.tag===6)s.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===t)break e;for(;c.sibling===null;){if(c.return===null||c.return===t)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}t.stateNode=s;e:switch(ft(s,i,l),i){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&_a(t)}}return Oe(t),fr(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&_a(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(r(166));if(e=ne.current,bn(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,i=ut,i!==null)switch(i.tag){case 27:case 5:l=i.memoizedProps}e[ot]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||rh(e.nodeValue,a)),e||Pa(t,!0)}else e=Ps(e).createTextNode(l),e[ot]=t,t.stateNode=e}return Oe(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=bn(t),a!==null){if(e===null){if(!l)throw Error(r(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(557));e[ot]=t}else kl(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),e=!1}else a=Su(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(Ht(t),t):(Ht(t),null);if((t.flags&128)!==0)throw Error(r(558))}return Oe(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=bn(t),l!==null&&l.dehydrated!==null){if(e===null){if(!i)throw Error(r(318));if(i=t.memoizedState,i=i!==null?i.dehydrated:null,!i)throw Error(r(317));i[ot]=t}else kl(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),i=!1}else i=Su(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(Ht(t),t):(Ht(t),null)}return Ht(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,i=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(i=l.alternate.memoizedState.cachePool.pool),s=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(s=l.memoizedState.cachePool.pool),s!==i&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),Hs(t,t.updateQueue),Oe(t),null);case 4:return ae(),e===null&&Or(t.stateNode.containerInfo),Oe(t),null;case 10:return Aa(t.type),Oe(t),null;case 19:if(be(Xe),l=t.memoizedState,l===null)return Oe(t),null;if(i=(t.flags&128)!==0,s=l.rendering,s===null)if(i)Ti(l,!1);else{if(Ge!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(s=Ts(e),s!==null){for(t.flags|=128,Ti(l,!1),e=s.updateQueue,t.updateQueue=e,Hs(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)Yf(a,e),a=a.sibling;return ce(Xe,Xe.current&1|2),ye&&Ta(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&Ze()>Vs&&(t.flags|=128,i=!0,Ti(l,!1),t.lanes=4194304)}else{if(!i)if(e=Ts(s),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Hs(t,e),Ti(l,!0),l.tail===null&&l.tailMode==="hidden"&&!s.alternate&&!ye)return Oe(t),null}else 2*Ze()-l.renderingStartTime>Vs&&a!==536870912&&(t.flags|=128,i=!0,Ti(l,!1),t.lanes=4194304);l.isBackwards?(s.sibling=t.child,t.child=s):(e=l.last,e!==null?e.sibling=s:t.child=s,l.last=s)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=Ze(),e.sibling=null,a=Xe.current,ce(Xe,i?a&1|2:a&1),ye&&Ta(t,l.treeForkCount),e):(Oe(t),null);case 22:case 23:return Ht(t),Ru(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(Oe(t),t.subtreeFlags&6&&(t.flags|=8192)):Oe(t),a=t.updateQueue,a!==null&&Hs(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&be(Ll),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Aa($e),Oe(t),null;case 25:return null;case 30:return null}throw Error(r(156,t.tag))}function up(e,t){switch(yu(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Aa($e),ae(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return St(t),null;case 31:if(t.memoizedState!==null){if(Ht(t),t.alternate===null)throw Error(r(340));kl()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Ht(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));kl()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return be(Xe),null;case 4:return ae(),null;case 10:return Aa(t.type),null;case 22:case 23:return Ht(t),Ru(),e!==null&&be(Ll),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Aa($e),null;case 25:return null;default:return null}}function hm(e,t){switch(yu(t),t.tag){case 3:Aa($e),ae();break;case 26:case 27:case 5:St(t);break;case 4:ae();break;case 31:t.memoizedState!==null&&Ht(t);break;case 13:Ht(t);break;case 19:be(Xe);break;case 10:Aa(t.type);break;case 22:case 23:Ht(t),Ru(),e!==null&&be(Ll);break;case 24:Aa($e)}}function ji(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var i=l.next;a=i;do{if((a.tag&e)===e){l=void 0;var s=a.create,c=a.inst;l=s(),c.destroy=l}a=a.next}while(a!==i)}}catch(m){ze(t,t.return,m)}}function sl(e,t,a){try{var l=t.updateQueue,i=l!==null?l.lastEffect:null;if(i!==null){var s=i.next;l=s;do{if((l.tag&e)===e){var c=l.inst,m=c.destroy;if(m!==void 0){c.destroy=void 0,i=t;var p=a,T=m;try{T()}catch(w){ze(i,p,w)}}}l=l.next}while(l!==s)}}catch(w){ze(t,t.return,w)}}function vm(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{id(t,a)}catch(l){ze(e,e.return,l)}}}function gm(e,t,a){a.props=Xl(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){ze(e,t,l)}}function Ai(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(i){ze(e,t,i)}}function da(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(i){ze(e,t,i)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(i){ze(e,t,i)}else a.current=null}function pm(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(i){ze(e,e.return,i)}}function dr(e,t,a){try{var l=e.stateNode;Cp(l,e.type,a,t),l[zt]=t}catch(i){ze(e,e.return,i)}}function bm(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&ml(e.type)||e.tag===4}function mr(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||bm(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.tag===27&&ml(e.type)||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 hr(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Ea));else if(l!==4&&(l===27&&ml(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(hr(e,t,a),e=e.sibling;e!==null;)hr(e,t,a),e=e.sibling}function Ls(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&ml(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(Ls(e,t,a),e=e.sibling;e!==null;)Ls(e,t,a),e=e.sibling}function ym(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);ft(t,l,a),t[ot]=e,t[zt]=a}catch(s){ze(e,e.return,s)}}var Ma=!1,Pe=!1,vr=!1,xm=typeof WeakSet=="function"?WeakSet:Set,lt=null;function rp(e,t){if(e=e.containerInfo,kr=so,e=Mf(e),uu(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var i=l.anchorOffset,s=l.focusNode;l=l.focusOffset;try{a.nodeType,s.nodeType}catch{a=null;break e}var c=0,m=-1,p=-1,T=0,w=0,M=e,A=null;t:for(;;){for(var D;M!==a||i!==0&&M.nodeType!==3||(m=c+i),M!==s||l!==0&&M.nodeType!==3||(p=c+l),M.nodeType===3&&(c+=M.nodeValue.length),(D=M.firstChild)!==null;)A=M,M=D;for(;;){if(M===e)break t;if(A===a&&++T===i&&(m=c),A===s&&++w===l&&(p=c),(D=M.nextSibling)!==null)break;M=A,A=M.parentNode}M=D}a=m===-1||p===-1?null:{start:m,end:p}}else a=null}a=a||{start:0,end:0}}else a=null;for(Br={focusedElem:e,selectionRange:a},so=!1,lt=t;lt!==null;)if(t=lt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,lt=e;else for(;lt!==null;){switch(t=lt,s=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),ft(s,l,a),s[ot]=e,at(s),l=s;break e;case"link":var c=jh("link","href",i).get(l+(a.href||""));if(c){for(var m=0;mCe&&(c=Ce,Ce=I,I=c);var x=Cf(m,I),b=Cf(m,Ce);if(x&&b&&(D.rangeCount!==1||D.anchorNode!==x.node||D.anchorOffset!==x.offset||D.focusNode!==b.node||D.focusOffset!==b.offset)){var z=M.createRange();z.setStart(x.node,x.offset),D.removeAllRanges(),I>Ce?(D.addRange(z),D.extend(b.node,b.offset)):(z.setEnd(b.node,b.offset),D.addRange(z))}}}}for(M=[],D=m;D=D.parentNode;)D.nodeType===1&&M.push({element:D,left:D.scrollLeft,top:D.scrollTop});for(typeof m.focus=="function"&&m.focus(),m=0;ma?32:a,j.T=null,a=Er,Er=null;var s=cl,c=Ba;if(et=0,Mn=cl=null,Ba=0,(Ee&6)!==0)throw Error(r(331));var m=Ee;if(Ee|=4,_m(s.current),Dm(s,s.current,c,a),Ee=m,Oi(0,!1),pt&&typeof pt.onPostCommitFiberRoot=="function")try{pt.onPostCommitFiberRoot(Qt,s)}catch{}return!0}finally{B.p=i,j.T=l,Fm(e,t)}}function Wm(e,t,a){t=$t(a,t),t=tr(e.stateNode,t,2),e=ll(e,t,2),e!==null&&(Je(e,2),ma(e))}function ze(e,t,a){if(e.tag===3)Wm(e,e,a);else for(;t!==null;){if(t.tag===3){Wm(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(rl===null||!rl.has(l))){e=$t(a,e),a=Id(2),l=ll(t,a,2),l!==null&&(Pd(a,l,t,e),Je(l,2),ma(l));break}}t=t.return}}function jr(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new dp;var i=new Set;l.set(t,i)}else i=l.get(t),i===void 0&&(i=new Set,l.set(t,i));i.has(a)||(br=!0,i.add(a),e=pp.bind(null,e,t,a),t.then(e,e))}function pp(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,_e===e&&(ve&a)===a&&(Ge===4||Ge===3&&(ve&62914560)===ve&&300>Ze()-Gs?(Ee&2)===0&&On(e,0):yr|=a,_n===ve&&(_n=0)),ma(e)}function Im(e,t){t===0&&(t=Ve()),e=Rl(e,t),e!==null&&(Je(e,t),ma(e))}function bp(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),Im(e,a)}function yp(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,i=e.memoizedState;i!==null&&(a=i.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(r(314))}l!==null&&l.delete(t),Im(e,a)}function xp(e,t){return In(e,t)}var Fs=null,Un=null,Ar=!1,$s=!1,Dr=!1,dl=0;function ma(e){e!==Un&&e.next===null&&(Un===null?Fs=Un=e:Un=Un.next=e),$s=!0,Ar||(Ar=!0,Ep())}function Oi(e,t){if(!Dr&&$s){Dr=!0;do for(var a=!1,l=Fs;l!==null;){if(e!==0){var i=l.pendingLanes;if(i===0)var s=0;else{var c=l.suspendedLanes,m=l.pingedLanes;s=(1<<31-gt(42|e)+1)-1,s&=i&~(c&~m),s=s&201326741?s&201326741|1:s?s|2:0}s!==0&&(a=!0,ah(l,s))}else s=ve,s=Al(l,l===_e?s:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(s&3)===0||Ja(l,s)||(a=!0,ah(l,s));l=l.next}while(a);Dr=!1}}function Sp(){Pm()}function Pm(){$s=Ar=!1;var e=0;dl!==0&&Mp()&&(e=dl);for(var t=Ze(),a=null,l=Fs;l!==null;){var i=l.next,s=eh(l,t);s===0?(l.next=null,a===null?Fs=i:a.next=i,i===null&&(Un=a)):(a=l,(e!==0||(s&3)!==0)&&($s=!0)),l=i}et!==0&&et!==5||Oi(e),dl!==0&&(dl=0)}function eh(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,i=e.expirationTimes,s=e.pendingLanes&-62914561;0m)break;var w=p.transferSize,M=p.initiatorType;w&&ch(M)&&(p=p.responseEnd,c+=w*(p"u"?null:document;function Eh(e,t,a){var l=kn;if(l&&typeof t=="string"&&t){var i=Jt(t);i='link[rel="'+e+'"][href="'+i+'"]',typeof a=="string"&&(i+='[crossorigin="'+a+'"]'),Sh.has(i)||(Sh.add(i),e={rel:e,crossOrigin:a,href:t},l.querySelector(i)===null&&(t=l.createElement("link"),ft(t,"link",e),at(t),l.head.appendChild(t)))}}function Yp(e){Ha.D(e),Eh("dns-prefetch",e,null)}function Gp(e,t){Ha.C(e,t),Eh("preconnect",e,t)}function Vp(e,t,a){Ha.L(e,t,a);var l=kn;if(l&&e&&t){var i='link[rel="preload"][as="'+Jt(t)+'"]';t==="image"&&a&&a.imageSrcSet?(i+='[imagesrcset="'+Jt(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(i+='[imagesizes="'+Jt(a.imageSizes)+'"]')):i+='[href="'+Jt(e)+'"]';var s=i;switch(t){case"style":s=Bn(e);break;case"script":s=Hn(e)}aa.has(s)||(e=v({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),aa.set(s,e),l.querySelector(i)!==null||t==="style"&&l.querySelector(Bi(s))||t==="script"&&l.querySelector(Hi(s))||(t=l.createElement("link"),ft(t,"link",e),at(t),l.head.appendChild(t)))}}function Xp(e,t){Ha.m(e,t);var a=kn;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",i='link[rel="modulepreload"][as="'+Jt(l)+'"][href="'+Jt(e)+'"]',s=i;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":s=Hn(e)}if(!aa.has(s)&&(e=v({rel:"modulepreload",href:e},t),aa.set(s,e),a.querySelector(i)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Hi(s)))return}l=a.createElement("link"),ft(l,"link",e),at(l),a.head.appendChild(l)}}}function Qp(e,t,a){Ha.S(e,t,a);var l=kn;if(l&&e){var i=nn(l).hoistableStyles,s=Bn(e);t=t||"default";var c=i.get(s);if(!c){var m={loading:0,preload:null};if(c=l.querySelector(Bi(s)))m.loading=5;else{e=v({rel:"stylesheet",href:e,"data-precedence":t},a),(a=aa.get(s))&&Xr(e,a);var p=c=l.createElement("link");at(p),ft(p,"link",e),p._p=new Promise(function(T,w){p.onload=T,p.onerror=w}),p.addEventListener("load",function(){m.loading|=1}),p.addEventListener("error",function(){m.loading|=2}),m.loading|=4,to(c,t,l)}c={type:"stylesheet",instance:c,count:1,state:m},i.set(s,c)}}}function Zp(e,t){Ha.X(e,t);var a=kn;if(a&&e){var l=nn(a).hoistableScripts,i=Hn(e),s=l.get(i);s||(s=a.querySelector(Hi(i)),s||(e=v({src:e,async:!0},t),(t=aa.get(i))&&Qr(e,t),s=a.createElement("script"),at(s),ft(s,"link",e),a.head.appendChild(s)),s={type:"script",instance:s,count:1,state:null},l.set(i,s))}}function Kp(e,t){Ha.M(e,t);var a=kn;if(a&&e){var l=nn(a).hoistableScripts,i=Hn(e),s=l.get(i);s||(s=a.querySelector(Hi(i)),s||(e=v({src:e,async:!0,type:"module"},t),(t=aa.get(i))&&Qr(e,t),s=a.createElement("script"),at(s),ft(s,"link",e),a.head.appendChild(s)),s={type:"script",instance:s,count:1,state:null},l.set(i,s))}}function Nh(e,t,a,l){var i=(i=ne.current)?eo(i):null;if(!i)throw Error(r(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Bn(a.href),a=nn(i).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Bn(a.href);var s=nn(i).hoistableStyles,c=s.get(e);if(c||(i=i.ownerDocument||i,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},s.set(e,c),(s=i.querySelector(Bi(e)))&&!s._p&&(c.instance=s,c.state.loading=5),aa.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},aa.set(e,a),s||Jp(i,e,a,c.state))),t&&l===null)throw Error(r(528,""));return c}if(t&&l!==null)throw Error(r(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Hn(a),a=nn(i).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,e))}}function Bn(e){return'href="'+Jt(e)+'"'}function Bi(e){return'link[rel="stylesheet"]['+e+"]"}function zh(e){return v({},e,{"data-precedence":e.precedence,precedence:null})}function Jp(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),ft(t,"link",a),at(t),e.head.appendChild(t))}function Hn(e){return'[src="'+Jt(e)+'"]'}function Hi(e){return"script[async]"+e}function Th(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+Jt(a.href)+'"]');if(l)return t.instance=l,at(l),l;var i=v({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),at(l),ft(l,"style",i),to(l,a.precedence,e),t.instance=l;case"stylesheet":i=Bn(a.href);var s=e.querySelector(Bi(i));if(s)return t.state.loading|=4,t.instance=s,at(s),s;l=zh(a),(i=aa.get(i))&&Xr(l,i),s=(e.ownerDocument||e).createElement("link"),at(s);var c=s;return c._p=new Promise(function(m,p){c.onload=m,c.onerror=p}),ft(s,"link",l),t.state.loading|=4,to(s,a.precedence,e),t.instance=s;case"script":return s=Hn(a.src),(i=e.querySelector(Hi(s)))?(t.instance=i,at(i),i):(l=a,(i=aa.get(s))&&(l=v({},a),Qr(l,i)),e=e.ownerDocument||e,i=e.createElement("script"),at(i),ft(i,"link",l),e.head.appendChild(i),t.instance=i);case"void":return null;default:throw Error(r(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,to(l,a.precedence,e));return t.instance}function to(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),i=l.length?l[l.length-1]:null,s=i,c=0;c title"):null)}function Fp(e,t,a){if(a===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;return t.rel==="stylesheet"?(e=t.disabled,typeof t.precedence=="string"&&e==null):!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 Dh(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function $p(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var i=Bn(l.href),s=t.querySelector(Bi(i));if(s){t=s._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=lo.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=s,at(s);return}s=t.ownerDocument||t,l=zh(l),(i=aa.get(i))&&Xr(l,i),s=s.createElement("link"),at(s);var c=s;c._p=new Promise(function(m,p){c.onload=m,c.onerror=p}),ft(s,"link",l),a.instance=s}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=lo.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var Zr=0;function Wp(e,t){return e.stylesheets&&e.count===0&&io(e,e.stylesheets),0Zr?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(i)}}:null}function lo(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)io(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var no=null;function io(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,no=new Map,t.forEach(Ip,e),no=null,lo.call(e))}function Ip(e,t){if(!(t.state.loading&4)){var a=no.get(e);if(a)var l=a.get(null);else{a=new Map,no.set(e,a);for(var i=e.querySelectorAll("link[data-precedence],style[data-precedence]"),s=0;s"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(o){console.error(o)}}return n(),tc.exports=Rb(),tc.exports}var kb=Ub();const Bb=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Hb=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(o,u,r)=>r?r.toUpperCase():u.toLowerCase()),Zh=n=>{const o=Hb(n);return o.charAt(0).toUpperCase()+o.slice(1)},Mv=(...n)=>n.filter((o,u,r)=>!!o&&o.trim()!==""&&r.indexOf(o)===u).join(" ").trim(),Lb=n=>{for(const o in n)if(o.startsWith("aria-")||o==="role"||o==="title")return!0};var qb={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 Yb=E.forwardRef(({color:n="currentColor",size:o=24,strokeWidth:u=2,absoluteStrokeWidth:r,className:d="",children:h,iconNode:g,...y},N)=>E.createElement("svg",{ref:N,...qb,width:o,height:o,stroke:n,strokeWidth:r?Number(u)*24/Number(o):u,className:Mv("lucide",d),...!h&&!Lb(y)&&{"aria-hidden":"true"},...y},[...g.map(([S,O])=>E.createElement(S,O)),...Array.isArray(h)?h:[h]]));const He=(n,o)=>{const u=E.forwardRef(({className:r,...d},h)=>E.createElement(Yb,{ref:h,iconNode:o,className:Mv(`lucide-${Bb(Zh(n))}`,`lucide-${n}`,r),...d}));return u.displayName=Zh(n),u};const Gb=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],Ov=He("activity",Gb);const Vb=[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"m21 8-4-4-4 4",key:"1c9v7m"}],["path",{d:"M17 4v16",key:"7dpous"}]],Xb=He("arrow-down-up",Vb);const Qb=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],Zb=He("arrow-down",Qb);const Kb=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],Jb=He("arrow-up",Kb);const Fb=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]],$b=He("chart-line",Fb);const Wb=[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]],Ib=He("chevrons-up-down",Wb);const Pb=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],ey=He("circle-x",Pb);const ty=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 12a9 3 0 0 0 5 2.69",key:"1ui2ym"}],["path",{d:"M21 9.3V5",key:"6k6cib"}],["path",{d:"M3 5v14a9 3 0 0 0 6.47 2.88",key:"i62tjy"}],["path",{d:"M12 12v4h4",key:"1bxaet"}],["path",{d:"M13 20a5 5 0 0 0 9-3 4.5 4.5 0 0 0-4.5-4.5c-1.33 0-2.54.54-3.41 1.41L12 16",key:"1f4ei9"}]],Cc=He("database-backup",ty);const ay=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],ly=He("eye",ay);const ny=[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]],iy=He("gauge",ny);const sy=[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]],oy=He("github",sy);const uy=[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]],_c=He("inbox",uy);const ry=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],cy=He("layers",ry);const fy=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],dy=He("layout-dashboard",fy);const my=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],hy=He("moon",my);const vy=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Oo=He("refresh-cw",vy);const gy=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Rv=He("rotate-ccw",gy);const py=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Uv=He("search",py);const by=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],yy=He("sun",by);const xy=[["path",{d:"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18",key:"gugj83"}]],kv=He("table-2",xy);const Sy=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],Ey=He("trash-2",Sy);const Ny=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],zy=He("x",Ny);const Ty=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],jy=He("zap",Ty);var Ay=Object.defineProperty,Mc=(n,o)=>Ay(n,"name",{value:o,configurable:!0});function mc(n,o){if(typeof n=="function")return n(o);n!=null&&(n.current=o)}Mc(mc,"setRef");function Bv(...n){return o=>{let u=!1;const r=n.map(d=>{const h=mc(d,o);return!u&&typeof h=="function"&&(u=!0),h});if(u)return()=>{for(let d=0;dDy(n,"name",{value:o,configurable:!0});function Ro(n){const o=E.forwardRef((u,r)=>{let{children:d,...h}=u,g=null,y=!1;const N=[];hc(d)&&typeof ho=="function"&&(d=ho(d._payload)),E.Children.forEach(d,C=>{if(Yv(C)){y=!0;const H=C;let R="child"in H.props?H.props.child:H.props.children;hc(R)&&typeof ho=="function"&&(R=ho(R._payload)),g=Cy(H,R),N.push(g?.props?.children)}else N.push(C)}),g?g=E.cloneElement(g,void 0,N):!y&&E.Children.count(d)===1&&E.isValidElement(d)&&(g=d);const S=g?qv(g):void 0,O=Jl(r,S);if(!g){if(d||d===0)throw new Error(y?Oy(n):My(n));return d}const v=Lv(h,g.props??{});return g.type!==E.Fragment&&(v.ref=r?O:S),E.cloneElement(g,v)});return o.displayName=`${n}.Slot`,o}oa(Ro,"createSlot");var Oc=Ro("Slot"),Hv=Symbol.for("radix.slottable");function wy(n){const o=oa(u=>"child"in u?u.children(u.child):u.children,"Slottable");return o.displayName=`${n}.Slottable`,o.__radixId=Hv,o}oa(wy,"createSlottable");var Cy=oa((n,o)=>{if("child"in n.props){const u=n.props.child;return E.isValidElement(u)?E.cloneElement(u,void 0,n.props.children(u.props.children)):null}return E.isValidElement(o)?o:null},"getSlottableElementFromSlottable");function Lv(n,o){const u={...o};for(const r in o){const d=n[r],h=o[r];/^on[A-Z]/.test(r)?d&&h?u[r]=(...y)=>{const N=h(...y);return d(...y),N}:d&&(u[r]=d):r==="style"?u[r]={...d,...h}:r==="className"&&(u[r]=[d,h].filter(Boolean).join(" "))}return{...n,...u}}oa(Lv,"mergeProps");function qv(n){let o=Object.getOwnPropertyDescriptor(n.props,"ref")?.get,u=o&&"isReactWarning"in o&&o.isReactWarning;return u?n.ref:(o=Object.getOwnPropertyDescriptor(n,"ref")?.get,u=o&&"isReactWarning"in o&&o.isReactWarning,u?n.props.ref:n.props.ref||n.ref)}oa(qv,"getElementRef");function Yv(n){return E.isValidElement(n)&&typeof n.type=="function"&&"__radixId"in n.type&&n.type.__radixId===Hv}oa(Yv,"isSlottable");var _y=Symbol.for("react.lazy");function hc(n){return n!=null&&typeof n=="object"&&"$$typeof"in n&&n.$$typeof===_y&&"_payload"in n&&Gv(n._payload)}oa(hc,"isLazyComponent");function Gv(n){return typeof n=="object"&&n!==null&&"then"in n}oa(Gv,"isPromiseLike");var My=oa(n=>`${n} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),Oy=oa(n=>`${n} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),ho=Ji[" use ".trim().toString()];const Kh=n=>typeof n=="boolean"?`${n}`:n===0?"0":n,Jh=Nv,Vv=(n,o)=>u=>{var r;if(o?.variants==null)return Jh(n,u?.class,u?.className);const{variants:d,defaultVariants:h}=o,g=Object.keys(d).map(S=>{const O=u?.[S],v=h?.[S];if(O===null)return null;const C=Kh(O)||Kh(v);return d[S][C]}),y=u&&Object.entries(u).reduce((S,O)=>{let[v,C]=O;return C===void 0||(S[v]=C),S},{}),N=o==null||(r=o.compoundVariants)===null||r===void 0?void 0:r.reduce((S,O)=>{let{class:v,className:C,...H}=O;return Object.entries(H).every(R=>{let[U,k]=R;return Array.isArray(k)?k.includes({...h,...y}[U]):{...h,...y}[U]===k})?[...S,v,C]:S},[]);return Jh(n,g,N,u?.class,u?.className)},Ry=(n,o)=>{const u=new Array(n.length+o.length);for(let r=0;r({classGroupId:n,validator:o}),Xv=(n=new Map,o=null,u)=>({nextPart:n,validators:o,classGroupId:u}),Co="-",Fh=[],ky="arbitrary..",By=n=>{const o=Ly(n),{conflictingClassGroups:u,conflictingClassGroupModifiers:r}=n;return{getClassGroupId:g=>{if(g.startsWith("[")&&g.endsWith("]"))return Hy(g);const y=g.split(Co),N=y[0]===""&&y.length>1?1:0;return Qv(y,N,o)},getConflictingClassGroupIds:(g,y)=>{if(y){const N=r[g],S=u[g];return N?S?Ry(S,N):N:S||Fh}return u[g]||Fh}}},Qv=(n,o,u)=>{if(n.length-o===0)return u.classGroupId;const d=n[o],h=u.nextPart.get(d);if(h){const S=Qv(n,o+1,h);if(S)return S}const g=u.validators;if(g===null)return;const y=o===0?n.join(Co):n.slice(o).join(Co),N=g.length;for(let S=0;Sn.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const o=n.slice(1,-1),u=o.indexOf(":"),r=o.slice(0,u);return r?ky+r:void 0})(),Ly=n=>{const{theme:o,classGroups:u}=n;return qy(u,o)},qy=(n,o)=>{const u=Xv();for(const r in n){const d=n[r];Rc(d,u,r,o)}return u},Rc=(n,o,u,r)=>{const d=n.length;for(let h=0;h{if(typeof n=="string"){Gy(n,o,u);return}if(typeof n=="function"){Vy(n,o,u,r);return}Xy(n,o,u,r)},Gy=(n,o,u)=>{const r=n===""?o:Zv(o,n);r.classGroupId=u},Vy=(n,o,u,r)=>{if(Qy(n)){Rc(n(r),o,u,r);return}o.validators===null&&(o.validators=[]),o.validators.push(Uy(u,n))},Xy=(n,o,u,r)=>{const d=Object.entries(n),h=d.length;for(let g=0;g{let u=n;const r=o.split(Co),d=r.length;for(let h=0;h"isThemeGetter"in n&&n.isThemeGetter===!0,Zy=n=>{if(n<1)return{get:()=>{},set:()=>{}};let o=0,u=Object.create(null),r=Object.create(null);const d=(h,g)=>{u[h]=g,o++,o>n&&(o=0,r=u,u=Object.create(null))};return{get(h){let g=u[h];if(g!==void 0)return g;if((g=r[h])!==void 0)return d(h,g),g},set(h,g){h in u?u[h]=g:d(h,g)}}},vc="!",$h=":",Ky=[],Wh=(n,o,u,r,d)=>({modifiers:n,hasImportantModifier:o,baseClassName:u,maybePostfixModifierPosition:r,isExternal:d}),Jy=n=>{const{prefix:o,experimentalParseClassName:u}=n;let r=d=>{const h=[];let g=0,y=0,N=0,S;const O=d.length;for(let U=0;UN?S-N:void 0;return Wh(h,H,C,R)};if(o){const d=o+$h,h=r;r=g=>g.startsWith(d)?h(g.slice(d.length)):Wh(Ky,!1,g,void 0,!0)}if(u){const d=r;r=h=>u({className:h,parseClassName:d})}return r},Fy=n=>{const o=new Map;return n.orderSensitiveModifiers.forEach((u,r)=>{o.set(u,1e6+r)}),u=>{const r=[];let d=[];for(let h=0;h0&&(d.sort(),r.push(...d),d=[]),r.push(g)):d.push(g)}return d.length>0&&(d.sort(),r.push(...d)),r}},$y=n=>({cache:Zy(n.cacheSize),parseClassName:Jy(n),sortModifiers:Fy(n),postfixLookupClassGroupIds:Wy(n),...By(n)}),Wy=n=>{const o=Object.create(null),u=n.postfixLookupClassGroups;if(u)for(let r=0;r{const{parseClassName:u,getClassGroupId:r,getConflictingClassGroupIds:d,sortModifiers:h,postfixLookupClassGroupIds:g}=o,y=[],N=n.trim().split(Iy);let S="";for(let O=N.length-1;O>=0;O-=1){const v=N[O],{isExternal:C,modifiers:H,hasImportantModifier:R,baseClassName:U,maybePostfixModifierPosition:k}=u(v);if(C){S=v+(S.length>0?" "+S:S);continue}let G=!!k,Z;if(G){const fe=U.substring(0,k);Z=r(fe);const Y=Z&&g[Z]?r(U):void 0;Y&&Y!==Z&&(Z=Y,G=!1)}else Z=r(U);if(!Z){if(!G){S=v+(S.length>0?" "+S:S);continue}if(Z=r(U),!Z){S=v+(S.length>0?" "+S:S);continue}G=!1}const K=H.length===0?"":H.length===1?H[0]:h(H).join(":"),P=R?K+vc:K,ee=P+Z;if(y.indexOf(ee)>-1)continue;y.push(ee);const oe=d(Z,G);for(let fe=0;fe0?" "+S:S)}return S},e1=(...n)=>{let o=0,u,r,d="";for(;o{if(typeof n=="string")return n;let o,u="";for(let r=0;r{let u,r,d,h;const g=N=>{const S=o.reduce((O,v)=>v(O),n());return u=$y(S),r=u.cache.get,d=u.cache.set,h=y,y(N)},y=N=>{const S=r(N);if(S)return S;const O=Py(N,u);return d(N,O),O};return h=g,(...N)=>h(e1(...N))},a1=[],tt=n=>{const o=u=>u[n]||a1;return o.isThemeGetter=!0,o},Jv=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Fv=/^\((?:(\w[\w-]*):)?(.+)\)$/i,l1=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,n1=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,i1=/\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$/,s1=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,o1=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,u1=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,yl=n=>l1.test(n),de=n=>!!n&&!Number.isNaN(Number(n)),ha=n=>!!n&&Number.isInteger(Number(n)),nc=n=>n.endsWith("%")&&de(n.slice(0,-1)),La=n=>n1.test(n),$v=()=>!0,r1=n=>i1.test(n)&&!s1.test(n),Uc=()=>!1,c1=n=>o1.test(n),f1=n=>u1.test(n),d1=n=>!V(n)&&!X(n),m1=n=>n.startsWith("@container")&&(n[10]==="/"&&n[11]!==void 0||n[11]==="s"&&n[16]!==void 0&&n.startsWith("-size/",10)||n[11]==="n"&&n[18]!==void 0&&n.startsWith("-normal/",10)),h1=n=>Nl(n,Pv,Uc),V=n=>Jv.test(n),Kl=n=>Nl(n,eg,r1),Ih=n=>Nl(n,E1,de),v1=n=>Nl(n,ag,$v),g1=n=>Nl(n,tg,Uc),Ph=n=>Nl(n,Wv,Uc),p1=n=>Nl(n,Iv,f1),vo=n=>Nl(n,lg,c1),X=n=>Fv.test(n),Xi=n=>Fl(n,eg),b1=n=>Fl(n,tg),ev=n=>Fl(n,Wv),y1=n=>Fl(n,Pv),x1=n=>Fl(n,Iv),go=n=>Fl(n,lg,!0),S1=n=>Fl(n,ag,!0),Nl=(n,o,u)=>{const r=Jv.exec(n);return r?r[1]?o(r[1]):u(r[2]):!1},Fl=(n,o,u=!1)=>{const r=Fv.exec(n);return r?r[1]?o(r[1]):u:!1},Wv=n=>n==="position"||n==="percentage",Iv=n=>n==="image"||n==="url",Pv=n=>n==="length"||n==="size"||n==="bg-size",eg=n=>n==="length",E1=n=>n==="number",tg=n=>n==="family-name",ag=n=>n==="number"||n==="weight",lg=n=>n==="shadow",N1=()=>{const n=tt("color"),o=tt("font"),u=tt("text"),r=tt("font-weight"),d=tt("tracking"),h=tt("leading"),g=tt("breakpoint"),y=tt("container"),N=tt("spacing"),S=tt("radius"),O=tt("shadow"),v=tt("inset-shadow"),C=tt("text-shadow"),H=tt("drop-shadow"),R=tt("blur"),U=tt("perspective"),k=tt("aspect"),G=tt("ease"),Z=tt("animate"),K=()=>["auto","avoid","all","avoid-page","page","left","right","column"],P=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],ee=()=>[...P(),X,V],oe=()=>["auto","hidden","clip","visible","scroll"],fe=()=>["auto","contain","none"],Y=()=>[X,V,N],pe=()=>[yl,"full","auto",...Y()],mt=()=>[ha,"none","subgrid",X,V],ke=()=>["auto",{span:["full",ha,X,V]},ha,X,V],le=()=>[ha,"auto",X,V],it=()=>["auto","min","max","fr",X,V],Le=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],Re=()=>["start","end","center","stretch","center-safe","end-safe"],j=()=>["auto",...Y()],B=()=>[yl,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...Y()],F=()=>[yl,"screen","full","dvw","lvw","svw","min","max","fit",...Y()],se=()=>[yl,"screen","full","lh","dvh","lvh","svh","min","max","fit",...Y()],L=()=>[n,X,V],Ae=()=>[...P(),ev,Ph,{position:[X,V]}],be=()=>["no-repeat",{repeat:["","x","y","space","round"]}],ce=()=>["auto","cover","contain",y1,h1,{size:[X,V]}],W=()=>[nc,Xi,Kl],te=()=>["","none","full",S,X,V],ne=()=>["",de,Xi,Kl],qe=()=>["solid","dashed","dotted","double"],ht=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ae=()=>[de,nc,ev,Ph],Vt=()=>["","none",R,X,V],St=()=>["none",de,X,V],Et=()=>["none",de,X,V],Xt=()=>[de,X,V],vt=()=>[yl,"full",...Y()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[La],breakpoint:[La],color:[$v],container:[La],"drop-shadow":[La],ease:["in","out","in-out"],font:[d1],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[La],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[La],shadow:[La],spacing:["px",de],text:[La],"text-shadow":[La],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",yl,V,X,k]}],container:["container"],"container-type":[{"@container":["","normal","size",X,V]}],"container-named":[m1],columns:[{columns:[de,V,X,y]}],"break-after":[{"break-after":K()}],"break-before":[{"break-before":K()}],"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"],sr:["sr-only","not-sr-only"],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()}],overflow:[{overflow:oe()}],"overflow-x":[{"overflow-x":oe()}],"overflow-y":[{"overflow-y":oe()}],overscroll:[{overscroll:fe()}],"overscroll-x":[{"overscroll-x":fe()}],"overscroll-y":[{"overscroll-y":fe()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:pe()}],"inset-x":[{"inset-x":pe()}],"inset-y":[{"inset-y":pe()}],start:[{"inset-s":pe(),start:pe()}],end:[{"inset-e":pe(),end:pe()}],"inset-bs":[{"inset-bs":pe()}],"inset-be":[{"inset-be":pe()}],top:[{top:pe()}],right:[{right:pe()}],bottom:[{bottom:pe()}],left:[{left:pe()}],visibility:["visible","invisible","collapse"],z:[{z:[ha,"auto",X,V]}],basis:[{basis:[yl,"full","auto",y,...Y()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[de,yl,"auto","initial","none",V]}],grow:[{grow:["",de,X,V]}],shrink:[{shrink:["",de,X,V]}],order:[{order:[ha,"first","last","none",X,V]}],"grid-cols":[{"grid-cols":mt()}],"col-start-end":[{col:ke()}],"col-start":[{"col-start":le()}],"col-end":[{"col-end":le()}],"grid-rows":[{"grid-rows":mt()}],"row-start-end":[{row:ke()}],"row-start":[{"row-start":le()}],"row-end":[{"row-end":le()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":it()}],"auto-rows":[{"auto-rows":it()}],gap:[{gap:Y()}],"gap-x":[{"gap-x":Y()}],"gap-y":[{"gap-y":Y()}],"justify-content":[{justify:[...Le(),"normal"]}],"justify-items":[{"justify-items":[...Re(),"normal"]}],"justify-self":[{"justify-self":["auto",...Re()]}],"align-content":[{content:["normal",...Le()]}],"align-items":[{items:[...Re(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...Re(),{baseline:["","last"]}]}],"place-content":[{"place-content":Le()}],"place-items":[{"place-items":[...Re(),"baseline"]}],"place-self":[{"place-self":["auto",...Re()]}],p:[{p:Y()}],px:[{px:Y()}],py:[{py:Y()}],ps:[{ps:Y()}],pe:[{pe:Y()}],pbs:[{pbs:Y()}],pbe:[{pbe:Y()}],pt:[{pt:Y()}],pr:[{pr:Y()}],pb:[{pb:Y()}],pl:[{pl:Y()}],m:[{m:j()}],mx:[{mx:j()}],my:[{my:j()}],ms:[{ms:j()}],me:[{me:j()}],mbs:[{mbs:j()}],mbe:[{mbe:j()}],mt:[{mt:j()}],mr:[{mr:j()}],mb:[{mb:j()}],ml:[{ml:j()}],"space-x":[{"space-x":Y()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":Y()}],"space-y-reverse":["space-y-reverse"],size:[{size:B()}],"inline-size":[{inline:["auto",...F()]}],"min-inline-size":[{"min-inline":["auto",...F()]}],"max-inline-size":[{"max-inline":["none",...F()]}],"block-size":[{block:["auto",...se()]}],"min-block-size":[{"min-block":["auto",...se()]}],"max-block-size":[{"max-block":["none",...se()]}],w:[{w:[y,"screen",...B()]}],"min-w":[{"min-w":[y,"screen","none",...B()]}],"max-w":[{"max-w":[y,"screen","none","prose",{screen:[g]},...B()]}],h:[{h:["screen","lh",...B()]}],"min-h":[{"min-h":["screen","lh","none",...B()]}],"max-h":[{"max-h":["screen","lh",...B()]}],"font-size":[{text:["base",u,Xi,Kl]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[r,S1,v1]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",nc,V]}],"font-family":[{font:[b1,g1,o]}],"font-features":[{"font-features":[V]}],"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:[d,X,V]}],"line-clamp":[{"line-clamp":[de,"none",X,Ih]}],leading:[{leading:[h,...Y()]}],"list-image":[{"list-image":["none",X,V]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",X,V]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:L()}],"text-color":[{text:L()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...qe(),"wavy"]}],"text-decoration-thickness":[{decoration:[de,"from-font","auto",X,Kl]}],"text-decoration-color":[{decoration:L()}],"underline-offset":[{"underline-offset":[de,"auto",X,V]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:Y()}],"tab-size":[{tab:[ha,X,V]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",X,V]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",X,V]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:Ae()}],"bg-repeat":[{bg:be()}],"bg-size":[{bg:ce()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},ha,X,V],radial:["",X,V],conic:[ha,X,V]},x1,p1]}],"bg-color":[{bg:L()}],"gradient-from-pos":[{from:W()}],"gradient-via-pos":[{via:W()}],"gradient-to-pos":[{to:W()}],"gradient-from":[{from:L()}],"gradient-via":[{via:L()}],"gradient-to":[{to:L()}],rounded:[{rounded:te()}],"rounded-s":[{"rounded-s":te()}],"rounded-e":[{"rounded-e":te()}],"rounded-t":[{"rounded-t":te()}],"rounded-r":[{"rounded-r":te()}],"rounded-b":[{"rounded-b":te()}],"rounded-l":[{"rounded-l":te()}],"rounded-ss":[{"rounded-ss":te()}],"rounded-se":[{"rounded-se":te()}],"rounded-ee":[{"rounded-ee":te()}],"rounded-es":[{"rounded-es":te()}],"rounded-tl":[{"rounded-tl":te()}],"rounded-tr":[{"rounded-tr":te()}],"rounded-br":[{"rounded-br":te()}],"rounded-bl":[{"rounded-bl":te()}],"border-w":[{border:ne()}],"border-w-x":[{"border-x":ne()}],"border-w-y":[{"border-y":ne()}],"border-w-s":[{"border-s":ne()}],"border-w-e":[{"border-e":ne()}],"border-w-bs":[{"border-bs":ne()}],"border-w-be":[{"border-be":ne()}],"border-w-t":[{"border-t":ne()}],"border-w-r":[{"border-r":ne()}],"border-w-b":[{"border-b":ne()}],"border-w-l":[{"border-l":ne()}],"divide-x":[{"divide-x":ne()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":ne()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...qe(),"hidden","none"]}],"divide-style":[{divide:[...qe(),"hidden","none"]}],"border-color":[{border:L()}],"border-color-x":[{"border-x":L()}],"border-color-y":[{"border-y":L()}],"border-color-s":[{"border-s":L()}],"border-color-e":[{"border-e":L()}],"border-color-bs":[{"border-bs":L()}],"border-color-be":[{"border-be":L()}],"border-color-t":[{"border-t":L()}],"border-color-r":[{"border-r":L()}],"border-color-b":[{"border-b":L()}],"border-color-l":[{"border-l":L()}],"divide-color":[{divide:L()}],"outline-style":[{outline:[...qe(),"none","hidden"]}],"outline-offset":[{"outline-offset":[de,X,V]}],"outline-w":[{outline:["",de,Xi,Kl]}],"outline-color":[{outline:L()}],shadow:[{shadow:["","none",O,go,vo]}],"shadow-color":[{shadow:L()}],"inset-shadow":[{"inset-shadow":["none",v,go,vo]}],"inset-shadow-color":[{"inset-shadow":L()}],"ring-w":[{ring:ne()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:L()}],"ring-offset-w":[{"ring-offset":[de,Kl]}],"ring-offset-color":[{"ring-offset":L()}],"inset-ring-w":[{"inset-ring":ne()}],"inset-ring-color":[{"inset-ring":L()}],"text-shadow":[{"text-shadow":["none",C,go,vo]}],"text-shadow-color":[{"text-shadow":L()}],opacity:[{opacity:[de,X,V]}],"mix-blend":[{"mix-blend":[...ht(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":ht()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[de]}],"mask-image-linear-from-pos":[{"mask-linear-from":ae()}],"mask-image-linear-to-pos":[{"mask-linear-to":ae()}],"mask-image-linear-from-color":[{"mask-linear-from":L()}],"mask-image-linear-to-color":[{"mask-linear-to":L()}],"mask-image-t-from-pos":[{"mask-t-from":ae()}],"mask-image-t-to-pos":[{"mask-t-to":ae()}],"mask-image-t-from-color":[{"mask-t-from":L()}],"mask-image-t-to-color":[{"mask-t-to":L()}],"mask-image-r-from-pos":[{"mask-r-from":ae()}],"mask-image-r-to-pos":[{"mask-r-to":ae()}],"mask-image-r-from-color":[{"mask-r-from":L()}],"mask-image-r-to-color":[{"mask-r-to":L()}],"mask-image-b-from-pos":[{"mask-b-from":ae()}],"mask-image-b-to-pos":[{"mask-b-to":ae()}],"mask-image-b-from-color":[{"mask-b-from":L()}],"mask-image-b-to-color":[{"mask-b-to":L()}],"mask-image-l-from-pos":[{"mask-l-from":ae()}],"mask-image-l-to-pos":[{"mask-l-to":ae()}],"mask-image-l-from-color":[{"mask-l-from":L()}],"mask-image-l-to-color":[{"mask-l-to":L()}],"mask-image-x-from-pos":[{"mask-x-from":ae()}],"mask-image-x-to-pos":[{"mask-x-to":ae()}],"mask-image-x-from-color":[{"mask-x-from":L()}],"mask-image-x-to-color":[{"mask-x-to":L()}],"mask-image-y-from-pos":[{"mask-y-from":ae()}],"mask-image-y-to-pos":[{"mask-y-to":ae()}],"mask-image-y-from-color":[{"mask-y-from":L()}],"mask-image-y-to-color":[{"mask-y-to":L()}],"mask-image-radial":[{"mask-radial":[X,V]}],"mask-image-radial-from-pos":[{"mask-radial-from":ae()}],"mask-image-radial-to-pos":[{"mask-radial-to":ae()}],"mask-image-radial-from-color":[{"mask-radial-from":L()}],"mask-image-radial-to-color":[{"mask-radial-to":L()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":P()}],"mask-image-conic-pos":[{"mask-conic":[de]}],"mask-image-conic-from-pos":[{"mask-conic-from":ae()}],"mask-image-conic-to-pos":[{"mask-conic-to":ae()}],"mask-image-conic-from-color":[{"mask-conic-from":L()}],"mask-image-conic-to-color":[{"mask-conic-to":L()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:Ae()}],"mask-repeat":[{mask:be()}],"mask-size":[{mask:ce()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",X,V]}],filter:[{filter:["","none",X,V]}],blur:[{blur:Vt()}],brightness:[{brightness:[de,X,V]}],contrast:[{contrast:[de,X,V]}],"drop-shadow":[{"drop-shadow":["","none",H,go,vo]}],"drop-shadow-color":[{"drop-shadow":L()}],grayscale:[{grayscale:["",de,X,V]}],"hue-rotate":[{"hue-rotate":[de,X,V]}],invert:[{invert:["",de,X,V]}],saturate:[{saturate:[de,X,V]}],sepia:[{sepia:["",de,X,V]}],"backdrop-filter":[{"backdrop-filter":["","none",X,V]}],"backdrop-blur":[{"backdrop-blur":Vt()}],"backdrop-brightness":[{"backdrop-brightness":[de,X,V]}],"backdrop-contrast":[{"backdrop-contrast":[de,X,V]}],"backdrop-grayscale":[{"backdrop-grayscale":["",de,X,V]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[de,X,V]}],"backdrop-invert":[{"backdrop-invert":["",de,X,V]}],"backdrop-opacity":[{"backdrop-opacity":[de,X,V]}],"backdrop-saturate":[{"backdrop-saturate":[de,X,V]}],"backdrop-sepia":[{"backdrop-sepia":["",de,X,V]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":Y()}],"border-spacing-x":[{"border-spacing-x":Y()}],"border-spacing-y":[{"border-spacing-y":Y()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",X,V]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[de,"initial",X,V]}],ease:[{ease:["linear","initial",G,X,V]}],delay:[{delay:[de,X,V]}],animate:[{animate:["none",Z,X,V]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[U,X,V]}],"perspective-origin":[{"perspective-origin":ee()}],rotate:[{rotate:St()}],"rotate-x":[{"rotate-x":St()}],"rotate-y":[{"rotate-y":St()}],"rotate-z":[{"rotate-z":St()}],scale:[{scale:Et()}],"scale-x":[{"scale-x":Et()}],"scale-y":[{"scale-y":Et()}],"scale-z":[{"scale-z":Et()}],"scale-3d":["scale-3d"],skew:[{skew:Xt()}],"skew-x":[{"skew-x":Xt()}],"skew-y":[{"skew-y":Xt()}],transform:[{transform:[X,V,"","none","gpu","cpu"]}],"transform-origin":[{origin:ee()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:vt()}],"translate-x":[{"translate-x":vt()}],"translate-y":[{"translate-y":vt()}],"translate-z":[{"translate-z":vt()}],"translate-none":["translate-none"],zoom:[{zoom:[ha,X,V]}],accent:[{accent:L()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:L()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],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",X,V]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scrollbar-thumb-color":[{"scrollbar-thumb":L()}],"scrollbar-track-color":[{"scrollbar-track":L()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":Y()}],"scroll-mx":[{"scroll-mx":Y()}],"scroll-my":[{"scroll-my":Y()}],"scroll-ms":[{"scroll-ms":Y()}],"scroll-me":[{"scroll-me":Y()}],"scroll-mbs":[{"scroll-mbs":Y()}],"scroll-mbe":[{"scroll-mbe":Y()}],"scroll-mt":[{"scroll-mt":Y()}],"scroll-mr":[{"scroll-mr":Y()}],"scroll-mb":[{"scroll-mb":Y()}],"scroll-ml":[{"scroll-ml":Y()}],"scroll-p":[{"scroll-p":Y()}],"scroll-px":[{"scroll-px":Y()}],"scroll-py":[{"scroll-py":Y()}],"scroll-ps":[{"scroll-ps":Y()}],"scroll-pe":[{"scroll-pe":Y()}],"scroll-pbs":[{"scroll-pbs":Y()}],"scroll-pbe":[{"scroll-pbe":Y()}],"scroll-pt":[{"scroll-pt":Y()}],"scroll-pr":[{"scroll-pr":Y()}],"scroll-pb":[{"scroll-pb":Y()}],"scroll-pl":[{"scroll-pl":Y()}],"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",X,V]}],fill:[{fill:["none",...L()]}],"stroke-w":[{stroke:[de,Xi,Kl,Ih]}],stroke:[{stroke:["none",...L()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{"container-named":["container-type"],overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","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","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","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-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","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-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","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"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","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-pbs","scroll-pbe","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"]},postfixLookupClassGroups:["container-type"],orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},z1=t1(N1);function je(...n){return z1(Nv(n))}const T1=Vv("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive/10 text-destructive dark:bg-destructive/20",success:"border-transparent bg-success/10 text-success dark:bg-success/15",warning:"border-transparent bg-warning/15 text-warning",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function ba({className:n,variant:o,asChild:u=!1,...r}){const d=u?Oc:"span";return f.jsx(d,{"data-slot":"badge",className:je(T1({variant:o}),n),...r})}function dt(n){return n==null?"0":n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e4?`${(n/1e3).toFixed(1)}k`:Math.round(n).toLocaleString()}function gc(n){if(n==null||n<=0)return"0 B";const o=["B","KiB","MiB","GiB","TiB"];let u=0;for(;n>=1024&&u=100||u===0?0:1)} ${o[u]}`}function ng(n){if(n==null||n<0)return"–";const o=Math.floor(n);return o<60?`${o}s`:o<3600?`${Math.floor(o/60)}m ${o%60}s`:o<86400?`${Math.floor(o/3600)}h ${Math.floor(o%3600/60)}m`:`${Math.floor(o/86400)}d ${Math.floor(o%86400/3600)}h`}function ig(n){return n==null||n<.05?"0/s":n<10?`${n.toFixed(1)}/s`:`${dt(n)}/s`}function kc(n){if(!n)return"–";const o=(Date.now()-new Date(n).getTime())/1e3;return o<60?`${Math.max(0,Math.floor(o))}s ago`:o<3600?`${Math.floor(o/60)}m ago`:o<86400?`${Math.floor(o/3600)}h ago`:`${Math.floor(o/86400)}d ago`}const j1=[{id:"overview",label:"Overview",icon:dy},{id:"tables",label:"Tables",icon:kv},{id:"backfill",label:"Backfill",icon:Cc},{id:"dlq",label:"Dead letters",icon:_c}];function A1(){const o=document.documentElement.classList.toggle("dark");localStorage.setItem("gtc-theme",o?"dark":"light")}function D1({page:n,onNavigate:o,stats:u,offline:r=!1,dlqCount:d,title:h,description:g,actions:y,children:N}){return f.jsxs("div",{className:"flex min-h-screen",children:[f.jsxs("aside",{className:"bg-sidebar text-sidebar-foreground border-sidebar-border fixed inset-y-0 left-0 z-30 flex w-14 flex-col border-r lg:w-56",children:[f.jsxs("div",{className:"flex items-center justify-center gap-2.5 px-2 pt-5 pb-4 lg:justify-start lg:px-4",children:[f.jsx("div",{className:"flex size-8 shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-amber-400 to-orange-500 text-white shadow-sm",children:f.jsx(jy,{className:"size-4.5",fill:"currentColor",strokeWidth:0})}),f.jsxs("div",{className:"hidden leading-tight lg:block",children:[f.jsx("div",{className:"text-sm font-bold tracking-tight",children:"GTC"}),f.jsx("div",{className:"text-sidebar-foreground/60 text-[10px] font-medium tracking-wide uppercase",children:"Change Data Capture"})]})]}),f.jsx("nav",{className:"flex flex-1 flex-col gap-0.5 px-2 pt-2 lg:px-2.5",children:j1.map(({id:S,label:O,icon:v})=>f.jsxs("button",{type:"button",title:O,onClick:()=>o(S),className:je("relative flex cursor-pointer items-center justify-center gap-2.5 rounded-md px-2.5 py-2 text-[13px] font-medium transition-colors lg:justify-start",n===S?"bg-sidebar-accent text-sidebar-accent-foreground":"text-sidebar-foreground/65 hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground"),children:[f.jsx(v,{className:"size-4 shrink-0",strokeWidth:n===S?2.25:2}),f.jsx("span",{className:"hidden flex-1 text-left lg:block",children:O}),S==="dlq"&&d>0&&f.jsxs(f.Fragment,{children:[f.jsx(ba,{variant:"destructive",className:"hidden h-5 min-w-5 px-1.5 tabular-nums lg:inline-flex",children:d}),f.jsx("span",{className:"absolute top-1.5 right-1.5 size-1.5 rounded-full bg-red-500 lg:hidden"})]})]},S))}),f.jsxs("div",{className:"border-sidebar-border hidden space-y-3 border-t px-4 py-4 lg:block",children:[f.jsxs("div",{className:"text-sidebar-foreground/60 flex items-center justify-between text-xs",children:[f.jsxs("span",{className:"flex items-center gap-1.5",children:[f.jsx("span",{className:je("relative flex size-2 rounded-full",u?.streaming?"bg-emerald-500":"bg-red-500"),children:u?.streaming&&f.jsx("span",{className:"absolute inline-flex size-full animate-ping rounded-full bg-emerald-500 opacity-60"})}),u?.streaming?"Streaming":"Disconnected"]}),f.jsx("span",{className:"tabular-nums",children:u?`up ${ng(u.uptime_seconds)}`:""})]}),f.jsxs("div",{className:"text-sidebar-foreground/60 flex items-center gap-1 text-xs",children:[f.jsxs("a",{href:"/metrics",target:"_blank",rel:"noreferrer",className:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex items-center gap-1.5 rounded-md px-2 py-1",children:[f.jsx($b,{className:"size-3.5"})," Metrics"]}),f.jsxs("a",{href:"https://github.com/emoss08/gtc",target:"_blank",rel:"noreferrer",className:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex items-center gap-1.5 rounded-md px-2 py-1",children:[f.jsx(oy,{className:"size-3.5"})," GitHub"]}),f.jsxs("button",{type:"button",onClick:A1,className:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground ml-auto cursor-pointer rounded-md p-1.5","aria-label":"Toggle theme",children:[f.jsx(yy,{className:"size-3.5 dark:hidden"}),f.jsx(hy,{className:"hidden size-3.5 dark:block"})]})]})]})]}),f.jsxs("div",{className:"ml-14 flex min-w-0 flex-1 flex-col lg:ml-56",children:[r&&f.jsx("div",{className:"bg-destructive/90 sticky top-0 z-30 px-6 py-1.5 text-center text-xs font-medium text-white",children:"Cannot reach GTC — the data below may be stale. Retrying…"}),f.jsx("header",{className:"bg-background/80 sticky top-0 z-20 border-b backdrop-blur",children:f.jsxs("div",{className:"mx-auto flex h-14 w-full max-w-6xl items-center justify-between gap-4 px-6",children:[f.jsxs("div",{className:"min-w-0",children:[f.jsx("h1",{className:"truncate text-[15px] font-semibold tracking-tight",children:h}),f.jsx("p",{className:"text-muted-foreground truncate text-xs",children:g})]}),f.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[u&&f.jsxs(f.Fragment,{children:[f.jsxs(ba,{variant:"outline",className:"text-muted-foreground hidden font-mono text-[11px] sm:inline-flex",children:[f.jsx(Ov,{className:"size-3"}),u.current_lsn]}),f.jsx(ba,{variant:u.ready?"success":"warning",children:u.ready?"Ready":"Not ready"})]}),y]})]})}),f.jsx("main",{className:"mx-auto w-full max-w-6xl flex-1 px-6 py-6",children:N})]})]})}function ga({className:n,...o}){return f.jsx("div",{"data-slot":"card",className:je("bg-card text-card-foreground flex flex-col gap-4 rounded-xl border py-4 shadow-sm",n),...o})}function Xn({className:n,...o}){return f.jsx("div",{"data-slot":"card-header",className:je("flex items-center justify-between gap-2 px-4",n),...o})}function Qn({className:n,...o}){return f.jsx("div",{"data-slot":"card-title",className:je("text-sm leading-none font-semibold tracking-tight",n),...o})}function Qi({className:n,...o}){return f.jsx("div",{"data-slot":"card-description",className:je("text-muted-foreground text-xs",n),...o})}function Ya({className:n,...o}){return f.jsx("div",{"data-slot":"card-content",className:je("px-4",n),...o})}const w1=ya({name:Be(),healthy:To(),breaker_state:Te(),succeeded:Te(),failed:Te(),filtered:Te(),retries:Te(),errors_by_type:Sv(Be(),Te()).nullable().transform(n=>n??{})}),C1=ya({table:Be(),insert:Te(),update:Te(),delete:Te(),read:Te(),truncate:Te(),total:Te()}),_1=ya({schema:Be(),table:Be(),state:ub(["pending","running","done","skipped","failed"]),rows_copied:Te(),started_at:Be().optional().nullable(),completed_at:Be().optional().nullable(),error:Be().optional()}),M1=ya({uptime_seconds:Te(),version:Be().default("dev"),slot_name:Be().default(""),publication:Be().default(""),ready:To(),streaming:To(),current_lsn:Be(),wal_lag_bytes:Te(),inflight:Te(),events_total:Te(),operations:Sv(Be(),Te()).nullable().transform(n=>n??{}),sinks:Zi(w1),tables:Zi(C1),backfill:Zi(_1),dlq:ya({enabled:To(),entries:Te(),parked_total:Te().default(0),retried_total:Te().default(0)})}),O1=ya({interval_seconds:Te(),samples:Zi(ya({t:Te(),events_total:Te(),wal_lag_bytes:Te(),inflight:Te(),dlq_entries:Te()})).nullable().transform(n=>n??[])}),R1=ya({id:Be(),sink:Be(),schema:Be(),table:Be(),operation:Be(),lsn:Be(),error:Be(),attempts:Te(),first_failed_at:Be().optional(),last_failed_at:Be(),event:rb().optional()}),U1=ya({total:Te(),entries:Zi(R1).nullable().transform(n=>n??[])});async function $l(n,o){const u=await fetch(n,{headers:{"Content-Type":"application/json"},...o}),r=await u.json().catch(()=>({}));if(!u.ok)throw new Error(r.error??`${u.status} ${u.statusText}`);return r}const k1=async()=>M1.parse(await $l("/api/stats")),B1=async()=>O1.parse(await $l("/api/history")),H1=async(n=100)=>U1.parse(await $l(`/dlq?limit=${n}`)),L1=n=>$l("/dlq/retry",{method:"POST",body:JSON.stringify({id:n})}),q1=()=>$l("/dlq/retry",{method:"POST",body:JSON.stringify({all:!0})}),Y1=n=>$l("/dlq/discard",{method:"POST",body:JSON.stringify({id:n})}),G1=n=>$l("/backfill",{method:"POST",body:JSON.stringify(n?{table:n}:{all:!0})}),sg=2e3;function V1(){return Dc({queryKey:["stats"],queryFn:k1,refetchInterval:sg})}function X1(){const{data:n,isLoading:o}=Dc({queryKey:["history"],queryFn:B1,refetchInterval:5e3});return{points:E.useMemo(()=>{const r=n?.samples??[],d=[];for(let h=1;h0?Math.max(0,(y.events_total-g.events_total)/N):0;d.push({t:y.t,rate:S,walLag:y.wal_lag_bytes,inflight:y.inflight,dlq:y.dlq_entries})}return d},[n]),isLoading:o}}function Q1(){const[n,o]=E.useState(()=>document.documentElement.classList.contains("dark"));return E.useEffect(()=>{const u=new MutationObserver(()=>{o(document.documentElement.classList.contains("dark"))});return u.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>u.disconnect()},[]),n}function Z1(n=!0){return Dc({queryKey:["dlq"],queryFn:()=>H1(200),refetchInterval:sg,enabled:n})}const Bc={INSERT:"#10b981",UPDATE:"#0ea5e9",DELETE:"#ef4444",READ:"#8b5cf6",TRUNCATE:"#f59e0b"};function Uo(){const n=Q1();return{dark:n,grid:n?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",axis:n?"rgba(255,255,255,0.45)":"rgba(0,0,0,0.45)",tooltipBg:n?"#27272a":"#ffffff",tooltipText:n?"#fafafa":"#18181b",tooltipBorder:n?"rgba(255,255,255,0.12)":"rgba(0,0,0,0.1)"}}function _o(n){const o=new Date(n);return`${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}function ko(n){return{backgroundColor:n.tooltipBg,color:n.tooltipText,border:`1px solid ${n.tooltipBorder}`,borderRadius:8,fontSize:12,padding:"6px 10px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)"}}function K1({points:n}){const o=Uo();return f.jsx(zv,{width:"100%",height:220,children:f.jsxs(Tv,{data:n,margin:{top:8,right:8,bottom:0,left:-12},children:[f.jsx("defs",{children:f.jsxs("linearGradient",{id:"rateFill",x1:"0",y1:"0",x2:"0",y2:"1",children:[f.jsx("stop",{offset:"0%",stopColor:"#10b981",stopOpacity:.35}),f.jsx("stop",{offset:"100%",stopColor:"#10b981",stopOpacity:0})]})}),f.jsx(jv,{stroke:o.grid,vertical:!1}),f.jsx(Av,{dataKey:"t",tickFormatter:_o,stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,minTickGap:48}),f.jsx(Dv,{stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,tickFormatter:u=>dt(u),width:48}),f.jsx(wv,{contentStyle:ko(o),labelFormatter:u=>_o(Number(u)),formatter:u=>[ig(Number(u)),"events"]}),f.jsx(Cv,{type:"monotone",dataKey:"rate",stroke:"#10b981",strokeWidth:2,fill:"url(#rateFill)",isAnimationActive:!1})]})})}function J1({points:n}){const o=Uo();return f.jsx(zv,{width:"100%",height:140,children:f.jsxs(Tv,{data:n,margin:{top:8,right:8,bottom:0,left:8},children:[f.jsx("defs",{children:f.jsxs("linearGradient",{id:"lagFill",x1:"0",y1:"0",x2:"0",y2:"1",children:[f.jsx("stop",{offset:"0%",stopColor:"#f59e0b",stopOpacity:.3}),f.jsx("stop",{offset:"100%",stopColor:"#f59e0b",stopOpacity:0})]})}),f.jsx(jv,{stroke:o.grid,vertical:!1}),f.jsx(Av,{dataKey:"t",tickFormatter:_o,stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,minTickGap:48}),f.jsx(Dv,{stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,tickFormatter:u=>gc(u),width:64}),f.jsx(wv,{contentStyle:ko(o),labelFormatter:u=>_o(Number(u)),formatter:u=>[gc(Number(u)),"WAL lag"]}),f.jsx(Cv,{type:"monotone",dataKey:"walLag",stroke:"#f59e0b",strokeWidth:2,fill:"url(#lagFill)",isAnimationActive:!1})]})})}function F1({operations:n}){const o=Uo(),u=E.useMemo(()=>Object.entries(n).filter(([,d])=>d>0).sort((d,h)=>h[1]-d[1]).map(([d,h])=>({id:d,label:d,value:h})),[n]),r=u.reduce((d,h)=>d+h.value,0);return u.length===0?f.jsx("div",{className:"text-muted-foreground flex h-[200px] items-center justify-center text-sm",children:"No events yet."}):f.jsxs("div",{className:"relative h-[200px]",children:[f.jsx(wb,{data:u,margin:{top:12,right:12,bottom:12,left:12},innerRadius:.72,padAngle:1.5,cornerRadius:3,colors:d=>Bc[d.id]??"#71717a",enableArcLinkLabels:!1,enableArcLabels:!1,borderWidth:0,isInteractive:!0,animate:!1,tooltip:({datum:d})=>f.jsxs("div",{style:ko(o),className:"flex items-center gap-2 whitespace-nowrap",children:[f.jsx("span",{className:"size-2 rounded-full",style:{backgroundColor:d.color}}),d.id,": ",dt(d.value)," (",r>0?(d.value/r*100).toFixed(1):0,"%)"]})}),f.jsxs("div",{className:"pointer-events-none absolute inset-0 flex flex-col items-center justify-center",children:[f.jsx("div",{className:"text-xl font-semibold tabular-nums",children:dt(r)}),f.jsx("div",{className:"text-muted-foreground text-[11px]",children:"events"})]})]})}function $1({tables:n}){const o=Uo(),u=E.useMemo(()=>n.slice().sort((r,d)=>d.total-r.total).slice(0,8).reverse().map(r=>({table:r.table,INSERT:r.insert,UPDATE:r.update,DELETE:r.delete,READ:r.read,TRUNCATE:r.truncate})),[n]);return u.length===0?f.jsx("div",{className:"text-muted-foreground flex h-[220px] items-center justify-center text-sm",children:"No events yet."}):f.jsx("div",{style:{height:Math.max(180,u.length*34+40)},children:f.jsx(Cb,{data:u,keys:["INSERT","UPDATE","DELETE","READ","TRUNCATE"],indexBy:"table",layout:"horizontal",margin:{top:0,right:16,bottom:28,left:130},padding:.35,colors:({id:r})=>Bc[r]??"#71717a",borderRadius:2,enableLabel:!1,enableGridY:!1,enableGridX:!0,animate:!1,theme:{grid:{line:{stroke:o.grid}},axis:{ticks:{text:{fill:o.axis,fontSize:11}}}},axisBottom:{tickSize:0,tickPadding:8,format:r=>dt(Number(r))},axisLeft:{tickSize:0,tickPadding:8},tooltip:({id:r,value:d,indexValue:h,color:g})=>f.jsxs("div",{style:ko(o),className:"flex items-center gap-2 whitespace-nowrap",children:[f.jsx("span",{className:"size-2 rounded-full",style:{backgroundColor:g}}),h," · ",r,": ",dt(d)]})})})}function og(){return f.jsx("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]",children:Object.entries(Bc).map(([n,o])=>f.jsxs("span",{className:"flex items-center gap-1.5",children:[f.jsx("span",{className:"size-2 rounded-full",style:{backgroundColor:o}}),n]},n))})}function W1({className:n,...o}){return f.jsx("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:f.jsx("table",{"data-slot":"table",className:je("w-full caption-bottom text-sm",n),...o})})}function I1({className:n,...o}){return f.jsx("thead",{"data-slot":"table-header",className:je("[&_tr]:border-b",n),...o})}function P1({className:n,...o}){return f.jsx("tbody",{"data-slot":"table-body",className:je("[&_tr:last-child]:border-0",n),...o})}function ic({className:n,...o}){return f.jsx("tr",{"data-slot":"table-row",className:je("hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",n),...o})}function ex({className:n,...o}){return f.jsx("th",{"data-slot":"table-head",className:je("text-muted-foreground h-9 px-3 text-left align-middle text-xs font-medium whitespace-nowrap first:pl-4 last:pr-4",n),...o})}function tv({className:n,...o}){return f.jsx("td",{"data-slot":"table-cell",className:je("px-3 py-2.5 align-middle whitespace-nowrap first:pl-4 last:pr-4",n),...o})}function Bo({table:n,empty:o}){const u=n.getRowModel().rows,r=n.getAllLeafColumns().length;return f.jsxs(W1,{children:[f.jsx(I1,{children:n.getHeaderGroups().map(d=>f.jsx(ic,{className:"hover:bg-transparent",children:d.headers.map(h=>{const g=h.column.getCanSort(),y=h.column.getIsSorted();return f.jsx(ex,{children:h.isPlaceholder?null:g?f.jsxs("button",{type:"button",className:je("inline-flex cursor-pointer items-center gap-1 select-none hover:text-foreground",y&&"text-foreground"),onClick:h.column.getToggleSortingHandler(),children:[f.jsx(Pr,{header:h}),y==="asc"?f.jsx(Jb,{className:"size-3"}):y==="desc"?f.jsx(Zb,{className:"size-3"}):f.jsx(Ib,{className:"size-3 opacity-50"})]}):f.jsx(Pr,{header:h})},h.id)})},d.id))}),f.jsx(P1,{children:u.length===0?f.jsx(ic,{className:"hover:bg-transparent",children:f.jsx(tv,{colSpan:r,className:"h-28 text-center whitespace-normal",children:o??f.jsx("span",{className:"text-muted-foreground text-sm",children:"No results."})})}):u.map(d=>f.jsx(ic,{children:d.getAllCells().map(h=>f.jsx(tv,{children:f.jsx(Pr,{cell:h})},h.id))},d.id))})]})}function po({label:n,value:o,sub:u,icon:r,tone:d="default",children:h}){return f.jsx(ga,{className:"gap-0 py-4",children:f.jsxs("div",{className:"flex items-start justify-between gap-3 px-4",children:[f.jsxs("div",{className:"min-w-0",children:[f.jsxs("div",{className:"text-muted-foreground flex items-center gap-1.5 text-xs font-medium",children:[f.jsx(r,{className:"size-3.5"}),n]}),f.jsx("div",{className:je("mt-1.5 truncate text-2xl font-semibold tracking-tight tabular-nums",d==="danger"&&"text-destructive",d==="success"&&"text-success"),children:o}),u&&f.jsx("div",{className:"text-muted-foreground mt-0.5 truncate text-xs",children:u})]}),h]})})}const Ho=cb({rowSortingFeature:bb,sortedRowModel:xb(),sortFns:{alphanumeric:pb,basic:gb,text:vb,datetime:hb},columnFilteringFeature:mb,globalFilteringFeature:db,filteredRowModel:yb(),filterFns:{includesString:fb}}),av={0:{label:"closed",variant:"success"},1:{label:"half-open",variant:"warning"},2:{label:"open",variant:"destructive"}};function tx(n){const o=Object.entries(n).sort((u,r)=>r[1]-u[1]).map(([u,r])=>`${u}: ${dt(r)}`);return o.length>0?`errors — ${o.join(", ")}`:""}const ax=[{accessorKey:"name",header:"Sink",sortFn:"text",cell:({row:n})=>f.jsxs("span",{className:"flex items-center gap-2 font-medium",children:[f.jsx("span",{className:n.original.healthy?"size-1.5 rounded-full bg-emerald-500":"size-1.5 rounded-full bg-red-500"}),n.original.name]})},{accessorKey:"breaker_state",header:"Breaker",sortFn:"basic",cell:({getValue:n})=>{const o=av[n()]??av[0];return f.jsx(ba,{variant:o.variant,children:o.label})}},{accessorKey:"succeeded",header:()=>f.jsx("span",{className:"block text-right",children:"Delivered"}),sortFn:"basic",cell:({getValue:n})=>f.jsx("span",{className:"text-success block text-right tabular-nums",children:dt(n())})},{accessorKey:"failed",header:()=>f.jsx("span",{className:"block text-right",children:"Failed"}),sortFn:"basic",cell:({row:n,getValue:o})=>{const u=o();return f.jsx("span",{className:`block text-right tabular-nums ${u>0?"text-destructive":"text-muted-foreground"}`,title:tx(n.original.errors_by_type),children:dt(u)})}},{accessorKey:"retries",header:()=>f.jsx("span",{className:"block text-right",children:"Retries"}),sortFn:"basic",cell:({getValue:n})=>f.jsx("span",{className:"text-muted-foreground block text-right tabular-nums",children:dt(n())})},{accessorKey:"filtered",header:()=>f.jsx("span",{className:"block text-right",children:"Filtered"}),sortFn:"basic",cell:({getValue:n})=>f.jsx("span",{className:"text-muted-foreground block text-right tabular-nums",children:dt(n())})}];function xl({label:n,value:o}){return f.jsxs("div",{className:"flex items-center justify-between gap-3 text-xs",children:[f.jsx("span",{className:"text-muted-foreground shrink-0",children:n}),f.jsx("span",{className:"truncate text-right font-medium",children:o})]})}function lx({stats:n}){const{points:o}=X1(),u=E.useMemo(()=>n?.sinks??[],[n]),r=o.length>0?o[o.length-1].rate:0,d=Mo({features:Ho,columns:ax,data:u}),h=n?.dlq.entries??0;return f.jsxs("div",{className:"space-y-4",children:[f.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:[f.jsx(po,{label:"Throughput",value:ig(r),sub:`${dt(n?.events_total)} events total`,icon:Ov}),f.jsx(po,{label:"WAL lag",value:gc(n?.wal_lag_bytes),sub:n?.streaming?"replication live":"replication down",icon:iy}),f.jsx(po,{label:"In flight",value:String(n?.inflight??0),sub:"events being processed",icon:cy}),f.jsx(po,{label:"Dead letters",value:String(h),sub:n?.dlq.enabled?`${dt(n.dlq.parked_total)} parked · ${dt(n.dlq.retried_total)} retried all-time`:"DLQ disabled",icon:_c,tone:h>0?"danger":"default"})]}),f.jsxs("div",{className:"grid gap-4 xl:grid-cols-3",children:[f.jsxs(ga,{className:"gap-2 xl:col-span-2",children:[f.jsx(Xn,{children:f.jsxs("div",{children:[f.jsx(Qn,{children:"Throughput"}),f.jsx(Qi,{className:"mt-1",children:"Events per second · last 30 minutes"})]})}),f.jsx(Ya,{className:"pr-2",children:f.jsx(K1,{points:o})})]}),f.jsxs(ga,{className:"gap-2",children:[f.jsx(Xn,{children:f.jsxs("div",{children:[f.jsx(Qn,{children:"Operation mix"}),f.jsx(Qi,{className:"mt-1",children:"All events since start"})]})}),f.jsxs(Ya,{children:[f.jsx(F1,{operations:n?.operations??{}}),f.jsx("div",{className:"mt-2 flex justify-center",children:f.jsx(og,{})})]})]})]}),f.jsxs("div",{className:"grid gap-4 xl:grid-cols-3",children:[f.jsxs(ga,{className:"gap-2 xl:col-span-2",children:[f.jsx(Xn,{children:f.jsxs("div",{children:[f.jsx(Qn,{children:"Replication lag"}),f.jsx(Qi,{className:"mt-1",children:"WAL bytes between the server and the last confirmed position — sustained growth means a sink can't keep up"})]})}),f.jsx(Ya,{className:"pr-2",children:f.jsx(J1,{points:o})})]}),f.jsxs(ga,{className:"gap-2",children:[f.jsx(Xn,{children:f.jsx(Qn,{children:"Instance"})}),f.jsxs(Ya,{className:"space-y-2.5",children:[f.jsx(xl,{label:"Version",value:n?.version??"–"}),f.jsx(xl,{label:"Status",value:f.jsxs("span",{className:"flex items-center justify-end gap-1.5",children:[f.jsx(ba,{variant:n?.streaming?"success":"destructive",children:n?.streaming?"streaming":"disconnected"}),f.jsx(ba,{variant:n?.ready?"success":"warning",children:n?.ready?"ready":"not ready"})]})}),f.jsx(xl,{label:"Uptime",value:ng(n?.uptime_seconds)}),f.jsx(xl,{label:"Current LSN",value:f.jsx("span",{className:"font-mono text-[11px]",children:n?.current_lsn??"–"})}),f.jsx(xl,{label:"Slot",value:f.jsx("span",{className:"font-mono text-[11px]",children:n?.slot_name||"–"})}),f.jsx(xl,{label:"Publication",value:f.jsx("span",{className:"font-mono text-[11px]",children:n?.publication||"–"})}),f.jsx(xl,{label:"Tables observed",value:String(n?.tables.length??0)}),f.jsx(xl,{label:"Dead-letter queue",value:n?.dlq.enabled?`${h} parked`:"disabled"})]})]})]}),f.jsxs(ga,{className:"gap-3",children:[f.jsxs(Xn,{children:[f.jsxs("div",{children:[f.jsx(Qn,{children:"Sinks"}),f.jsx(Qi,{className:"mt-1",children:"Delivery state per destination — the circuit breaker opens while a sink is down. Hover a failure count for the error breakdown."})]}),f.jsxs(ba,{variant:"outline",className:"text-muted-foreground",children:[f.jsx(Xb,{className:"size-3"}),u.length," active"]})]}),f.jsx(Ya,{className:"px-0",children:f.jsx(Bo,{table:d,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(ey,{className:"size-5"}),"No sinks configured — set REDIS_URL, REDIS_JSON_URL, or MEILISEARCH_URL."]})})})]})]})}function Hc({className:n,type:o,...u}){return f.jsx("input",{type:o,"data-slot":"input",className:je("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",n),...u})}function bo(n,o){return f.jsx("span",{className:`block text-right tabular-nums ${n>0?o:"text-muted-foreground/50"}`,children:dt(n)})}function nx(n){return[{accessorKey:"table",header:"Table",sortFn:"text",cell:({getValue:o})=>f.jsx("span",{className:"font-medium",children:o()})},{accessorKey:"insert",header:()=>f.jsx("span",{className:"block text-right",children:"Inserts"}),sortFn:"basic",cell:({getValue:o})=>bo(o(),"text-emerald-600 dark:text-emerald-400")},{accessorKey:"update",header:()=>f.jsx("span",{className:"block text-right",children:"Updates"}),sortFn:"basic",cell:({getValue:o})=>bo(o(),"text-sky-600 dark:text-sky-400")},{accessorKey:"delete",header:()=>f.jsx("span",{className:"block text-right",children:"Deletes"}),sortFn:"basic",cell:({getValue:o})=>bo(o(),"text-red-600 dark:text-red-400")},{accessorKey:"read",header:()=>f.jsx("span",{className:"block text-right",children:"Backfill reads"}),sortFn:"basic",cell:({getValue:o})=>bo(o(),"text-violet-600 dark:text-violet-400")},{accessorKey:"total",header:()=>f.jsx("span",{className:"block text-right",children:"Total"}),sortFn:"basic",cell:({getValue:o})=>{const u=o(),r=n>0?u/n*100:0;return f.jsxs("div",{className:"flex items-center justify-end gap-2",children:[f.jsx("span",{className:"font-medium tabular-nums",children:dt(u)}),f.jsx("span",{className:"bg-muted relative h-1.5 w-16 overflow-hidden rounded-full",children:f.jsx("span",{className:"bg-primary/70 absolute inset-y-0 left-0 rounded-full",style:{width:`${Math.max(2,r)}%`}})})]})}}]}function ix({stats:n}){const[o,u]=E.useState(""),r=E.useMemo(()=>n?.tables??[],[n]),d=E.useMemo(()=>nx(n?.events_total??0),[n?.events_total]),h=Mo({features:Ho,columns:d,data:r,globalFilterFn:"includesString",initialState:{sorting:[{id:"total",desc:!0}]},state:{globalFilter:o}});return f.jsxs("div",{className:"space-y-4",children:[r.length>0&&f.jsxs(ga,{className:"gap-2",children:[f.jsxs(Xn,{children:[f.jsxs("div",{children:[f.jsx(Qn,{children:"Busiest tables"}),f.jsxs(Qi,{className:"mt-1",children:["Top ",Math.min(8,r.length)," tables by change volume, stacked by operation"]})]}),f.jsx(og,{})]}),f.jsx(Ya,{className:"pr-2",children:f.jsx($1,{tables:r})})]}),f.jsxs("div",{className:"relative max-w-xs",children:[f.jsx(Uv,{className:"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2"}),f.jsx(Hc,{placeholder:"Filter tables…",value:o,onChange:g=>u(g.target.value),className:"h-8 pl-8 text-sm"})]}),f.jsx(ga,{className:"py-0",children:f.jsx(Ya,{className:"px-0",children:f.jsx(Bo,{table:h,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(kv,{className:"size-5"}),"No change events observed yet."]})})})})]})}const lv=(n,o,u)=>{if(n&&"reportValidity"in n){const r=dc(u,o);n.setCustomValidity(r&&r.message||""),n.reportValidity()}},pc=(n,o)=>{for(const u in o.fields){const r=o.fields[u];r&&r.ref&&"reportValidity"in r.ref?lv(r.ref,u,n):r&&r.refs&&r.refs.forEach(d=>lv(d,u,n))}},nv=(n,o)=>{o.shouldUseNativeValidation&&pc(n,o);const u={};for(const r in n){const d=dc(o.fields,r),h=Object.assign(n[r]||{},{ref:d&&d.refs?d.refs[0]:d&&d.ref});if(sx(o.names||Object.keys(n),r)){const g=Object.assign({},dc(u,r));ec(g,"root",h),ec(u,r,g)}else ec(u,r,h)}return u},sx=(n,o)=>{const u=iv(o).replace(/[.*+?^${}()|\\]/g,"\\$&");return n.some(r=>iv(r).match(`^${u}\\.\\d+`))};function iv(n){return n.replace(/[\[\]]/g,"")}function bc(){return bc=Object.assign?Object.assign.bind():function(n){for(var o=1;o0){var N,S,O=d.errors.reduce(function(H,R){return R.length"u")return;let o=document.head||document.getElementsByTagName("head")[0],u=document.createElement("style");u.type="text/css",o.appendChild(u),u.styleSheet?u.styleSheet.cssText=n:u.appendChild(document.createTextNode(n))}const fx=n=>{switch(n){case"success":return hx;case"info":return gx;case"warning":return vx;case"error":return px;default:return null}},dx=Array(12).fill(0),mx=({visible:n,className:o})=>q.createElement("div",{className:["sonner-loading-wrapper",o].filter(Boolean).join(" "),"data-visible":n},q.createElement("div",{className:"sonner-spinner"},dx.map((u,r)=>q.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${r}`})))),hx=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),vx=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),gx=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),px=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),bx=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true"},q.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),q.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),yx=()=>{const[n,o]=q.useState(document.hidden);return q.useEffect(()=>{const u=()=>{o(document.hidden)};return document.addEventListener("visibilitychange",u),()=>document.removeEventListener("visibilitychange",u)},[]),n};let xx=1;const Sx=100,ov=n=>{var o;return typeof n?.id=="number"||(n==null||(o=n.id)==null?void 0:o.length)>0?n.id:xx++};class Ex{constructor(){this.subscribe=o=>(this.subscribers.push(o),this.getActiveToasts().forEach(u=>o(u)),()=>{const u=this.subscribers.indexOf(o);this.subscribers.splice(u,1)}),this.publish=o=>{this.subscribers.forEach(u=>u(o))},this.addToast=o=>{this.publish(o),this.toasts=[...this.toasts,o],this.trimHistory()},this.trimHistory=()=>{let o=this.toasts.length-Sx;o<=0||(this.toasts=this.toasts.filter(u=>o>0&&this.dismissedToasts.has(u.id)?(this.dismissedToasts.delete(u.id),o--,!1):!0))},this.create=o=>{const{message:u,...r}=o,d=ov(o),h=this.pendingDismissals.get(d);h!==void 0&&(cancelAnimationFrame(h),this.pendingDismissals.delete(d),this.dismissedToasts.delete(d));const g=this.dismissedToasts.has(d),y=o.dismissible===void 0?!0:o.dismissible;return g&&(this.dismissedToasts.delete(d),this.toasts=this.toasts.filter(S=>S.id!==d)),(g?void 0:this.toasts.find(S=>S.id===d))?this.toasts=this.toasts.map(S=>S.id===d?(this.publish({...S,...o,id:d,title:u}),{...S,...o,id:d,dismissible:y,title:u}):S):this.addToast({title:u,...r,dismissible:y,id:d}),d},this.dismiss=o=>{if(o==null)return this.getActiveToasts().forEach(r=>{this.dismissedToasts.add(r.id),this.subscribers.forEach(d=>d({id:r.id,dismiss:!0}))}),o;this.dismissedToasts.add(o);const u=this.pendingDismissals.get(o);return u!==void 0&&cancelAnimationFrame(u),this.pendingDismissals.set(o,requestAnimationFrame(()=>{this.pendingDismissals.delete(o),this.subscribers.forEach(r=>r({id:o,dismiss:!0}))})),o},this.message=(o,u)=>this.create({...u,message:o,type:void 0}),this.error=(o,u)=>this.create({...u,message:o,type:"error"}),this.success=(o,u)=>this.create({...u,type:"success",message:o}),this.info=(o,u)=>this.create({...u,type:"info",message:o}),this.warning=(o,u)=>this.create({...u,type:"warning",message:o}),this.loading=(o,u)=>this.create({...u,type:"loading",message:o}),this.promise=(o,u)=>{if(!u)return;let r;u.loading!==void 0&&(r=this.create({...u,promise:o,type:"loading",message:u.loading,description:typeof u.description!="function"?u.description:void 0}));const d=Promise.resolve(o instanceof Function?o():o);let h=r!==void 0,g;const y=d.then(async S=>{if(g=["resolve",S],q.isValidElement(S))h=!1,this.create({id:r,type:"default",message:S});else if(zx(S)&&!S.ok){h=!1;const v=typeof u.error=="function"?await u.error(`HTTP error! status: ${S.status}`):u.error,C=typeof u.description=="function"?await u.description(`HTTP error! status: ${S.status}`):u.description,R=typeof v=="object"&&!q.isValidElement(v)?v:{message:v};this.create({id:r,type:"error",description:C,...R})}else if(S instanceof Error){h=!1;const v=typeof u.error=="function"?await u.error(S):u.error,C=typeof u.description=="function"?await u.description(S):u.description,R=typeof v=="object"&&!q.isValidElement(v)?v:{message:v};this.create({id:r,type:"error",description:C,...R})}else if(u.success!==void 0){h=!1;const v=typeof u.success=="function"?await u.success(S):u.success,C=typeof u.description=="function"?await u.description(S):u.description,R=typeof v=="object"&&!q.isValidElement(v)?v:{message:v};this.create({id:r,type:"success",description:C,...R})}}).catch(async S=>{if(g=["reject",S],u.error!==void 0){h=!1;const O=typeof u.error=="function"?await u.error(S):u.error,v=typeof u.description=="function"?await u.description(S):u.description,H=typeof O=="object"&&!q.isValidElement(O)?O:{message:O};this.create({id:r,type:"error",description:v,...H})}}).finally(()=>{h&&(this.dismiss(r),r=void 0),u.finally==null||u.finally.call(u)}),N=()=>new Promise((S,O)=>y.then(()=>g[0]==="reject"?O(g[1]):S(g[1])).catch(O));return typeof r!="string"&&typeof r!="number"?{unwrap:N}:Object.assign(r,{unwrap:N})},this.custom=(o,u)=>{const r=ov(u);return this.create({...u,jsx:o(r),id:r,type:void 0}),r},this.getActiveToasts=()=>this.toasts.filter(o=>!this.dismissedToasts.has(o.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set,this.pendingDismissals=new Map}}const _t=new Ex,Nx=(n,o)=>_t.message(n,o),zx=n=>n&&typeof n=="object"&&"ok"in n&&typeof n.ok=="boolean"&&"status"in n&&typeof n.status=="number",Tx=Nx,jx=()=>_t.toasts,Ax=()=>_t.getActiveToasts(),Sl=Object.assign(Tx,{success:_t.success,info:_t.info,warning:_t.warning,error:_t.error,custom:_t.custom,message:_t.message,promise:_t.promise,dismiss:_t.dismiss,loading:_t.loading},{getHistory:jx,getToasts:Ax});cx("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--normal-text);background:var(--normal-bg);border:1px solid var(--normal-border);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{-webkit-user-select:none;user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function yo(n){return n.label!==void 0}const Dx=3,wx="24px",Cx="16px",uv=4e3,_x=356,Mx=14,Ox=45,Rx=200;function va(...n){return n.filter(Boolean).join(" ")}function Ux(n){const[o,u]=n.split("-"),r=[];return o&&r.push(o),u&&r.push(u),r}const kx=n=>{var o,u,r,d,h,g,y,N,S;const{invert:O,toast:v,unstyled:C,interacting:H,setHeights:R,visibleToasts:U,heights:k,index:G,toasts:Z,expanded:K,removeToast:P,defaultRichColors:ee,closeButton:oe,style:fe,cancelButtonStyle:Y,actionButtonStyle:pe,className:mt="",descriptionClassName:ke="",duration:le,position:it,gap:Le,expandByDefault:Re,classNames:j,icons:B,closeButtonAriaLabel:F="Close toast"}=n,[se,L]=q.useState(null),[Ae,be]=q.useState(null),[ce,W]=q.useState(!1),[te,ne]=q.useState(!1),[qe,ht]=q.useState(!1),[ae,Vt]=q.useState(!1),[St,Et]=q.useState(!1),[Xt,vt]=q.useState(0),[$n,Wl]=q.useState(0),zl=q.useRef(v.duration||le||uv),Wn=q.useRef(null),Mt=q.useRef(null),In=G===0,Pn=G+1<=U,st=v.type,$i=st??"default",Ze=v.dismissible!==!1,Go=v.className||"",Wi=v.descriptionClassName||"",Tl=q.useMemo(()=>k.findIndex(ie=>ie.toastId===v.id)||0,[k,v.id]),Il=q.useMemo(()=>{var ie;return(ie=v.closeButton)!=null?ie:oe},[v.closeButton,oe]),Ii=q.useMemo(()=>v.duration||le||uv,[v.duration,le]),Pl=q.useRef(0),Za=q.useRef(0),Pi=q.useRef(0),Qt=q.useRef(null),[pt,ra]=it.split("-"),gt=q.useMemo(()=>k.reduce((ie,Ve,Ke)=>Ke>=Tl?ie:ie+Ve.height,0),[k,Tl]),es=yx(),Zt=q.useMemo(()=>{var ie;return(ie=n.swipeDirections)!=null?ie:Ux(it)},[n.swipeDirections,it]),Vo=v.invert||O,Ka=st==="loading";Za.current=q.useMemo(()=>Tl*Le+gt,[Tl,gt]),q.useEffect(()=>{zl.current=Ii},[Ii]),q.useEffect(()=>{W(!0)},[]),q.useEffect(()=>{const ie=Mt.current;if(ie){const Ve=ie.getBoundingClientRect().height;return Wl(Ve),R(Ke=>[{toastId:v.id,height:Ve,position:v.position},...Ke]),()=>R(Ke=>Ke.filter(Je=>Je.toastId!==v.id))}},[R,v.id]),q.useLayoutEffect(()=>{if(!ce)return;const ie=Mt.current,Ve=ie.style.height;ie.style.height="auto";const Ke=ie.getBoundingClientRect().height;ie.style.height=Ve,Wl(Ke),R(Je=>Je.find(Fe=>Fe.toastId===v.id)?Je.map(Fe=>Fe.toastId===v.id?{...Fe,height:Ke}:Fe):[{toastId:v.id,height:Ke,position:v.position},...Je])},[ce,v.title,v.description,R,v.id,v.jsx,v.action,v.cancel]);const Ot=q.useCallback(()=>{ne(!0),vt(Za.current),R(ie=>ie.filter(Ve=>Ve.toastId!==v.id)),setTimeout(()=>{P(v)},Rx)},[v,P,R,Za]);q.useEffect(()=>{if(v.promise&&st==="loading"||v.duration===1/0||v.type==="loading")return;let ie;return K||H||es?(()=>{if(Pi.current{v.onAutoClose==null||v.onAutoClose.call(v,v),Ot()},zl.current)),()=>clearTimeout(ie)},[K,H,v,st,es,Ot]),q.useEffect(()=>{v.delete&&(Ot(),v.onDismiss==null||v.onDismiss.call(v,v))},[Ot,v.delete]);function jl(){var ie;if(B?.loading){var Ve;return q.createElement("div",{className:va(j?.loader,v==null||(Ve=v.classNames)==null?void 0:Ve.loader,"sonner-loader"),"data-visible":st==="loading"},B.loading)}return q.createElement(mx,{className:va(j?.loader,v==null||(ie=v.classNames)==null?void 0:ie.loader),visible:st==="loading"})}const xa=v.icon||B?.[st]||fx(st);var Al,Ja;return q.createElement("li",{tabIndex:0,ref:Mt,className:va(mt,Go,j?.toast,v==null||(o=v.classNames)==null?void 0:o.toast,j?.[$i],v==null||(u=v.classNames)==null?void 0:u[$i]),"data-sonner-toast":"","data-rich-colors":(Al=v.richColors)!=null?Al:ee,"data-styled":!(v.jsx||v.unstyled||C),"data-mounted":ce,"data-promise":!!v.promise,"data-swiped":St,"data-removed":te,"data-visible":Pn,"data-y-position":pt,"data-x-position":ra,"data-index":G,"data-front":In,"data-swiping":qe,"data-dismissible":Ze,"data-type":st,"data-invert":Vo,"data-swipe-out":ae,"data-swipe-direction":Ae,"data-expanded":!!(K||Re&&ce),"data-testid":v.testId,style:{"--index":G,"--toasts-before":G,"--z-index":Z.length-G,"--offset":`${te?Xt:Za.current}px`,"--initial-height":Re?"auto":`${$n}px`,...fe,...v.style},onDragEnd:()=>{ht(!1),L(null),Qt.current=null},onPointerDown:ie=>{ie.button!==2&&(Ka||!Ze||(Wn.current=new Date,vt(Za.current),ie.target.setPointerCapture(ie.pointerId),ie.target.tagName!=="BUTTON"&&(ht(!0),Qt.current={x:ie.clientX,y:ie.clientY})))},onPointerUp:()=>{var ie,Ve,Ke;if(ae||!Ze)return;Qt.current=null;const Je=Number(((ie=Mt.current)==null?void 0:ie.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),Dl=Number(((Ve=Mt.current)==null?void 0:Ve.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),Fe=new Date().getTime()-((Ke=Wn.current)==null?void 0:Ke.getTime()),bt=se==="x"?Je:Dl,Rt=Math.abs(bt)/Fe;if((se==="x"?Zt.includes(Je>0?"right":"left"):Zt.includes(Dl>0?"bottom":"top"))&&(Math.abs(bt)>=Ox||Rt>.11)){vt(Za.current),v.onDismiss==null||v.onDismiss.call(v,v),be(se==="x"?Je>0?"right":"left":Dl>0?"down":"up"),Ot(),Vt(!0);return}else{var Nt,en;(Nt=Mt.current)==null||Nt.style.setProperty("--swipe-amount-x","0px"),(en=Mt.current)==null||en.style.setProperty("--swipe-amount-y","0px")}Et(!1),ht(!1),L(null)},onPointerMove:ie=>{var Ve,Ke,Je;if(!Qt.current||!Ze||((Ve=window.getSelection())==null?void 0:Ve.toString().length)>0)return;const Fe=ie.clientY-Qt.current.y,bt=ie.clientX-Qt.current.x;!se&&(Math.abs(bt)>1||Math.abs(Fe)>1)&&L(Math.abs(bt)>Math.abs(Fe)?"x":"y");let Rt={x:0,y:0};const wl=Nt=>1/(1.5+Math.abs(Nt)/20);if(se==="y"){if(Zt.includes("top")||Zt.includes("bottom"))if(Zt.includes("top")&&Fe<0||Zt.includes("bottom")&&Fe>0)Rt.y=Fe;else{const Nt=Fe*wl(Fe);Rt.y=Math.abs(Nt)0)Rt.x=bt;else{const Nt=bt*wl(bt);Rt.x=Math.abs(Nt)0||Math.abs(Rt.y)>0)&&Et(!0),(Ke=Mt.current)==null||Ke.style.setProperty("--swipe-amount-x",`${Rt.x}px`),(Je=Mt.current)==null||Je.style.setProperty("--swipe-amount-y",`${Rt.y}px`)}},Il&&!v.jsx&&st!=="loading"?q.createElement("button",{"aria-label":F,"data-disabled":Ka,"data-close-button":!0,onClick:Ka||!Ze?()=>{}:()=>{Ot(),v.onDismiss==null||v.onDismiss.call(v,v)},className:va(j?.closeButton,v==null||(r=v.classNames)==null?void 0:r.closeButton)},(Ja=B?.close)!=null?Ja:bx):null,(st||v.icon||v.promise)&&v.icon!==null&&(B?.[st]!==null||v.icon)?q.createElement("div",{"data-icon":"",className:va(j?.icon,v==null||(d=v.classNames)==null?void 0:d.icon)},st==="loading"?v.icon||jl():v.promise?jl():null,st!=="loading"?xa:null):null,q.createElement("div",{"data-content":"",className:va(j?.content,v==null||(h=v.classNames)==null?void 0:h.content)},q.createElement("div",{"data-title":"",className:va(j?.title,v==null||(g=v.classNames)==null?void 0:g.title)},v.jsx?v.jsx:typeof v.title=="function"?v.title():v.title),v.description?q.createElement("div",{"data-description":"",className:va(ke,Wi,j?.description,v==null||(y=v.classNames)==null?void 0:y.description)},typeof v.description=="function"?v.description():v.description):null),q.isValidElement(v.cancel)?v.cancel:v.cancel&&yo(v.cancel)?q.createElement("button",{"data-button":!0,"data-cancel":!0,style:v.cancelButtonStyle||Y,onClick:ie=>{yo(v.cancel)&&Ze&&(v.cancel.onClick==null||v.cancel.onClick.call(v.cancel,ie),Ot())},className:va(j?.cancelButton,v==null||(N=v.classNames)==null?void 0:N.cancelButton)},v.cancel.label):null,q.isValidElement(v.action)?v.action:v.action&&yo(v.action)?q.createElement("button",{"data-button":!0,"data-action":!0,style:v.actionButtonStyle||pe,onClick:ie=>{yo(v.action)&&(v.action.onClick==null||v.action.onClick.call(v.action,ie),!ie.defaultPrevented&&Ot())},className:va(j?.actionButton,v==null||(S=v.classNames)==null?void 0:S.actionButton)},v.action.label):null)};function rv(){if(typeof window>"u"||typeof document>"u")return"ltr";const n=document.documentElement.getAttribute("dir");return n==="auto"||!n?window.getComputedStyle(document.documentElement).direction:n}function Bx(n,o){const u={};return[n,o].forEach((r,d)=>{const h=d===1,g=h?"--mobile-offset":"--offset",y=h?Cx:wx;function N(S){["top","right","bottom","left"].forEach(O=>{u[`${g}-${O}`]=typeof S=="number"?`${S}px`:S})}typeof r=="number"||typeof r=="string"?N(r):typeof r=="object"?["top","right","bottom","left"].forEach(S=>{r[S]===void 0?u[`${g}-${S}`]=y:u[`${g}-${S}`]=typeof r[S]=="number"?`${r[S]}px`:r[S]}):N(y)}),u}const Hx=q.forwardRef(function(o,u){const{id:r,invert:d,position:h="bottom-right",hotkey:g=["altKey","KeyT"],expand:y,closeButton:N,className:S,offset:O,mobileOffset:v,theme:C="light",richColors:H,duration:R,style:U,visibleToasts:k=Dx,toastOptions:G,dir:Z=rv(),gap:K=Mx,icons:P,customAriaLabel:ee,containerAriaLabel:oe="Notifications"}=o,[fe,Y]=q.useState([]),pe=q.useMemo(()=>r?fe.filter(W=>W.toasterId===r):fe.filter(W=>!W.toasterId),[fe,r]),mt=q.useMemo(()=>Array.from(new Set([h].concat(pe.filter(W=>W.position).map(W=>W.position)))),[pe,h]),[ke,le]=q.useState([]),[it,Le]=q.useState(!1),[Re,j]=q.useState(!1),[B,F]=q.useState(C!=="system"?C:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),se=q.useRef(null),L=g.join("+").replace(/Key/g,"").replace(/Digit/g,""),Ae=q.useRef(null),be=q.useRef(!1),ce=q.useCallback(W=>{Y(te=>{var ne;return(ne=te.find(qe=>qe.id===W.id))!=null&&ne.delete||_t.dismiss(W.id),te.filter(({id:qe})=>qe!==W.id)})},[]);return q.useEffect(()=>_t.subscribe(W=>{if(W.dismiss){requestAnimationFrame(()=>{Y(te=>te.map(ne=>ne.id===W.id?{...ne,delete:!0}:ne))});return}setTimeout(()=>{_b.flushSync(()=>{Y(te=>{const ne=te.findIndex(qe=>qe.id===W.id);return ne!==-1?[...te.slice(0,ne),{...te[ne],...W},...te.slice(ne+1)]:[W,...te]})})})}),[]),q.useEffect(()=>{if(C!=="system"){F(C);return}if(C==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?F("dark"):F("light")),typeof window>"u")return;const W=window.matchMedia("(prefers-color-scheme: dark)");try{W.addEventListener("change",({matches:te})=>{F(te?"dark":"light")})}catch{W.addListener(({matches:ne})=>{try{F(ne?"dark":"light")}catch(qe){console.error(qe)}})}},[C]),q.useEffect(()=>{fe.length<=1&&Le(!1)},[fe]),q.useEffect(()=>{const W=te=>{var ne;if(g.length>0&&g.every(ae=>te[ae]||te.code===ae)){var ht;Le(!0),(ht=se.current)==null||ht.focus()}te.code==="Escape"&&(document.activeElement===se.current||(ne=se.current)!=null&&ne.contains(document.activeElement))&&Le(!1)};return document.addEventListener("keydown",W),()=>document.removeEventListener("keydown",W)},[g]),q.useEffect(()=>{if(se.current)return()=>{Ae.current&&(Ae.current.focus({preventScroll:!0}),Ae.current=null,be.current=!1)}},[se.current]),q.createElement("section",{ref:u,"aria-label":ee??`${oe} ${L}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0,"data-react-aria-top-layer":!0},mt.map((W,te)=>{var ne;const[qe,ht]=W.split("-");return pe.length?q.createElement("ol",{key:W,dir:Z==="auto"?rv():Z,tabIndex:-1,ref:se,className:S,"data-sonner-toaster":!0,"data-sonner-theme":B,"data-y-position":qe,"data-x-position":ht,style:{"--front-toast-height":`${((ne=ke[0])==null?void 0:ne.height)||0}px`,"--width":`${_x}px`,"--gap":`${K}px`,...U,...Bx(O,v)},onBlur:ae=>{be.current&&!ae.currentTarget.contains(ae.relatedTarget)&&(be.current=!1,Ae.current&&(Ae.current.focus({preventScroll:!0}),Ae.current=null))},onFocus:ae=>{ae.target instanceof HTMLElement&&ae.target.dataset.dismissible==="false"||be.current||(be.current=!0,Ae.current=ae.relatedTarget)},onMouseEnter:()=>Le(!0),onMouseMove:()=>Le(!0),onMouseLeave:()=>{Re||Le(!1)},onDragEnd:()=>Le(!1),onPointerDown:ae=>{ae.target instanceof HTMLElement&&ae.target.dataset.dismissible==="false"||j(!0)},onPointerUp:()=>j(!1)},pe.filter(ae=>!ae.position&&te===0||ae.position===W).map((ae,Vt)=>{var St,Et;return q.createElement(kx,{key:ae.id,icons:P,index:Vt,toast:ae,defaultRichColors:H,duration:(St=G?.duration)!=null?St:R,className:G?.className,descriptionClassName:G?.descriptionClassName,invert:d,visibleToasts:k,closeButton:(Et=G?.closeButton)!=null?Et:N,interacting:Re,position:W,style:G?.style,unstyled:G?.unstyled,classNames:G?.classNames,cancelButtonStyle:G?.cancelButtonStyle,actionButtonStyle:G?.actionButtonStyle,closeButtonAriaLabel:G?.closeButtonAriaLabel,removeToast:ce,toasts:pe.filter(Xt=>Xt.position==ae.position),heights:ke.filter(Xt=>Xt.position==ae.position),setHeights:le,expandByDefault:y,gap:K,expanded:it,swipeDirections:o.swipeDirections})})):null}))}),Lx=Vv("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive cursor-pointer",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",xs:"h-7 rounded-md gap-1 px-2.5 text-xs has-[>svg]:px-2",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-7"}},defaultVariants:{variant:"default",size:"default"}});function Ga({className:n,variant:o,size:u,asChild:r=!1,...d}){const h=r?Oc:"button";return f.jsx(h,{"data-slot":"button",className:je(Lx({variant:o,size:u,className:n})),...d})}var qx=Object.defineProperty,Fn=(n,o)=>qx(n,"name",{value:o,configurable:!0}),ug=!!(typeof window<"u"&&window.document&&window.document.createElement);function Va(n,o,{checkForDefaultPrevented:u=!0}={}){return Fn(function(d){if(n?.(d),u===!1||!d||!d.defaultPrevented)return o?.(d)},"handleEvent")}Fn(Va,"composeEventHandlers");function Yx(n){if(!ug)throw new Error("Cannot access window outside of the DOM");return n?.ownerDocument?.defaultView??window}Fn(Yx,"getOwnerWindow");function yc(n){if(!ug)throw new Error("Cannot access document outside of the DOM");return n?.ownerDocument??document}Fn(yc,"getOwnerDocument");function rg(n,o=!1){const{activeElement:u}=yc(n);if(!u?.nodeName)return null;if(cg(u)&&u.contentDocument)return rg(u.contentDocument.body,o);if(o){const r=u.getAttribute("aria-activedescendant");if(r){const d=yc(u).getElementById(r);if(d)return d}}return u}Fn(rg,"getActiveElement");function cg(n){return n.tagName==="IFRAME"}Fn(cg,"isFrame");var Gx=Object.defineProperty,la=(n,o)=>Gx(n,"name",{value:o,configurable:!0});function Vx(n,o){const u=E.createContext(o);u.displayName=n+"Context";const r=la(h=>{const{children:g,...y}=h,N=E.useMemo(()=>y,Object.values(y));return f.jsx(u.Provider,{value:N,children:g})},"Provider");r.displayName=n+"Provider";function d(h,g={}){const{optional:y=!1}=g,N=E.useContext(u);if(N)return N;if(o!==void 0)return o;if(!y)throw new Error(`\`${h}\` must be used within \`${n}\``)}return la(d,"useContext"),[r,d]}la(Vx,"createContext");function fg(n,o=[]){let u=[];function r(h,g){const y=E.createContext(g);y.displayName=h+"Context";const N=u.length;u=[...u,g];const S=la(v=>{const{scope:C,children:H,...R}=v,U=C?.[n]?.[N]||y,k=E.useMemo(()=>R,Object.values(R));return f.jsx(U.Provider,{value:k,children:H})},"Provider");S.displayName=h+"Provider";function O(v,C,H={}){const{optional:R=!1}=H,U=C?.[n]?.[N]||y,k=E.useContext(U);if(k)return k;if(g!==void 0)return g;if(!R)throw new Error(`\`${v}\` must be used within \`${h}\``)}return la(O,"useContext"),[S,O]}la(r,"createContext");const d=la(()=>{const h=u.map(g=>E.createContext(g));return la(function(y){const N=y?.[n]||h;return E.useMemo(()=>({[`__scope${n}`]:{...y,[n]:N}}),[y,N])},"useScope")},"createScope");return d.scopeName=n,[r,dg(d,...o)]}la(fg,"createContextScope");function dg(...n){const o=n[0];if(n.length===1)return o;const u=la(()=>{const r=n.map(d=>({useScope:d(),scopeName:d.scopeName}));return la(function(h){const g=r.reduce((y,{useScope:N,scopeName:S})=>{const v=N(h)[`__scope${S}`];return{...y,...v}},{});return E.useMemo(()=>({[`__scope${o.scopeName}`]:g}),[g])},"useComposedScopes")},"createScope");return u.scopeName=o.scopeName,u}la(dg,"composeContextScopes");var El=globalThis?.document?E.useLayoutEffect:()=>{},Xx=Object.defineProperty,Qx=(n,o)=>Xx(n,"name",{value:o,configurable:!0}),Zx=Ji[" useId ".trim().toString()]||(()=>{}),Kx=0;function jo(n){const[o,u]=E.useState(Zx());return El(()=>{n||u(r=>r??String(Kx++))},[n]),n||(o?`radix-${o}`:"")}Qx(jo,"useId");var Jx=Object.defineProperty,Fx=(n,o)=>Jx(n,"name",{value:o,configurable:!0}),cv=Ji[" useEffectEvent ".trim().toString()],fv=Ji[" useInsertionEffect ".trim().toString()];function mg(n){if(typeof cv=="function")return cv(n);const o=E.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return typeof fv=="function"?fv(()=>{o.current=n}):El(()=>{o.current=n}),E.useMemo(()=>((...u)=>o.current?.(...u)),[])}Fx(mg,"useEffectEvent");var $x=Object.defineProperty,Fi=(n,o)=>$x(n,"name",{value:o,configurable:!0}),Wx=Ji[" useInsertionEffect ".trim().toString()]||El;function hg({prop:n,defaultProp:o,onChange:u=Fi(()=>{},"onChange"),caller:r}){const[d,h,g]=vg({defaultProp:o,onChange:u}),y=n!==void 0,N=y?n:d,S=E.useCallback(O=>{if(y){const v=gg(O)?O(n):O;v!==n&&g.current?.(v)}else h(O)},[y,n,h,g]);return[N,S]}Fi(hg,"useControllableState");function vg({defaultProp:n,onChange:o}){const[u,r]=E.useState(n),d=E.useRef(u),h=E.useRef(o);return Wx(()=>{h.current=o},[o]),E.useEffect(()=>{d.current!==u&&(h.current?.(u),d.current=u)},[u,d]),[u,r,h]}Fi(vg,"useUncontrolledState");function gg(n){return typeof n=="function"}Fi(gg,"isFunction");var dv=Symbol("RADIX:SYNC_STATE");function Ix(n,o,u,r){const{prop:d,defaultProp:h,onChange:g,caller:y}=o,N=d!==void 0,S=mg(g),O=[{...u,state:h}];r&&O.push(r);const[v,C]=E.useReducer((k,G)=>{if(G.type===dv)return{...k,state:G.state};const Z=n(k,G);return N&&!Object.is(Z.state,k.state)&&S(Z.state),Z},...O),H=v.state,R=E.useRef(H);E.useEffect(()=>{R.current!==H&&(R.current=H,N||S(H))},[H,R,N]);const U=E.useMemo(()=>d!==void 0?{...v,state:d}:v,[v,d]);return E.useEffect(()=>{N&&!Object.is(d,v.state)&&C({type:dv,state:d})},[d,v.state,N]),[U,C]}Fi(Ix,"useControllableStateReducer");var Px=Object.defineProperty,e2=(n,o)=>Px(n,"name",{value:o,configurable:!0}),t2=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Qa=t2.reduce((n,o)=>{const u=Ro(`Primitive.${o}`),r=E.forwardRef((d,h)=>{const{asChild:g,...y}=d,N=g?u:o;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),f.jsx(N,{...y,ref:h})});return r.displayName=`Primitive.${o}`,{...n,[o]:r}},{});function pg(n,o){n&&_v.flushSync(()=>n.dispatchEvent(o))}e2(pg,"dispatchDiscreteCustomEvent");var a2=Object.defineProperty,l2=(n,o)=>a2(n,"name",{value:o,configurable:!0});function Jn(n){const o=E.useRef(n);return E.useEffect(()=>{o.current=n}),E.useMemo(()=>((...u)=>o.current?.(...u)),[])}l2(Jn,"useCallbackRef");var n2=Object.defineProperty,nt=(n,o)=>n2(n,"name",{value:o,configurable:!0}),xc="dismissableLayer.update",i2="dismissableLayer.pointerDownOutside",s2="dismissableLayer.focusOutside",mv,bg=E.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),o2=E.forwardRef(nt(function(o,u){const{disableOutsidePointerEvents:r=!1,deferPointerDownOutside:d=!1,onEscapeKeyDown:h,onPointerDownOutside:g,onFocusOutside:y,onInteractOutside:N,onDismiss:S,...O}=o,v=E.useContext(bg),[C,H]=E.useState(null),R=C?.ownerDocument??globalThis?.document,[,U]=E.useState({}),k=Jl(u,H),G=Array.from(v.layers),[Z]=[...v.layersWithOutsidePointerEventsDisabled].slice(-1),K=Z?G.indexOf(Z):-1,P=C?G.indexOf(C):-1,ee=v.layersWithOutsidePointerEventsDisabled.size>0,oe=P>=K,fe=E.useRef(!1),Y=xg(le=>{g?.(le),N?.(le),le.defaultPrevented||S?.()},{ownerDocument:R,deferPointerDownOutside:d,isDeferredPointerDownOutsideRef:fe,dismissableSurfaces:v.dismissableSurfaces,shouldHandlePointerDownOutside:E.useCallback(le=>{if(!(le instanceof Node))return!1;const it=[...v.branches].some(Le=>Le.contains(le));return oe&&!it},[v.branches,oe])}),pe=Sg(le=>{if(d&&fe.current)return;const it=le.target;[...v.branches].some(Re=>Re.contains(it))||(y?.(le),N?.(le),le.defaultPrevented||S?.())},R),mt=C?P===G.length-1:!1,ke=Jn(le=>{le.key==="Escape"&&(h?.(le),!le.defaultPrevented&&S&&(le.preventDefault(),S()))});return E.useEffect(()=>{if(mt)return R.addEventListener("keydown",ke,{capture:!0}),()=>R.removeEventListener("keydown",ke,{capture:!0})},[R,mt,ke]),E.useEffect(()=>{if(C)return r&&(v.layersWithOutsidePointerEventsDisabled.size===0&&(mv=R.body.style.pointerEvents,R.body.style.pointerEvents="none"),v.layersWithOutsidePointerEventsDisabled.add(C)),v.layers.add(C),Sc(),()=>{r&&(v.layersWithOutsidePointerEventsDisabled.delete(C),v.layersWithOutsidePointerEventsDisabled.size===0&&(R.body.style.pointerEvents=mv))}},[C,R,r,v]),E.useEffect(()=>()=>{C&&(v.layers.delete(C),v.layersWithOutsidePointerEventsDisabled.delete(C),Sc())},[C,v]),E.useEffect(()=>{const le=nt(()=>U({}),"handleUpdate");return document.addEventListener(xc,le),()=>document.removeEventListener(xc,le)},[]),f.jsx(Qa.div,{...O,ref:k,style:{pointerEvents:ee?oe?"auto":"none":void 0,...o.style},onFocusCapture:Va(o.onFocusCapture,pe.onFocusCapture),onBlurCapture:Va(o.onBlurCapture,pe.onBlurCapture),onPointerDownCapture:Va(o.onPointerDownCapture,Y.onPointerDownCapture)})},"DismissableLayer"));function yg(){const n=E.useContext(bg),[o,u]=E.useState(null);return E.useEffect(()=>{if(o)return n.dismissableSurfaces.add(o),()=>{n.dismissableSurfaces.delete(o)}},[o,n.dismissableSurfaces]),u}nt(yg,"useDismissableLayerSurface");var u2=nt(()=>!0,"IS_TRUE");function xg(n,o){const{ownerDocument:u=globalThis?.document,deferPointerDownOutside:r=!1,isDeferredPointerDownOutsideRef:d,dismissableSurfaces:h,shouldHandlePointerDownOutside:g=u2}=o,y=Jn(n),N=E.useRef(!1),S=E.useRef(!1),O=E.useRef(new Map),v=E.useRef(()=>{});return E.useEffect(()=>{function C(){S.current=!1,d.current=!1,O.current.clear()}nt(C,"resetOutsideInteraction");function H(){return Array.from(O.current.values()).some(Boolean)}nt(H,"isOutsideInteractionIntercepted");function R(K){if(!S.current)return;const P=K.target;P instanceof Node&&[...h].some(oe=>oe.contains(P))||O.current.set(K.type,!0),K.type==="click"&&window.setTimeout(()=>{S.current&&v.current()},0)}nt(R,"handleInteractionCapture");function U(K){S.current&&O.current.set(K.type,!1)}nt(U,"handleInteractionBubble");const k=nt(K=>{if(K.target&&!N.current){let P=function(){u.removeEventListener("click",v.current);const oe=H();C(),oe||Lc(i2,y,ee,{discrete:!0})};if(nt(P,"handleAndDispatchPointerDownOutsideEvent"),!g(K.target)){u.removeEventListener("click",v.current),C(),N.current=!1;return}const ee={originalEvent:K};S.current=!0,d.current=r&&K.button===0,O.current.clear(),!r||K.button!==0?P():(u.removeEventListener("click",v.current),v.current=P,u.addEventListener("click",v.current,{once:!0}))}else u.removeEventListener("click",v.current),C();N.current=!1},"handlePointerDown"),G=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const K of G)u.addEventListener(K,R,!0),u.addEventListener(K,U);const Z=window.setTimeout(()=>{u.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(Z),u.removeEventListener("pointerdown",k),u.removeEventListener("click",v.current);for(const K of G)u.removeEventListener(K,R,!0),u.removeEventListener(K,U)}},[u,y,r,d,h,g]),{onPointerDownCapture:nt(()=>N.current=!0,"onPointerDownCapture")}}nt(xg,"usePointerDownOutside");function Sg(n,o=globalThis?.document){const u=Jn(n),r=E.useRef(!1);return E.useEffect(()=>{const d=nt(h=>{h.target&&!r.current&&Lc(s2,u,{originalEvent:h},{discrete:!1})},"handleFocus");return o.addEventListener("focusin",d),()=>o.removeEventListener("focusin",d)},[o,u]),{onFocusCapture:nt(()=>r.current=!0,"onFocusCapture"),onBlurCapture:nt(()=>r.current=!1,"onBlurCapture")}}nt(Sg,"useFocusOutside");function Sc(){const n=new CustomEvent(xc);document.dispatchEvent(n)}nt(Sc,"dispatchUpdate");function Lc(n,o,u,{discrete:r}){const d=u.originalEvent.target,h=new CustomEvent(n,{bubbles:!1,cancelable:!0,detail:u});o&&d.addEventListener(n,o,{once:!0}),r?pg(d,h):d.dispatchEvent(h)}nt(Lc,"handleAndDispatchCustomEvent");var r2=Object.defineProperty,xt=(n,o)=>r2(n,"name",{value:o,configurable:!0}),sc="focusScope.autoFocusOnMount",oc="focusScope.autoFocusOnUnmount",hv={bubbles:!1,cancelable:!0},c2=E.forwardRef(xt(function(o,u){const{loop:r=!1,trapped:d=!1,onMountAutoFocus:h,onUnmountAutoFocus:g,...y}=o,[N,S]=E.useState(null),O=Jn(h),v=Jn(g),C=E.useRef(null),H=Jl(u,S),R=E.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;E.useEffect(()=>{if(d){let k=function(P){if(R.paused||!N)return;const ee=P.target;N.contains(ee)?C.current=ee:qa(C.current,{select:!0})},G=function(P){if(R.paused||!N)return;const ee=P.relatedTarget;ee!==null&&(N.contains(ee)||qa(C.current,{select:!0}))},Z=function(P){if(document.activeElement===document.body)for(const oe of P)oe.removedNodes.length>0&&qa(N)};xt(k,"handleFocusIn"),xt(G,"handleFocusOut"),xt(Z,"handleMutations"),document.addEventListener("focusin",k),document.addEventListener("focusout",G);const K=new MutationObserver(Z);return N&&K.observe(N,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",G),K.disconnect()}}},[d,N,R.paused]),E.useEffect(()=>{if(N){vv.add(R);const k=document.activeElement;if(!N.contains(k)){const Z=new CustomEvent(sc,hv);N.addEventListener(sc,O),N.dispatchEvent(Z),Z.defaultPrevented||(Eg(Ag(qc(N)),{select:!0}),document.activeElement===k&&qa(N))}return()=>{N.removeEventListener(sc,O),setTimeout(()=>{const Z=new CustomEvent(oc,hv);N.addEventListener(oc,v),N.dispatchEvent(Z),Z.defaultPrevented||qa(k??document.body,{select:!0}),N.removeEventListener(oc,v),vv.remove(R)},0)}}},[N,O,v,R]);const U=E.useCallback(k=>{if(!r&&!d||R.paused)return;const G=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,Z=document.activeElement;if(G&&Z){const K=k.currentTarget,[P,ee]=Ng(K);P&&ee?!k.shiftKey&&Z===ee?(k.preventDefault(),r&&qa(P,{select:!0})):k.shiftKey&&Z===P&&(k.preventDefault(),r&&qa(ee,{select:!0})):Z===K&&k.preventDefault()}},[r,d,R.paused]);return f.jsx(Qa.div,{tabIndex:-1,...y,ref:H,onKeyDown:U})},"FocusScope"));function Eg(n,{select:o=!1}={}){const u=document.activeElement;for(const r of n)if(qa(r,{select:o}),document.activeElement!==u)return}xt(Eg,"focusFirst");function Ng(n){const o=qc(n),u=Ec(o,n),r=Ec(o.reverse(),n);return[u,r]}xt(Ng,"getTabbableEdges");function qc(n){const o=[],u=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,{acceptNode:xt(r=>{const d=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||d?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP},"acceptNode")});for(;u.nextNode();)o.push(u.currentNode);return o}xt(qc,"getTabbableCandidates");function Ec(n,o){const u=typeof o.checkVisibility=="function"&&o.checkVisibility({checkVisibilityCSS:!0});for(const r of n)if(!(u?!r.checkVisibility({checkVisibilityCSS:!0}):zg(r,{upTo:o})))return r}xt(Ec,"findVisible");function zg(n,{upTo:o}){if(getComputedStyle(n).visibility==="hidden")return!0;for(;n;){if(o!==void 0&&n===o)return!1;if(getComputedStyle(n).display==="none")return!0;n=n.parentElement}return!1}xt(zg,"isHidden");function Tg(n){return n instanceof HTMLInputElement&&"select"in n}xt(Tg,"isSelectableInput");function qa(n,{select:o=!1}={}){if(n&&n.focus){const u=document.activeElement;n.focus({preventScroll:!0}),n!==u&&Tg(n)&&o&&n.select()}}xt(qa,"focus");var vv=jg();function jg(){let n=[];return{add(o){const u=n[0];o!==u&&u?.pause(),n=Nc(n,o),n.unshift(o)},remove(o){n=Nc(n,o),n[0]?.resume()}}}xt(jg,"createFocusScopesStack");function Nc(n,o){const u=[...n],r=u.indexOf(o);return r!==-1&&u.splice(r,1),u}xt(Nc,"arrayRemove");function Ag(n){return n.filter(o=>o.tagName!=="A")}xt(Ag,"removeLinks");var f2=Object.defineProperty,d2=(n,o)=>f2(n,"name",{value:o,configurable:!0}),m2=E.forwardRef(d2(function(o,u){const{container:r,...d}=o,[h,g]=E.useState(!1);El(()=>g(!0),[]);const y=r||h&&globalThis?.document?.body;return y?_v.createPortal(f.jsx(Qa.div,{...d,ref:u}),y):null},"Portal")),h2=Object.defineProperty,Xa=(n,o)=>h2(n,"name",{value:o,configurable:!0});function Dg(n,o){return E.useReducer((u,r)=>o[u][r]??u,n)}Xa(Dg,"useStateMachine");var Yc=Xa(n=>{const{present:o,children:u}=n,r=wg(o),d=typeof u=="function"?u({present:r.isPresent}):E.Children.only(u),h=Cg(r.ref,_g(d));return typeof u=="function"||r.isPresent?E.cloneElement(d,{ref:h}):null},"Presence");function wg(n){const[o,u]=E.useState(),r=E.useRef(null),d=E.useRef(n),h=E.useRef("none"),g=E.useRef(void 0),y=n?"mounted":"unmounted",[N,S]=Dg(y,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return E.useEffect(()=>{N==="mounted"?(h.current=g.current??Zn(r.current),g.current=void 0):h.current="none"},[N]),El(()=>{const O=r.current,v=d.current;if(v!==n){const H=h.current,R=Zn(O);n?(g.current=R,S("MOUNT")):R==="none"||O?.display==="none"?S("UNMOUNT"):S(v&&H!==R?"ANIMATION_OUT":"UNMOUNT"),d.current=n}},[n,S]),El(()=>{if(o){let O;const v=o.ownerDocument.defaultView??window,C=Xa(R=>{const k=Zn(r.current).includes(CSS.escape(R.animationName));if(R.target===o&&k&&(S("ANIMATION_END"),!d.current)){const G=o.style.animationFillMode;o.style.animationFillMode="forwards",O=v.setTimeout(()=>{o.style.animationFillMode==="forwards"&&(o.style.animationFillMode=G)})}},"handleAnimationEnd"),H=Xa(R=>{R.target===o&&(h.current=Zn(r.current))},"handleAnimationStart");return o.addEventListener("animationstart",H),o.addEventListener("animationcancel",C),o.addEventListener("animationend",C),()=>{v.clearTimeout(O),o.removeEventListener("animationstart",H),o.removeEventListener("animationcancel",C),o.removeEventListener("animationend",C)}}else S("ANIMATION_END")},[o,S]),{isPresent:["mounted","unmountSuspended"].includes(N),ref:E.useCallback(O=>{if(O){const v=getComputedStyle(O);r.current=v,g.current=Zn(v)}else r.current=null;u(O)},[])}}Xa(wg,"usePresence");function zc(n,o){if(typeof n=="function")return n(o);n!=null&&(n.current=o)}Xa(zc,"setRef");function Cg(...n){const o=E.useRef(n);return o.current=n,E.useCallback(u=>{const r=o.current;let d=!1;const h=r.map(g=>{const y=zc(g,u);return!d&&typeof y=="function"&&(d=!0),y});if(d)return()=>{for(let g=0;gv2(n,"name",{value:o,configurable:!0}),xo=0,qn=null;function g2(n){return Vc(),n.children}Gc(g2,"FocusGuards");function Vc(){E.useEffect(()=>{qn||(qn={start:Tc(),end:Tc()});const{start:n,end:o}=qn;return document.body.firstElementChild!==n&&document.body.insertAdjacentElement("afterbegin",n),document.body.lastElementChild!==o&&document.body.insertAdjacentElement("beforeend",o),xo++,()=>{xo===1&&(qn?.start.remove(),qn?.end.remove(),qn=null),xo=Math.max(0,xo-1)}},[])}Gc(Vc,"useFocusGuards");function Tc(){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}Gc(Tc,"createFocusGuard");var pa=function(){return pa=Object.assign||function(o){for(var u,r=1,d=arguments.length;r"u")return O2;var o=R2(n),u=document.documentElement.clientWidth,r=window.innerWidth;return{left:o[0],top:o[1],right:o[2],gap:Math.max(0,r-u+o[2]-o[0])}},k2=Ug(),Kn="data-scroll-locked",B2=function(n,o,u,r){var d=n.left,h=n.top,g=n.right,y=n.gap;return u===void 0&&(u="margin"),` - .`.concat(b2,` { - overflow: hidden `).concat(r,`; - padding-right: `).concat(y,"px ").concat(r,`; - } - body[`).concat(Kn,`] { - overflow: hidden `).concat(r,`; - overscroll-behavior: contain; - `).concat([o&&"position: relative ".concat(r,";"),u==="margin"&&` - padding-left: `.concat(d,`px; - padding-top: `).concat(h,`px; - padding-right: `).concat(g,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(y,"px ").concat(r,`; - `),u==="padding"&&"padding-right: ".concat(y,"px ").concat(r,";")].filter(Boolean).join(""),` - } - - .`).concat(Ao,` { - right: `).concat(y,"px ").concat(r,`; - } - - .`).concat(Do,` { - margin-right: `).concat(y,"px ").concat(r,`; - } - - .`).concat(Ao," .").concat(Ao,` { - right: 0 `).concat(r,`; - } - - .`).concat(Do," .").concat(Do,` { - margin-right: 0 `).concat(r,`; - } - - body[`).concat(Kn,`] { - `).concat(y2,": ").concat(y,`px; - } -`)},pv=function(){var n=parseInt(document.body.getAttribute(Kn)||"0",10);return isFinite(n)?n:0},H2=function(){E.useEffect(function(){return document.body.setAttribute(Kn,(pv()+1).toString()),function(){var n=pv()-1;n<=0?document.body.removeAttribute(Kn):document.body.setAttribute(Kn,n.toString())}},[])},L2=function(n){var o=n.noRelative,u=n.noImportant,r=n.gapMode,d=r===void 0?"margin":r;H2();var h=E.useMemo(function(){return U2(d)},[d]);return E.createElement(k2,{styles:B2(h,!o,d,u?"":"!important")})},jc=!1;if(typeof window<"u")try{var So=Object.defineProperty({},"passive",{get:function(){return jc=!0,!0}});window.addEventListener("test",So,So),window.removeEventListener("test",So,So)}catch{jc=!1}var Yn=jc?{passive:!1}:!1,q2=function(n){return n.tagName==="TEXTAREA"},kg=function(n,o){if(!(n instanceof Element))return!1;var u=window.getComputedStyle(n);return u[o]!=="hidden"&&!(u.overflowY===u.overflowX&&!q2(n)&&u[o]==="visible")},Y2=function(n){return kg(n,"overflowY")},G2=function(n){return kg(n,"overflowX")},bv=function(n,o){var u=o.ownerDocument,r=o;do{typeof ShadowRoot<"u"&&r instanceof ShadowRoot&&(r=r.host);var d=Bg(n,r);if(d){var h=Hg(n,r),g=h[1],y=h[2];if(g>y)return!0}r=r.parentNode}while(r&&r!==u.body);return!1},V2=function(n){var o=n.scrollTop,u=n.scrollHeight,r=n.clientHeight;return[o,u,r]},X2=function(n){var o=n.scrollLeft,u=n.scrollWidth,r=n.clientWidth;return[o,u,r]},Bg=function(n,o){return n==="v"?Y2(o):G2(o)},Hg=function(n,o){return n==="v"?V2(o):X2(o)},Q2=function(n,o){return n==="h"&&o==="rtl"?-1:1},Z2=function(n,o,u,r,d){var h=Q2(n,window.getComputedStyle(o).direction),g=h*r,y=u.target,N=o.contains(y),S=!1,O=g>0,v=0,C=0;do{if(!y)break;var H=Hg(n,y),R=H[0],U=H[1],k=H[2],G=U-k-h*R;(R||G)&&Bg(n,y)&&(v+=G,C+=R);var Z=y.parentNode;y=Z&&Z.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Z.host:Z}while(!N&&y!==document.body||N&&(o.contains(y)||o===y));return(O&&Math.abs(v)<1||!O&&Math.abs(C)<1)&&(S=!0),S},Eo=function(n){return"changedTouches"in n?[n.changedTouches[0].clientX,n.changedTouches[0].clientY]:[0,0]},yv=function(n){return[n.deltaX,n.deltaY]},xv=function(n){return n&&"current"in n?n.current:n},K2=function(n,o){return n[0]===o[0]&&n[1]===o[1]},J2=function(n){return` - .block-interactivity-`.concat(n,` {pointer-events: none;} - .allow-interactivity-`).concat(n,` {pointer-events: all;} -`)},F2=0,Gn=[];function $2(n){var o=E.useRef([]),u=E.useRef([0,0]),r=E.useRef(),d=E.useState(F2++)[0],h=E.useState(Ug)[0],g=E.useRef(n);E.useEffect(function(){g.current=n},[n]),E.useEffect(function(){if(n.inert){document.body.classList.add("block-interactivity-".concat(d));var U=p2([n.lockRef.current],(n.shards||[]).map(xv),!0).filter(Boolean);return U.forEach(function(k){return k.classList.add("allow-interactivity-".concat(d))}),function(){document.body.classList.remove("block-interactivity-".concat(d)),U.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(d))})}}},[n.inert,n.lockRef.current,n.shards]);var y=E.useCallback(function(U,k){if("touches"in U&&U.touches.length===2||U.type==="wheel"&&U.ctrlKey)return!g.current.allowPinchZoom;var G=Eo(U),Z=u.current,K="deltaX"in U?U.deltaX:Z[0]-G[0],P="deltaY"in U?U.deltaY:Z[1]-G[1],ee,oe=U.target,fe=Math.abs(K)>Math.abs(P)?"h":"v";if("touches"in U&&fe==="h"&&oe.type==="range")return!1;var Y=window.getSelection(),pe=Y&&Y.anchorNode,mt=pe?pe===oe||pe.contains(oe):!1;if(mt)return!1;var ke=bv(fe,oe);if(!ke)return!0;if(ke?ee=fe:(ee=fe==="v"?"h":"v",ke=bv(fe,oe)),!ke)return!1;if(!r.current&&"changedTouches"in U&&(K||P)&&(r.current=ee),!ee)return!0;var le=r.current||ee;return Z2(le,k,U,le==="h"?K:P)},[]),N=E.useCallback(function(U){var k=U;if(!(!Gn.length||Gn[Gn.length-1]!==h)){var G="deltaY"in k?yv(k):Eo(k),Z=o.current.filter(function(ee){return ee.name===k.type&&(ee.target===k.target||k.target===ee.shadowParent)&&K2(ee.delta,G)})[0];if(Z&&Z.should){k.cancelable&&k.preventDefault();return}if(!Z){var K=(g.current.shards||[]).map(xv).filter(Boolean).filter(function(ee){return ee.contains(k.target)}),P=K.length>0?y(k,K[0]):!g.current.noIsolation;P&&k.cancelable&&k.preventDefault()}}},[]),S=E.useCallback(function(U,k,G,Z){var K={name:U,delta:k,target:G,should:Z,shadowParent:W2(G)};o.current.push(K),setTimeout(function(){o.current=o.current.filter(function(P){return P!==K})},1)},[]),O=E.useCallback(function(U){u.current=Eo(U),r.current=void 0},[]),v=E.useCallback(function(U){S(U.type,yv(U),U.target,y(U,n.lockRef.current))},[]),C=E.useCallback(function(U){S(U.type,Eo(U),U.target,y(U,n.lockRef.current))},[]);E.useEffect(function(){return Gn.push(h),n.setCallbacks({onScrollCapture:v,onWheelCapture:v,onTouchMoveCapture:C}),document.addEventListener("wheel",N,Yn),document.addEventListener("touchmove",N,Yn),document.addEventListener("touchstart",O,Yn),function(){Gn=Gn.filter(function(U){return U!==h}),document.removeEventListener("wheel",N,Yn),document.removeEventListener("touchmove",N,Yn),document.removeEventListener("touchstart",O,Yn)}},[]);var H=n.removeScrollBar,R=n.inert;return E.createElement(E.Fragment,null,R?E.createElement(h,{styles:J2(d)}):null,H?E.createElement(L2,{noRelative:n.noRelative,gapMode:n.gapMode}):null)}function W2(n){for(var o=null;n!==null;)n instanceof ShadowRoot&&(o=n.host,n=n.host),n=n.parentNode;return o}const I2=j2(Rg,$2);var Lg=E.forwardRef(function(n,o){return E.createElement(Lo,pa({},n,{ref:o,sideCar:I2}))});Lg.classNames=Lo.classNames;var P2=function(n){if(typeof document>"u")return null;var o=Array.isArray(n)?n[0]:n;return o.ownerDocument.body},Vn=new WeakMap,No=new WeakMap,zo={},fc=0,qg=function(n){return n&&(n.host||qg(n.parentNode))},eS=function(n,o){return o.map(function(u){if(n.contains(u))return u;var r=qg(u);return r&&n.contains(r)?r:(console.error("aria-hidden",u,"in not contained inside",n,". Doing nothing"),null)}).filter(function(u){return!!u})},tS=function(n,o,u,r){var d=eS(o,Array.isArray(n)?n:[n]);zo[u]||(zo[u]=new WeakMap);var h=zo[u],g=[],y=new Set,N=new Set(d),S=function(v){!v||y.has(v)||(y.add(v),S(v.parentNode))};d.forEach(S);var O=function(v){!v||N.has(v)||Array.prototype.forEach.call(v.children,function(C){if(y.has(C))O(C);else try{var H=C.getAttribute(r),R=H!==null&&H!=="false",U=(Vn.get(C)||0)+1,k=(h.get(C)||0)+1;Vn.set(C,U),h.set(C,k),g.push(C),U===1&&R&&No.set(C,!0),k===1&&C.setAttribute(u,"true"),R||C.setAttribute(r,"true")}catch(G){console.error("aria-hidden: cannot operate on ",C,G)}})};return O(o),y.clear(),fc++,function(){g.forEach(function(v){var C=Vn.get(v)-1,H=h.get(v)-1;Vn.set(v,C),h.set(v,H),C||(No.has(v)||v.removeAttribute(r),No.delete(v)),H||v.removeAttribute(u)}),fc--,fc||(Vn=new WeakMap,Vn=new WeakMap,No=new WeakMap,zo={})}},aS=function(n,o,u){u===void 0&&(u="data-aria-hidden");var r=Array.from(Array.isArray(n)?n:[n]),d=P2(n);return d?(r.push.apply(r,Array.from(d.querySelectorAll("[aria-live], script"))),tS(r,d,u,"aria-hidden")):function(){return null}},lS=Object.defineProperty,Gt=(n,o)=>lS(n,"name",{value:o,configurable:!0}),Xc="Dialog",[Yg,IS]=fg(Xc),[nS,ua]=Yg(Xc),iS=Gt(n=>{const{__scopeDialog:o,children:u,open:r,defaultOpen:d,onOpenChange:h,modal:g=!0}=n,y=E.useRef(null),N=E.useRef(null),[S,O]=hg({prop:r,defaultProp:d??!1,onChange:h,caller:Xc}),[v,C]=E.useState(0),[H,R]=E.useState(0);return f.jsx(nS,{scope:o,triggerRef:y,contentRef:N,contentId:jo(),titleId:jo(),descriptionId:jo(),titlePresent:v>0,descriptionPresent:H>0,setTitleCount:C,setDescriptionCount:R,open:S,onOpenChange:O,onOpenToggle:E.useCallback(()=>O(U=>!U),[O]),modal:g,children:u})},"Dialog"),sS="DialogTrigger",oS=E.forwardRef(Gt(function(o,u){const{__scopeDialog:r,...d}=o,h=ua(sS,r),g=Jl(u,h.triggerRef);return f.jsx(Qa.button,{type:"button","aria-haspopup":"dialog","aria-expanded":h.open,"aria-controls":h.open?h.contentId:void 0,"data-state":qo(h.open),...d,ref:g,onClick:Va(o.onClick,h.onOpenToggle)})},"DialogTrigger")),Gg="DialogPortal",[uS,Vg]=Yg(Gg,{forceMount:void 0}),rS=Gt(n=>{const{__scopeDialog:o,forceMount:u,children:r,container:d}=n,h=ua(Gg,o);return f.jsx(uS,{scope:o,forceMount:u,children:E.Children.map(r,g=>f.jsx(Yc,{present:u||h.open,children:f.jsx(m2,{asChild:!0,container:d,children:g})}))})},"DialogPortal"),Ac="DialogOverlay",cS=E.forwardRef(Gt(function(o,u){const r=Vg(Ac,o.__scopeDialog),{forceMount:d=r.forceMount,...h}=o,g=ua(Ac,o.__scopeDialog);return g.modal?f.jsx(Yc,{present:d||g.open,children:f.jsx(dS,{...h,ref:u})}):null},"DialogOverlay")),fS=Ro("DialogOverlay.RemoveScroll"),dS=E.forwardRef(Gt(function(o,u){const{__scopeDialog:r,...d}=o,h=ua(Ac,r),g=yg(),y=Jl(u,g);return f.jsx(Lg,{as:fS,allowPinchZoom:!0,shards:[h.contentRef],children:f.jsx(Qa.div,{"data-state":qo(h.open),...d,ref:y,style:{pointerEvents:"auto",...d.style}})})},"DialogOverlayImpl")),Ki="DialogContent",mS=E.forwardRef(Gt(function(o,u){const r=Vg(Ki,o.__scopeDialog),{forceMount:d=r.forceMount,...h}=o,g=ua(Ki,o.__scopeDialog);return f.jsx(Yc,{present:d||g.open,children:g.modal?f.jsx(hS,{...h,ref:u}):f.jsx(vS,{...h,ref:u})})},"DialogContent")),hS=E.forwardRef(Gt(function(o,u){const r=ua(Ki,o.__scopeDialog),d=E.useRef(null),h=Jl(u,r.contentRef,d);return E.useEffect(()=>{const g=d.current;if(g)return aS(g)},[]),f.jsx(Xg,{...o,ref:h,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:Va(o.onCloseAutoFocus,g=>{g.preventDefault(),r.triggerRef.current?.focus()}),onPointerDownOutside:Va(o.onPointerDownOutside,g=>{const y=g.detail.originalEvent,N=y.button===0&&y.ctrlKey===!0;(y.button===2||N)&&g.preventDefault()}),onFocusOutside:Va(o.onFocusOutside,g=>g.preventDefault())})},"DialogContentModal")),vS=E.forwardRef(Gt(function(o,u){const r=ua(Ki,o.__scopeDialog),d=E.useRef(!1),h=E.useRef(!1);return f.jsx(Xg,{...o,ref:u,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:g=>{o.onCloseAutoFocus?.(g),g.defaultPrevented||(d.current||r.triggerRef.current?.focus(),g.preventDefault()),d.current=!1,h.current=!1},onInteractOutside:g=>{o.onInteractOutside?.(g),g.defaultPrevented||(d.current=!0,g.detail.originalEvent.type==="pointerdown"&&(h.current=!0));const y=g.target;r.triggerRef.current?.contains(y)&&g.preventDefault(),g.detail.originalEvent.type==="focusin"&&h.current&&g.preventDefault()}})},"DialogContentNonModal")),Xg=E.forwardRef(Gt(function(o,u){const{__scopeDialog:r,trapFocus:d,onOpenAutoFocus:h,onCloseAutoFocus:g,...y}=o,N=ua(Ki,r);return Vc(),f.jsx(f.Fragment,{children:f.jsx(c2,{asChild:!0,loop:!0,trapped:d,onMountAutoFocus:h,onUnmountAutoFocus:g,children:f.jsx(o2,{role:"dialog",id:N.contentId,"aria-describedby":N.descriptionPresent?N.descriptionId:void 0,"aria-labelledby":N.titlePresent?N.titleId:void 0,"data-state":qo(N.open),...y,ref:u,deferPointerDownOutside:!0,onDismiss:()=>N.onOpenChange(!1)})})})},"DialogContentImpl")),gS="DialogTitle",pS=E.forwardRef(Gt(function(o,u){const{__scopeDialog:r,...d}=o,h=ua(gS,r),{setTitleCount:g}=h;return El(()=>(g(y=>y+1),()=>g(y=>y-1)),[g]),f.jsx(Qa.h2,{id:h.titleId,...d,ref:u})},"DialogTitle")),bS="DialogDescription",yS=E.forwardRef(Gt(function(o,u){const{__scopeDialog:r,...d}=o,h=ua(bS,r),{setDescriptionCount:g}=h;return El(()=>(g(y=>y+1),()=>g(y=>y-1)),[g]),f.jsx(Qa.p,{id:h.descriptionId,...d,ref:u})},"DialogDescription")),xS="DialogClose",SS=E.forwardRef(Gt(function(o,u){const{__scopeDialog:r,...d}=o,h=ua(xS,r);return f.jsx(Qa.button,{type:"button",...d,ref:u,onClick:Va(o.onClick,()=>h.onOpenChange(!1))})},"DialogClose"));function qo(n){return n?"open":"closed"}Gt(qo,"getState");const Qc=iS,Qg=oS;function ES({className:n,...o}){return f.jsx(cS,{"data-slot":"dialog-overlay",className:je("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",n),...o})}function Zc({className:n,children:o,...u}){return f.jsxs(rS,{children:[f.jsx(ES,{}),f.jsxs(mS,{"data-slot":"dialog-content",className:je("bg-background 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 fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-md",n),...u,children:[o,f.jsxs(SS,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none cursor-pointer",children:[f.jsx(zy,{className:"size-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]})]})]})}function Kc({className:n,...o}){return f.jsx("div",{"data-slot":"dialog-header",className:je("flex flex-col gap-1.5 text-left",n),...o})}function Zg({className:n,...o}){return f.jsx("div",{"data-slot":"dialog-footer",className:je("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",n),...o})}function Jc({className:n,...o}){return f.jsx(pS,{"data-slot":"dialog-title",className:je("text-lg leading-none font-semibold",n),...o})}function Fc({className:n,...o}){return f.jsx(yS,{"data-slot":"dialog-description",className:je("text-muted-foreground text-sm",n),...o})}var NS=Object.defineProperty,zS=(n,o)=>NS(n,"name",{value:o,configurable:!0}),TS=E.forwardRef(zS(function(o,u){return f.jsx(Qa.label,{...o,ref:u,onMouseDown:r=>{r.target.closest("button, input, select, textarea")||(o.onMouseDown?.(r),!r.defaultPrevented&&r.detail>1&&r.preventDefault())}})},"Label")),jS=TS;function AS({className:n,...o}){return f.jsx(jS,{"data-slot":"label",className:je("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",n),...o})}const DS=Sb,Kg=E.createContext({});function wS({...n}){return f.jsx(Kg.Provider,{value:{name:n.name},children:f.jsx(Eb,{...n})})}function Yo(){const n=E.useContext(Kg),o=E.useContext(Jg),{getFieldState:u}=Nb(),r=zb({name:n.name}),d=u(n.name,r);if(!n)throw new Error("useFormField should be used within ");const{id:h}=o;return{id:h,name:n.name,formItemId:`${h}-form-item`,formDescriptionId:`${h}-form-item-description`,formMessageId:`${h}-form-item-message`,...d}}const Jg=E.createContext({});function CS({className:n,...o}){const u=E.useId();return f.jsx(Jg.Provider,{value:{id:u},children:f.jsx("div",{"data-slot":"form-item",className:je("grid gap-2",n),...o})})}function _S({className:n,...o}){const{error:u,formItemId:r}=Yo();return f.jsx(AS,{"data-slot":"form-label","data-error":!!u,className:je("data-[error=true]:text-destructive",n),htmlFor:r,...o})}function MS({...n}){const{error:o,formItemId:u,formDescriptionId:r,formMessageId:d}=Yo();return f.jsx(Oc,{"data-slot":"form-control",id:u,"aria-describedby":o?`${r} ${d}`:r,"aria-invalid":!!o,...n})}function OS({className:n,...o}){const{formDescriptionId:u}=Yo();return f.jsx("p",{"data-slot":"form-description",id:u,className:je("text-muted-foreground text-xs",n),...o})}function RS({className:n,...o}){const{error:u,formMessageId:r}=Yo(),d=u?String(u?.message??""):o.children;return d?f.jsx("p",{"data-slot":"form-message",id:r,className:je("text-destructive text-xs font-medium",n),...o,children:d}):null}const US={done:{label:"done",variant:"success"},running:{label:"running",variant:"default"},pending:{label:"pending",variant:"secondary"},skipped:{label:"skipped",variant:"warning"},failed:{label:"failed",variant:"destructive"}},kS=[{id:"table",accessorFn:n=>`${n.schema}.${n.table}`,header:"Table",sortFn:"text",cell:({getValue:n})=>f.jsx("span",{className:"font-medium",children:n()})},{accessorKey:"state",header:"State",sortFn:"text",cell:({getValue:n})=>{const o=US[n()];return f.jsxs(ba,{variant:o.variant,children:[o.label==="running"&&f.jsx(Oo,{className:"size-3 animate-spin"}),o.label]})}},{accessorKey:"rows_copied",header:()=>f.jsx("span",{className:"block text-right",children:"Rows copied"}),sortFn:"basic",cell:({getValue:n})=>f.jsx("span",{className:"block text-right tabular-nums",children:dt(n())})},{accessorKey:"completed_at",header:"Completed",enableSorting:!1,cell:({row:n})=>f.jsx("span",{className:"text-muted-foreground",children:n.original.state==="done"?kc(n.original.completed_at):"–"})},{accessorKey:"error",header:"Note",enableSorting:!1,cell:({getValue:n})=>{const o=n();return o?f.jsx("span",{className:"text-destructive text-xs",children:o}):null}}],BS=ya({table:Be().trim().refine(n=>n===""||/^([A-Za-z_][A-Za-z0-9_$]*\.)?[A-Za-z_][A-Za-z0-9_$]*$/.test(n),{message:"Use schema.table (e.g. public.orders) or leave empty for all tables"})});function HS(){const[n,o]=E.useState(!1),u=wc(),r=Tb({resolver:rx(BS),defaultValues:{table:""}}),d=wo({mutationFn:h=>G1(h.table||void 0),onSuccess:(h,g)=>{Sl.success(g.table?`Backfill enqueued for ${g.table}`:"Backfill enqueued for all tables"),u.invalidateQueries({queryKey:["stats"]}),o(!1),r.reset()},onError:h=>Sl.error(h.message)});return f.jsxs(Qc,{open:n,onOpenChange:o,children:[f.jsx(Qg,{asChild:!0,children:f.jsxs(Ga,{size:"sm",children:[f.jsx(Cc,{className:"size-4"}),"Sync tables"]})}),f.jsxs(Zc,{children:[f.jsxs(Kc,{children:[f.jsx(Jc,{children:"Trigger a backfill"}),f.jsx(Fc,{children:"Re-sync existing rows into the sinks. Runs concurrently with live streaming — no locks, no downtime."})]}),f.jsx(DS,{...r,children:f.jsxs("form",{onSubmit:r.handleSubmit(h=>d.mutate(h)),className:"space-y-4",children:[f.jsx(wS,{control:r.control,name:"table",render:({field:h})=>f.jsxs(CS,{children:[f.jsx(_S,{children:"Table"}),f.jsx(MS,{children:f.jsx(Hc,{placeholder:"public.orders",autoComplete:"off",...h})}),f.jsx(OS,{children:"Leave empty to backfill every published table."}),f.jsx(RS,{})]})}),f.jsxs(Zg,{children:[f.jsx(Ga,{type:"button",variant:"outline",onClick:()=>o(!1),children:"Cancel"}),f.jsxs(Ga,{type:"submit",disabled:d.isPending,children:[d.isPending&&f.jsx(Oo,{className:"size-4 animate-spin"}),"Start backfill"]})]})]})})]})]})}function LS({stats:n}){const o=E.useMemo(()=>n?.backfill??[],[n]),u=Mo({features:Ho,columns:kS,data:o,initialState:{sorting:[{id:"table",desc:!1}]}});return f.jsxs("div",{className:"space-y-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx("p",{className:"text-muted-foreground max-w-xl text-sm",children:"Watermark-based chunked sync of existing data, interleaved with the live stream. Progress survives restarts."}),f.jsx(HS,{})]}),f.jsx(ga,{className:"py-0",children:f.jsx(Ya,{className:"px-0",children:f.jsx(Bo,{table:u,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(Cc,{className:"size-5"}),"No backfills have run. New deployments backfill automatically when the replication slot is first created."]})})})})]})}const qS={INSERT:"success",UPDATE:"secondary",DELETE:"destructive",READ:"outline"},Fg=E.createContext(()=>{});function YS({entry:n}){const o=E.useContext(Fg),u=wc(),r=()=>{u.invalidateQueries({queryKey:["dlq"]}),u.invalidateQueries({queryKey:["stats"]})},d=wo({mutationFn:()=>L1(n.id),onSuccess:()=>{Sl.success(`Retried ${n.id} successfully`),r()},onError:g=>{Sl.error(g.message),r()}}),h=wo({mutationFn:()=>Y1(n.id),onSuccess:()=>{Sl.success(`Discarded ${n.id}`),r()},onError:g=>Sl.error(g.message)});return f.jsxs("div",{className:"flex justify-end gap-1.5",children:[f.jsx(Ga,{size:"xs",variant:"ghost",onClick:()=>o(n),title:"Inspect the parked event payload",children:f.jsx(ly,{className:"size-3"})}),f.jsxs(Ga,{size:"xs",variant:"outline",disabled:d.isPending,onClick:()=>d.mutate(),title:"Re-deliver this event to its sink",children:[d.isPending?f.jsx(Oo,{className:"size-3 animate-spin"}):f.jsx(Rv,{className:"size-3"}),"Retry"]}),f.jsx(Ga,{size:"xs",variant:"ghost",className:"text-destructive hover:text-destructive",disabled:h.isPending,onClick:()=>h.mutate(),title:"Drop this event permanently",children:f.jsx(Ey,{className:"size-3"})})]})}const GS=[{accessorKey:"sink",header:"Sink",sortFn:"text",cell:({getValue:n})=>f.jsx(ba,{variant:"outline",children:n()})},{id:"target",accessorFn:n=>`${n.schema}.${n.table}`,header:"Table",sortFn:"text",cell:({row:n,getValue:o})=>f.jsxs("span",{className:"flex items-center gap-2",children:[f.jsx("span",{className:"font-medium",children:o()}),f.jsx(ba,{variant:qS[n.original.operation]??"secondary",className:"text-[10px]",children:n.original.operation})]})},{accessorKey:"error",header:"Error",enableSorting:!1,cell:({getValue:n})=>f.jsx("span",{className:"text-destructive block max-w-md truncate text-xs whitespace-normal sm:whitespace-nowrap",title:n(),children:n()})},{accessorKey:"attempts",header:()=>f.jsx("span",{className:"block text-right",children:"Attempts"}),sortFn:"basic",cell:({getValue:n})=>f.jsx("span",{className:"block text-right tabular-nums",children:n()})},{accessorKey:"last_failed_at",header:"Last failed",sortFn:"datetime",cell:({getValue:n})=>f.jsx("span",{className:"text-muted-foreground",children:kc(n())})},{id:"actions",header:()=>f.jsx("span",{className:"block text-right",children:"Actions"}),enableSorting:!1,cell:({row:n})=>f.jsx(YS,{entry:n.original})}];function VS({count:n}){const[o,u]=E.useState(!1),r=wc(),d=wo({mutationFn:q1,onSuccess:h=>{Sl.success(`Retried ${h.retried??0}: ${h.succeeded??0} succeeded, ${h.failed??0} failed`),r.invalidateQueries({queryKey:["dlq"]}),r.invalidateQueries({queryKey:["stats"]}),u(!1)},onError:h=>Sl.error(h.message)});return f.jsxs(Qc,{open:o,onOpenChange:u,children:[f.jsx(Qg,{asChild:!0,children:f.jsxs(Ga,{size:"sm",disabled:n===0,children:[f.jsx(Rv,{className:"size-4"}),"Retry all"]})}),f.jsxs(Zc,{children:[f.jsxs(Kc,{children:[f.jsx(Jc,{children:"Retry all parked events?"}),f.jsxs(Fc,{children:["Re-delivers all ",n," parked events to their sinks. Events that still fail stay in the queue with an updated error. If newer changes for the same rows have already flowed, retrying re-applies the older state — consider discarding stale entries and re-running a backfill instead."]})]}),f.jsxs(Zg,{children:[f.jsx(Ga,{variant:"outline",onClick:()=>u(!1),children:"Cancel"}),f.jsxs(Ga,{onClick:()=>d.mutate(),disabled:d.isPending,children:[d.isPending&&f.jsx(Oo,{className:"size-4 animate-spin"}),"Retry ",n," events"]})]})]})]})}function XS({entry:n,onClose:o}){return f.jsx(Qc,{open:n!==null,onOpenChange:u=>!u&&o(),children:f.jsxs(Zc,{className:"sm:max-w-2xl",children:[f.jsxs(Kc,{children:[f.jsx(Jc,{children:"Parked event"}),f.jsx(Fc,{children:"The event payload as it was delivered to the sink (transforms already applied). Retrying re-delivers exactly this payload."})]}),n&&f.jsxs("div",{className:"space-y-3",children:[f.jsx("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-1.5 text-xs sm:grid-cols-3",children:[["Sink",n.sink],["Table",`${n.schema}.${n.table}`],["Operation",n.operation],["LSN",n.lsn],["Attempts",String(n.attempts)],["Last failed",kc(n.last_failed_at)]].map(([u,r])=>f.jsxs("div",{children:[f.jsx("dt",{className:"text-muted-foreground",children:u}),f.jsx("dd",{className:"truncate font-mono",title:r,children:r})]},u))}),f.jsxs("div",{children:[f.jsx("div",{className:"text-muted-foreground mb-1 text-xs",children:"Error"}),f.jsx("p",{className:"text-destructive text-xs break-words",children:n.error})]}),f.jsx("pre",{className:"bg-muted max-h-80 overflow-auto rounded-md p-3 font-mono text-xs",children:n.event===void 0?"Event payload not included in the API response.":JSON.stringify(n.event,null,2)})]})]})})}function QS({dlqEnabled:n}){const[o,u]=E.useState(""),[r,d]=E.useState(null),{data:h}=Z1(n),g=E.useMemo(()=>h?.entries??[],[h]),y=Mo({features:Ho,columns:GS,data:g,globalFilterFn:"includesString",initialState:{sorting:[{id:"last_failed_at",desc:!0}]},state:{globalFilter:o}});return f.jsx(Fg.Provider,{value:d,children:f.jsxs("div",{className:"space-y-4",children:[f.jsx(XS,{entry:r,onClose:()=>d(null)}),f.jsxs("div",{className:"flex items-center justify-between gap-3",children:[f.jsxs("div",{className:"relative max-w-xs flex-1",children:[f.jsx(Uv,{className:"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2"}),f.jsx(Hc,{placeholder:"Filter by sink, table, error…",value:o,onChange:N=>u(N.target.value),className:"h-8 pl-8 text-sm"})]}),f.jsx(VS,{count:g.length})]}),f.jsx(ga,{className:"py-0",children:f.jsx(Ya,{className:"px-0",children:f.jsx(Bo,{table:y,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(_c,{className:"size-5"}),n?"No parked events — the pipeline is healthy.":"Dead-letter queue is disabled (set REDIS_URL and CDC_DLQ_ENABLED=true)."]})})})})]})})}const ZS={overview:{title:"Overview",description:"Pipeline health at a glance"},tables:{title:"Table activity",description:"Change events by source table"},backfill:{title:"Backfill",description:"Sync existing data into the sinks"},dlq:{title:"Dead letters",description:"Poison events parked for triage"}};function KS(){const[n,o]=E.useState("overview"),{data:u,isError:r}=V1(),d=ZS[n];return E.useEffect(()=>{document.title=`${d.title} · GTC`},[d.title]),f.jsxs(D1,{page:n,onNavigate:o,stats:u,offline:r,dlqCount:u?.dlq.entries??0,title:d.title,description:d.description,children:[n==="overview"&&f.jsx(lx,{stats:u}),n==="tables"&&f.jsx(ix,{stats:u}),n==="backfill"&&f.jsx(LS,{stats:u}),n==="dlq"&&f.jsx(QS,{dlqEnabled:u?.dlq.enabled??!1})]})}function JS(n){const o=document.documentElement.classList.contains("dark");return f.jsx(Hx,{theme:o?"dark":"light",className:"toaster group",style:{"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)"},...n})}const FS=new jb({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1}}});kb.createRoot(document.getElementById("root")).render(f.jsx(E.StrictMode,{children:f.jsxs(Ab,{client:FS,children:[f.jsx(KS,{}),f.jsx(JS,{position:"bottom-right"})]})})); diff --git a/ui/dist/assets/index-DD7dZXNj.css b/ui/dist/assets/index-DD7dZXNj.css deleted file mode 100644 index d5c592e..0000000 --- a/ui/dist/assets/index-DD7dZXNj.css +++ /dev/null @@ -1 +0,0 @@ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-400:oklch(82.8% .189 84.429);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-600:oklch(58.8% .158 241.966);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-600:oklch(54.1% .281 293.009);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--radius-xs:.125rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv02","cv03","cv04","cv11";font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,sans-serif}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-4{right:calc(var(--spacing) * 4)}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.ml-14{margin-left:calc(var(--spacing) * 14)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-4\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-28{height:calc(var(--spacing) * 28)}.h-\[200px\]{height:200px}.h-\[220px\]{height:220px}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-screen{min-height:100vh}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-none{translate:none}.scale-3d{scale:var(--tw-scale-x) var(--tw-scale-y) var(--tw-scale-z)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-bs{border-block-start-style:var(--tw-border-style);border-block-start-width:1px}.border-be{border-block-end-style:var(--tw-border-style);border-block-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-input{border-color:var(--input)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--background) 80%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-card{background-color:var(--card)}.bg-destructive,.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-destructive\/90{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/90{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-muted{background-color:var(--muted)}.bg-primary,.bg-primary\/70{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/70{background-color:color-mix(in oklab,var(--primary) 70%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--success) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning\/15{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/15{background-color:color-mix(in oklab,var(--warning) 15%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-amber-400{--tw-gradient-from:var(--color-amber-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-500{--tw-gradient-to:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-repeat{background-repeat:repeat}.mask-no-clip{-webkit-mask-clip:no-clip;mask-clip:no-clip}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:0}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-sidebar-foreground,.text-sidebar-foreground\/60{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/60{color:color-mix(in oklab,var(--sidebar-foreground) 60%,transparent)}}.text-sidebar-foreground\/65{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/65{color:color-mix(in oklab,var(--sidebar-foreground) 65%,transparent)}}.text-sky-600{color:var(--color-sky-600)}.text-success{color:var(--success)}.text-violet-600{color:var(--color-violet-600)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.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,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.inset-ring{--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.paused{animation-play-state:paused}.ring-inset{--tw-ring-inset:inset}.running{animation-play-state:running}.zoom-in{--tw-enter-scale:0}.zoom-out{--tw-exit-scale:0}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.first\:pl-4:first-child{padding-left:calc(var(--spacing) * 4)}.last\:pr-4:last-child{padding-right:calc(var(--spacing) * 4)}@media(hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:bg-sidebar-accent:hover,.hover\:bg-sidebar-accent\/60:hover{background-color:var(--sidebar-accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-sidebar-accent\/60:hover{background-color:color-mix(in oklab,var(--sidebar-accent) 60%,transparent)}}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\>svg\]\:px-2:has(>svg){padding-inline:calc(var(--spacing) * 2)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[error\=true\]\:text-destructive[data-error=true]{color:var(--destructive)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@media(min-width:40rem){.sm\:inline-flex{display:inline-flex}.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:whitespace-nowrap{white-space:nowrap}}@media(min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:64rem){.lg\:ml-56{margin-left:calc(var(--spacing) * 56)}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:inline-flex{display:inline-flex}.lg\:w-56{width:calc(var(--spacing) * 56)}.lg\:justify-start{justify-content:flex-start}.lg\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.dark\:bg-success\/15:is(.dark *){background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-success\/15:is(.dark *){background-color:color-mix(in oklab,var(--success) 15%,transparent)}}.dark\:text-emerald-400:is(.dark *){color:var(--color-emerald-400)}.dark\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\:text-sky-400:is(.dark *){color:var(--color-sky-400)}.dark\:text-violet-400:is(.dark *){color:var(--color-violet-400)}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(98.5% 0 0);--foreground:oklch(14.1% .005 285.823);--card:oklch(100% 0 0);--card-foreground:oklch(14.1% .005 285.823);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.1% .005 285.823);--primary:oklch(21% .006 285.885);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.7% .001 286.375);--muted-foreground:oklch(55.2% .016 285.938);--accent:oklch(96.7% .001 286.375);--accent-foreground:oklch(21% .006 285.885);--destructive:oklch(57.7% .245 27.325);--success:oklch(62.7% .17 149.2);--warning:oklch(66.6% .179 58.318);--border:oklch(92% .004 286.32);--input:oklch(92% .004 286.32);--ring:oklch(70.5% .015 286.067);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(100% 0 0);--sidebar-foreground:oklch(14.1% .005 285.823);--sidebar-primary:oklch(21% .006 285.885);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(96.7% .001 286.375);--sidebar-accent-foreground:oklch(21% .006 285.885);--sidebar-border:oklch(92% .004 286.32);--sidebar-ring:oklch(70.5% .015 286.067)}.dark{--background:oklch(14.1% .005 285.823);--foreground:oklch(98.5% 0 0);--card:oklch(17.5% .006 285.885);--card-foreground:oklch(98.5% 0 0);--popover:oklch(21% .006 285.885);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92% .004 286.32);--primary-foreground:oklch(21% .006 285.885);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(24.4% .006 286.033);--muted-foreground:oklch(70.5% .015 286.067);--accent:oklch(27.4% .006 286.033);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--success:oklch(72.3% .192 149.579);--warning:oklch(82.8% .189 84.429);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.2% .016 285.938);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(16.5% .006 285.885);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(27.4% .006 286.033);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.2% .016 285.938)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@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));filter:blur(var(--tw-enter-blur,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));filter:blur(var(--tw-exit-blur,0))}} diff --git a/ui/dist/assets/index-DofAKR1r.js b/ui/dist/assets/index-DofAKR1r.js new file mode 100644 index 0000000..bde640d --- /dev/null +++ b/ui/dist/assets/index-DofAKR1r.js @@ -0,0 +1,49 @@ +import{r as cb,a as E,R as Fi,j as f,o as Mt,b as Ng,s as me,_ as fb,n as Se,d as Jl,e as la,u as db,f as ko,F as nc,t as mb,h as hb,i as gb,k as vb,l as pb,m as bb,p as yb,q as xb,v as Sb,x as Eb,y as Nb,z as $i,A as vc,B as lc,C as zg,D as q,E as zb,G as Tb,H as jb,I as Ab,J as Mc,K as Db,L as Oo,Q as wb,M as _b}from"./data-DHjwm5_s.js";import{r as Cb,c as Tg,R as jg,A as Ag,C as Dg,X as wg,Y as _g,T as Cg,a as Mg,t as Mb,b as Ob,d as Rb,e as Og}from"./charts-Bt2W3tNT.js";(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))u(d);new MutationObserver(d=>{for(const h of d)if(h.type==="childList")for(const v of h.addedNodes)v.tagName==="LINK"&&v.rel==="modulepreload"&&u(v)}).observe(document,{childList:!0,subtree:!0});function r(d){const h={};return d.integrity&&(h.integrity=d.integrity),d.referrerPolicy&&(h.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?h.credentials="include":d.crossOrigin==="anonymous"?h.credentials="omit":h.credentials="same-origin",h}function u(d){if(d.ep)return;d.ep=!0;const h=r(d);fetch(d.href,h)}})();var ic={exports:{}},Qi={},sc={exports:{}},oc={};var Xh;function Ub(){return Xh||(Xh=1,(function(l){function o(j,B){var F=j.length;j.push(B);e:for(;0>>1,L=j[se];if(0>>1;sed(ce,F))Wd(te,ce)?(j[se]=te,j[W]=F,se=W):(j[se]=ce,j[ye]=F,se=ye);else if(Wd(te,F))j[se]=te,j[W]=F,se=W;else break e}}return B}function d(j,B){var F=j.sortIndex-B.sortIndex;return F!==0?F:j.id-B.id}if(l.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var h=performance;l.unstable_now=function(){return h.now()}}else{var v=Date,y=v.now();l.unstable_now=function(){return v.now()-y}}var N=[],S=[],O=1,g=null,_=3,H=!1,R=!1,U=!1,k=!1,G=typeof setTimeout=="function"?setTimeout:null,Z=typeof clearTimeout=="function"?clearTimeout:null,K=typeof setImmediate<"u"?setImmediate:null;function P(j){for(var B=r(S);B!==null;){if(B.callback===null)u(S);else if(B.startTime<=j)u(S),B.sortIndex=B.expirationTime,o(N,B);else break;B=r(S)}}function ee(j){if(U=!1,P(j),!R)if(r(N)!==null)R=!0,oe||(oe=!0,ne());else{var B=r(S);B!==null&&ke(ee,B.startTime-j)}}var oe=!1,fe=-1,Y=5,be=-1;function mt(){return k?!0:!(l.unstable_now()-bej&&mt());){var se=g.callback;if(typeof se=="function"){g.callback=null,_=g.priorityLevel;var L=se(g.expirationTime<=j);if(j=l.unstable_now(),typeof L=="function"){g.callback=L,P(j),B=!0;break t}g===r(N)&&u(N),P(j)}else u(N);g=r(N)}if(g!==null)B=!0;else{var De=r(S);De!==null&&ke(ee,De.startTime-j),B=!1}}break e}finally{g=null,_=F,H=!1}B=void 0}}finally{B?ne():oe=!1}}}var ne;if(typeof K=="function")ne=function(){K(He)};else if(typeof MessageChannel<"u"){var it=new MessageChannel,Le=it.port2;it.port1.onmessage=He,ne=function(){Le.postMessage(null)}}else ne=function(){G(He,0)};function ke(j,B){fe=G(function(){j(l.unstable_now())},B)}l.unstable_IdlePriority=5,l.unstable_ImmediatePriority=1,l.unstable_LowPriority=4,l.unstable_NormalPriority=3,l.unstable_Profiling=null,l.unstable_UserBlockingPriority=2,l.unstable_cancelCallback=function(j){j.callback=null},l.unstable_forceFrameRate=function(j){0>j||125se?(j.sortIndex=F,o(S,j),r(N)===null&&j===r(S)&&(U?(Z(fe),fe=-1):U=!0,ke(ee,F-se))):(j.sortIndex=L,o(N,j),R||H||(R=!0,oe||(oe=!0,ne()))),j},l.unstable_shouldYield=mt,l.unstable_wrapCallback=function(j){var B=_;return function(){var F=_;_=B;try{return j.apply(this,arguments)}finally{_=F}}}})(oc)),oc}var Qh;function kb(){return Qh||(Qh=1,sc.exports=Ub()),sc.exports}var Zh;function Bb(){if(Zh)return Qi;Zh=1;var l=kb(),o=cb(),r=Cb();function u(e){var t="https://react.dev/errors/"+e;if(1L||(e.current=se[L],se[L]=null,L--)}function ce(e,t){L++,se[L]=e.current,e.current=t}var W=De(null),te=De(null),le=De(null),qe=De(null);function ht(e,t){switch(ce(le,t),ce(te,e),ce(W,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?mh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=mh(t),e=hh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}ye(W),ce(W,e)}function ae(){ye(W),ye(te),ye(le)}function Xt(e){e.memoizedState!==null&&ce(qe,e);var t=W.current,a=hh(t,e.type);t!==a&&(ce(te,e),ce(W,a))}function St(e){te.current===e&&(ye(W),ye(te)),qe.current===e&&(ye(qe),Yi._currentValue=F)}var Et,Qt;function gt(e){if(Et===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Et=t&&t[1]||"",Qt=-1)":-1i||p[n]!==T[i]){var w=` +`+p[n].replace(" at new "," at ");return e.displayName&&w.includes("")&&(w=w.replace("",e.displayName)),w}while(1<=n&&0<=i);break}}}finally{Il=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?gt(a):""}function An(e,t){switch(e.tag){case 26:case 27:case 5:return gt(e.type);case 16:return gt("Lazy");case 13:return e.child!==t&&t!==null?gt("Suspense Fallback"):gt("Suspense");case 19:return gt("SuspenseList");case 0:case 15:return Pn(e.type,!1);case 11:return Pn(e.type.render,!1);case 1:return Pn(e.type,!0);case 31:return gt("Activity");default:return""}}function Pl(e){try{var t="",a=null;do t+=An(e,a),a=e,e=e.return;while(e);return t}catch(n){return` +Error generating stack: `+n.message+` +`+n.stack}}var Ot=Object.prototype.hasOwnProperty,ei=l.unstable_scheduleCallback,ti=l.unstable_cancelCallback,st=l.unstable_shouldYield,es=l.unstable_requestPaint,Ze=l.unstable_now,Zo=l.unstable_getCurrentPriorityLevel,ts=l.unstable_ImmediatePriority,Dn=l.unstable_UserBlockingPriority,el=l.unstable_NormalPriority,as=l.unstable_LowPriority,tl=l.unstable_IdlePriority,Ka=l.log,ns=l.unstable_setDisableYieldValue,Zt=null,pt=null;function ma(e){if(typeof Ka=="function"&&ns(e),pt&&typeof pt.setStrictMode=="function")try{pt.setStrictMode(Zt,e)}catch{}}var vt=Math.clz32?Math.clz32:Ko,ls=Math.log,Kt=Math.LN2;function Ko(e){return e>>>=0,e===0?32:31-(ls(e)/Kt|0)|0}var Ja=256,Rt=262144,wn=4194304;function Ea(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:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;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 _n(e,t,a){var n=e.pendingLanes;if(n===0)return 0;var i=0,s=e.suspendedLanes,c=e.pingedLanes;e=e.warmLanes;var m=n&134217727;return m!==0?(n=m&~s,n!==0?i=Ea(n):(c&=m,c!==0?i=Ea(c):a||(a=m&~e,a!==0&&(i=Ea(a))))):(m=n&~s,m!==0?i=Ea(m):c!==0?i=Ea(c):a||(a=n&~e,a!==0&&(i=Ea(a)))),i===0?0:t!==0&&t!==i&&(t&s)===0&&(s=i&-i,a=t&-t,s>=a||s===32&&(a&4194048)!==0)?t:i}function Fa(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function ie(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32: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 Ve(){var e=wn;return wn<<=1,(wn&62914560)===0&&(wn=4194304),e}function Ke(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Je(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Cn(e,t,a,n,i,s){var c=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var m=e.entanglements,p=e.expirationTimes,T=e.hiddenUpdates;for(a=c&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var l0=/[\n"\\]/g;function Ft(e){return e.replace(l0,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Wo(e,t,a,n,i,s,c,m){e.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?e.type=c:e.removeAttribute("type"),t!=null?c==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Jt(t)):e.value!==""+Jt(t)&&(e.value=""+Jt(t)):c!=="submit"&&c!=="reset"||e.removeAttribute("value"),t!=null?Io(e,c,Jt(t)):a!=null?Io(e,c,Jt(a)):n!=null&&e.removeAttribute("value"),i==null&&s!=null&&(e.defaultChecked=!!s),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"?e.name=""+Jt(m):e.removeAttribute("name")}function of(e,t,a,n,i,s,c,m){if(s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"&&(e.type=s),t!=null||a!=null){if(!(s!=="submit"&&s!=="reset"||t!=null)){$o(e);return}a=a!=null?""+Jt(a):"",t=t!=null?""+Jt(t):a,m||t===e.value||(e.value=t),e.defaultValue=t}n=n??i,n=typeof n!="function"&&typeof n!="symbol"&&!!n,e.checked=m?e.checked:!!n,e.defaultChecked=!!n,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(e.name=c),$o(e)}function Io(e,t,a){t==="number"&&os(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function rl(e,t,a,n){if(e=e.options,t){t={};for(var i=0;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),nr=!1;if(Ta)try{var ii={};Object.defineProperty(ii,"passive",{get:function(){nr=!0}}),window.addEventListener("test",ii,ii),window.removeEventListener("test",ii,ii)}catch{nr=!1}var Wa=null,lr=null,us=null;function hf(){if(us)return us;var e,t=lr,a=t.length,n,i="value"in Wa?Wa.value:Wa.textContent,s=i.length;for(e=0;e=ri),xf=" ",Sf=!1;function Ef(e,t){switch(e){case"keyup":return M0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Nf(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var dl=!1;function R0(e,t){switch(e){case"compositionend":return Nf(t);case"keypress":return t.which!==32?null:(Sf=!0,xf);case"textInput":return e=t.data,e===xf&&Sf?null:e;default:return null}}function U0(e,t){if(dl)return e==="compositionend"||!ur&&Ef(e,t)?(e=hf(),us=lr=Wa=null,dl=!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:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Cf(a)}}function Of(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Of(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Rf(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=os(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=os(e.document)}return t}function dr(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")}var V0=Ta&&"documentMode"in document&&11>=document.documentMode,ml=null,mr=null,di=null,hr=!1;function Uf(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;hr||ml==null||ml!==os(n)||(n=ml,"selectionStart"in n&&dr(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),di&&fi(di,n)||(di=n,n=ao(mr,"onSelect"),0>=c,i-=c,ha=1<<32-vt(t)+i|a<ue?(pe=J,J=null):pe=J.sibling;var Ne=A(x,J,z[ue],C);if(Ne===null){J===null&&(J=pe);break}e&&J&&Ne.alternate===null&&t(x,J),b=s(Ne,b,ue),Ee===null?$=Ne:Ee.sibling=Ne,Ee=Ne,J=pe}if(ue===z.length)return a(x,J),xe&&Aa(x,ue),$;if(J===null){for(;ueue?(pe=J,J=null):pe=J.sibling;var xn=A(x,J,Ne.value,C);if(xn===null){J===null&&(J=pe);break}e&&J&&xn.alternate===null&&t(x,J),b=s(xn,b,ue),Ee===null?$=xn:Ee.sibling=xn,Ee=xn,J=pe}if(Ne.done)return a(x,J),xe&&Aa(x,ue),$;if(J===null){for(;!Ne.done;ue++,Ne=z.next())Ne=M(x,Ne.value,C),Ne!==null&&(b=s(Ne,b,ue),Ee===null?$=Ne:Ee.sibling=Ne,Ee=Ne);return xe&&Aa(x,ue),$}for(J=n(J);!Ne.done;ue++,Ne=z.next())Ne=D(J,x,ue,Ne.value,C),Ne!==null&&(e&&Ne.alternate!==null&&J.delete(Ne.key===null?ue:Ne.key),b=s(Ne,b,ue),Ee===null?$=Ne:Ee.sibling=Ne,Ee=Ne);return e&&J.forEach(function(ub){return t(x,ub)}),xe&&Aa(x,ue),$}function Ce(x,b,z,C){if(typeof z=="object"&&z!==null&&z.type===U&&z.key===null&&(z=z.props.children),typeof z=="object"&&z!==null){switch(z.$$typeof){case H:e:{for(var $=z.key;b!==null;){if(b.key===$){if($=z.type,$===U){if(b.tag===7){a(x,b.sibling),C=i(b,z.props.children),C.return=x,x=C;break e}}else if(b.elementType===$||typeof $=="object"&&$!==null&&$.$$typeof===Y&&Vn($)===b.type){a(x,b.sibling),C=i(b,z.props),bi(C,z),C.return=x,x=C;break e}a(x,b);break}else t(x,b);b=b.sibling}z.type===U?(C=Hn(z.props.children,x.mode,C,z.key),C.return=x,x=C):(C=ys(z.type,z.key,z.props,null,x.mode,C),bi(C,z),C.return=x,x=C)}return c(x);case R:e:{for($=z.key;b!==null;){if(b.key===$)if(b.tag===4&&b.stateNode.containerInfo===z.containerInfo&&b.stateNode.implementation===z.implementation){a(x,b.sibling),C=i(b,z.children||[]),C.return=x,x=C;break e}else{a(x,b);break}else t(x,b);b=b.sibling}C=Sr(z,x.mode,C),C.return=x,x=C}return c(x);case Y:return z=Vn(z),Ce(x,b,z,C)}if(ke(z))return Q(x,b,z,C);if(ne(z)){if($=ne(z),typeof $!="function")throw Error(u(150));return z=$.call(z),I(x,b,z,C)}if(typeof z.then=="function")return Ce(x,b,js(z),C);if(z.$$typeof===K)return Ce(x,b,Es(x,z),C);As(x,z)}return typeof z=="string"&&z!==""||typeof z=="number"||typeof z=="bigint"?(z=""+z,b!==null&&b.tag===6?(a(x,b.sibling),C=i(b,z),C.return=x,x=C):(a(x,b),C=xr(z,x.mode,C),C.return=x,x=C),c(x)):a(x,b)}return function(x,b,z,C){try{pi=0;var $=Ce(x,b,z,C);return zl=null,$}catch(J){if(J===Nl||J===zs)throw J;var Ee=Bt(29,J,null,x.mode);return Ee.lanes=C,Ee.return=x,Ee}}}var Qn=ld(!0),id=ld(!1),an=!1;function Or(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Rr(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function nn(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ln(e,t,a){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,(ze&2)!==0){var i=n.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),n.pending=t,t=bs(e),Gf(e,null,a),t}return ps(e,n,t,a),bs(e)}function yi(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,bt(e,a)}}function Ur(e,t){var a=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,a===n)){var i=null,s=null;if(a=a.firstBaseUpdate,a!==null){do{var c={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};s===null?i=s=c:s=s.next=c,a=a.next}while(a!==null);s===null?i=s=t:s=s.next=t}else i=s=t;a={baseState:n.baseState,firstBaseUpdate:i,lastBaseUpdate:s,shared:n.shared,callbacks:n.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var kr=!1;function xi(){if(kr){var e=El;if(e!==null)throw e}}function Si(e,t,a,n){kr=!1;var i=e.updateQueue;an=!1;var s=i.firstBaseUpdate,c=i.lastBaseUpdate,m=i.shared.pending;if(m!==null){i.shared.pending=null;var p=m,T=p.next;p.next=null,c===null?s=T:c.next=T,c=p;var w=e.alternate;w!==null&&(w=w.updateQueue,m=w.lastBaseUpdate,m!==c&&(m===null?w.firstBaseUpdate=T:m.next=T,w.lastBaseUpdate=p))}if(s!==null){var M=i.baseState;c=0,w=T=p=null,m=s;do{var A=m.lane&-536870913,D=A!==m.lane;if(D?(ve&A)===A:(n&A)===A){A!==0&&A===Sl&&(kr=!0),w!==null&&(w=w.next={lane:0,tag:m.tag,payload:m.payload,callback:null,next:null});e:{var Q=e,I=m;A=t;var Ce=a;switch(I.tag){case 1:if(Q=I.payload,typeof Q=="function"){M=Q.call(Ce,M,A);break e}M=Q;break e;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=I.payload,A=typeof Q=="function"?Q.call(Ce,M,A):Q,A==null)break e;M=g({},M,A);break e;case 2:an=!0}}A=m.callback,A!==null&&(e.flags|=64,D&&(e.flags|=8192),D=i.callbacks,D===null?i.callbacks=[A]:D.push(A))}else D={lane:A,tag:m.tag,payload:m.payload,callback:m.callback,next:null},w===null?(T=w=D,p=M):w=w.next=D,c|=A;if(m=m.next,m===null){if(m=i.shared.pending,m===null)break;D=m,m=D.next,D.next=null,i.lastBaseUpdate=D,i.shared.pending=null}}while(!0);w===null&&(p=M),i.baseState=p,i.firstBaseUpdate=T,i.lastBaseUpdate=w,s===null&&(i.shared.lanes=0),cn|=c,e.lanes=c,e.memoizedState=M}}function sd(e,t){if(typeof e!="function")throw Error(u(191,e));e.call(t)}function od(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;es?s:8;var c=j.T,m={};j.T=m,tu(e,!1,t,a);try{var p=i(),T=j.S;if(T!==null&&T(m,p),p!==null&&typeof p=="object"&&typeof p.then=="function"){var w=I0(p,n);zi(e,t,w,Gt(e))}else zi(e,t,n,Gt(e))}catch(M){zi(e,t,{then:function(){},status:"rejected",reason:M},Gt())}finally{B.p=s,c!==null&&m.types!==null&&(c.types=m.types),j.T=c}}function lp(){}function Pr(e,t,a,n){if(e.tag!==5)throw Error(u(476));var i=Ld(e).queue;Hd(e,i,t,F,a===null?lp:function(){return qd(e),a(n)})}function Ld(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:F,baseState:F,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ca,lastRenderedState:F},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ca,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function qd(e){var t=Ld(e);t.next===null&&(t=e.alternate.memoizedState),zi(e,t.next.queue,{},Gt())}function eu(){return ut(Yi)}function Yd(){return Qe().memoizedState}function Gd(){return Qe().memoizedState}function ip(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=Gt();e=nn(a);var n=ln(t,e,a);n!==null&&(_t(n,t,a),yi(n,t,a)),t={cache:wr()},e.payload=t;return}t=t.return}}function sp(e,t,a){var n=Gt();a={lane:n,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Bs(e)?Xd(t,a):(a=br(e,t,a,n),a!==null&&(_t(a,e,n),Qd(a,t,n)))}function Vd(e,t,a){var n=Gt();zi(e,t,a,n)}function zi(e,t,a,n){var i={lane:n,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(Bs(e))Xd(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var c=t.lastRenderedState,m=s(c,a);if(i.hasEagerState=!0,i.eagerState=m,kt(m,c))return ps(e,t,i,0),Me===null&&vs(),!1}catch{}if(a=br(e,t,i,n),a!==null)return _t(a,e,n),Qd(a,t,n),!0}return!1}function tu(e,t,a,n){if(n={lane:2,revertLane:Ou(),gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Bs(e)){if(t)throw Error(u(479))}else t=br(e,a,n,2),t!==null&&_t(t,e,2)}function Bs(e){var t=e.alternate;return e===re||t!==null&&t===re}function Xd(e,t){jl=_s=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function Qd(e,t,a){if((a&4194048)!==0){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,bt(e,a)}}var Ti={readContext:ut,use:Os,useCallback:Ye,useContext:Ye,useEffect:Ye,useImperativeHandle:Ye,useLayoutEffect:Ye,useInsertionEffect:Ye,useMemo:Ye,useReducer:Ye,useRef:Ye,useState:Ye,useDebugValue:Ye,useDeferredValue:Ye,useTransition:Ye,useSyncExternalStore:Ye,useId:Ye,useHostTransitionStatus:Ye,useFormState:Ye,useActionState:Ye,useOptimistic:Ye,useMemoCache:Ye,useCacheRefresh:Ye};Ti.useEffectEvent=Ye;var Zd={readContext:ut,use:Os,useCallback:function(e,t){return yt().memoizedState=[e,t===void 0?null:t],e},useContext:ut,useEffect:wd,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,Us(4194308,4,Od.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Us(4194308,4,e,t)},useInsertionEffect:function(e,t){Us(4,2,e,t)},useMemo:function(e,t){var a=yt();t=t===void 0?null:t;var n=e();if(Zn){ma(!0);try{e()}finally{ma(!1)}}return a.memoizedState=[n,t],n},useReducer:function(e,t,a){var n=yt();if(a!==void 0){var i=a(t);if(Zn){ma(!0);try{a(t)}finally{ma(!1)}}}else i=t;return n.memoizedState=n.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},n.queue=e,e=e.dispatch=sp.bind(null,re,e),[n.memoizedState,e]},useRef:function(e){var t=yt();return e={current:e},t.memoizedState=e},useState:function(e){e=Jr(e);var t=e.queue,a=Vd.bind(null,re,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:Wr,useDeferredValue:function(e,t){var a=yt();return Ir(a,e,t)},useTransition:function(){var e=Jr(!1);return e=Hd.bind(null,re,e.queue,!0,!1),yt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var n=re,i=yt();if(xe){if(a===void 0)throw Error(u(407));a=a()}else{if(a=t(),Me===null)throw Error(u(349));(ve&127)!==0||md(n,t,a)}i.memoizedState=a;var s={value:a,getSnapshot:t};return i.queue=s,wd(gd.bind(null,n,s,e),[e]),n.flags|=2048,Dl(9,{destroy:void 0},hd.bind(null,n,s,a,t),null),a},useId:function(){var e=yt(),t=Me.identifierPrefix;if(xe){var a=ga,n=ha;a=(n&~(1<<32-vt(n)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Cs++,0<\/script>",s=s.removeChild(s.firstChild);break;case"select":s=typeof n.is=="string"?c.createElement("select",{is:n.is}):c.createElement("select"),n.multiple?s.multiple=!0:n.size&&(s.size=n.size);break;default:s=typeof n.is=="string"?c.createElement(i,{is:n.is}):c.createElement(i)}}s[ot]=t,s[zt]=n;e:for(c=t.child;c!==null;){if(c.tag===5||c.tag===6)s.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===t)break e;for(;c.sibling===null;){if(c.return===null||c.return===t)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}t.stateNode=s;e:switch(ft(s,i,n),i){case"button":case"input":case"select":case"textarea":n=!!n.autoFocus;break e;case"img":n=!0;break e;default:n=!1}n&&Oa(t)}}return Re(t),gu(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==n&&Oa(t);else{if(typeof n!="string"&&t.stateNode===null)throw Error(u(166));if(e=le.current,yl(t)){if(e=t.stateNode,a=t.memoizedProps,n=null,i=rt,i!==null)switch(i.tag){case 27:case 5:n=i.memoizedProps}e[ot]=t,e=!!(e.nodeValue===a||n!==null&&n.suppressHydrationWarning===!0||fh(e.nodeValue,a)),e||en(t,!0)}else e=no(e).createTextNode(n),e[ot]=t,t.stateNode=e}return Re(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(n=yl(t),a!==null){if(e===null){if(!n)throw Error(u(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(u(557));e[ot]=t}else Ln(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Re(t),e=!1}else a=Tr(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(Lt(t),t):(Lt(t),null);if((t.flags&128)!==0)throw Error(u(558))}return Re(t),null;case 13:if(n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=yl(t),n!==null&&n.dehydrated!==null){if(e===null){if(!i)throw Error(u(318));if(i=t.memoizedState,i=i!==null?i.dehydrated:null,!i)throw Error(u(317));i[ot]=t}else Ln(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Re(t),i=!1}else i=Tr(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(Lt(t),t):(Lt(t),null)}return Lt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=n!==null,e=e!==null&&e.memoizedState!==null,a&&(n=t.child,i=null,n.alternate!==null&&n.alternate.memoizedState!==null&&n.alternate.memoizedState.cachePool!==null&&(i=n.alternate.memoizedState.cachePool.pool),s=null,n.memoizedState!==null&&n.memoizedState.cachePool!==null&&(s=n.memoizedState.cachePool.pool),s!==i&&(n.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),Gs(t,t.updateQueue),Re(t),null);case 4:return ae(),e===null&&Bu(t.stateNode.containerInfo),Re(t),null;case 10:return wa(t.type),Re(t),null;case 19:if(ye(Xe),n=t.memoizedState,n===null)return Re(t),null;if(i=(t.flags&128)!==0,s=n.rendering,s===null)if(i)Ai(n,!1);else{if(Ge!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(s=ws(e),s!==null){for(t.flags|=128,Ai(n,!1),e=s.updateQueue,t.updateQueue=e,Gs(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)Vf(a,e),a=a.sibling;return ce(Xe,Xe.current&1|2),xe&&Aa(t,n.treeForkCount),t.child}e=e.sibling}n.tail!==null&&Ze()>Ks&&(t.flags|=128,i=!0,Ai(n,!1),t.lanes=4194304)}else{if(!i)if(e=ws(s),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Gs(t,e),Ai(n,!0),n.tail===null&&n.tailMode==="hidden"&&!s.alternate&&!xe)return Re(t),null}else 2*Ze()-n.renderingStartTime>Ks&&a!==536870912&&(t.flags|=128,i=!0,Ai(n,!1),t.lanes=4194304);n.isBackwards?(s.sibling=t.child,t.child=s):(e=n.last,e!==null?e.sibling=s:t.child=s,n.last=s)}return n.tail!==null?(e=n.tail,n.rendering=e,n.tail=e.sibling,n.renderingStartTime=Ze(),e.sibling=null,a=Xe.current,ce(Xe,i?a&1|2:a&1),xe&&Aa(t,n.treeForkCount),e):(Re(t),null);case 22:case 23:return Lt(t),Hr(),n=t.memoizedState!==null,e!==null?e.memoizedState!==null!==n&&(t.flags|=8192):n&&(t.flags|=8192),n?(a&536870912)!==0&&(t.flags&128)===0&&(Re(t),t.subtreeFlags&6&&(t.flags|=8192)):Re(t),a=t.updateQueue,a!==null&&Gs(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),n=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(n=t.memoizedState.cachePool.pool),n!==a&&(t.flags|=2048),e!==null&&ye(Gn),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),wa($e),Re(t),null;case 25:return null;case 30:return null}throw Error(u(156,t.tag))}function fp(e,t){switch(Nr(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return wa($e),ae(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return St(t),null;case 31:if(t.memoizedState!==null){if(Lt(t),t.alternate===null)throw Error(u(340));Ln()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Lt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(u(340));Ln()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ye(Xe),null;case 4:return ae(),null;case 10:return wa(t.type),null;case 22:case 23:return Lt(t),Hr(),e!==null&&ye(Gn),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return wa($e),null;case 25:return null;default:return null}}function vm(e,t){switch(Nr(t),t.tag){case 3:wa($e),ae();break;case 26:case 27:case 5:St(t);break;case 4:ae();break;case 31:t.memoizedState!==null&&Lt(t);break;case 13:Lt(t);break;case 19:ye(Xe);break;case 10:wa(t.type);break;case 22:case 23:Lt(t),Hr(),e!==null&&ye(Gn);break;case 24:wa($e)}}function Di(e,t){try{var a=t.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var i=n.next;a=i;do{if((a.tag&e)===e){n=void 0;var s=a.create,c=a.inst;n=s(),c.destroy=n}a=a.next}while(a!==i)}}catch(m){je(t,t.return,m)}}function rn(e,t,a){try{var n=t.updateQueue,i=n!==null?n.lastEffect:null;if(i!==null){var s=i.next;n=s;do{if((n.tag&e)===e){var c=n.inst,m=c.destroy;if(m!==void 0){c.destroy=void 0,i=t;var p=a,T=m;try{T()}catch(w){je(i,p,w)}}}n=n.next}while(n!==s)}}catch(w){je(t,t.return,w)}}function pm(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{od(t,a)}catch(n){je(e,e.return,n)}}}function bm(e,t,a){a.props=Kn(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(n){je(e,t,n)}}function wi(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var n=e.stateNode;break;case 30:n=e.stateNode;break;default:n=e.stateNode}typeof a=="function"?e.refCleanup=a(n):a.current=n}}catch(i){je(e,t,i)}}function va(e,t){var a=e.ref,n=e.refCleanup;if(a!==null)if(typeof n=="function")try{n()}catch(i){je(e,t,i)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(i){je(e,t,i)}else a.current=null}function ym(e){var t=e.type,a=e.memoizedProps,n=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&n.focus();break e;case"img":a.src?n.src=a.src:a.srcSet&&(n.srcset=a.srcSet)}}catch(i){je(e,e.return,i)}}function vu(e,t,a){try{var n=e.stateNode;Op(n,e.type,a,t),n[zt]=t}catch(i){je(e,e.return,i)}}function xm(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&gn(e.type)||e.tag===4}function pu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||xm(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.tag===27&&gn(e.type)||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 bu(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=za));else if(n!==4&&(n===27&&gn(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(bu(e,t,a),e=e.sibling;e!==null;)bu(e,t,a),e=e.sibling}function Vs(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(n!==4&&(n===27&&gn(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(Vs(e,t,a),e=e.sibling;e!==null;)Vs(e,t,a),e=e.sibling}function Sm(e){var t=e.stateNode,a=e.memoizedProps;try{for(var n=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);ft(t,n,a),t[ot]=e,t[zt]=a}catch(s){je(e,e.return,s)}}var Ra=!1,Pe=!1,yu=!1,Em=typeof WeakSet=="function"?WeakSet:Set,nt=null;function dp(e,t){if(e=e.containerInfo,qu=co,e=Rf(e),dr(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var n=a.getSelection&&a.getSelection();if(n&&n.rangeCount!==0){a=n.anchorNode;var i=n.anchorOffset,s=n.focusNode;n=n.focusOffset;try{a.nodeType,s.nodeType}catch{a=null;break e}var c=0,m=-1,p=-1,T=0,w=0,M=e,A=null;t:for(;;){for(var D;M!==a||i!==0&&M.nodeType!==3||(m=c+i),M!==s||n!==0&&M.nodeType!==3||(p=c+n),M.nodeType===3&&(c+=M.nodeValue.length),(D=M.firstChild)!==null;)A=M,M=D;for(;;){if(M===e)break t;if(A===a&&++T===i&&(m=c),A===s&&++w===n&&(p=c),(D=M.nextSibling)!==null)break;M=A,A=M.parentNode}M=D}a=m===-1||p===-1?null:{start:m,end:p}}else a=null}a=a||{start:0,end:0}}else a=null;for(Yu={focusedElem:e,selectionRange:a},co=!1,nt=t;nt!==null;)if(t=nt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,nt=e;else for(;nt!==null;){switch(t=nt,s=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),ft(s,n,a),s[ot]=e,at(s),n=s;break e;case"link":var c=Dh("link","href",i).get(n+(a.href||""));if(c){for(var m=0;mCe&&(c=Ce,Ce=I,I=c);var x=Mf(m,I),b=Mf(m,Ce);if(x&&b&&(D.rangeCount!==1||D.anchorNode!==x.node||D.anchorOffset!==x.offset||D.focusNode!==b.node||D.focusOffset!==b.offset)){var z=M.createRange();z.setStart(x.node,x.offset),D.removeAllRanges(),I>Ce?(D.addRange(z),D.extend(b.node,b.offset)):(z.setEnd(b.node,b.offset),D.addRange(z))}}}}for(M=[],D=m;D=D.parentNode;)D.nodeType===1&&M.push({element:D,left:D.scrollLeft,top:D.scrollTop});for(typeof m.focus=="function"&&m.focus(),m=0;ma?32:a,j.T=null,a=ju,ju=null;var s=dn,c=La;if(et=0,Ol=dn=null,La=0,(ze&6)!==0)throw Error(u(331));var m=ze;if(ze|=4,Om(s.current),_m(s,s.current,c,a),ze=m,Ui(0,!1),pt&&typeof pt.onPostCommitFiberRoot=="function")try{pt.onPostCommitFiberRoot(Zt,s)}catch{}return!0}finally{B.p=i,j.T=n,Wm(e,t)}}function Pm(e,t,a){t=Wt(a,t),t=iu(e.stateNode,t,2),e=ln(e,t,2),e!==null&&(Je(e,2),pa(e))}function je(e,t,a){if(e.tag===3)Pm(e,e,a);else for(;t!==null;){if(t.tag===3){Pm(t,e,a);break}else if(t.tag===1){var n=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof n.componentDidCatch=="function"&&(fn===null||!fn.has(n))){e=Wt(a,e),a=em(2),n=ln(t,a,2),n!==null&&(tm(a,n,t,e),Je(n,2),pa(n));break}}t=t.return}}function _u(e,t,a){var n=e.pingCache;if(n===null){n=e.pingCache=new gp;var i=new Set;n.set(t,i)}else i=n.get(t),i===void 0&&(i=new Set,n.set(t,i));i.has(a)||(Eu=!0,i.add(a),e=xp.bind(null,e,t,a),t.then(e,e))}function xp(e,t,a){var n=e.pingCache;n!==null&&n.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,Me===e&&(ve&a)===a&&(Ge===4||Ge===3&&(ve&62914560)===ve&&300>Ze()-Zs?(ze&2)===0&&Rl(e,0):Nu|=a,Ml===ve&&(Ml=0)),pa(e)}function eh(e,t){t===0&&(t=Ve()),e=Bn(e,t),e!==null&&(Je(e,t),pa(e))}function Sp(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),eh(e,a)}function Ep(e,t){var a=0;switch(e.tag){case 31:case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(a=i.retryLane);break;case 19:n=e.stateNode;break;case 22:n=e.stateNode._retryCache;break;default:throw Error(u(314))}n!==null&&n.delete(t),eh(e,a)}function Np(e,t){return ei(e,t)}var Ps=null,kl=null,Cu=!1,eo=!1,Mu=!1,hn=0;function pa(e){e!==kl&&e.next===null&&(kl===null?Ps=kl=e:kl=kl.next=e),eo=!0,Cu||(Cu=!0,Tp())}function Ui(e,t){if(!Mu&&eo){Mu=!0;do for(var a=!1,n=Ps;n!==null;){if(e!==0){var i=n.pendingLanes;if(i===0)var s=0;else{var c=n.suspendedLanes,m=n.pingedLanes;s=(1<<31-vt(42|e)+1)-1,s&=i&~(c&~m),s=s&201326741?s&201326741|1:s?s|2:0}s!==0&&(a=!0,lh(n,s))}else s=ve,s=_n(n,n===Me?s:0,n.cancelPendingCommit!==null||n.timeoutHandle!==-1),(s&3)===0||Fa(n,s)||(a=!0,lh(n,s));n=n.next}while(a);Mu=!1}}function zp(){th()}function th(){eo=Cu=!1;var e=0;hn!==0&&Up()&&(e=hn);for(var t=Ze(),a=null,n=Ps;n!==null;){var i=n.next,s=ah(n,t);s===0?(n.next=null,a===null?Ps=i:a.next=i,i===null&&(kl=a)):(a=n,(e!==0||(s&3)!==0)&&(eo=!0)),n=i}et!==0&&et!==5||Ui(e),hn!==0&&(hn=0)}function ah(e,t){for(var a=e.suspendedLanes,n=e.pingedLanes,i=e.expirationTimes,s=e.pendingLanes&-62914561;0m)break;var w=p.transferSize,M=p.initiatorType;w&&dh(M)&&(p=p.responseEnd,c+=w*(p"u"?null:document;function zh(e,t,a){var n=Bl;if(n&&typeof t=="string"&&t){var i=Ft(t);i='link[rel="'+e+'"][href="'+i+'"]',typeof a=="string"&&(i+='[crossorigin="'+a+'"]'),Nh.has(i)||(Nh.add(i),e={rel:e,crossOrigin:a,href:t},n.querySelector(i)===null&&(t=n.createElement("link"),ft(t,"link",e),at(t),n.head.appendChild(t)))}}function Xp(e){qa.D(e),zh("dns-prefetch",e,null)}function Qp(e,t){qa.C(e,t),zh("preconnect",e,t)}function Zp(e,t,a){qa.L(e,t,a);var n=Bl;if(n&&e&&t){var i='link[rel="preload"][as="'+Ft(t)+'"]';t==="image"&&a&&a.imageSrcSet?(i+='[imagesrcset="'+Ft(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(i+='[imagesizes="'+Ft(a.imageSizes)+'"]')):i+='[href="'+Ft(e)+'"]';var s=i;switch(t){case"style":s=Hl(e);break;case"script":s=Ll(e)}na.has(s)||(e=g({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),na.set(s,e),n.querySelector(i)!==null||t==="style"&&n.querySelector(Li(s))||t==="script"&&n.querySelector(qi(s))||(t=n.createElement("link"),ft(t,"link",e),at(t),n.head.appendChild(t)))}}function Kp(e,t){qa.m(e,t);var a=Bl;if(a&&e){var n=t&&typeof t.as=="string"?t.as:"script",i='link[rel="modulepreload"][as="'+Ft(n)+'"][href="'+Ft(e)+'"]',s=i;switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":s=Ll(e)}if(!na.has(s)&&(e=g({rel:"modulepreload",href:e},t),na.set(s,e),a.querySelector(i)===null)){switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(qi(s)))return}n=a.createElement("link"),ft(n,"link",e),at(n),a.head.appendChild(n)}}}function Jp(e,t,a){qa.S(e,t,a);var n=Bl;if(n&&e){var i=sl(n).hoistableStyles,s=Hl(e);t=t||"default";var c=i.get(s);if(!c){var m={loading:0,preload:null};if(c=n.querySelector(Li(s)))m.loading=5;else{e=g({rel:"stylesheet",href:e,"data-precedence":t},a),(a=na.get(s))&&Ju(e,a);var p=c=n.createElement("link");at(p),ft(p,"link",e),p._p=new Promise(function(T,w){p.onload=T,p.onerror=w}),p.addEventListener("load",function(){m.loading|=1}),p.addEventListener("error",function(){m.loading|=2}),m.loading|=4,io(c,t,n)}c={type:"stylesheet",instance:c,count:1,state:m},i.set(s,c)}}}function Fp(e,t){qa.X(e,t);var a=Bl;if(a&&e){var n=sl(a).hoistableScripts,i=Ll(e),s=n.get(i);s||(s=a.querySelector(qi(i)),s||(e=g({src:e,async:!0},t),(t=na.get(i))&&Fu(e,t),s=a.createElement("script"),at(s),ft(s,"link",e),a.head.appendChild(s)),s={type:"script",instance:s,count:1,state:null},n.set(i,s))}}function $p(e,t){qa.M(e,t);var a=Bl;if(a&&e){var n=sl(a).hoistableScripts,i=Ll(e),s=n.get(i);s||(s=a.querySelector(qi(i)),s||(e=g({src:e,async:!0,type:"module"},t),(t=na.get(i))&&Fu(e,t),s=a.createElement("script"),at(s),ft(s,"link",e),a.head.appendChild(s)),s={type:"script",instance:s,count:1,state:null},n.set(i,s))}}function Th(e,t,a,n){var i=(i=le.current)?lo(i):null;if(!i)throw Error(u(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Hl(a.href),a=sl(i).hoistableStyles,n=a.get(t),n||(n={type:"style",instance:null,count:0,state:null},a.set(t,n)),n):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Hl(a.href);var s=sl(i).hoistableStyles,c=s.get(e);if(c||(i=i.ownerDocument||i,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},s.set(e,c),(s=i.querySelector(Li(e)))&&!s._p&&(c.instance=s,c.state.loading=5),na.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},na.set(e,a),s||Wp(i,e,a,c.state))),t&&n===null)throw Error(u(528,""));return c}if(t&&n!==null)throw Error(u(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ll(a),a=sl(i).hoistableScripts,n=a.get(t),n||(n={type:"script",instance:null,count:0,state:null},a.set(t,n)),n):{type:"void",instance:null,count:0,state:null};default:throw Error(u(444,e))}}function Hl(e){return'href="'+Ft(e)+'"'}function Li(e){return'link[rel="stylesheet"]['+e+"]"}function jh(e){return g({},e,{"data-precedence":e.precedence,precedence:null})}function Wp(e,t,a,n){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?n.loading=1:(t=e.createElement("link"),n.preload=t,t.addEventListener("load",function(){return n.loading|=1}),t.addEventListener("error",function(){return n.loading|=2}),ft(t,"link",a),at(t),e.head.appendChild(t))}function Ll(e){return'[src="'+Ft(e)+'"]'}function qi(e){return"script[async]"+e}function Ah(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var n=e.querySelector('style[data-href~="'+Ft(a.href)+'"]');if(n)return t.instance=n,at(n),n;var i=g({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return n=(e.ownerDocument||e).createElement("style"),at(n),ft(n,"style",i),io(n,a.precedence,e),t.instance=n;case"stylesheet":i=Hl(a.href);var s=e.querySelector(Li(i));if(s)return t.state.loading|=4,t.instance=s,at(s),s;n=jh(a),(i=na.get(i))&&Ju(n,i),s=(e.ownerDocument||e).createElement("link"),at(s);var c=s;return c._p=new Promise(function(m,p){c.onload=m,c.onerror=p}),ft(s,"link",n),t.state.loading|=4,io(s,a.precedence,e),t.instance=s;case"script":return s=Ll(a.src),(i=e.querySelector(qi(s)))?(t.instance=i,at(i),i):(n=a,(i=na.get(s))&&(n=g({},a),Fu(n,i)),e=e.ownerDocument||e,i=e.createElement("script"),at(i),ft(i,"link",n),e.head.appendChild(i),t.instance=i);case"void":return null;default:throw Error(u(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(n=t.instance,t.state.loading|=4,io(n,a.precedence,e));return t.instance}function io(e,t,a){for(var n=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),i=n.length?n[n.length-1]:null,s=i,c=0;c title"):null)}function Ip(e,t,a){if(a===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;return t.rel==="stylesheet"?(e=t.disabled,typeof t.precedence=="string"&&e==null):!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 _h(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function Pp(e,t,a,n){if(a.type==="stylesheet"&&(typeof n.media!="string"||matchMedia(n.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var i=Hl(n.href),s=t.querySelector(Li(i));if(s){t=s._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=oo.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=s,at(s);return}s=t.ownerDocument||t,n=jh(n),(i=na.get(i))&&Ju(n,i),s=s.createElement("link"),at(s);var c=s;c._p=new Promise(function(m,p){c.onload=m,c.onerror=p}),ft(s,"link",n),a.instance=s}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=oo.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var $u=0;function eb(e,t){return e.stylesheets&&e.count===0&&uo(e,e.stylesheets),0$u?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(n),clearTimeout(i)}}:null}function oo(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)uo(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var ro=null;function uo(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ro=new Map,t.forEach(tb,e),ro=null,oo.call(e))}function tb(e,t){if(!(t.state.loading&4)){var a=ro.get(e);if(a)var n=a.get(null);else{a=new Map,ro.set(e,a);for(var i=e.querySelectorAll("link[data-precedence],style[data-precedence]"),s=0;s"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(l)}catch(o){console.error(o)}}return l(),ic.exports=Bb(),ic.exports}var Lb=Hb();const qb=l=>l.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Yb=l=>l.replace(/^([A-Z])|[\s-_]+(\w)/g,(o,r,u)=>u?u.toUpperCase():r.toLowerCase()),Jh=l=>{const o=Yb(l);return o.charAt(0).toUpperCase()+o.slice(1)},Rg=(...l)=>l.filter((o,r,u)=>!!o&&o.trim()!==""&&u.indexOf(o)===r).join(" ").trim(),Gb=l=>{for(const o in l)if(o.startsWith("aria-")||o==="role"||o==="title")return!0};var Vb={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 Xb=E.forwardRef(({color:l="currentColor",size:o=24,strokeWidth:r=2,absoluteStrokeWidth:u,className:d="",children:h,iconNode:v,...y},N)=>E.createElement("svg",{ref:N,...Vb,width:o,height:o,stroke:l,strokeWidth:u?Number(r)*24/Number(o):r,className:Rg("lucide",d),...!h&&!Gb(y)&&{"aria-hidden":"true"},...y},[...v.map(([S,O])=>E.createElement(S,O)),...Array.isArray(h)?h:[h]]));const Ue=(l,o)=>{const r=E.forwardRef(({className:u,...d},h)=>E.createElement(Xb,{ref:h,iconNode:o,className:Rg(`lucide-${qb(Jh(l))}`,`lucide-${l}`,u),...d}));return r.displayName=Jh(l),r};const Qb=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],Ug=Ue("activity",Qb);const Zb=[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"m21 8-4-4-4 4",key:"1c9v7m"}],["path",{d:"M17 4v16",key:"7dpous"}]],Kb=Ue("arrow-down-up",Zb);const Jb=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],Fb=Ue("arrow-down",Jb);const $b=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],Wb=Ue("arrow-up",$b);const Ib=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]],Pb=Ue("chart-line",Ib);const ey=[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]],ty=Ue("chevrons-up-down",ey);const ay=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],ny=Ue("circle-x",ay);const ly=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 12a9 3 0 0 0 5 2.69",key:"1ui2ym"}],["path",{d:"M21 9.3V5",key:"6k6cib"}],["path",{d:"M3 5v14a9 3 0 0 0 6.47 2.88",key:"i62tjy"}],["path",{d:"M12 12v4h4",key:"1bxaet"}],["path",{d:"M13 20a5 5 0 0 0 9-3 4.5 4.5 0 0 0-4.5-4.5c-1.33 0-2.54.54-3.41 1.41L12 16",key:"1f4ei9"}]],Oc=Ue("database-backup",ly);const iy=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],sy=Ue("eye",iy);const oy=[["path",{d:"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"1pf5j1"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m5 12-3 3 3 3",key:"oke12k"}],["path",{d:"m9 18 3-3-3-3",key:"112psh"}]],kg=Ue("file-code-2",oy);const ry=[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]],uy=Ue("gauge",ry);const cy=[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]],fy=Ue("github",cy);const dy=[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]],Rc=Ue("inbox",dy);const my=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],hy=Ue("layers",my);const gy=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],vy=Ue("layout-dashboard",gy);const py=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],by=Ue("moon",py);const yy=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Bo=Ue("refresh-cw",yy);const xy=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Bg=Ue("rotate-ccw",xy);const Sy=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Uc=Ue("search",Sy);const Ey=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],Ny=Ue("sun",Ey);const zy=[["path",{d:"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18",key:"gugj83"}]],Hg=Ue("table-2",zy);const Ty=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],jy=Ue("trash-2",Ty);const Ay=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Lg=Ue("triangle-alert",Ay);const Dy=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],wy=Ue("x",Dy);const _y=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],Cy=Ue("zap",_y);var My=Object.defineProperty,kc=(l,o)=>My(l,"name",{value:o,configurable:!0});function pc(l,o){if(typeof l=="function")return l(o);l!=null&&(l.current=o)}kc(pc,"setRef");function qg(...l){return o=>{let r=!1;const u=l.map(d=>{const h=pc(d,o);return!r&&typeof h=="function"&&(r=!0),h});if(r)return()=>{for(let d=0;dOy(l,"name",{value:o,configurable:!0});function Ho(l){const o=E.forwardRef((r,u)=>{let{children:d,...h}=r,v=null,y=!1;const N=[];bc(d)&&typeof bo=="function"&&(d=bo(d._payload)),E.Children.forEach(d,_=>{if(Xg(_)){y=!0;const H=_;let R="child"in H.props?H.props.child:H.props.children;bc(R)&&typeof bo=="function"&&(R=bo(R._payload)),v=Uy(H,R),N.push(v?.props?.children)}else N.push(_)}),v?v=E.cloneElement(v,void 0,N):!y&&E.Children.count(d)===1&&E.isValidElement(d)&&(v=d);const S=v?Vg(v):void 0,O=Wn(u,S);if(!v){if(d||d===0)throw new Error(y?Hy(l):By(l));return d}const g=Gg(h,v.props??{});return v.type!==E.Fragment&&(g.ref=u?O:S),E.cloneElement(v,g)});return o.displayName=`${l}.Slot`,o}fa(Ho,"createSlot");var Bc=Ho("Slot"),Yg=Symbol.for("radix.slottable");function Ry(l){const o=fa(r=>"child"in r?r.children(r.child):r.children,"Slottable");return o.displayName=`${l}.Slottable`,o.__radixId=Yg,o}fa(Ry,"createSlottable");var Uy=fa((l,o)=>{if("child"in l.props){const r=l.props.child;return E.isValidElement(r)?E.cloneElement(r,void 0,l.props.children(r.props.children)):null}return E.isValidElement(o)?o:null},"getSlottableElementFromSlottable");function Gg(l,o){const r={...o};for(const u in o){const d=l[u],h=o[u];/^on[A-Z]/.test(u)?d&&h?r[u]=(...y)=>{const N=h(...y);return d(...y),N}:d&&(r[u]=d):u==="style"?r[u]={...d,...h}:u==="className"&&(r[u]=[d,h].filter(Boolean).join(" "))}return{...l,...r}}fa(Gg,"mergeProps");function Vg(l){let o=Object.getOwnPropertyDescriptor(l.props,"ref")?.get,r=o&&"isReactWarning"in o&&o.isReactWarning;return r?l.ref:(o=Object.getOwnPropertyDescriptor(l,"ref")?.get,r=o&&"isReactWarning"in o&&o.isReactWarning,r?l.props.ref:l.props.ref||l.ref)}fa(Vg,"getElementRef");function Xg(l){return E.isValidElement(l)&&typeof l.type=="function"&&"__radixId"in l.type&&l.type.__radixId===Yg}fa(Xg,"isSlottable");var ky=Symbol.for("react.lazy");function bc(l){return l!=null&&typeof l=="object"&&"$$typeof"in l&&l.$$typeof===ky&&"_payload"in l&&Qg(l._payload)}fa(bc,"isLazyComponent");function Qg(l){return typeof l=="object"&&l!==null&&"then"in l}fa(Qg,"isPromiseLike");var By=fa(l=>`${l} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),Hy=fa(l=>`${l} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),bo=Fi[" use ".trim().toString()];const Fh=l=>typeof l=="boolean"?`${l}`:l===0?"0":l,$h=Tg,Zg=(l,o)=>r=>{var u;if(o?.variants==null)return $h(l,r?.class,r?.className);const{variants:d,defaultVariants:h}=o,v=Object.keys(d).map(S=>{const O=r?.[S],g=h?.[S];if(O===null)return null;const _=Fh(O)||Fh(g);return d[S][_]}),y=r&&Object.entries(r).reduce((S,O)=>{let[g,_]=O;return _===void 0||(S[g]=_),S},{}),N=o==null||(u=o.compoundVariants)===null||u===void 0?void 0:u.reduce((S,O)=>{let{class:g,className:_,...H}=O;return Object.entries(H).every(R=>{let[U,k]=R;return Array.isArray(k)?k.includes({...h,...y}[U]):{...h,...y}[U]===k})?[...S,g,_]:S},[]);return $h(l,v,N,r?.class,r?.className)},Ly=(l,o)=>{const r=new Array(l.length+o.length);for(let u=0;u({classGroupId:l,validator:o}),Kg=(l=new Map,o=null,r)=>({nextPart:l,validators:o,classGroupId:r}),Ro="-",Wh=[],Yy="arbitrary..",Gy=l=>{const o=Xy(l),{conflictingClassGroups:r,conflictingClassGroupModifiers:u}=l;return{getClassGroupId:v=>{if(v.startsWith("[")&&v.endsWith("]"))return Vy(v);const y=v.split(Ro),N=y[0]===""&&y.length>1?1:0;return Jg(y,N,o)},getConflictingClassGroupIds:(v,y)=>{if(y){const N=u[v],S=r[v];return N?S?Ly(S,N):N:S||Wh}return r[v]||Wh}}},Jg=(l,o,r)=>{if(l.length-o===0)return r.classGroupId;const d=l[o],h=r.nextPart.get(d);if(h){const S=Jg(l,o+1,h);if(S)return S}const v=r.validators;if(v===null)return;const y=o===0?l.join(Ro):l.slice(o).join(Ro),N=v.length;for(let S=0;Sl.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const o=l.slice(1,-1),r=o.indexOf(":"),u=o.slice(0,r);return u?Yy+u:void 0})(),Xy=l=>{const{theme:o,classGroups:r}=l;return Qy(r,o)},Qy=(l,o)=>{const r=Kg();for(const u in l){const d=l[u];Hc(d,r,u,o)}return r},Hc=(l,o,r,u)=>{const d=l.length;for(let h=0;h{if(typeof l=="string"){Ky(l,o,r);return}if(typeof l=="function"){Jy(l,o,r,u);return}Fy(l,o,r,u)},Ky=(l,o,r)=>{const u=l===""?o:Fg(o,l);u.classGroupId=r},Jy=(l,o,r,u)=>{if($y(l)){Hc(l(u),o,r,u);return}o.validators===null&&(o.validators=[]),o.validators.push(qy(r,l))},Fy=(l,o,r,u)=>{const d=Object.entries(l),h=d.length;for(let v=0;v{let r=l;const u=o.split(Ro),d=u.length;for(let h=0;h"isThemeGetter"in l&&l.isThemeGetter===!0,Wy=l=>{if(l<1)return{get:()=>{},set:()=>{}};let o=0,r=Object.create(null),u=Object.create(null);const d=(h,v)=>{r[h]=v,o++,o>l&&(o=0,u=r,r=Object.create(null))};return{get(h){let v=r[h];if(v!==void 0)return v;if((v=u[h])!==void 0)return d(h,v),v},set(h,v){h in r?r[h]=v:d(h,v)}}},yc="!",Ih=":",Iy=[],Ph=(l,o,r,u,d)=>({modifiers:l,hasImportantModifier:o,baseClassName:r,maybePostfixModifierPosition:u,isExternal:d}),Py=l=>{const{prefix:o,experimentalParseClassName:r}=l;let u=d=>{const h=[];let v=0,y=0,N=0,S;const O=d.length;for(let U=0;UN?S-N:void 0;return Ph(h,H,_,R)};if(o){const d=o+Ih,h=u;u=v=>v.startsWith(d)?h(v.slice(d.length)):Ph(Iy,!1,v,void 0,!0)}if(r){const d=u;u=h=>r({className:h,parseClassName:d})}return u},e1=l=>{const o=new Map;return l.orderSensitiveModifiers.forEach((r,u)=>{o.set(r,1e6+u)}),r=>{const u=[];let d=[];for(let h=0;h0&&(d.sort(),u.push(...d),d=[]),u.push(v)):d.push(v)}return d.length>0&&(d.sort(),u.push(...d)),u}},t1=l=>({cache:Wy(l.cacheSize),parseClassName:Py(l),sortModifiers:e1(l),postfixLookupClassGroupIds:a1(l),...Gy(l)}),a1=l=>{const o=Object.create(null),r=l.postfixLookupClassGroups;if(r)for(let u=0;u{const{parseClassName:r,getClassGroupId:u,getConflictingClassGroupIds:d,sortModifiers:h,postfixLookupClassGroupIds:v}=o,y=[],N=l.trim().split(n1);let S="";for(let O=N.length-1;O>=0;O-=1){const g=N[O],{isExternal:_,modifiers:H,hasImportantModifier:R,baseClassName:U,maybePostfixModifierPosition:k}=r(g);if(_){S=g+(S.length>0?" "+S:S);continue}let G=!!k,Z;if(G){const fe=U.substring(0,k);Z=u(fe);const Y=Z&&v[Z]?u(U):void 0;Y&&Y!==Z&&(Z=Y,G=!1)}else Z=u(U);if(!Z){if(!G){S=g+(S.length>0?" "+S:S);continue}if(Z=u(U),!Z){S=g+(S.length>0?" "+S:S);continue}G=!1}const K=H.length===0?"":H.length===1?H[0]:h(H).join(":"),P=R?K+yc:K,ee=P+Z;if(y.indexOf(ee)>-1)continue;y.push(ee);const oe=d(Z,G);for(let fe=0;fe0?" "+S:S)}return S},i1=(...l)=>{let o=0,r,u,d="";for(;o{if(typeof l=="string")return l;let o,r="";for(let u=0;u{let r,u,d,h;const v=N=>{const S=o.reduce((O,g)=>g(O),l());return r=t1(S),u=r.cache.get,d=r.cache.set,h=y,y(N)},y=N=>{const S=u(N);if(S)return S;const O=l1(N,r);return d(N,O),O};return h=v,(...N)=>h(i1(...N))},o1=[],tt=l=>{const o=r=>r[l]||o1;return o.isThemeGetter=!0,o},Wg=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Ig=/^\((?:(\w[\w-]*):)?(.+)\)$/i,r1=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,u1=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,c1=/\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$/,f1=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,d1=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,m1=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Sn=l=>r1.test(l),de=l=>!!l&&!Number.isNaN(Number(l)),ba=l=>!!l&&Number.isInteger(Number(l)),rc=l=>l.endsWith("%")&&de(l.slice(0,-1)),Ya=l=>u1.test(l),Pg=()=>!0,h1=l=>c1.test(l)&&!f1.test(l),Lc=()=>!1,g1=l=>d1.test(l),v1=l=>m1.test(l),p1=l=>!V(l)&&!X(l),b1=l=>l.startsWith("@container")&&(l[10]==="/"&&l[11]!==void 0||l[11]==="s"&&l[16]!==void 0&&l.startsWith("-size/",10)||l[11]==="n"&&l[18]!==void 0&&l.startsWith("-normal/",10)),y1=l=>Tn(l,av,Lc),V=l=>Wg.test(l),$n=l=>Tn(l,nv,h1),eg=l=>Tn(l,A1,de),x1=l=>Tn(l,iv,Pg),S1=l=>Tn(l,lv,Lc),tg=l=>Tn(l,ev,Lc),E1=l=>Tn(l,tv,v1),yo=l=>Tn(l,sv,g1),X=l=>Ig.test(l),Zi=l=>In(l,nv),N1=l=>In(l,lv),ag=l=>In(l,ev),z1=l=>In(l,av),T1=l=>In(l,tv),xo=l=>In(l,sv,!0),j1=l=>In(l,iv,!0),Tn=(l,o,r)=>{const u=Wg.exec(l);return u?u[1]?o(u[1]):r(u[2]):!1},In=(l,o,r=!1)=>{const u=Ig.exec(l);return u?u[1]?o(u[1]):r:!1},ev=l=>l==="position"||l==="percentage",tv=l=>l==="image"||l==="url",av=l=>l==="length"||l==="size"||l==="bg-size",nv=l=>l==="length",A1=l=>l==="number",lv=l=>l==="family-name",iv=l=>l==="number"||l==="weight",sv=l=>l==="shadow",D1=()=>{const l=tt("color"),o=tt("font"),r=tt("text"),u=tt("font-weight"),d=tt("tracking"),h=tt("leading"),v=tt("breakpoint"),y=tt("container"),N=tt("spacing"),S=tt("radius"),O=tt("shadow"),g=tt("inset-shadow"),_=tt("text-shadow"),H=tt("drop-shadow"),R=tt("blur"),U=tt("perspective"),k=tt("aspect"),G=tt("ease"),Z=tt("animate"),K=()=>["auto","avoid","all","avoid-page","page","left","right","column"],P=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],ee=()=>[...P(),X,V],oe=()=>["auto","hidden","clip","visible","scroll"],fe=()=>["auto","contain","none"],Y=()=>[X,V,N],be=()=>[Sn,"full","auto",...Y()],mt=()=>[ba,"none","subgrid",X,V],He=()=>["auto",{span:["full",ba,X,V]},ba,X,V],ne=()=>[ba,"auto",X,V],it=()=>["auto","min","max","fr",X,V],Le=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],ke=()=>["start","end","center","stretch","center-safe","end-safe"],j=()=>["auto",...Y()],B=()=>[Sn,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...Y()],F=()=>[Sn,"screen","full","dvw","lvw","svw","min","max","fit",...Y()],se=()=>[Sn,"screen","full","lh","dvh","lvh","svh","min","max","fit",...Y()],L=()=>[l,X,V],De=()=>[...P(),ag,tg,{position:[X,V]}],ye=()=>["no-repeat",{repeat:["","x","y","space","round"]}],ce=()=>["auto","cover","contain",z1,y1,{size:[X,V]}],W=()=>[rc,Zi,$n],te=()=>["","none","full",S,X,V],le=()=>["",de,Zi,$n],qe=()=>["solid","dashed","dotted","double"],ht=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ae=()=>[de,rc,ag,tg],Xt=()=>["","none",R,X,V],St=()=>["none",de,X,V],Et=()=>["none",de,X,V],Qt=()=>[de,X,V],gt=()=>[Sn,"full",...Y()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Ya],breakpoint:[Ya],color:[Pg],container:[Ya],"drop-shadow":[Ya],ease:["in","out","in-out"],font:[p1],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Ya],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Ya],shadow:[Ya],spacing:["px",de],text:[Ya],"text-shadow":[Ya],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",Sn,V,X,k]}],container:["container"],"container-type":[{"@container":["","normal","size",X,V]}],"container-named":[b1],columns:[{columns:[de,V,X,y]}],"break-after":[{"break-after":K()}],"break-before":[{"break-before":K()}],"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"],sr:["sr-only","not-sr-only"],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()}],overflow:[{overflow:oe()}],"overflow-x":[{"overflow-x":oe()}],"overflow-y":[{"overflow-y":oe()}],overscroll:[{overscroll:fe()}],"overscroll-x":[{"overscroll-x":fe()}],"overscroll-y":[{"overscroll-y":fe()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:be()}],"inset-x":[{"inset-x":be()}],"inset-y":[{"inset-y":be()}],start:[{"inset-s":be(),start:be()}],end:[{"inset-e":be(),end:be()}],"inset-bs":[{"inset-bs":be()}],"inset-be":[{"inset-be":be()}],top:[{top:be()}],right:[{right:be()}],bottom:[{bottom:be()}],left:[{left:be()}],visibility:["visible","invisible","collapse"],z:[{z:[ba,"auto",X,V]}],basis:[{basis:[Sn,"full","auto",y,...Y()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[de,Sn,"auto","initial","none",V]}],grow:[{grow:["",de,X,V]}],shrink:[{shrink:["",de,X,V]}],order:[{order:[ba,"first","last","none",X,V]}],"grid-cols":[{"grid-cols":mt()}],"col-start-end":[{col:He()}],"col-start":[{"col-start":ne()}],"col-end":[{"col-end":ne()}],"grid-rows":[{"grid-rows":mt()}],"row-start-end":[{row:He()}],"row-start":[{"row-start":ne()}],"row-end":[{"row-end":ne()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":it()}],"auto-rows":[{"auto-rows":it()}],gap:[{gap:Y()}],"gap-x":[{"gap-x":Y()}],"gap-y":[{"gap-y":Y()}],"justify-content":[{justify:[...Le(),"normal"]}],"justify-items":[{"justify-items":[...ke(),"normal"]}],"justify-self":[{"justify-self":["auto",...ke()]}],"align-content":[{content:["normal",...Le()]}],"align-items":[{items:[...ke(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...ke(),{baseline:["","last"]}]}],"place-content":[{"place-content":Le()}],"place-items":[{"place-items":[...ke(),"baseline"]}],"place-self":[{"place-self":["auto",...ke()]}],p:[{p:Y()}],px:[{px:Y()}],py:[{py:Y()}],ps:[{ps:Y()}],pe:[{pe:Y()}],pbs:[{pbs:Y()}],pbe:[{pbe:Y()}],pt:[{pt:Y()}],pr:[{pr:Y()}],pb:[{pb:Y()}],pl:[{pl:Y()}],m:[{m:j()}],mx:[{mx:j()}],my:[{my:j()}],ms:[{ms:j()}],me:[{me:j()}],mbs:[{mbs:j()}],mbe:[{mbe:j()}],mt:[{mt:j()}],mr:[{mr:j()}],mb:[{mb:j()}],ml:[{ml:j()}],"space-x":[{"space-x":Y()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":Y()}],"space-y-reverse":["space-y-reverse"],size:[{size:B()}],"inline-size":[{inline:["auto",...F()]}],"min-inline-size":[{"min-inline":["auto",...F()]}],"max-inline-size":[{"max-inline":["none",...F()]}],"block-size":[{block:["auto",...se()]}],"min-block-size":[{"min-block":["auto",...se()]}],"max-block-size":[{"max-block":["none",...se()]}],w:[{w:[y,"screen",...B()]}],"min-w":[{"min-w":[y,"screen","none",...B()]}],"max-w":[{"max-w":[y,"screen","none","prose",{screen:[v]},...B()]}],h:[{h:["screen","lh",...B()]}],"min-h":[{"min-h":["screen","lh","none",...B()]}],"max-h":[{"max-h":["screen","lh",...B()]}],"font-size":[{text:["base",r,Zi,$n]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[u,j1,x1]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",rc,V]}],"font-family":[{font:[N1,S1,o]}],"font-features":[{"font-features":[V]}],"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:[d,X,V]}],"line-clamp":[{"line-clamp":[de,"none",X,eg]}],leading:[{leading:[h,...Y()]}],"list-image":[{"list-image":["none",X,V]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",X,V]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:L()}],"text-color":[{text:L()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...qe(),"wavy"]}],"text-decoration-thickness":[{decoration:[de,"from-font","auto",X,$n]}],"text-decoration-color":[{decoration:L()}],"underline-offset":[{"underline-offset":[de,"auto",X,V]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:Y()}],"tab-size":[{tab:[ba,X,V]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",X,V]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",X,V]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:De()}],"bg-repeat":[{bg:ye()}],"bg-size":[{bg:ce()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},ba,X,V],radial:["",X,V],conic:[ba,X,V]},T1,E1]}],"bg-color":[{bg:L()}],"gradient-from-pos":[{from:W()}],"gradient-via-pos":[{via:W()}],"gradient-to-pos":[{to:W()}],"gradient-from":[{from:L()}],"gradient-via":[{via:L()}],"gradient-to":[{to:L()}],rounded:[{rounded:te()}],"rounded-s":[{"rounded-s":te()}],"rounded-e":[{"rounded-e":te()}],"rounded-t":[{"rounded-t":te()}],"rounded-r":[{"rounded-r":te()}],"rounded-b":[{"rounded-b":te()}],"rounded-l":[{"rounded-l":te()}],"rounded-ss":[{"rounded-ss":te()}],"rounded-se":[{"rounded-se":te()}],"rounded-ee":[{"rounded-ee":te()}],"rounded-es":[{"rounded-es":te()}],"rounded-tl":[{"rounded-tl":te()}],"rounded-tr":[{"rounded-tr":te()}],"rounded-br":[{"rounded-br":te()}],"rounded-bl":[{"rounded-bl":te()}],"border-w":[{border:le()}],"border-w-x":[{"border-x":le()}],"border-w-y":[{"border-y":le()}],"border-w-s":[{"border-s":le()}],"border-w-e":[{"border-e":le()}],"border-w-bs":[{"border-bs":le()}],"border-w-be":[{"border-be":le()}],"border-w-t":[{"border-t":le()}],"border-w-r":[{"border-r":le()}],"border-w-b":[{"border-b":le()}],"border-w-l":[{"border-l":le()}],"divide-x":[{"divide-x":le()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":le()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...qe(),"hidden","none"]}],"divide-style":[{divide:[...qe(),"hidden","none"]}],"border-color":[{border:L()}],"border-color-x":[{"border-x":L()}],"border-color-y":[{"border-y":L()}],"border-color-s":[{"border-s":L()}],"border-color-e":[{"border-e":L()}],"border-color-bs":[{"border-bs":L()}],"border-color-be":[{"border-be":L()}],"border-color-t":[{"border-t":L()}],"border-color-r":[{"border-r":L()}],"border-color-b":[{"border-b":L()}],"border-color-l":[{"border-l":L()}],"divide-color":[{divide:L()}],"outline-style":[{outline:[...qe(),"none","hidden"]}],"outline-offset":[{"outline-offset":[de,X,V]}],"outline-w":[{outline:["",de,Zi,$n]}],"outline-color":[{outline:L()}],shadow:[{shadow:["","none",O,xo,yo]}],"shadow-color":[{shadow:L()}],"inset-shadow":[{"inset-shadow":["none",g,xo,yo]}],"inset-shadow-color":[{"inset-shadow":L()}],"ring-w":[{ring:le()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:L()}],"ring-offset-w":[{"ring-offset":[de,$n]}],"ring-offset-color":[{"ring-offset":L()}],"inset-ring-w":[{"inset-ring":le()}],"inset-ring-color":[{"inset-ring":L()}],"text-shadow":[{"text-shadow":["none",_,xo,yo]}],"text-shadow-color":[{"text-shadow":L()}],opacity:[{opacity:[de,X,V]}],"mix-blend":[{"mix-blend":[...ht(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":ht()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[de]}],"mask-image-linear-from-pos":[{"mask-linear-from":ae()}],"mask-image-linear-to-pos":[{"mask-linear-to":ae()}],"mask-image-linear-from-color":[{"mask-linear-from":L()}],"mask-image-linear-to-color":[{"mask-linear-to":L()}],"mask-image-t-from-pos":[{"mask-t-from":ae()}],"mask-image-t-to-pos":[{"mask-t-to":ae()}],"mask-image-t-from-color":[{"mask-t-from":L()}],"mask-image-t-to-color":[{"mask-t-to":L()}],"mask-image-r-from-pos":[{"mask-r-from":ae()}],"mask-image-r-to-pos":[{"mask-r-to":ae()}],"mask-image-r-from-color":[{"mask-r-from":L()}],"mask-image-r-to-color":[{"mask-r-to":L()}],"mask-image-b-from-pos":[{"mask-b-from":ae()}],"mask-image-b-to-pos":[{"mask-b-to":ae()}],"mask-image-b-from-color":[{"mask-b-from":L()}],"mask-image-b-to-color":[{"mask-b-to":L()}],"mask-image-l-from-pos":[{"mask-l-from":ae()}],"mask-image-l-to-pos":[{"mask-l-to":ae()}],"mask-image-l-from-color":[{"mask-l-from":L()}],"mask-image-l-to-color":[{"mask-l-to":L()}],"mask-image-x-from-pos":[{"mask-x-from":ae()}],"mask-image-x-to-pos":[{"mask-x-to":ae()}],"mask-image-x-from-color":[{"mask-x-from":L()}],"mask-image-x-to-color":[{"mask-x-to":L()}],"mask-image-y-from-pos":[{"mask-y-from":ae()}],"mask-image-y-to-pos":[{"mask-y-to":ae()}],"mask-image-y-from-color":[{"mask-y-from":L()}],"mask-image-y-to-color":[{"mask-y-to":L()}],"mask-image-radial":[{"mask-radial":[X,V]}],"mask-image-radial-from-pos":[{"mask-radial-from":ae()}],"mask-image-radial-to-pos":[{"mask-radial-to":ae()}],"mask-image-radial-from-color":[{"mask-radial-from":L()}],"mask-image-radial-to-color":[{"mask-radial-to":L()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":P()}],"mask-image-conic-pos":[{"mask-conic":[de]}],"mask-image-conic-from-pos":[{"mask-conic-from":ae()}],"mask-image-conic-to-pos":[{"mask-conic-to":ae()}],"mask-image-conic-from-color":[{"mask-conic-from":L()}],"mask-image-conic-to-color":[{"mask-conic-to":L()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:De()}],"mask-repeat":[{mask:ye()}],"mask-size":[{mask:ce()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",X,V]}],filter:[{filter:["","none",X,V]}],blur:[{blur:Xt()}],brightness:[{brightness:[de,X,V]}],contrast:[{contrast:[de,X,V]}],"drop-shadow":[{"drop-shadow":["","none",H,xo,yo]}],"drop-shadow-color":[{"drop-shadow":L()}],grayscale:[{grayscale:["",de,X,V]}],"hue-rotate":[{"hue-rotate":[de,X,V]}],invert:[{invert:["",de,X,V]}],saturate:[{saturate:[de,X,V]}],sepia:[{sepia:["",de,X,V]}],"backdrop-filter":[{"backdrop-filter":["","none",X,V]}],"backdrop-blur":[{"backdrop-blur":Xt()}],"backdrop-brightness":[{"backdrop-brightness":[de,X,V]}],"backdrop-contrast":[{"backdrop-contrast":[de,X,V]}],"backdrop-grayscale":[{"backdrop-grayscale":["",de,X,V]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[de,X,V]}],"backdrop-invert":[{"backdrop-invert":["",de,X,V]}],"backdrop-opacity":[{"backdrop-opacity":[de,X,V]}],"backdrop-saturate":[{"backdrop-saturate":[de,X,V]}],"backdrop-sepia":[{"backdrop-sepia":["",de,X,V]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":Y()}],"border-spacing-x":[{"border-spacing-x":Y()}],"border-spacing-y":[{"border-spacing-y":Y()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",X,V]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[de,"initial",X,V]}],ease:[{ease:["linear","initial",G,X,V]}],delay:[{delay:[de,X,V]}],animate:[{animate:["none",Z,X,V]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[U,X,V]}],"perspective-origin":[{"perspective-origin":ee()}],rotate:[{rotate:St()}],"rotate-x":[{"rotate-x":St()}],"rotate-y":[{"rotate-y":St()}],"rotate-z":[{"rotate-z":St()}],scale:[{scale:Et()}],"scale-x":[{"scale-x":Et()}],"scale-y":[{"scale-y":Et()}],"scale-z":[{"scale-z":Et()}],"scale-3d":["scale-3d"],skew:[{skew:Qt()}],"skew-x":[{"skew-x":Qt()}],"skew-y":[{"skew-y":Qt()}],transform:[{transform:[X,V,"","none","gpu","cpu"]}],"transform-origin":[{origin:ee()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:gt()}],"translate-x":[{"translate-x":gt()}],"translate-y":[{"translate-y":gt()}],"translate-z":[{"translate-z":gt()}],"translate-none":["translate-none"],zoom:[{zoom:[ba,X,V]}],accent:[{accent:L()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:L()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],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",X,V]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scrollbar-thumb-color":[{"scrollbar-thumb":L()}],"scrollbar-track-color":[{"scrollbar-track":L()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":Y()}],"scroll-mx":[{"scroll-mx":Y()}],"scroll-my":[{"scroll-my":Y()}],"scroll-ms":[{"scroll-ms":Y()}],"scroll-me":[{"scroll-me":Y()}],"scroll-mbs":[{"scroll-mbs":Y()}],"scroll-mbe":[{"scroll-mbe":Y()}],"scroll-mt":[{"scroll-mt":Y()}],"scroll-mr":[{"scroll-mr":Y()}],"scroll-mb":[{"scroll-mb":Y()}],"scroll-ml":[{"scroll-ml":Y()}],"scroll-p":[{"scroll-p":Y()}],"scroll-px":[{"scroll-px":Y()}],"scroll-py":[{"scroll-py":Y()}],"scroll-ps":[{"scroll-ps":Y()}],"scroll-pe":[{"scroll-pe":Y()}],"scroll-pbs":[{"scroll-pbs":Y()}],"scroll-pbe":[{"scroll-pbe":Y()}],"scroll-pt":[{"scroll-pt":Y()}],"scroll-pr":[{"scroll-pr":Y()}],"scroll-pb":[{"scroll-pb":Y()}],"scroll-pl":[{"scroll-pl":Y()}],"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",X,V]}],fill:[{fill:["none",...L()]}],"stroke-w":[{stroke:[de,Zi,$n,eg]}],stroke:[{stroke:["none",...L()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{"container-named":["container-type"],overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","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","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","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-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","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-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","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"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","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-pbs","scroll-pbe","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"]},postfixLookupClassGroups:["container-type"],orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},w1=s1(D1);function Ae(...l){return w1(Tg(l))}const _1=Zg("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive/10 text-destructive dark:bg-destructive/20",success:"border-transparent bg-success/10 text-success dark:bg-success/15",warning:"border-transparent bg-warning/15 text-warning",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function sa({className:l,variant:o,asChild:r=!1,...u}){const d=r?Bc:"span";return f.jsx(d,{"data-slot":"badge",className:Ae(_1({variant:o}),l),...u})}function dt(l){return l==null?"0":l>=1e6?`${(l/1e6).toFixed(1)}M`:l>=1e4?`${(l/1e3).toFixed(1)}k`:Math.round(l).toLocaleString()}function xc(l){if(l==null||l<=0)return"0 B";const o=["B","KiB","MiB","GiB","TiB"];let r=0;for(;l>=1024&&r=100||r===0?0:1)} ${o[r]}`}function ov(l){if(l==null||l<0)return"–";const o=Math.floor(l);return o<60?`${o}s`:o<3600?`${Math.floor(o/60)}m ${o%60}s`:o<86400?`${Math.floor(o/3600)}h ${Math.floor(o%3600/60)}m`:`${Math.floor(o/86400)}d ${Math.floor(o%86400/3600)}h`}function rv(l){return l==null||l<.05?"0/s":l<10?`${l.toFixed(1)}/s`:`${dt(l)}/s`}function Lo(l){if(!l)return"–";const o=(Date.now()-new Date(l).getTime())/1e3;return o<60?`${Math.max(0,Math.floor(o))}s ago`:o<3600?`${Math.floor(o/60)}m ago`:o<86400?`${Math.floor(o/3600)}h ago`:`${Math.floor(o/86400)}d ago`}const C1=[{id:"overview",label:"Overview",icon:vy},{id:"tables",label:"Tables",icon:Hg},{id:"schema",label:"Schema",icon:kg},{id:"backfill",label:"Backfill",icon:Oc},{id:"dlq",label:"Dead letters",icon:Rc}];function M1(){const o=document.documentElement.classList.toggle("dark");localStorage.setItem("gtc-theme",o?"dark":"light")}function O1({page:l,onNavigate:o,stats:r,offline:u=!1,dlqCount:d,title:h,description:v,actions:y,children:N}){return f.jsxs("div",{className:"flex min-h-screen",children:[f.jsxs("aside",{className:"bg-sidebar text-sidebar-foreground border-sidebar-border fixed inset-y-0 left-0 z-30 flex w-14 flex-col border-r lg:w-56",children:[f.jsxs("div",{className:"flex items-center justify-center gap-2.5 px-2 pt-5 pb-4 lg:justify-start lg:px-4",children:[f.jsx("div",{className:"flex size-8 shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-amber-400 to-orange-500 text-white shadow-sm",children:f.jsx(Cy,{className:"size-4.5",fill:"currentColor",strokeWidth:0})}),f.jsxs("div",{className:"hidden leading-tight lg:block",children:[f.jsx("div",{className:"text-sm font-bold tracking-tight",children:"GTC"}),f.jsx("div",{className:"text-sidebar-foreground/60 text-[10px] font-medium tracking-wide uppercase",children:"Change Data Capture"})]})]}),f.jsx("nav",{className:"flex flex-1 flex-col gap-0.5 px-2 pt-2 lg:px-2.5",children:C1.map(({id:S,label:O,icon:g})=>f.jsxs("button",{type:"button",title:O,onClick:()=>o(S),className:Ae("relative flex cursor-pointer items-center justify-center gap-2.5 rounded-md px-2.5 py-2 text-[13px] font-medium transition-colors lg:justify-start",l===S?"bg-sidebar-accent text-sidebar-accent-foreground":"text-sidebar-foreground/65 hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground"),children:[f.jsx(g,{className:"size-4 shrink-0",strokeWidth:l===S?2.25:2}),f.jsx("span",{className:"hidden flex-1 text-left lg:block",children:O}),S==="dlq"&&d>0&&f.jsxs(f.Fragment,{children:[f.jsx(sa,{variant:"destructive",className:"hidden h-5 min-w-5 px-1.5 tabular-nums lg:inline-flex",children:d}),f.jsx("span",{className:"absolute top-1.5 right-1.5 size-1.5 rounded-full bg-red-500 lg:hidden"})]})]},S))}),f.jsxs("div",{className:"border-sidebar-border hidden space-y-3 border-t px-4 py-4 lg:block",children:[f.jsxs("div",{className:"text-sidebar-foreground/60 flex items-center justify-between text-xs",children:[f.jsxs("span",{className:"flex items-center gap-1.5",children:[f.jsx("span",{className:Ae("relative flex size-2 rounded-full",r?.streaming?"bg-emerald-500":"bg-red-500"),children:r?.streaming&&f.jsx("span",{className:"absolute inline-flex size-full animate-ping rounded-full bg-emerald-500 opacity-60"})}),r?.streaming?"Streaming":"Disconnected"]}),f.jsx("span",{className:"tabular-nums",children:r?`up ${ov(r.uptime_seconds)}`:""})]}),f.jsxs("div",{className:"text-sidebar-foreground/60 flex items-center gap-1 text-xs",children:[f.jsxs("a",{href:"/metrics",target:"_blank",rel:"noreferrer",className:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex items-center gap-1.5 rounded-md px-2 py-1",children:[f.jsx(Pb,{className:"size-3.5"})," Metrics"]}),f.jsxs("a",{href:"https://github.com/emoss08/gtc",target:"_blank",rel:"noreferrer",className:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex items-center gap-1.5 rounded-md px-2 py-1",children:[f.jsx(fy,{className:"size-3.5"})," GitHub"]}),f.jsxs("button",{type:"button",onClick:M1,className:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground ml-auto cursor-pointer rounded-md p-1.5","aria-label":"Toggle theme",children:[f.jsx(Ny,{className:"size-3.5 dark:hidden"}),f.jsx(by,{className:"hidden size-3.5 dark:block"})]})]})]})]}),f.jsxs("div",{className:"ml-14 flex min-w-0 flex-1 flex-col lg:ml-56",children:[u&&f.jsx("div",{className:"bg-destructive/90 sticky top-0 z-30 px-6 py-1.5 text-center text-xs font-medium text-white",children:"Cannot reach GTC — the data below may be stale. Retrying…"}),f.jsx("header",{className:"bg-background/80 sticky top-0 z-20 border-b backdrop-blur",children:f.jsxs("div",{className:"mx-auto flex h-14 w-full max-w-6xl items-center justify-between gap-4 px-6",children:[f.jsxs("div",{className:"min-w-0",children:[f.jsx("h1",{className:"truncate text-[15px] font-semibold tracking-tight",children:h}),f.jsx("p",{className:"text-muted-foreground truncate text-xs",children:v})]}),f.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[r&&f.jsxs(f.Fragment,{children:[f.jsxs(sa,{variant:"outline",className:"text-muted-foreground hidden font-mono text-[11px] sm:inline-flex",children:[f.jsx(Ug,{className:"size-3"}),r.current_lsn]}),f.jsx(sa,{variant:r.ready?"success":"warning",children:r.ready?"Ready":"Not ready"})]}),y]})]})}),f.jsx("main",{className:"mx-auto w-full max-w-6xl flex-1 px-6 py-6",children:N})]})]})}function ca({className:l,...o}){return f.jsx("div",{"data-slot":"card",className:Ae("bg-card text-card-foreground flex flex-col gap-4 rounded-xl border py-4 shadow-sm",l),...o})}function Ql({className:l,...o}){return f.jsx("div",{"data-slot":"card-header",className:Ae("flex items-center justify-between gap-2 px-4",l),...o})}function Zl({className:l,...o}){return f.jsx("div",{"data-slot":"card-title",className:Ae("text-sm leading-none font-semibold tracking-tight",l),...o})}function Ki({className:l,...o}){return f.jsx("div",{"data-slot":"card-description",className:Ae("text-muted-foreground text-xs",l),...o})}function xa({className:l,...o}){return f.jsx("div",{"data-slot":"card-content",className:Ae("px-4",l),...o})}const R1=Mt({name:me(),healthy:Jl(),breaker_state:Se(),succeeded:Se(),failed:Se(),filtered:Se(),retries:Se(),errors_by_type:Ng(me(),Se()).nullable().transform(l=>l??{})}),U1=Mt({table:me(),insert:Se(),update:Se(),delete:Se(),read:Se(),truncate:Se(),total:Se()}),k1=Mt({schema:me(),table:me(),state:fb(["pending","running","done","skipped","failed"]),rows_copied:Se(),started_at:me().optional().nullable(),completed_at:me().optional().nullable(),error:me().optional()}),B1=Mt({uptime_seconds:Se(),version:me().default("dev"),slot_name:me().default(""),publication:me().default(""),ready:Jl(),streaming:Jl(),current_lsn:me(),wal_lag_bytes:Se(),inflight:Se(),events_total:Se(),operations:Ng(me(),Se()).nullable().transform(l=>l??{}),sinks:la(R1),tables:la(U1),backfill:la(k1),dlq:Mt({enabled:Jl(),entries:Se(),parked_total:Se().default(0),retried_total:Se().default(0)})}),H1=Mt({interval_seconds:Se(),samples:la(Mt({t:Se(),events_total:Se(),wal_lag_bytes:Se(),inflight:Se(),dlq_entries:Se()})).nullable().transform(l=>l??[])}),So=Mt({name:me(),type:me(),type_oid:Se(),part_of_key:Jl()}),L1=Mt({schema:me(),table:me(),relation_id:Se(),previous_schema:me().optional(),previous_table:me().optional(),added_columns:la(So).optional(),dropped_columns:la(So).optional(),changed_columns:la(Mt({name:me(),from:So,to:So})).optional(),key_columns:la(me()).optional(),previous_key_columns:la(me()).optional(),replica_identity:me(),previous_replica_identity:me().optional(),kinds:la(me()),lsn:me(),transaction_id:Se(),timestamp:me(),breaking:Jl(),summary:me()}),q1=Mt({total:Se(),changes:la(L1).nullable().transform(l=>l??[])}),Y1=Mt({id:me(),sink:me(),schema:me(),table:me(),operation:me(),lsn:me(),error:me(),attempts:Se(),first_failed_at:me().optional(),last_failed_at:me(),event:db().optional()}),G1=Mt({total:Se(),entries:la(Y1).nullable().transform(l=>l??[])});async function jn(l,o){const r=await fetch(l,{headers:{"Content-Type":"application/json"},...o}),u=await r.json().catch(()=>({}));if(!r.ok)throw new Error(u.error??`${r.status} ${r.statusText}`);return u}const V1=async()=>B1.parse(await jn("/api/stats")),X1=async()=>H1.parse(await jn("/api/history")),Q1=async()=>q1.parse(await jn("/api/schema")),Z1=async(l=100)=>G1.parse(await jn(`/dlq?limit=${l}`)),K1=l=>jn("/dlq/retry",{method:"POST",body:JSON.stringify({id:l})}),J1=()=>jn("/dlq/retry",{method:"POST",body:JSON.stringify({all:!0})}),F1=l=>jn("/dlq/discard",{method:"POST",body:JSON.stringify({id:l})}),$1=l=>jn("/backfill",{method:"POST",body:JSON.stringify(l?{table:l}:{all:!0})}),uv=2e3;function W1(){return ko({queryKey:["stats"],queryFn:V1,refetchInterval:uv})}function I1(){const{data:l,isLoading:o}=ko({queryKey:["history"],queryFn:X1,refetchInterval:5e3});return{points:E.useMemo(()=>{const u=l?.samples??[],d=[];for(let h=1;h0?Math.max(0,(y.events_total-v.events_total)/N):0;d.push({t:y.t,rate:S,walLag:y.wal_lag_bytes,inflight:y.inflight,dlq:y.dlq_entries})}return d},[l]),isLoading:o}}function P1(){const[l,o]=E.useState(()=>document.documentElement.classList.contains("dark"));return E.useEffect(()=>{const r=new MutationObserver(()=>{o(document.documentElement.classList.contains("dark"))});return r.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}),()=>r.disconnect()},[]),l}function ex(){return ko({queryKey:["schema"],queryFn:Q1,refetchInterval:1e4})}function tx(l=!0){return ko({queryKey:["dlq"],queryFn:()=>Z1(200),refetchInterval:uv,enabled:l})}const qc={INSERT:"#10b981",UPDATE:"#0ea5e9",DELETE:"#ef4444",READ:"#8b5cf6",TRUNCATE:"#f59e0b"};function qo(){const l=P1();return{dark:l,grid:l?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",axis:l?"rgba(255,255,255,0.45)":"rgba(0,0,0,0.45)",tooltipBg:l?"#27272a":"#ffffff",tooltipText:l?"#fafafa":"#18181b",tooltipBorder:l?"rgba(255,255,255,0.12)":"rgba(0,0,0,0.1)"}}function Uo(l){const o=new Date(l);return`${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}function Yo(l){return{backgroundColor:l.tooltipBg,color:l.tooltipText,border:`1px solid ${l.tooltipBorder}`,borderRadius:8,fontSize:12,padding:"6px 10px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)"}}function ax({points:l}){const o=qo();return f.jsx(jg,{width:"100%",height:220,children:f.jsxs(Ag,{data:l,margin:{top:8,right:8,bottom:0,left:-12},children:[f.jsx("defs",{children:f.jsxs("linearGradient",{id:"rateFill",x1:"0",y1:"0",x2:"0",y2:"1",children:[f.jsx("stop",{offset:"0%",stopColor:"#10b981",stopOpacity:.35}),f.jsx("stop",{offset:"100%",stopColor:"#10b981",stopOpacity:0})]})}),f.jsx(Dg,{stroke:o.grid,vertical:!1}),f.jsx(wg,{dataKey:"t",tickFormatter:Uo,stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,minTickGap:48}),f.jsx(_g,{stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,tickFormatter:r=>dt(r),width:48}),f.jsx(Cg,{contentStyle:Yo(o),labelFormatter:r=>Uo(Number(r)),formatter:r=>[rv(Number(r)),"events"]}),f.jsx(Mg,{type:"monotone",dataKey:"rate",stroke:"#10b981",strokeWidth:2,fill:"url(#rateFill)",isAnimationActive:!1})]})})}function nx({points:l}){const o=qo();return f.jsx(jg,{width:"100%",height:140,children:f.jsxs(Ag,{data:l,margin:{top:8,right:8,bottom:0,left:8},children:[f.jsx("defs",{children:f.jsxs("linearGradient",{id:"lagFill",x1:"0",y1:"0",x2:"0",y2:"1",children:[f.jsx("stop",{offset:"0%",stopColor:"#f59e0b",stopOpacity:.3}),f.jsx("stop",{offset:"100%",stopColor:"#f59e0b",stopOpacity:0})]})}),f.jsx(Dg,{stroke:o.grid,vertical:!1}),f.jsx(wg,{dataKey:"t",tickFormatter:Uo,stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,minTickGap:48}),f.jsx(_g,{stroke:o.axis,fontSize:11,tickLine:!1,axisLine:!1,tickFormatter:r=>xc(r),width:64}),f.jsx(Cg,{contentStyle:Yo(o),labelFormatter:r=>Uo(Number(r)),formatter:r=>[xc(Number(r)),"WAL lag"]}),f.jsx(Mg,{type:"monotone",dataKey:"walLag",stroke:"#f59e0b",strokeWidth:2,fill:"url(#lagFill)",isAnimationActive:!1})]})})}function lx({operations:l}){const o=qo(),r=E.useMemo(()=>Object.entries(l).filter(([,d])=>d>0).sort((d,h)=>h[1]-d[1]).map(([d,h])=>({id:d,label:d,value:h})),[l]),u=r.reduce((d,h)=>d+h.value,0);return r.length===0?f.jsx("div",{className:"text-muted-foreground flex h-[200px] items-center justify-center text-sm",children:"No events yet."}):f.jsxs("div",{className:"relative h-[200px]",children:[f.jsx(Mb,{data:r,margin:{top:12,right:12,bottom:12,left:12},innerRadius:.72,padAngle:1.5,cornerRadius:3,colors:d=>qc[d.id]??"#71717a",enableArcLinkLabels:!1,enableArcLabels:!1,borderWidth:0,isInteractive:!0,animate:!1,tooltip:({datum:d})=>f.jsxs("div",{style:Yo(o),className:"flex items-center gap-2 whitespace-nowrap",children:[f.jsx("span",{className:"size-2 rounded-full",style:{backgroundColor:d.color}}),d.id,": ",dt(d.value)," (",u>0?(d.value/u*100).toFixed(1):0,"%)"]})}),f.jsxs("div",{className:"pointer-events-none absolute inset-0 flex flex-col items-center justify-center",children:[f.jsx("div",{className:"text-xl font-semibold tabular-nums",children:dt(u)}),f.jsx("div",{className:"text-muted-foreground text-[11px]",children:"events"})]})]})}function ix({tables:l}){const o=qo(),r=E.useMemo(()=>l.slice().sort((u,d)=>d.total-u.total).slice(0,8).reverse().map(u=>({table:u.table,INSERT:u.insert,UPDATE:u.update,DELETE:u.delete,READ:u.read,TRUNCATE:u.truncate})),[l]);return r.length===0?f.jsx("div",{className:"text-muted-foreground flex h-[220px] items-center justify-center text-sm",children:"No events yet."}):f.jsx("div",{style:{height:Math.max(180,r.length*34+40)},children:f.jsx(Ob,{data:r,keys:["INSERT","UPDATE","DELETE","READ","TRUNCATE"],indexBy:"table",layout:"horizontal",margin:{top:0,right:16,bottom:28,left:130},padding:.35,colors:({id:u})=>qc[u]??"#71717a",borderRadius:2,enableLabel:!1,enableGridY:!1,enableGridX:!0,animate:!1,theme:{grid:{line:{stroke:o.grid}},axis:{ticks:{text:{fill:o.axis,fontSize:11}}}},axisBottom:{tickSize:0,tickPadding:8,format:u=>dt(Number(u))},axisLeft:{tickSize:0,tickPadding:8},tooltip:({id:u,value:d,indexValue:h,color:v})=>f.jsxs("div",{style:Yo(o),className:"flex items-center gap-2 whitespace-nowrap",children:[f.jsx("span",{className:"size-2 rounded-full",style:{backgroundColor:v}}),h," · ",u,": ",dt(d)]})})})}function cv(){return f.jsx("div",{className:"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]",children:Object.entries(qc).map(([l,o])=>f.jsxs("span",{className:"flex items-center gap-1.5",children:[f.jsx("span",{className:"size-2 rounded-full",style:{backgroundColor:o}}),l]},l))})}function sx({className:l,...o}){return f.jsx("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:f.jsx("table",{"data-slot":"table",className:Ae("w-full caption-bottom text-sm",l),...o})})}function ox({className:l,...o}){return f.jsx("thead",{"data-slot":"table-header",className:Ae("[&_tr]:border-b",l),...o})}function rx({className:l,...o}){return f.jsx("tbody",{"data-slot":"table-body",className:Ae("[&_tr:last-child]:border-0",l),...o})}function uc({className:l,...o}){return f.jsx("tr",{"data-slot":"table-row",className:Ae("hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",l),...o})}function ux({className:l,...o}){return f.jsx("th",{"data-slot":"table-head",className:Ae("text-muted-foreground h-9 px-3 text-left align-middle text-xs font-medium whitespace-nowrap first:pl-4 last:pr-4",l),...o})}function ng({className:l,...o}){return f.jsx("td",{"data-slot":"table-cell",className:Ae("px-3 py-2.5 align-middle whitespace-nowrap first:pl-4 last:pr-4",l),...o})}function Wi({table:l,empty:o}){const r=l.getRowModel().rows,u=l.getAllLeafColumns().length;return f.jsxs(sx,{children:[f.jsx(ox,{children:l.getHeaderGroups().map(d=>f.jsx(uc,{className:"hover:bg-transparent",children:d.headers.map(h=>{const v=h.column.getCanSort(),y=h.column.getIsSorted();return f.jsx(ux,{children:h.isPlaceholder?null:v?f.jsxs("button",{type:"button",className:Ae("inline-flex cursor-pointer items-center gap-1 select-none hover:text-foreground",y&&"text-foreground"),onClick:h.column.getToggleSortingHandler(),children:[f.jsx(nc,{header:h}),y==="asc"?f.jsx(Wb,{className:"size-3"}):y==="desc"?f.jsx(Fb,{className:"size-3"}):f.jsx(ty,{className:"size-3 opacity-50"})]}):f.jsx(nc,{header:h})},h.id)})},d.id))}),f.jsx(rx,{children:r.length===0?f.jsx(uc,{className:"hover:bg-transparent",children:f.jsx(ng,{colSpan:u,className:"h-28 text-center whitespace-normal",children:o??f.jsx("span",{className:"text-muted-foreground text-sm",children:"No results."})})}):r.map(d=>f.jsx(uc,{children:d.getAllCells().map(h=>f.jsx(ng,{children:f.jsx(nc,{cell:h})},h.id))},d.id))})]})}function Eo({label:l,value:o,sub:r,icon:u,tone:d="default",children:h}){return f.jsx(ca,{className:"gap-0 py-4",children:f.jsxs("div",{className:"flex items-start justify-between gap-3 px-4",children:[f.jsxs("div",{className:"min-w-0",children:[f.jsxs("div",{className:"text-muted-foreground flex items-center gap-1.5 text-xs font-medium",children:[f.jsx(u,{className:"size-3.5"}),l]}),f.jsx("div",{className:Ae("mt-1.5 truncate text-2xl font-semibold tracking-tight tabular-nums",d==="danger"&&"text-destructive",d==="success"&&"text-success"),children:o}),r&&f.jsx("div",{className:"text-muted-foreground mt-0.5 truncate text-xs",children:r})]}),h]})})}const Ii=mb({rowSortingFeature:Sb,sortedRowModel:Nb(),sortFns:{alphanumeric:xb,basic:yb,text:bb,datetime:pb},columnFilteringFeature:vb,globalFilteringFeature:gb,filteredRowModel:Eb(),filterFns:{includesString:hb}}),lg={0:{label:"closed",variant:"success"},1:{label:"half-open",variant:"warning"},2:{label:"open",variant:"destructive"}};function cx(l){const o=Object.entries(l).sort((r,u)=>u[1]-r[1]).map(([r,u])=>`${r}: ${dt(u)}`);return o.length>0?`errors — ${o.join(", ")}`:""}const fx=[{accessorKey:"name",header:"Sink",sortFn:"text",cell:({row:l})=>f.jsxs("span",{className:"flex items-center gap-2 font-medium",children:[f.jsx("span",{className:l.original.healthy?"size-1.5 rounded-full bg-emerald-500":"size-1.5 rounded-full bg-red-500"}),l.original.name]})},{accessorKey:"breaker_state",header:"Breaker",sortFn:"basic",cell:({getValue:l})=>{const o=lg[l()]??lg[0];return f.jsx(sa,{variant:o.variant,children:o.label})}},{accessorKey:"succeeded",header:()=>f.jsx("span",{className:"block text-right",children:"Delivered"}),sortFn:"basic",cell:({getValue:l})=>f.jsx("span",{className:"text-success block text-right tabular-nums",children:dt(l())})},{accessorKey:"failed",header:()=>f.jsx("span",{className:"block text-right",children:"Failed"}),sortFn:"basic",cell:({row:l,getValue:o})=>{const r=o();return f.jsx("span",{className:`block text-right tabular-nums ${r>0?"text-destructive":"text-muted-foreground"}`,title:cx(l.original.errors_by_type),children:dt(r)})}},{accessorKey:"retries",header:()=>f.jsx("span",{className:"block text-right",children:"Retries"}),sortFn:"basic",cell:({getValue:l})=>f.jsx("span",{className:"text-muted-foreground block text-right tabular-nums",children:dt(l())})},{accessorKey:"filtered",header:()=>f.jsx("span",{className:"block text-right",children:"Filtered"}),sortFn:"basic",cell:({getValue:l})=>f.jsx("span",{className:"text-muted-foreground block text-right tabular-nums",children:dt(l())})}];function En({label:l,value:o}){return f.jsxs("div",{className:"flex items-center justify-between gap-3 text-xs",children:[f.jsx("span",{className:"text-muted-foreground shrink-0",children:l}),f.jsx("span",{className:"truncate text-right font-medium",children:o})]})}function dx({stats:l}){const{points:o}=I1(),r=E.useMemo(()=>l?.sinks??[],[l]),u=o.length>0?o[o.length-1].rate:0,d=$i({features:Ii,columns:fx,data:r}),h=l?.dlq.entries??0;return f.jsxs("div",{className:"space-y-4",children:[f.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-4",children:[f.jsx(Eo,{label:"Throughput",value:rv(u),sub:`${dt(l?.events_total)} events total`,icon:Ug}),f.jsx(Eo,{label:"WAL lag",value:xc(l?.wal_lag_bytes),sub:l?.streaming?"replication live":"replication down",icon:uy}),f.jsx(Eo,{label:"In flight",value:String(l?.inflight??0),sub:"events being processed",icon:hy}),f.jsx(Eo,{label:"Dead letters",value:String(h),sub:l?.dlq.enabled?`${dt(l.dlq.parked_total)} parked · ${dt(l.dlq.retried_total)} retried all-time`:"DLQ disabled",icon:Rc,tone:h>0?"danger":"default"})]}),f.jsxs("div",{className:"grid gap-4 xl:grid-cols-3",children:[f.jsxs(ca,{className:"gap-2 xl:col-span-2",children:[f.jsx(Ql,{children:f.jsxs("div",{children:[f.jsx(Zl,{children:"Throughput"}),f.jsx(Ki,{className:"mt-1",children:"Events per second · last 30 minutes"})]})}),f.jsx(xa,{className:"pr-2",children:f.jsx(ax,{points:o})})]}),f.jsxs(ca,{className:"gap-2",children:[f.jsx(Ql,{children:f.jsxs("div",{children:[f.jsx(Zl,{children:"Operation mix"}),f.jsx(Ki,{className:"mt-1",children:"All events since start"})]})}),f.jsxs(xa,{children:[f.jsx(lx,{operations:l?.operations??{}}),f.jsx("div",{className:"mt-2 flex justify-center",children:f.jsx(cv,{})})]})]})]}),f.jsxs("div",{className:"grid gap-4 xl:grid-cols-3",children:[f.jsxs(ca,{className:"gap-2 xl:col-span-2",children:[f.jsx(Ql,{children:f.jsxs("div",{children:[f.jsx(Zl,{children:"Replication lag"}),f.jsx(Ki,{className:"mt-1",children:"WAL bytes between the server and the last confirmed position — sustained growth means a sink can't keep up"})]})}),f.jsx(xa,{className:"pr-2",children:f.jsx(nx,{points:o})})]}),f.jsxs(ca,{className:"gap-2",children:[f.jsx(Ql,{children:f.jsx(Zl,{children:"Instance"})}),f.jsxs(xa,{className:"space-y-2.5",children:[f.jsx(En,{label:"Version",value:l?.version??"–"}),f.jsx(En,{label:"Status",value:f.jsxs("span",{className:"flex items-center justify-end gap-1.5",children:[f.jsx(sa,{variant:l?.streaming?"success":"destructive",children:l?.streaming?"streaming":"disconnected"}),f.jsx(sa,{variant:l?.ready?"success":"warning",children:l?.ready?"ready":"not ready"})]})}),f.jsx(En,{label:"Uptime",value:ov(l?.uptime_seconds)}),f.jsx(En,{label:"Current LSN",value:f.jsx("span",{className:"font-mono text-[11px]",children:l?.current_lsn??"–"})}),f.jsx(En,{label:"Slot",value:f.jsx("span",{className:"font-mono text-[11px]",children:l?.slot_name||"–"})}),f.jsx(En,{label:"Publication",value:f.jsx("span",{className:"font-mono text-[11px]",children:l?.publication||"–"})}),f.jsx(En,{label:"Tables observed",value:String(l?.tables.length??0)}),f.jsx(En,{label:"Dead-letter queue",value:l?.dlq.enabled?`${h} parked`:"disabled"})]})]})]}),f.jsxs(ca,{className:"gap-3",children:[f.jsxs(Ql,{children:[f.jsxs("div",{children:[f.jsx(Zl,{children:"Sinks"}),f.jsx(Ki,{className:"mt-1",children:"Delivery state per destination — the circuit breaker opens while a sink is down. Hover a failure count for the error breakdown."})]}),f.jsxs(sa,{variant:"outline",className:"text-muted-foreground",children:[f.jsx(Kb,{className:"size-3"}),r.length," active"]})]}),f.jsx(xa,{className:"px-0",children:f.jsx(Wi,{table:d,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(ny,{className:"size-5"}),"No sinks configured — set REDIS_URL, REDIS_JSON_URL, or MEILISEARCH_URL."]})})})]})]})}function Go({className:l,type:o,...r}){return f.jsx("input",{type:o,"data-slot":"input",className:Ae("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",l),...r})}function No(l,o){return f.jsx("span",{className:`block text-right tabular-nums ${l>0?o:"text-muted-foreground/50"}`,children:dt(l)})}function mx(l){return[{accessorKey:"table",header:"Table",sortFn:"text",cell:({getValue:o})=>f.jsx("span",{className:"font-medium",children:o()})},{accessorKey:"insert",header:()=>f.jsx("span",{className:"block text-right",children:"Inserts"}),sortFn:"basic",cell:({getValue:o})=>No(o(),"text-emerald-600 dark:text-emerald-400")},{accessorKey:"update",header:()=>f.jsx("span",{className:"block text-right",children:"Updates"}),sortFn:"basic",cell:({getValue:o})=>No(o(),"text-sky-600 dark:text-sky-400")},{accessorKey:"delete",header:()=>f.jsx("span",{className:"block text-right",children:"Deletes"}),sortFn:"basic",cell:({getValue:o})=>No(o(),"text-red-600 dark:text-red-400")},{accessorKey:"read",header:()=>f.jsx("span",{className:"block text-right",children:"Backfill reads"}),sortFn:"basic",cell:({getValue:o})=>No(o(),"text-violet-600 dark:text-violet-400")},{accessorKey:"total",header:()=>f.jsx("span",{className:"block text-right",children:"Total"}),sortFn:"basic",cell:({getValue:o})=>{const r=o(),u=l>0?r/l*100:0;return f.jsxs("div",{className:"flex items-center justify-end gap-2",children:[f.jsx("span",{className:"font-medium tabular-nums",children:dt(r)}),f.jsx("span",{className:"bg-muted relative h-1.5 w-16 overflow-hidden rounded-full",children:f.jsx("span",{className:"bg-primary/70 absolute inset-y-0 left-0 rounded-full",style:{width:`${Math.max(2,u)}%`}})})]})}}]}function hx({stats:l}){const[o,r]=E.useState(""),u=E.useMemo(()=>l?.tables??[],[l]),d=E.useMemo(()=>mx(l?.events_total??0),[l?.events_total]),h=$i({features:Ii,columns:d,data:u,globalFilterFn:"includesString",initialState:{sorting:[{id:"total",desc:!0}]},state:{globalFilter:o}});return f.jsxs("div",{className:"space-y-4",children:[u.length>0&&f.jsxs(ca,{className:"gap-2",children:[f.jsxs(Ql,{children:[f.jsxs("div",{children:[f.jsx(Zl,{children:"Busiest tables"}),f.jsxs(Ki,{className:"mt-1",children:["Top ",Math.min(8,u.length)," tables by change volume, stacked by operation"]})]}),f.jsx(cv,{})]}),f.jsx(xa,{className:"pr-2",children:f.jsx(ix,{tables:u})})]}),f.jsxs("div",{className:"relative max-w-xs",children:[f.jsx(Uc,{className:"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2"}),f.jsx(Go,{placeholder:"Filter tables…",value:o,onChange:v=>r(v.target.value),className:"h-8 pl-8 text-sm"})]}),f.jsx(ca,{className:"py-0",children:f.jsx(xa,{className:"px-0",children:f.jsx(Wi,{table:h,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(Hg,{className:"size-5"}),"No change events observed yet."]})})})})]})}const gx={column_added:"column added",column_dropped:"column dropped",column_type_changed:"type changed",key_changed:"key changed",replica_identity_changed:"replica identity",table_renamed:"renamed"},vx=new Set(["column_added"]),px=[{id:"target",accessorFn:l=>`${l.schema}.${l.table}`,header:"Table",sortFn:"text",cell:({row:l,getValue:o})=>f.jsxs("span",{className:"flex items-center gap-2",children:[f.jsx("span",{className:"font-medium",children:o()}),l.original.breaking&&f.jsx(Lg,{className:"size-3.5 text-amber-500","aria-label":"Potentially breaking for consumers"})]})},{id:"kinds",accessorFn:l=>l.kinds.join(" "),header:"Change",enableSorting:!1,cell:({row:l})=>f.jsx("div",{className:"flex flex-wrap gap-1",children:l.original.kinds.map(o=>f.jsx(sa,{variant:vx.has(o)?"success":"destructive",className:"text-[10px]",children:gx[o]??o},o))})},{accessorKey:"summary",header:"Details",enableSorting:!1,cell:({getValue:l})=>f.jsx("span",{className:"text-muted-foreground block max-w-md truncate text-xs",title:l(),children:l()})},{accessorKey:"lsn",header:"LSN",enableSorting:!1,cell:({getValue:l})=>f.jsx("span",{className:"text-muted-foreground font-mono text-xs",children:l()})},{accessorKey:"timestamp",header:"Detected",sortFn:"datetime",cell:({getValue:l})=>f.jsx("span",{className:"text-muted-foreground",children:Lo(l())})}];function bx(){const[l,o]=E.useState(""),{data:r}=ex(),u=E.useMemo(()=>r?.changes??[],[r]),d=u.filter(v=>v.breaking).length,h=$i({features:Ii,columns:px,data:u,globalFilterFn:"includesString",initialState:{sorting:[{id:"timestamp",desc:!0}]},state:{globalFilter:l}});return f.jsxs("div",{className:"space-y-4",children:[f.jsxs("div",{className:"flex items-center justify-between gap-3",children:[f.jsxs("div",{className:"relative max-w-xs flex-1",children:[f.jsx(Uc,{className:"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2"}),f.jsx(Go,{placeholder:"Filter by table or change…",value:l,onChange:v=>o(v.target.value),className:"h-8 pl-8 text-sm"})]}),d>0&&f.jsxs(sa,{variant:"destructive",className:"gap-1",children:[f.jsx(Lg,{className:"size-3"}),d," potentially breaking"]})]}),f.jsx(ca,{className:"py-0",children:f.jsx(xa,{className:"px-0",children:f.jsx(Wi,{table:h,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(kg,{className:"size-5"}),"No schema changes observed since start."]})})})}),f.jsx("p",{className:"text-muted-foreground px-1 text-xs",children:"PostgreSQL does not stream DDL statements. GTC reports the effect of a change — columns added, dropped or retyped, replica identity, renames — the moment the table's next row change arrives, so a change to an idle table surfaces when its traffic resumes."})]})}const ig=(l,o,r)=>{if(l&&"reportValidity"in l){const u=vc(r,o);l.setCustomValidity(u&&u.message||""),l.reportValidity()}},Sc=(l,o)=>{for(const r in o.fields){const u=o.fields[r];u&&u.ref&&"reportValidity"in u.ref?ig(u.ref,r,l):u&&u.refs&&u.refs.forEach(d=>ig(d,r,l))}},sg=(l,o)=>{o.shouldUseNativeValidation&&Sc(l,o);const r={};for(const u in l){const d=vc(o.fields,u),h=Object.assign(l[u]||{},{ref:d&&d.refs?d.refs[0]:d&&d.ref});if(yx(o.names||Object.keys(l),u)){const v=Object.assign({},vc(r,u));lc(v,"root",h),lc(r,u,v)}else lc(r,u,h)}return r},yx=(l,o)=>{const r=og(o).replace(/[.*+?^${}()|\\]/g,"\\$&");return l.some(u=>og(u).match(`^${r}\\.\\d+`))};function og(l){return l.replace(/[\[\]]/g,"")}function Ec(){return Ec=Object.assign?Object.assign.bind():function(l){for(var o=1;o0){var N,S,O=d.errors.reduce(function(H,R){return R.length"u")return;let o=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",o.appendChild(r),r.styleSheet?r.styleSheet.cssText=l:r.appendChild(document.createTextNode(l))}const zx=l=>{switch(l){case"success":return Ax;case"info":return wx;case"warning":return Dx;case"error":return _x;default:return null}},Tx=Array(12).fill(0),jx=({visible:l,className:o})=>q.createElement("div",{className:["sonner-loading-wrapper",o].filter(Boolean).join(" "),"data-visible":l},q.createElement("div",{className:"sonner-spinner"},Tx.map((r,u)=>q.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${u}`})))),Ax=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),Dx=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),wx=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),_x=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20","aria-hidden":"true"},q.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),Cx=q.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true"},q.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),q.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),Mx=()=>{const[l,o]=q.useState(document.hidden);return q.useEffect(()=>{const r=()=>{o(document.hidden)};return document.addEventListener("visibilitychange",r),()=>document.removeEventListener("visibilitychange",r)},[]),l};let Ox=1;const Rx=100,ug=l=>{var o;return typeof l?.id=="number"||(l==null||(o=l.id)==null?void 0:o.length)>0?l.id:Ox++};class Ux{constructor(){this.subscribe=o=>(this.subscribers.push(o),this.getActiveToasts().forEach(r=>o(r)),()=>{const r=this.subscribers.indexOf(o);this.subscribers.splice(r,1)}),this.publish=o=>{this.subscribers.forEach(r=>r(o))},this.addToast=o=>{this.publish(o),this.toasts=[...this.toasts,o],this.trimHistory()},this.trimHistory=()=>{let o=this.toasts.length-Rx;o<=0||(this.toasts=this.toasts.filter(r=>o>0&&this.dismissedToasts.has(r.id)?(this.dismissedToasts.delete(r.id),o--,!1):!0))},this.create=o=>{const{message:r,...u}=o,d=ug(o),h=this.pendingDismissals.get(d);h!==void 0&&(cancelAnimationFrame(h),this.pendingDismissals.delete(d),this.dismissedToasts.delete(d));const v=this.dismissedToasts.has(d),y=o.dismissible===void 0?!0:o.dismissible;return v&&(this.dismissedToasts.delete(d),this.toasts=this.toasts.filter(S=>S.id!==d)),(v?void 0:this.toasts.find(S=>S.id===d))?this.toasts=this.toasts.map(S=>S.id===d?(this.publish({...S,...o,id:d,title:r}),{...S,...o,id:d,dismissible:y,title:r}):S):this.addToast({title:r,...u,dismissible:y,id:d}),d},this.dismiss=o=>{if(o==null)return this.getActiveToasts().forEach(u=>{this.dismissedToasts.add(u.id),this.subscribers.forEach(d=>d({id:u.id,dismiss:!0}))}),o;this.dismissedToasts.add(o);const r=this.pendingDismissals.get(o);return r!==void 0&&cancelAnimationFrame(r),this.pendingDismissals.set(o,requestAnimationFrame(()=>{this.pendingDismissals.delete(o),this.subscribers.forEach(u=>u({id:o,dismiss:!0}))})),o},this.message=(o,r)=>this.create({...r,message:o,type:void 0}),this.error=(o,r)=>this.create({...r,message:o,type:"error"}),this.success=(o,r)=>this.create({...r,type:"success",message:o}),this.info=(o,r)=>this.create({...r,type:"info",message:o}),this.warning=(o,r)=>this.create({...r,type:"warning",message:o}),this.loading=(o,r)=>this.create({...r,type:"loading",message:o}),this.promise=(o,r)=>{if(!r)return;let u;r.loading!==void 0&&(u=this.create({...r,promise:o,type:"loading",message:r.loading,description:typeof r.description!="function"?r.description:void 0}));const d=Promise.resolve(o instanceof Function?o():o);let h=u!==void 0,v;const y=d.then(async S=>{if(v=["resolve",S],q.isValidElement(S))h=!1,this.create({id:u,type:"default",message:S});else if(Bx(S)&&!S.ok){h=!1;const g=typeof r.error=="function"?await r.error(`HTTP error! status: ${S.status}`):r.error,_=typeof r.description=="function"?await r.description(`HTTP error! status: ${S.status}`):r.description,R=typeof g=="object"&&!q.isValidElement(g)?g:{message:g};this.create({id:u,type:"error",description:_,...R})}else if(S instanceof Error){h=!1;const g=typeof r.error=="function"?await r.error(S):r.error,_=typeof r.description=="function"?await r.description(S):r.description,R=typeof g=="object"&&!q.isValidElement(g)?g:{message:g};this.create({id:u,type:"error",description:_,...R})}else if(r.success!==void 0){h=!1;const g=typeof r.success=="function"?await r.success(S):r.success,_=typeof r.description=="function"?await r.description(S):r.description,R=typeof g=="object"&&!q.isValidElement(g)?g:{message:g};this.create({id:u,type:"success",description:_,...R})}}).catch(async S=>{if(v=["reject",S],r.error!==void 0){h=!1;const O=typeof r.error=="function"?await r.error(S):r.error,g=typeof r.description=="function"?await r.description(S):r.description,H=typeof O=="object"&&!q.isValidElement(O)?O:{message:O};this.create({id:u,type:"error",description:g,...H})}}).finally(()=>{h&&(this.dismiss(u),u=void 0),r.finally==null||r.finally.call(r)}),N=()=>new Promise((S,O)=>y.then(()=>v[0]==="reject"?O(v[1]):S(v[1])).catch(O));return typeof u!="string"&&typeof u!="number"?{unwrap:N}:Object.assign(u,{unwrap:N})},this.custom=(o,r)=>{const u=ug(r);return this.create({...r,jsx:o(u),id:u,type:void 0}),u},this.getActiveToasts=()=>this.toasts.filter(o=>!this.dismissedToasts.has(o.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set,this.pendingDismissals=new Map}}const Ct=new Ux,kx=(l,o)=>Ct.message(l,o),Bx=l=>l&&typeof l=="object"&&"ok"in l&&typeof l.ok=="boolean"&&"status"in l&&typeof l.status=="number",Hx=kx,Lx=()=>Ct.toasts,qx=()=>Ct.getActiveToasts(),Nn=Object.assign(Hx,{success:Ct.success,info:Ct.info,warning:Ct.warning,error:Ct.error,custom:Ct.custom,message:Ct.message,promise:Ct.promise,dismiss:Ct.dismiss,loading:Ct.loading},{getHistory:Lx,getToasts:qx});Nx("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--normal-text);background:var(--normal-bg);border:1px solid var(--normal-border);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{-webkit-user-select:none;user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function zo(l){return l.label!==void 0}const Yx=3,Gx="24px",Vx="16px",cg=4e3,Xx=356,Qx=14,Zx=45,Kx=200;function ya(...l){return l.filter(Boolean).join(" ")}function Jx(l){const[o,r]=l.split("-"),u=[];return o&&u.push(o),r&&u.push(r),u}const Fx=l=>{var o,r,u,d,h,v,y,N,S;const{invert:O,toast:g,unstyled:_,interacting:H,setHeights:R,visibleToasts:U,heights:k,index:G,toasts:Z,expanded:K,removeToast:P,defaultRichColors:ee,closeButton:oe,style:fe,cancelButtonStyle:Y,actionButtonStyle:be,className:mt="",descriptionClassName:He="",duration:ne,position:it,gap:Le,expandByDefault:ke,classNames:j,icons:B,closeButtonAriaLabel:F="Close toast"}=l,[se,L]=q.useState(null),[De,ye]=q.useState(null),[ce,W]=q.useState(!1),[te,le]=q.useState(!1),[qe,ht]=q.useState(!1),[ae,Xt]=q.useState(!1),[St,Et]=q.useState(!1),[Qt,gt]=q.useState(0),[Il,Pn]=q.useState(0),An=q.useRef(g.duration||ne||cg),Pl=q.useRef(null),Ot=q.useRef(null),ei=G===0,ti=G+1<=U,st=g.type,es=st??"default",Ze=g.dismissible!==!1,Zo=g.className||"",ts=g.descriptionClassName||"",Dn=q.useMemo(()=>k.findIndex(ie=>ie.toastId===g.id)||0,[k,g.id]),el=q.useMemo(()=>{var ie;return(ie=g.closeButton)!=null?ie:oe},[g.closeButton,oe]),as=q.useMemo(()=>g.duration||ne||cg,[g.duration,ne]),tl=q.useRef(0),Ka=q.useRef(0),ns=q.useRef(0),Zt=q.useRef(null),[pt,ma]=it.split("-"),vt=q.useMemo(()=>k.reduce((ie,Ve,Ke)=>Ke>=Dn?ie:ie+Ve.height,0),[k,Dn]),ls=Mx(),Kt=q.useMemo(()=>{var ie;return(ie=l.swipeDirections)!=null?ie:Jx(it)},[l.swipeDirections,it]),Ko=g.invert||O,Ja=st==="loading";Ka.current=q.useMemo(()=>Dn*Le+vt,[Dn,vt]),q.useEffect(()=>{An.current=as},[as]),q.useEffect(()=>{W(!0)},[]),q.useEffect(()=>{const ie=Ot.current;if(ie){const Ve=ie.getBoundingClientRect().height;return Pn(Ve),R(Ke=>[{toastId:g.id,height:Ve,position:g.position},...Ke]),()=>R(Ke=>Ke.filter(Je=>Je.toastId!==g.id))}},[R,g.id]),q.useLayoutEffect(()=>{if(!ce)return;const ie=Ot.current,Ve=ie.style.height;ie.style.height="auto";const Ke=ie.getBoundingClientRect().height;ie.style.height=Ve,Pn(Ke),R(Je=>Je.find(Fe=>Fe.toastId===g.id)?Je.map(Fe=>Fe.toastId===g.id?{...Fe,height:Ke}:Fe):[{toastId:g.id,height:Ke,position:g.position},...Je])},[ce,g.title,g.description,R,g.id,g.jsx,g.action,g.cancel]);const Rt=q.useCallback(()=>{le(!0),gt(Ka.current),R(ie=>ie.filter(Ve=>Ve.toastId!==g.id)),setTimeout(()=>{P(g)},Kx)},[g,P,R,Ka]);q.useEffect(()=>{if(g.promise&&st==="loading"||g.duration===1/0||g.type==="loading")return;let ie;return K||H||ls?(()=>{if(ns.current{g.onAutoClose==null||g.onAutoClose.call(g,g),Rt()},An.current)),()=>clearTimeout(ie)},[K,H,g,st,ls,Rt]),q.useEffect(()=>{g.delete&&(Rt(),g.onDismiss==null||g.onDismiss.call(g,g))},[Rt,g.delete]);function wn(){var ie;if(B?.loading){var Ve;return q.createElement("div",{className:ya(j?.loader,g==null||(Ve=g.classNames)==null?void 0:Ve.loader,"sonner-loader"),"data-visible":st==="loading"},B.loading)}return q.createElement(jx,{className:ya(j?.loader,g==null||(ie=g.classNames)==null?void 0:ie.loader),visible:st==="loading"})}const Ea=g.icon||B?.[st]||zx(st);var _n,Fa;return q.createElement("li",{tabIndex:0,ref:Ot,className:ya(mt,Zo,j?.toast,g==null||(o=g.classNames)==null?void 0:o.toast,j?.[es],g==null||(r=g.classNames)==null?void 0:r[es]),"data-sonner-toast":"","data-rich-colors":(_n=g.richColors)!=null?_n:ee,"data-styled":!(g.jsx||g.unstyled||_),"data-mounted":ce,"data-promise":!!g.promise,"data-swiped":St,"data-removed":te,"data-visible":ti,"data-y-position":pt,"data-x-position":ma,"data-index":G,"data-front":ei,"data-swiping":qe,"data-dismissible":Ze,"data-type":st,"data-invert":Ko,"data-swipe-out":ae,"data-swipe-direction":De,"data-expanded":!!(K||ke&&ce),"data-testid":g.testId,style:{"--index":G,"--toasts-before":G,"--z-index":Z.length-G,"--offset":`${te?Qt:Ka.current}px`,"--initial-height":ke?"auto":`${Il}px`,...fe,...g.style},onDragEnd:()=>{ht(!1),L(null),Zt.current=null},onPointerDown:ie=>{ie.button!==2&&(Ja||!Ze||(Pl.current=new Date,gt(Ka.current),ie.target.setPointerCapture(ie.pointerId),ie.target.tagName!=="BUTTON"&&(ht(!0),Zt.current={x:ie.clientX,y:ie.clientY})))},onPointerUp:()=>{var ie,Ve,Ke;if(ae||!Ze)return;Zt.current=null;const Je=Number(((ie=Ot.current)==null?void 0:ie.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),Cn=Number(((Ve=Ot.current)==null?void 0:Ve.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),Fe=new Date().getTime()-((Ke=Pl.current)==null?void 0:Ke.getTime()),bt=se==="x"?Je:Cn,Ut=Math.abs(bt)/Fe;if((se==="x"?Kt.includes(Je>0?"right":"left"):Kt.includes(Cn>0?"bottom":"top"))&&(Math.abs(bt)>=Zx||Ut>.11)){gt(Ka.current),g.onDismiss==null||g.onDismiss.call(g,g),ye(se==="x"?Je>0?"right":"left":Cn>0?"down":"up"),Rt(),Xt(!0);return}else{var Nt,al;(Nt=Ot.current)==null||Nt.style.setProperty("--swipe-amount-x","0px"),(al=Ot.current)==null||al.style.setProperty("--swipe-amount-y","0px")}Et(!1),ht(!1),L(null)},onPointerMove:ie=>{var Ve,Ke,Je;if(!Zt.current||!Ze||((Ve=window.getSelection())==null?void 0:Ve.toString().length)>0)return;const Fe=ie.clientY-Zt.current.y,bt=ie.clientX-Zt.current.x;!se&&(Math.abs(bt)>1||Math.abs(Fe)>1)&&L(Math.abs(bt)>Math.abs(Fe)?"x":"y");let Ut={x:0,y:0};const Mn=Nt=>1/(1.5+Math.abs(Nt)/20);if(se==="y"){if(Kt.includes("top")||Kt.includes("bottom"))if(Kt.includes("top")&&Fe<0||Kt.includes("bottom")&&Fe>0)Ut.y=Fe;else{const Nt=Fe*Mn(Fe);Ut.y=Math.abs(Nt)0)Ut.x=bt;else{const Nt=bt*Mn(bt);Ut.x=Math.abs(Nt)0||Math.abs(Ut.y)>0)&&Et(!0),(Ke=Ot.current)==null||Ke.style.setProperty("--swipe-amount-x",`${Ut.x}px`),(Je=Ot.current)==null||Je.style.setProperty("--swipe-amount-y",`${Ut.y}px`)}},el&&!g.jsx&&st!=="loading"?q.createElement("button",{"aria-label":F,"data-disabled":Ja,"data-close-button":!0,onClick:Ja||!Ze?()=>{}:()=>{Rt(),g.onDismiss==null||g.onDismiss.call(g,g)},className:ya(j?.closeButton,g==null||(u=g.classNames)==null?void 0:u.closeButton)},(Fa=B?.close)!=null?Fa:Cx):null,(st||g.icon||g.promise)&&g.icon!==null&&(B?.[st]!==null||g.icon)?q.createElement("div",{"data-icon":"",className:ya(j?.icon,g==null||(d=g.classNames)==null?void 0:d.icon)},st==="loading"?g.icon||wn():g.promise?wn():null,st!=="loading"?Ea:null):null,q.createElement("div",{"data-content":"",className:ya(j?.content,g==null||(h=g.classNames)==null?void 0:h.content)},q.createElement("div",{"data-title":"",className:ya(j?.title,g==null||(v=g.classNames)==null?void 0:v.title)},g.jsx?g.jsx:typeof g.title=="function"?g.title():g.title),g.description?q.createElement("div",{"data-description":"",className:ya(He,ts,j?.description,g==null||(y=g.classNames)==null?void 0:y.description)},typeof g.description=="function"?g.description():g.description):null),q.isValidElement(g.cancel)?g.cancel:g.cancel&&zo(g.cancel)?q.createElement("button",{"data-button":!0,"data-cancel":!0,style:g.cancelButtonStyle||Y,onClick:ie=>{zo(g.cancel)&&Ze&&(g.cancel.onClick==null||g.cancel.onClick.call(g.cancel,ie),Rt())},className:ya(j?.cancelButton,g==null||(N=g.classNames)==null?void 0:N.cancelButton)},g.cancel.label):null,q.isValidElement(g.action)?g.action:g.action&&zo(g.action)?q.createElement("button",{"data-button":!0,"data-action":!0,style:g.actionButtonStyle||be,onClick:ie=>{zo(g.action)&&(g.action.onClick==null||g.action.onClick.call(g.action,ie),!ie.defaultPrevented&&Rt())},className:ya(j?.actionButton,g==null||(S=g.classNames)==null?void 0:S.actionButton)},g.action.label):null)};function fg(){if(typeof window>"u"||typeof document>"u")return"ltr";const l=document.documentElement.getAttribute("dir");return l==="auto"||!l?window.getComputedStyle(document.documentElement).direction:l}function $x(l,o){const r={};return[l,o].forEach((u,d)=>{const h=d===1,v=h?"--mobile-offset":"--offset",y=h?Vx:Gx;function N(S){["top","right","bottom","left"].forEach(O=>{r[`${v}-${O}`]=typeof S=="number"?`${S}px`:S})}typeof u=="number"||typeof u=="string"?N(u):typeof u=="object"?["top","right","bottom","left"].forEach(S=>{u[S]===void 0?r[`${v}-${S}`]=y:r[`${v}-${S}`]=typeof u[S]=="number"?`${u[S]}px`:u[S]}):N(y)}),r}const Wx=q.forwardRef(function(o,r){const{id:u,invert:d,position:h="bottom-right",hotkey:v=["altKey","KeyT"],expand:y,closeButton:N,className:S,offset:O,mobileOffset:g,theme:_="light",richColors:H,duration:R,style:U,visibleToasts:k=Yx,toastOptions:G,dir:Z=fg(),gap:K=Qx,icons:P,customAriaLabel:ee,containerAriaLabel:oe="Notifications"}=o,[fe,Y]=q.useState([]),be=q.useMemo(()=>u?fe.filter(W=>W.toasterId===u):fe.filter(W=>!W.toasterId),[fe,u]),mt=q.useMemo(()=>Array.from(new Set([h].concat(be.filter(W=>W.position).map(W=>W.position)))),[be,h]),[He,ne]=q.useState([]),[it,Le]=q.useState(!1),[ke,j]=q.useState(!1),[B,F]=q.useState(_!=="system"?_:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),se=q.useRef(null),L=v.join("+").replace(/Key/g,"").replace(/Digit/g,""),De=q.useRef(null),ye=q.useRef(!1),ce=q.useCallback(W=>{Y(te=>{var le;return(le=te.find(qe=>qe.id===W.id))!=null&&le.delete||Ct.dismiss(W.id),te.filter(({id:qe})=>qe!==W.id)})},[]);return q.useEffect(()=>Ct.subscribe(W=>{if(W.dismiss){requestAnimationFrame(()=>{Y(te=>te.map(le=>le.id===W.id?{...le,delete:!0}:le))});return}setTimeout(()=>{Rb.flushSync(()=>{Y(te=>{const le=te.findIndex(qe=>qe.id===W.id);return le!==-1?[...te.slice(0,le),{...te[le],...W},...te.slice(le+1)]:[W,...te]})})})}),[]),q.useEffect(()=>{if(_!=="system"){F(_);return}if(_==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?F("dark"):F("light")),typeof window>"u")return;const W=window.matchMedia("(prefers-color-scheme: dark)");try{W.addEventListener("change",({matches:te})=>{F(te?"dark":"light")})}catch{W.addListener(({matches:le})=>{try{F(le?"dark":"light")}catch(qe){console.error(qe)}})}},[_]),q.useEffect(()=>{fe.length<=1&&Le(!1)},[fe]),q.useEffect(()=>{const W=te=>{var le;if(v.length>0&&v.every(ae=>te[ae]||te.code===ae)){var ht;Le(!0),(ht=se.current)==null||ht.focus()}te.code==="Escape"&&(document.activeElement===se.current||(le=se.current)!=null&&le.contains(document.activeElement))&&Le(!1)};return document.addEventListener("keydown",W),()=>document.removeEventListener("keydown",W)},[v]),q.useEffect(()=>{if(se.current)return()=>{De.current&&(De.current.focus({preventScroll:!0}),De.current=null,ye.current=!1)}},[se.current]),q.createElement("section",{ref:r,"aria-label":ee??`${oe} ${L}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0,"data-react-aria-top-layer":!0},mt.map((W,te)=>{var le;const[qe,ht]=W.split("-");return be.length?q.createElement("ol",{key:W,dir:Z==="auto"?fg():Z,tabIndex:-1,ref:se,className:S,"data-sonner-toaster":!0,"data-sonner-theme":B,"data-y-position":qe,"data-x-position":ht,style:{"--front-toast-height":`${((le=He[0])==null?void 0:le.height)||0}px`,"--width":`${Xx}px`,"--gap":`${K}px`,...U,...$x(O,g)},onBlur:ae=>{ye.current&&!ae.currentTarget.contains(ae.relatedTarget)&&(ye.current=!1,De.current&&(De.current.focus({preventScroll:!0}),De.current=null))},onFocus:ae=>{ae.target instanceof HTMLElement&&ae.target.dataset.dismissible==="false"||ye.current||(ye.current=!0,De.current=ae.relatedTarget)},onMouseEnter:()=>Le(!0),onMouseMove:()=>Le(!0),onMouseLeave:()=>{ke||Le(!1)},onDragEnd:()=>Le(!1),onPointerDown:ae=>{ae.target instanceof HTMLElement&&ae.target.dataset.dismissible==="false"||j(!0)},onPointerUp:()=>j(!1)},be.filter(ae=>!ae.position&&te===0||ae.position===W).map((ae,Xt)=>{var St,Et;return q.createElement(Fx,{key:ae.id,icons:P,index:Xt,toast:ae,defaultRichColors:H,duration:(St=G?.duration)!=null?St:R,className:G?.className,descriptionClassName:G?.descriptionClassName,invert:d,visibleToasts:k,closeButton:(Et=G?.closeButton)!=null?Et:N,interacting:ke,position:W,style:G?.style,unstyled:G?.unstyled,classNames:G?.classNames,cancelButtonStyle:G?.cancelButtonStyle,actionButtonStyle:G?.actionButtonStyle,closeButtonAriaLabel:G?.closeButtonAriaLabel,removeToast:ce,toasts:be.filter(Qt=>Qt.position==ae.position),heights:He.filter(Qt=>Qt.position==ae.position),setHeights:ne,expandByDefault:y,gap:K,expanded:it,swipeDirections:o.swipeDirections})})):null}))}),Ix=Zg("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive cursor-pointer",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",xs:"h-7 rounded-md gap-1 px-2.5 text-xs has-[>svg]:px-2",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-7"}},defaultVariants:{variant:"default",size:"default"}});function Va({className:l,variant:o,size:r,asChild:u=!1,...d}){const h=u?Bc:"button";return f.jsx(h,{"data-slot":"button",className:Ae(Ix({variant:o,size:r,className:l})),...d})}var Px=Object.defineProperty,Wl=(l,o)=>Px(l,"name",{value:o,configurable:!0}),fv=!!(typeof window<"u"&&window.document&&window.document.createElement);function Xa(l,o,{checkForDefaultPrevented:r=!0}={}){return Wl(function(d){if(l?.(d),r===!1||!d||!d.defaultPrevented)return o?.(d)},"handleEvent")}Wl(Xa,"composeEventHandlers");function e2(l){if(!fv)throw new Error("Cannot access window outside of the DOM");return l?.ownerDocument?.defaultView??window}Wl(e2,"getOwnerWindow");function Nc(l){if(!fv)throw new Error("Cannot access document outside of the DOM");return l?.ownerDocument??document}Wl(Nc,"getOwnerDocument");function dv(l,o=!1){const{activeElement:r}=Nc(l);if(!r?.nodeName)return null;if(mv(r)&&r.contentDocument)return dv(r.contentDocument.body,o);if(o){const u=r.getAttribute("aria-activedescendant");if(u){const d=Nc(r).getElementById(u);if(d)return d}}return r}Wl(dv,"getActiveElement");function mv(l){return l.tagName==="IFRAME"}Wl(mv,"isFrame");var t2=Object.defineProperty,ia=(l,o)=>t2(l,"name",{value:o,configurable:!0});function a2(l,o){const r=E.createContext(o);r.displayName=l+"Context";const u=ia(h=>{const{children:v,...y}=h,N=E.useMemo(()=>y,Object.values(y));return f.jsx(r.Provider,{value:N,children:v})},"Provider");u.displayName=l+"Provider";function d(h,v={}){const{optional:y=!1}=v,N=E.useContext(r);if(N)return N;if(o!==void 0)return o;if(!y)throw new Error(`\`${h}\` must be used within \`${l}\``)}return ia(d,"useContext"),[u,d]}ia(a2,"createContext");function hv(l,o=[]){let r=[];function u(h,v){const y=E.createContext(v);y.displayName=h+"Context";const N=r.length;r=[...r,v];const S=ia(g=>{const{scope:_,children:H,...R}=g,U=_?.[l]?.[N]||y,k=E.useMemo(()=>R,Object.values(R));return f.jsx(U.Provider,{value:k,children:H})},"Provider");S.displayName=h+"Provider";function O(g,_,H={}){const{optional:R=!1}=H,U=_?.[l]?.[N]||y,k=E.useContext(U);if(k)return k;if(v!==void 0)return v;if(!R)throw new Error(`\`${g}\` must be used within \`${h}\``)}return ia(O,"useContext"),[S,O]}ia(u,"createContext");const d=ia(()=>{const h=r.map(v=>E.createContext(v));return ia(function(y){const N=y?.[l]||h;return E.useMemo(()=>({[`__scope${l}`]:{...y,[l]:N}}),[y,N])},"useScope")},"createScope");return d.scopeName=l,[u,gv(d,...o)]}ia(hv,"createContextScope");function gv(...l){const o=l[0];if(l.length===1)return o;const r=ia(()=>{const u=l.map(d=>({useScope:d(),scopeName:d.scopeName}));return ia(function(h){const v=u.reduce((y,{useScope:N,scopeName:S})=>{const g=N(h)[`__scope${S}`];return{...y,...g}},{});return E.useMemo(()=>({[`__scope${o.scopeName}`]:v}),[v])},"useComposedScopes")},"createScope");return r.scopeName=o.scopeName,r}ia(gv,"composeContextScopes");var zn=globalThis?.document?E.useLayoutEffect:()=>{},n2=Object.defineProperty,l2=(l,o)=>n2(l,"name",{value:o,configurable:!0}),i2=Fi[" useId ".trim().toString()]||(()=>{}),s2=0;function _o(l){const[o,r]=E.useState(i2());return zn(()=>{l||r(u=>u??String(s2++))},[l]),l||(o?`radix-${o}`:"")}l2(_o,"useId");var o2=Object.defineProperty,r2=(l,o)=>o2(l,"name",{value:o,configurable:!0}),dg=Fi[" useEffectEvent ".trim().toString()],mg=Fi[" useInsertionEffect ".trim().toString()];function vv(l){if(typeof dg=="function")return dg(l);const o=E.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return typeof mg=="function"?mg(()=>{o.current=l}):zn(()=>{o.current=l}),E.useMemo(()=>((...r)=>o.current?.(...r)),[])}r2(vv,"useEffectEvent");var u2=Object.defineProperty,Pi=(l,o)=>u2(l,"name",{value:o,configurable:!0}),c2=Fi[" useInsertionEffect ".trim().toString()]||zn;function pv({prop:l,defaultProp:o,onChange:r=Pi(()=>{},"onChange"),caller:u}){const[d,h,v]=bv({defaultProp:o,onChange:r}),y=l!==void 0,N=y?l:d,S=E.useCallback(O=>{if(y){const g=yv(O)?O(l):O;g!==l&&v.current?.(g)}else h(O)},[y,l,h,v]);return[N,S]}Pi(pv,"useControllableState");function bv({defaultProp:l,onChange:o}){const[r,u]=E.useState(l),d=E.useRef(r),h=E.useRef(o);return c2(()=>{h.current=o},[o]),E.useEffect(()=>{d.current!==r&&(h.current?.(r),d.current=r)},[r,d]),[r,u,h]}Pi(bv,"useUncontrolledState");function yv(l){return typeof l=="function"}Pi(yv,"isFunction");var hg=Symbol("RADIX:SYNC_STATE");function f2(l,o,r,u){const{prop:d,defaultProp:h,onChange:v,caller:y}=o,N=d!==void 0,S=vv(v),O=[{...r,state:h}];u&&O.push(u);const[g,_]=E.useReducer((k,G)=>{if(G.type===hg)return{...k,state:G.state};const Z=l(k,G);return N&&!Object.is(Z.state,k.state)&&S(Z.state),Z},...O),H=g.state,R=E.useRef(H);E.useEffect(()=>{R.current!==H&&(R.current=H,N||S(H))},[H,R,N]);const U=E.useMemo(()=>d!==void 0?{...g,state:d}:g,[g,d]);return E.useEffect(()=>{N&&!Object.is(d,g.state)&&_({type:hg,state:d})},[d,g.state,N]),[U,_]}Pi(f2,"useControllableStateReducer");var d2=Object.defineProperty,m2=(l,o)=>d2(l,"name",{value:o,configurable:!0}),h2=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Za=h2.reduce((l,o)=>{const r=Ho(`Primitive.${o}`),u=E.forwardRef((d,h)=>{const{asChild:v,...y}=d,N=v?r:o;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),f.jsx(N,{...y,ref:h})});return u.displayName=`Primitive.${o}`,{...l,[o]:u}},{});function xv(l,o){l&&Og.flushSync(()=>l.dispatchEvent(o))}m2(xv,"dispatchDiscreteCustomEvent");var g2=Object.defineProperty,v2=(l,o)=>g2(l,"name",{value:o,configurable:!0});function $l(l){const o=E.useRef(l);return E.useEffect(()=>{o.current=l}),E.useMemo(()=>((...r)=>o.current?.(...r)),[])}v2($l,"useCallbackRef");var p2=Object.defineProperty,lt=(l,o)=>p2(l,"name",{value:o,configurable:!0}),zc="dismissableLayer.update",b2="dismissableLayer.pointerDownOutside",y2="dismissableLayer.focusOutside",gg,Sv=E.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),x2=E.forwardRef(lt(function(o,r){const{disableOutsidePointerEvents:u=!1,deferPointerDownOutside:d=!1,onEscapeKeyDown:h,onPointerDownOutside:v,onFocusOutside:y,onInteractOutside:N,onDismiss:S,...O}=o,g=E.useContext(Sv),[_,H]=E.useState(null),R=_?.ownerDocument??globalThis?.document,[,U]=E.useState({}),k=Wn(r,H),G=Array.from(g.layers),[Z]=[...g.layersWithOutsidePointerEventsDisabled].slice(-1),K=Z?G.indexOf(Z):-1,P=_?G.indexOf(_):-1,ee=g.layersWithOutsidePointerEventsDisabled.size>0,oe=P>=K,fe=E.useRef(!1),Y=Nv(ne=>{v?.(ne),N?.(ne),ne.defaultPrevented||S?.()},{ownerDocument:R,deferPointerDownOutside:d,isDeferredPointerDownOutsideRef:fe,dismissableSurfaces:g.dismissableSurfaces,shouldHandlePointerDownOutside:E.useCallback(ne=>{if(!(ne instanceof Node))return!1;const it=[...g.branches].some(Le=>Le.contains(ne));return oe&&!it},[g.branches,oe])}),be=zv(ne=>{if(d&&fe.current)return;const it=ne.target;[...g.branches].some(ke=>ke.contains(it))||(y?.(ne),N?.(ne),ne.defaultPrevented||S?.())},R),mt=_?P===G.length-1:!1,He=$l(ne=>{ne.key==="Escape"&&(h?.(ne),!ne.defaultPrevented&&S&&(ne.preventDefault(),S()))});return E.useEffect(()=>{if(mt)return R.addEventListener("keydown",He,{capture:!0}),()=>R.removeEventListener("keydown",He,{capture:!0})},[R,mt,He]),E.useEffect(()=>{if(_)return u&&(g.layersWithOutsidePointerEventsDisabled.size===0&&(gg=R.body.style.pointerEvents,R.body.style.pointerEvents="none"),g.layersWithOutsidePointerEventsDisabled.add(_)),g.layers.add(_),Tc(),()=>{u&&(g.layersWithOutsidePointerEventsDisabled.delete(_),g.layersWithOutsidePointerEventsDisabled.size===0&&(R.body.style.pointerEvents=gg))}},[_,R,u,g]),E.useEffect(()=>()=>{_&&(g.layers.delete(_),g.layersWithOutsidePointerEventsDisabled.delete(_),Tc())},[_,g]),E.useEffect(()=>{const ne=lt(()=>U({}),"handleUpdate");return document.addEventListener(zc,ne),()=>document.removeEventListener(zc,ne)},[]),f.jsx(Za.div,{...O,ref:k,style:{pointerEvents:ee?oe?"auto":"none":void 0,...o.style},onFocusCapture:Xa(o.onFocusCapture,be.onFocusCapture),onBlurCapture:Xa(o.onBlurCapture,be.onBlurCapture),onPointerDownCapture:Xa(o.onPointerDownCapture,Y.onPointerDownCapture)})},"DismissableLayer"));function Ev(){const l=E.useContext(Sv),[o,r]=E.useState(null);return E.useEffect(()=>{if(o)return l.dismissableSurfaces.add(o),()=>{l.dismissableSurfaces.delete(o)}},[o,l.dismissableSurfaces]),r}lt(Ev,"useDismissableLayerSurface");var S2=lt(()=>!0,"IS_TRUE");function Nv(l,o){const{ownerDocument:r=globalThis?.document,deferPointerDownOutside:u=!1,isDeferredPointerDownOutsideRef:d,dismissableSurfaces:h,shouldHandlePointerDownOutside:v=S2}=o,y=$l(l),N=E.useRef(!1),S=E.useRef(!1),O=E.useRef(new Map),g=E.useRef(()=>{});return E.useEffect(()=>{function _(){S.current=!1,d.current=!1,O.current.clear()}lt(_,"resetOutsideInteraction");function H(){return Array.from(O.current.values()).some(Boolean)}lt(H,"isOutsideInteractionIntercepted");function R(K){if(!S.current)return;const P=K.target;P instanceof Node&&[...h].some(oe=>oe.contains(P))||O.current.set(K.type,!0),K.type==="click"&&window.setTimeout(()=>{S.current&&g.current()},0)}lt(R,"handleInteractionCapture");function U(K){S.current&&O.current.set(K.type,!1)}lt(U,"handleInteractionBubble");const k=lt(K=>{if(K.target&&!N.current){let P=function(){r.removeEventListener("click",g.current);const oe=H();_(),oe||Yc(b2,y,ee,{discrete:!0})};if(lt(P,"handleAndDispatchPointerDownOutsideEvent"),!v(K.target)){r.removeEventListener("click",g.current),_(),N.current=!1;return}const ee={originalEvent:K};S.current=!0,d.current=u&&K.button===0,O.current.clear(),!u||K.button!==0?P():(r.removeEventListener("click",g.current),g.current=P,r.addEventListener("click",g.current,{once:!0}))}else r.removeEventListener("click",g.current),_();N.current=!1},"handlePointerDown"),G=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const K of G)r.addEventListener(K,R,!0),r.addEventListener(K,U);const Z=window.setTimeout(()=>{r.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(Z),r.removeEventListener("pointerdown",k),r.removeEventListener("click",g.current);for(const K of G)r.removeEventListener(K,R,!0),r.removeEventListener(K,U)}},[r,y,u,d,h,v]),{onPointerDownCapture:lt(()=>N.current=!0,"onPointerDownCapture")}}lt(Nv,"usePointerDownOutside");function zv(l,o=globalThis?.document){const r=$l(l),u=E.useRef(!1);return E.useEffect(()=>{const d=lt(h=>{h.target&&!u.current&&Yc(y2,r,{originalEvent:h},{discrete:!1})},"handleFocus");return o.addEventListener("focusin",d),()=>o.removeEventListener("focusin",d)},[o,r]),{onFocusCapture:lt(()=>u.current=!0,"onFocusCapture"),onBlurCapture:lt(()=>u.current=!1,"onBlurCapture")}}lt(zv,"useFocusOutside");function Tc(){const l=new CustomEvent(zc);document.dispatchEvent(l)}lt(Tc,"dispatchUpdate");function Yc(l,o,r,{discrete:u}){const d=r.originalEvent.target,h=new CustomEvent(l,{bubbles:!1,cancelable:!0,detail:r});o&&d.addEventListener(l,o,{once:!0}),u?xv(d,h):d.dispatchEvent(h)}lt(Yc,"handleAndDispatchCustomEvent");var E2=Object.defineProperty,xt=(l,o)=>E2(l,"name",{value:o,configurable:!0}),cc="focusScope.autoFocusOnMount",fc="focusScope.autoFocusOnUnmount",vg={bubbles:!1,cancelable:!0},N2=E.forwardRef(xt(function(o,r){const{loop:u=!1,trapped:d=!1,onMountAutoFocus:h,onUnmountAutoFocus:v,...y}=o,[N,S]=E.useState(null),O=$l(h),g=$l(v),_=E.useRef(null),H=Wn(r,S),R=E.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;E.useEffect(()=>{if(d){let k=function(P){if(R.paused||!N)return;const ee=P.target;N.contains(ee)?_.current=ee:Ga(_.current,{select:!0})},G=function(P){if(R.paused||!N)return;const ee=P.relatedTarget;ee!==null&&(N.contains(ee)||Ga(_.current,{select:!0}))},Z=function(P){if(document.activeElement===document.body)for(const oe of P)oe.removedNodes.length>0&&Ga(N)};xt(k,"handleFocusIn"),xt(G,"handleFocusOut"),xt(Z,"handleMutations"),document.addEventListener("focusin",k),document.addEventListener("focusout",G);const K=new MutationObserver(Z);return N&&K.observe(N,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",G),K.disconnect()}}},[d,N,R.paused]),E.useEffect(()=>{if(N){pg.add(R);const k=document.activeElement;if(!N.contains(k)){const Z=new CustomEvent(cc,vg);N.addEventListener(cc,O),N.dispatchEvent(Z),Z.defaultPrevented||(Tv(_v(Gc(N)),{select:!0}),document.activeElement===k&&Ga(N))}return()=>{N.removeEventListener(cc,O),setTimeout(()=>{const Z=new CustomEvent(fc,vg);N.addEventListener(fc,g),N.dispatchEvent(Z),Z.defaultPrevented||Ga(k??document.body,{select:!0}),N.removeEventListener(fc,g),pg.remove(R)},0)}}},[N,O,g,R]);const U=E.useCallback(k=>{if(!u&&!d||R.paused)return;const G=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,Z=document.activeElement;if(G&&Z){const K=k.currentTarget,[P,ee]=jv(K);P&&ee?!k.shiftKey&&Z===ee?(k.preventDefault(),u&&Ga(P,{select:!0})):k.shiftKey&&Z===P&&(k.preventDefault(),u&&Ga(ee,{select:!0})):Z===K&&k.preventDefault()}},[u,d,R.paused]);return f.jsx(Za.div,{tabIndex:-1,...y,ref:H,onKeyDown:U})},"FocusScope"));function Tv(l,{select:o=!1}={}){const r=document.activeElement;for(const u of l)if(Ga(u,{select:o}),document.activeElement!==r)return}xt(Tv,"focusFirst");function jv(l){const o=Gc(l),r=jc(o,l),u=jc(o.reverse(),l);return[r,u]}xt(jv,"getTabbableEdges");function Gc(l){const o=[],r=document.createTreeWalker(l,NodeFilter.SHOW_ELEMENT,{acceptNode:xt(u=>{const d=u.tagName==="INPUT"&&u.type==="hidden";return u.disabled||u.hidden||d?NodeFilter.FILTER_SKIP:u.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP},"acceptNode")});for(;r.nextNode();)o.push(r.currentNode);return o}xt(Gc,"getTabbableCandidates");function jc(l,o){const r=typeof o.checkVisibility=="function"&&o.checkVisibility({checkVisibilityCSS:!0});for(const u of l)if(!(r?!u.checkVisibility({checkVisibilityCSS:!0}):Av(u,{upTo:o})))return u}xt(jc,"findVisible");function Av(l,{upTo:o}){if(getComputedStyle(l).visibility==="hidden")return!0;for(;l;){if(o!==void 0&&l===o)return!1;if(getComputedStyle(l).display==="none")return!0;l=l.parentElement}return!1}xt(Av,"isHidden");function Dv(l){return l instanceof HTMLInputElement&&"select"in l}xt(Dv,"isSelectableInput");function Ga(l,{select:o=!1}={}){if(l&&l.focus){const r=document.activeElement;l.focus({preventScroll:!0}),l!==r&&Dv(l)&&o&&l.select()}}xt(Ga,"focus");var pg=wv();function wv(){let l=[];return{add(o){const r=l[0];o!==r&&r?.pause(),l=Ac(l,o),l.unshift(o)},remove(o){l=Ac(l,o),l[0]?.resume()}}}xt(wv,"createFocusScopesStack");function Ac(l,o){const r=[...l],u=r.indexOf(o);return u!==-1&&r.splice(u,1),r}xt(Ac,"arrayRemove");function _v(l){return l.filter(o=>o.tagName!=="A")}xt(_v,"removeLinks");var z2=Object.defineProperty,T2=(l,o)=>z2(l,"name",{value:o,configurable:!0}),j2=E.forwardRef(T2(function(o,r){const{container:u,...d}=o,[h,v]=E.useState(!1);zn(()=>v(!0),[]);const y=u||h&&globalThis?.document?.body;return y?Og.createPortal(f.jsx(Za.div,{...d,ref:r}),y):null},"Portal")),A2=Object.defineProperty,Qa=(l,o)=>A2(l,"name",{value:o,configurable:!0});function Cv(l,o){return E.useReducer((r,u)=>o[r][u]??r,l)}Qa(Cv,"useStateMachine");var Vc=Qa(l=>{const{present:o,children:r}=l,u=Mv(o),d=typeof r=="function"?r({present:u.isPresent}):E.Children.only(r),h=Ov(u.ref,Rv(d));return typeof r=="function"||u.isPresent?E.cloneElement(d,{ref:h}):null},"Presence");function Mv(l){const[o,r]=E.useState(),u=E.useRef(null),d=E.useRef(l),h=E.useRef("none"),v=E.useRef(void 0),y=l?"mounted":"unmounted",[N,S]=Cv(y,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return E.useEffect(()=>{N==="mounted"?(h.current=v.current??Kl(u.current),v.current=void 0):h.current="none"},[N]),zn(()=>{const O=u.current,g=d.current;if(g!==l){const H=h.current,R=Kl(O);l?(v.current=R,S("MOUNT")):R==="none"||O?.display==="none"?S("UNMOUNT"):S(g&&H!==R?"ANIMATION_OUT":"UNMOUNT"),d.current=l}},[l,S]),zn(()=>{if(o){let O;const g=o.ownerDocument.defaultView??window,_=Qa(R=>{const k=Kl(u.current).includes(CSS.escape(R.animationName));if(R.target===o&&k&&(S("ANIMATION_END"),!d.current)){const G=o.style.animationFillMode;o.style.animationFillMode="forwards",O=g.setTimeout(()=>{o.style.animationFillMode==="forwards"&&(o.style.animationFillMode=G)})}},"handleAnimationEnd"),H=Qa(R=>{R.target===o&&(h.current=Kl(u.current))},"handleAnimationStart");return o.addEventListener("animationstart",H),o.addEventListener("animationcancel",_),o.addEventListener("animationend",_),()=>{g.clearTimeout(O),o.removeEventListener("animationstart",H),o.removeEventListener("animationcancel",_),o.removeEventListener("animationend",_)}}else S("ANIMATION_END")},[o,S]),{isPresent:["mounted","unmountSuspended"].includes(N),ref:E.useCallback(O=>{if(O){const g=getComputedStyle(O);u.current=g,v.current=Kl(g)}else u.current=null;r(O)},[])}}Qa(Mv,"usePresence");function Dc(l,o){if(typeof l=="function")return l(o);l!=null&&(l.current=o)}Qa(Dc,"setRef");function Ov(...l){const o=E.useRef(l);return o.current=l,E.useCallback(r=>{const u=o.current;let d=!1;const h=u.map(v=>{const y=Dc(v,r);return!d&&typeof y=="function"&&(d=!0),y});if(d)return()=>{for(let v=0;vD2(l,"name",{value:o,configurable:!0}),To=0,Yl=null;function w2(l){return Qc(),l.children}Xc(w2,"FocusGuards");function Qc(){E.useEffect(()=>{Yl||(Yl={start:wc(),end:wc()});const{start:l,end:o}=Yl;return document.body.firstElementChild!==l&&document.body.insertAdjacentElement("afterbegin",l),document.body.lastElementChild!==o&&document.body.insertAdjacentElement("beforeend",o),To++,()=>{To===1&&(Yl?.start.remove(),Yl?.end.remove(),Yl=null),To=Math.max(0,To-1)}},[])}Xc(Qc,"useFocusGuards");function wc(){const l=document.createElement("span");return l.setAttribute("data-radix-focus-guard",""),l.tabIndex=0,l.style.outline="none",l.style.opacity="0",l.style.position="fixed",l.style.pointerEvents="none",l}Xc(wc,"createFocusGuard");var Sa=function(){return Sa=Object.assign||function(o){for(var r,u=1,d=arguments.length;u"u")return Z2;var o=K2(l),r=document.documentElement.clientWidth,u=window.innerWidth;return{left:o[0],top:o[1],right:o[2],gap:Math.max(0,u-r+o[2]-o[0])}},F2=Hv(),Fl="data-scroll-locked",$2=function(l,o,r,u){var d=l.left,h=l.top,v=l.right,y=l.gap;return r===void 0&&(r="margin"),` + .`.concat(C2,` { + overflow: hidden `).concat(u,`; + padding-right: `).concat(y,"px ").concat(u,`; + } + body[`).concat(Fl,`] { + overflow: hidden `).concat(u,`; + overscroll-behavior: contain; + `).concat([o&&"position: relative ".concat(u,";"),r==="margin"&&` + padding-left: `.concat(d,`px; + padding-top: `).concat(h,`px; + padding-right: `).concat(v,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(y,"px ").concat(u,`; + `),r==="padding"&&"padding-right: ".concat(y,"px ").concat(u,";")].filter(Boolean).join(""),` + } + + .`).concat(Co,` { + right: `).concat(y,"px ").concat(u,`; + } + + .`).concat(Mo,` { + margin-right: `).concat(y,"px ").concat(u,`; + } + + .`).concat(Co," .").concat(Co,` { + right: 0 `).concat(u,`; + } + + .`).concat(Mo," .").concat(Mo,` { + margin-right: 0 `).concat(u,`; + } + + body[`).concat(Fl,`] { + `).concat(M2,": ").concat(y,`px; + } +`)},yg=function(){var l=parseInt(document.body.getAttribute(Fl)||"0",10);return isFinite(l)?l:0},W2=function(){E.useEffect(function(){return document.body.setAttribute(Fl,(yg()+1).toString()),function(){var l=yg()-1;l<=0?document.body.removeAttribute(Fl):document.body.setAttribute(Fl,l.toString())}},[])},I2=function(l){var o=l.noRelative,r=l.noImportant,u=l.gapMode,d=u===void 0?"margin":u;W2();var h=E.useMemo(function(){return J2(d)},[d]);return E.createElement(F2,{styles:$2(h,!o,d,r?"":"!important")})},_c=!1;if(typeof window<"u")try{var jo=Object.defineProperty({},"passive",{get:function(){return _c=!0,!0}});window.addEventListener("test",jo,jo),window.removeEventListener("test",jo,jo)}catch{_c=!1}var Gl=_c?{passive:!1}:!1,P2=function(l){return l.tagName==="TEXTAREA"},Lv=function(l,o){if(!(l instanceof Element))return!1;var r=window.getComputedStyle(l);return r[o]!=="hidden"&&!(r.overflowY===r.overflowX&&!P2(l)&&r[o]==="visible")},eS=function(l){return Lv(l,"overflowY")},tS=function(l){return Lv(l,"overflowX")},xg=function(l,o){var r=o.ownerDocument,u=o;do{typeof ShadowRoot<"u"&&u instanceof ShadowRoot&&(u=u.host);var d=qv(l,u);if(d){var h=Yv(l,u),v=h[1],y=h[2];if(v>y)return!0}u=u.parentNode}while(u&&u!==r.body);return!1},aS=function(l){var o=l.scrollTop,r=l.scrollHeight,u=l.clientHeight;return[o,r,u]},nS=function(l){var o=l.scrollLeft,r=l.scrollWidth,u=l.clientWidth;return[o,r,u]},qv=function(l,o){return l==="v"?eS(o):tS(o)},Yv=function(l,o){return l==="v"?aS(o):nS(o)},lS=function(l,o){return l==="h"&&o==="rtl"?-1:1},iS=function(l,o,r,u,d){var h=lS(l,window.getComputedStyle(o).direction),v=h*u,y=r.target,N=o.contains(y),S=!1,O=v>0,g=0,_=0;do{if(!y)break;var H=Yv(l,y),R=H[0],U=H[1],k=H[2],G=U-k-h*R;(R||G)&&qv(l,y)&&(g+=G,_+=R);var Z=y.parentNode;y=Z&&Z.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Z.host:Z}while(!N&&y!==document.body||N&&(o.contains(y)||o===y));return(O&&Math.abs(g)<1||!O&&Math.abs(_)<1)&&(S=!0),S},Ao=function(l){return"changedTouches"in l?[l.changedTouches[0].clientX,l.changedTouches[0].clientY]:[0,0]},Sg=function(l){return[l.deltaX,l.deltaY]},Eg=function(l){return l&&"current"in l?l.current:l},sS=function(l,o){return l[0]===o[0]&&l[1]===o[1]},oS=function(l){return` + .block-interactivity-`.concat(l,` {pointer-events: none;} + .allow-interactivity-`).concat(l,` {pointer-events: all;} +`)},rS=0,Vl=[];function uS(l){var o=E.useRef([]),r=E.useRef([0,0]),u=E.useRef(),d=E.useState(rS++)[0],h=E.useState(Hv)[0],v=E.useRef(l);E.useEffect(function(){v.current=l},[l]),E.useEffect(function(){if(l.inert){document.body.classList.add("block-interactivity-".concat(d));var U=_2([l.lockRef.current],(l.shards||[]).map(Eg),!0).filter(Boolean);return U.forEach(function(k){return k.classList.add("allow-interactivity-".concat(d))}),function(){document.body.classList.remove("block-interactivity-".concat(d)),U.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(d))})}}},[l.inert,l.lockRef.current,l.shards]);var y=E.useCallback(function(U,k){if("touches"in U&&U.touches.length===2||U.type==="wheel"&&U.ctrlKey)return!v.current.allowPinchZoom;var G=Ao(U),Z=r.current,K="deltaX"in U?U.deltaX:Z[0]-G[0],P="deltaY"in U?U.deltaY:Z[1]-G[1],ee,oe=U.target,fe=Math.abs(K)>Math.abs(P)?"h":"v";if("touches"in U&&fe==="h"&&oe.type==="range")return!1;var Y=window.getSelection(),be=Y&&Y.anchorNode,mt=be?be===oe||be.contains(oe):!1;if(mt)return!1;var He=xg(fe,oe);if(!He)return!0;if(He?ee=fe:(ee=fe==="v"?"h":"v",He=xg(fe,oe)),!He)return!1;if(!u.current&&"changedTouches"in U&&(K||P)&&(u.current=ee),!ee)return!0;var ne=u.current||ee;return iS(ne,k,U,ne==="h"?K:P)},[]),N=E.useCallback(function(U){var k=U;if(!(!Vl.length||Vl[Vl.length-1]!==h)){var G="deltaY"in k?Sg(k):Ao(k),Z=o.current.filter(function(ee){return ee.name===k.type&&(ee.target===k.target||k.target===ee.shadowParent)&&sS(ee.delta,G)})[0];if(Z&&Z.should){k.cancelable&&k.preventDefault();return}if(!Z){var K=(v.current.shards||[]).map(Eg).filter(Boolean).filter(function(ee){return ee.contains(k.target)}),P=K.length>0?y(k,K[0]):!v.current.noIsolation;P&&k.cancelable&&k.preventDefault()}}},[]),S=E.useCallback(function(U,k,G,Z){var K={name:U,delta:k,target:G,should:Z,shadowParent:cS(G)};o.current.push(K),setTimeout(function(){o.current=o.current.filter(function(P){return P!==K})},1)},[]),O=E.useCallback(function(U){r.current=Ao(U),u.current=void 0},[]),g=E.useCallback(function(U){S(U.type,Sg(U),U.target,y(U,l.lockRef.current))},[]),_=E.useCallback(function(U){S(U.type,Ao(U),U.target,y(U,l.lockRef.current))},[]);E.useEffect(function(){return Vl.push(h),l.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:_}),document.addEventListener("wheel",N,Gl),document.addEventListener("touchmove",N,Gl),document.addEventListener("touchstart",O,Gl),function(){Vl=Vl.filter(function(U){return U!==h}),document.removeEventListener("wheel",N,Gl),document.removeEventListener("touchmove",N,Gl),document.removeEventListener("touchstart",O,Gl)}},[]);var H=l.removeScrollBar,R=l.inert;return E.createElement(E.Fragment,null,R?E.createElement(h,{styles:oS(d)}):null,H?E.createElement(I2,{noRelative:l.noRelative,gapMode:l.gapMode}):null)}function cS(l){for(var o=null;l!==null;)l instanceof ShadowRoot&&(o=l.host,l=l.host),l=l.parentNode;return o}const fS=L2(Bv,uS);var Gv=E.forwardRef(function(l,o){return E.createElement(Vo,Sa({},l,{ref:o,sideCar:fS}))});Gv.classNames=Vo.classNames;var dS=function(l){if(typeof document>"u")return null;var o=Array.isArray(l)?l[0]:l;return o.ownerDocument.body},Xl=new WeakMap,Do=new WeakMap,wo={},gc=0,Vv=function(l){return l&&(l.host||Vv(l.parentNode))},mS=function(l,o){return o.map(function(r){if(l.contains(r))return r;var u=Vv(r);return u&&l.contains(u)?u:(console.error("aria-hidden",r,"in not contained inside",l,". Doing nothing"),null)}).filter(function(r){return!!r})},hS=function(l,o,r,u){var d=mS(o,Array.isArray(l)?l:[l]);wo[r]||(wo[r]=new WeakMap);var h=wo[r],v=[],y=new Set,N=new Set(d),S=function(g){!g||y.has(g)||(y.add(g),S(g.parentNode))};d.forEach(S);var O=function(g){!g||N.has(g)||Array.prototype.forEach.call(g.children,function(_){if(y.has(_))O(_);else try{var H=_.getAttribute(u),R=H!==null&&H!=="false",U=(Xl.get(_)||0)+1,k=(h.get(_)||0)+1;Xl.set(_,U),h.set(_,k),v.push(_),U===1&&R&&Do.set(_,!0),k===1&&_.setAttribute(r,"true"),R||_.setAttribute(u,"true")}catch(G){console.error("aria-hidden: cannot operate on ",_,G)}})};return O(o),y.clear(),gc++,function(){v.forEach(function(g){var _=Xl.get(g)-1,H=h.get(g)-1;Xl.set(g,_),h.set(g,H),_||(Do.has(g)||g.removeAttribute(u),Do.delete(g)),H||g.removeAttribute(r)}),gc--,gc||(Xl=new WeakMap,Xl=new WeakMap,Do=new WeakMap,wo={})}},gS=function(l,o,r){r===void 0&&(r="data-aria-hidden");var u=Array.from(Array.isArray(l)?l:[l]),d=dS(l);return d?(u.push.apply(u,Array.from(d.querySelectorAll("[aria-live], script"))),hS(u,d,r,"aria-hidden")):function(){return null}},vS=Object.defineProperty,Vt=(l,o)=>vS(l,"name",{value:o,configurable:!0}),Zc="Dialog",[Xv,fE]=hv(Zc),[pS,da]=Xv(Zc),bS=Vt(l=>{const{__scopeDialog:o,children:r,open:u,defaultOpen:d,onOpenChange:h,modal:v=!0}=l,y=E.useRef(null),N=E.useRef(null),[S,O]=pv({prop:u,defaultProp:d??!1,onChange:h,caller:Zc}),[g,_]=E.useState(0),[H,R]=E.useState(0);return f.jsx(pS,{scope:o,triggerRef:y,contentRef:N,contentId:_o(),titleId:_o(),descriptionId:_o(),titlePresent:g>0,descriptionPresent:H>0,setTitleCount:_,setDescriptionCount:R,open:S,onOpenChange:O,onOpenToggle:E.useCallback(()=>O(U=>!U),[O]),modal:v,children:r})},"Dialog"),yS="DialogTrigger",xS=E.forwardRef(Vt(function(o,r){const{__scopeDialog:u,...d}=o,h=da(yS,u),v=Wn(r,h.triggerRef);return f.jsx(Za.button,{type:"button","aria-haspopup":"dialog","aria-expanded":h.open,"aria-controls":h.open?h.contentId:void 0,"data-state":Xo(h.open),...d,ref:v,onClick:Xa(o.onClick,h.onOpenToggle)})},"DialogTrigger")),Qv="DialogPortal",[SS,Zv]=Xv(Qv,{forceMount:void 0}),ES=Vt(l=>{const{__scopeDialog:o,forceMount:r,children:u,container:d}=l,h=da(Qv,o);return f.jsx(SS,{scope:o,forceMount:r,children:E.Children.map(u,v=>f.jsx(Vc,{present:r||h.open,children:f.jsx(j2,{asChild:!0,container:d,children:v})}))})},"DialogPortal"),Cc="DialogOverlay",NS=E.forwardRef(Vt(function(o,r){const u=Zv(Cc,o.__scopeDialog),{forceMount:d=u.forceMount,...h}=o,v=da(Cc,o.__scopeDialog);return v.modal?f.jsx(Vc,{present:d||v.open,children:f.jsx(TS,{...h,ref:r})}):null},"DialogOverlay")),zS=Ho("DialogOverlay.RemoveScroll"),TS=E.forwardRef(Vt(function(o,r){const{__scopeDialog:u,...d}=o,h=da(Cc,u),v=Ev(),y=Wn(r,v);return f.jsx(Gv,{as:zS,allowPinchZoom:!0,shards:[h.contentRef],children:f.jsx(Za.div,{"data-state":Xo(h.open),...d,ref:y,style:{pointerEvents:"auto",...d.style}})})},"DialogOverlayImpl")),Ji="DialogContent",jS=E.forwardRef(Vt(function(o,r){const u=Zv(Ji,o.__scopeDialog),{forceMount:d=u.forceMount,...h}=o,v=da(Ji,o.__scopeDialog);return f.jsx(Vc,{present:d||v.open,children:v.modal?f.jsx(AS,{...h,ref:r}):f.jsx(DS,{...h,ref:r})})},"DialogContent")),AS=E.forwardRef(Vt(function(o,r){const u=da(Ji,o.__scopeDialog),d=E.useRef(null),h=Wn(r,u.contentRef,d);return E.useEffect(()=>{const v=d.current;if(v)return gS(v)},[]),f.jsx(Kv,{...o,ref:h,trapFocus:u.open,disableOutsidePointerEvents:u.open,onCloseAutoFocus:Xa(o.onCloseAutoFocus,v=>{v.preventDefault(),u.triggerRef.current?.focus()}),onPointerDownOutside:Xa(o.onPointerDownOutside,v=>{const y=v.detail.originalEvent,N=y.button===0&&y.ctrlKey===!0;(y.button===2||N)&&v.preventDefault()}),onFocusOutside:Xa(o.onFocusOutside,v=>v.preventDefault())})},"DialogContentModal")),DS=E.forwardRef(Vt(function(o,r){const u=da(Ji,o.__scopeDialog),d=E.useRef(!1),h=E.useRef(!1);return f.jsx(Kv,{...o,ref:r,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:v=>{o.onCloseAutoFocus?.(v),v.defaultPrevented||(d.current||u.triggerRef.current?.focus(),v.preventDefault()),d.current=!1,h.current=!1},onInteractOutside:v=>{o.onInteractOutside?.(v),v.defaultPrevented||(d.current=!0,v.detail.originalEvent.type==="pointerdown"&&(h.current=!0));const y=v.target;u.triggerRef.current?.contains(y)&&v.preventDefault(),v.detail.originalEvent.type==="focusin"&&h.current&&v.preventDefault()}})},"DialogContentNonModal")),Kv=E.forwardRef(Vt(function(o,r){const{__scopeDialog:u,trapFocus:d,onOpenAutoFocus:h,onCloseAutoFocus:v,...y}=o,N=da(Ji,u);return Qc(),f.jsx(f.Fragment,{children:f.jsx(N2,{asChild:!0,loop:!0,trapped:d,onMountAutoFocus:h,onUnmountAutoFocus:v,children:f.jsx(x2,{role:"dialog",id:N.contentId,"aria-describedby":N.descriptionPresent?N.descriptionId:void 0,"aria-labelledby":N.titlePresent?N.titleId:void 0,"data-state":Xo(N.open),...y,ref:r,deferPointerDownOutside:!0,onDismiss:()=>N.onOpenChange(!1)})})})},"DialogContentImpl")),wS="DialogTitle",_S=E.forwardRef(Vt(function(o,r){const{__scopeDialog:u,...d}=o,h=da(wS,u),{setTitleCount:v}=h;return zn(()=>(v(y=>y+1),()=>v(y=>y-1)),[v]),f.jsx(Za.h2,{id:h.titleId,...d,ref:r})},"DialogTitle")),CS="DialogDescription",MS=E.forwardRef(Vt(function(o,r){const{__scopeDialog:u,...d}=o,h=da(CS,u),{setDescriptionCount:v}=h;return zn(()=>(v(y=>y+1),()=>v(y=>y-1)),[v]),f.jsx(Za.p,{id:h.descriptionId,...d,ref:r})},"DialogDescription")),OS="DialogClose",RS=E.forwardRef(Vt(function(o,r){const{__scopeDialog:u,...d}=o,h=da(OS,u);return f.jsx(Za.button,{type:"button",...d,ref:r,onClick:Xa(o.onClick,()=>h.onOpenChange(!1))})},"DialogClose"));function Xo(l){return l?"open":"closed"}Vt(Xo,"getState");const Kc=bS,Jv=xS;function US({className:l,...o}){return f.jsx(NS,{"data-slot":"dialog-overlay",className:Ae("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",l),...o})}function Jc({className:l,children:o,...r}){return f.jsxs(ES,{children:[f.jsx(US,{}),f.jsxs(jS,{"data-slot":"dialog-content",className:Ae("bg-background 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 fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-md",l),...r,children:[o,f.jsxs(RS,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none cursor-pointer",children:[f.jsx(wy,{className:"size-4"}),f.jsx("span",{className:"sr-only",children:"Close"})]})]})]})}function Fc({className:l,...o}){return f.jsx("div",{"data-slot":"dialog-header",className:Ae("flex flex-col gap-1.5 text-left",l),...o})}function Fv({className:l,...o}){return f.jsx("div",{"data-slot":"dialog-footer",className:Ae("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",l),...o})}function $c({className:l,...o}){return f.jsx(_S,{"data-slot":"dialog-title",className:Ae("text-lg leading-none font-semibold",l),...o})}function Wc({className:l,...o}){return f.jsx(MS,{"data-slot":"dialog-description",className:Ae("text-muted-foreground text-sm",l),...o})}var kS=Object.defineProperty,BS=(l,o)=>kS(l,"name",{value:o,configurable:!0}),HS=E.forwardRef(BS(function(o,r){return f.jsx(Za.label,{...o,ref:r,onMouseDown:u=>{u.target.closest("button, input, select, textarea")||(o.onMouseDown?.(u),!u.defaultPrevented&&u.detail>1&&u.preventDefault())}})},"Label")),LS=HS;function qS({className:l,...o}){return f.jsx(LS,{"data-slot":"label",className:Ae("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",l),...o})}const YS=zb,$v=E.createContext({});function GS({...l}){return f.jsx($v.Provider,{value:{name:l.name},children:f.jsx(Tb,{...l})})}function Qo(){const l=E.useContext($v),o=E.useContext(Wv),{getFieldState:r}=jb(),u=Ab({name:l.name}),d=r(l.name,u);if(!l)throw new Error("useFormField should be used within ");const{id:h}=o;return{id:h,name:l.name,formItemId:`${h}-form-item`,formDescriptionId:`${h}-form-item-description`,formMessageId:`${h}-form-item-message`,...d}}const Wv=E.createContext({});function VS({className:l,...o}){const r=E.useId();return f.jsx(Wv.Provider,{value:{id:r},children:f.jsx("div",{"data-slot":"form-item",className:Ae("grid gap-2",l),...o})})}function XS({className:l,...o}){const{error:r,formItemId:u}=Qo();return f.jsx(qS,{"data-slot":"form-label","data-error":!!r,className:Ae("data-[error=true]:text-destructive",l),htmlFor:u,...o})}function QS({...l}){const{error:o,formItemId:r,formDescriptionId:u,formMessageId:d}=Qo();return f.jsx(Bc,{"data-slot":"form-control",id:r,"aria-describedby":o?`${u} ${d}`:u,"aria-invalid":!!o,...l})}function ZS({className:l,...o}){const{formDescriptionId:r}=Qo();return f.jsx("p",{"data-slot":"form-description",id:r,className:Ae("text-muted-foreground text-xs",l),...o})}function KS({className:l,...o}){const{error:r,formMessageId:u}=Qo(),d=r?String(r?.message??""):o.children;return d?f.jsx("p",{"data-slot":"form-message",id:u,className:Ae("text-destructive text-xs font-medium",l),...o,children:d}):null}const JS={done:{label:"done",variant:"success"},running:{label:"running",variant:"default"},pending:{label:"pending",variant:"secondary"},skipped:{label:"skipped",variant:"warning"},failed:{label:"failed",variant:"destructive"}},FS=[{id:"table",accessorFn:l=>`${l.schema}.${l.table}`,header:"Table",sortFn:"text",cell:({getValue:l})=>f.jsx("span",{className:"font-medium",children:l()})},{accessorKey:"state",header:"State",sortFn:"text",cell:({getValue:l})=>{const o=JS[l()];return f.jsxs(sa,{variant:o.variant,children:[o.label==="running"&&f.jsx(Bo,{className:"size-3 animate-spin"}),o.label]})}},{accessorKey:"rows_copied",header:()=>f.jsx("span",{className:"block text-right",children:"Rows copied"}),sortFn:"basic",cell:({getValue:l})=>f.jsx("span",{className:"block text-right tabular-nums",children:dt(l())})},{accessorKey:"completed_at",header:"Completed",enableSorting:!1,cell:({row:l})=>f.jsx("span",{className:"text-muted-foreground",children:l.original.state==="done"?Lo(l.original.completed_at):"–"})},{accessorKey:"error",header:"Note",enableSorting:!1,cell:({getValue:l})=>{const o=l();return o?f.jsx("span",{className:"text-destructive text-xs",children:o}):null}}],$S=Mt({table:me().trim().refine(l=>l===""||/^([A-Za-z_][A-Za-z0-9_$]*\.)?[A-Za-z_][A-Za-z0-9_$]*$/.test(l),{message:"Use schema.table (e.g. public.orders) or leave empty for all tables"})});function WS(){const[l,o]=E.useState(!1),r=Mc(),u=Db({resolver:Ex($S),defaultValues:{table:""}}),d=Oo({mutationFn:h=>$1(h.table||void 0),onSuccess:(h,v)=>{Nn.success(v.table?`Backfill enqueued for ${v.table}`:"Backfill enqueued for all tables"),r.invalidateQueries({queryKey:["stats"]}),o(!1),u.reset()},onError:h=>Nn.error(h.message)});return f.jsxs(Kc,{open:l,onOpenChange:o,children:[f.jsx(Jv,{asChild:!0,children:f.jsxs(Va,{size:"sm",children:[f.jsx(Oc,{className:"size-4"}),"Sync tables"]})}),f.jsxs(Jc,{children:[f.jsxs(Fc,{children:[f.jsx($c,{children:"Trigger a backfill"}),f.jsx(Wc,{children:"Re-sync existing rows into the sinks. Runs concurrently with live streaming — no locks, no downtime."})]}),f.jsx(YS,{...u,children:f.jsxs("form",{onSubmit:u.handleSubmit(h=>d.mutate(h)),className:"space-y-4",children:[f.jsx(GS,{control:u.control,name:"table",render:({field:h})=>f.jsxs(VS,{children:[f.jsx(XS,{children:"Table"}),f.jsx(QS,{children:f.jsx(Go,{placeholder:"public.orders",autoComplete:"off",...h})}),f.jsx(ZS,{children:"Leave empty to backfill every published table."}),f.jsx(KS,{})]})}),f.jsxs(Fv,{children:[f.jsx(Va,{type:"button",variant:"outline",onClick:()=>o(!1),children:"Cancel"}),f.jsxs(Va,{type:"submit",disabled:d.isPending,children:[d.isPending&&f.jsx(Bo,{className:"size-4 animate-spin"}),"Start backfill"]})]})]})})]})]})}function IS({stats:l}){const o=E.useMemo(()=>l?.backfill??[],[l]),r=$i({features:Ii,columns:FS,data:o,initialState:{sorting:[{id:"table",desc:!1}]}});return f.jsxs("div",{className:"space-y-4",children:[f.jsxs("div",{className:"flex items-center justify-between",children:[f.jsx("p",{className:"text-muted-foreground max-w-xl text-sm",children:"Watermark-based chunked sync of existing data, interleaved with the live stream. Progress survives restarts."}),f.jsx(WS,{})]}),f.jsx(ca,{className:"py-0",children:f.jsx(xa,{className:"px-0",children:f.jsx(Wi,{table:r,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(Oc,{className:"size-5"}),"No backfills have run. New deployments backfill automatically when the replication slot is first created."]})})})})]})}const PS={INSERT:"success",UPDATE:"secondary",DELETE:"destructive",READ:"outline"},Iv=E.createContext(()=>{});function eE({entry:l}){const o=E.useContext(Iv),r=Mc(),u=()=>{r.invalidateQueries({queryKey:["dlq"]}),r.invalidateQueries({queryKey:["stats"]})},d=Oo({mutationFn:()=>K1(l.id),onSuccess:()=>{Nn.success(`Retried ${l.id} successfully`),u()},onError:v=>{Nn.error(v.message),u()}}),h=Oo({mutationFn:()=>F1(l.id),onSuccess:()=>{Nn.success(`Discarded ${l.id}`),u()},onError:v=>Nn.error(v.message)});return f.jsxs("div",{className:"flex justify-end gap-1.5",children:[f.jsx(Va,{size:"xs",variant:"ghost",onClick:()=>o(l),title:"Inspect the parked event payload",children:f.jsx(sy,{className:"size-3"})}),f.jsxs(Va,{size:"xs",variant:"outline",disabled:d.isPending,onClick:()=>d.mutate(),title:"Re-deliver this event to its sink",children:[d.isPending?f.jsx(Bo,{className:"size-3 animate-spin"}):f.jsx(Bg,{className:"size-3"}),"Retry"]}),f.jsx(Va,{size:"xs",variant:"ghost",className:"text-destructive hover:text-destructive",disabled:h.isPending,onClick:()=>h.mutate(),title:"Drop this event permanently",children:f.jsx(jy,{className:"size-3"})})]})}const tE=[{accessorKey:"sink",header:"Sink",sortFn:"text",cell:({getValue:l})=>f.jsx(sa,{variant:"outline",children:l()})},{id:"target",accessorFn:l=>`${l.schema}.${l.table}`,header:"Table",sortFn:"text",cell:({row:l,getValue:o})=>f.jsxs("span",{className:"flex items-center gap-2",children:[f.jsx("span",{className:"font-medium",children:o()}),f.jsx(sa,{variant:PS[l.original.operation]??"secondary",className:"text-[10px]",children:l.original.operation})]})},{accessorKey:"error",header:"Error",enableSorting:!1,cell:({getValue:l})=>f.jsx("span",{className:"text-destructive block max-w-md truncate text-xs whitespace-normal sm:whitespace-nowrap",title:l(),children:l()})},{accessorKey:"attempts",header:()=>f.jsx("span",{className:"block text-right",children:"Attempts"}),sortFn:"basic",cell:({getValue:l})=>f.jsx("span",{className:"block text-right tabular-nums",children:l()})},{accessorKey:"last_failed_at",header:"Last failed",sortFn:"datetime",cell:({getValue:l})=>f.jsx("span",{className:"text-muted-foreground",children:Lo(l())})},{id:"actions",header:()=>f.jsx("span",{className:"block text-right",children:"Actions"}),enableSorting:!1,cell:({row:l})=>f.jsx(eE,{entry:l.original})}];function aE({count:l}){const[o,r]=E.useState(!1),u=Mc(),d=Oo({mutationFn:J1,onSuccess:h=>{Nn.success(`Retried ${h.retried??0}: ${h.succeeded??0} succeeded, ${h.failed??0} failed`),u.invalidateQueries({queryKey:["dlq"]}),u.invalidateQueries({queryKey:["stats"]}),r(!1)},onError:h=>Nn.error(h.message)});return f.jsxs(Kc,{open:o,onOpenChange:r,children:[f.jsx(Jv,{asChild:!0,children:f.jsxs(Va,{size:"sm",disabled:l===0,children:[f.jsx(Bg,{className:"size-4"}),"Retry all"]})}),f.jsxs(Jc,{children:[f.jsxs(Fc,{children:[f.jsx($c,{children:"Retry all parked events?"}),f.jsxs(Wc,{children:["Re-delivers all ",l," parked events to their sinks. Events that still fail stay in the queue with an updated error. If newer changes for the same rows have already flowed, retrying re-applies the older state — consider discarding stale entries and re-running a backfill instead."]})]}),f.jsxs(Fv,{children:[f.jsx(Va,{variant:"outline",onClick:()=>r(!1),children:"Cancel"}),f.jsxs(Va,{onClick:()=>d.mutate(),disabled:d.isPending,children:[d.isPending&&f.jsx(Bo,{className:"size-4 animate-spin"}),"Retry ",l," events"]})]})]})]})}function nE({entry:l,onClose:o}){return f.jsx(Kc,{open:l!==null,onOpenChange:r=>!r&&o(),children:f.jsxs(Jc,{className:"sm:max-w-2xl",children:[f.jsxs(Fc,{children:[f.jsx($c,{children:"Parked event"}),f.jsx(Wc,{children:"The event payload as it was delivered to the sink (transforms already applied). Retrying re-delivers exactly this payload."})]}),l&&f.jsxs("div",{className:"space-y-3",children:[f.jsx("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-1.5 text-xs sm:grid-cols-3",children:[["Sink",l.sink],["Table",`${l.schema}.${l.table}`],["Operation",l.operation],["LSN",l.lsn],["Attempts",String(l.attempts)],["Last failed",Lo(l.last_failed_at)]].map(([r,u])=>f.jsxs("div",{children:[f.jsx("dt",{className:"text-muted-foreground",children:r}),f.jsx("dd",{className:"truncate font-mono",title:u,children:u})]},r))}),f.jsxs("div",{children:[f.jsx("div",{className:"text-muted-foreground mb-1 text-xs",children:"Error"}),f.jsx("p",{className:"text-destructive text-xs break-words",children:l.error})]}),f.jsx("pre",{className:"bg-muted max-h-80 overflow-auto rounded-md p-3 font-mono text-xs",children:l.event===void 0?"Event payload not included in the API response.":JSON.stringify(l.event,null,2)})]})]})})}function lE({dlqEnabled:l}){const[o,r]=E.useState(""),[u,d]=E.useState(null),{data:h}=tx(l),v=E.useMemo(()=>h?.entries??[],[h]),y=$i({features:Ii,columns:tE,data:v,globalFilterFn:"includesString",initialState:{sorting:[{id:"last_failed_at",desc:!0}]},state:{globalFilter:o}});return f.jsx(Iv.Provider,{value:d,children:f.jsxs("div",{className:"space-y-4",children:[f.jsx(nE,{entry:u,onClose:()=>d(null)}),f.jsxs("div",{className:"flex items-center justify-between gap-3",children:[f.jsxs("div",{className:"relative max-w-xs flex-1",children:[f.jsx(Uc,{className:"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2"}),f.jsx(Go,{placeholder:"Filter by sink, table, error…",value:o,onChange:N=>r(N.target.value),className:"h-8 pl-8 text-sm"})]}),f.jsx(aE,{count:v.length})]}),f.jsx(ca,{className:"py-0",children:f.jsx(xa,{className:"px-0",children:f.jsx(Wi,{table:y,empty:f.jsxs("div",{className:"text-muted-foreground flex flex-col items-center gap-1 text-sm",children:[f.jsx(Rc,{className:"size-5"}),l?"No parked events — the pipeline is healthy.":"Dead-letter queue is disabled (set REDIS_URL and CDC_DLQ_ENABLED=true)."]})})})})]})})}const iE={overview:{title:"Overview",description:"Pipeline health at a glance"},tables:{title:"Table activity",description:"Change events by source table"},schema:{title:"Schema changes",description:"DDL detected on published tables"},backfill:{title:"Backfill",description:"Sync existing data into the sinks"},dlq:{title:"Dead letters",description:"Poison events parked for triage"}};function sE(){const[l,o]=E.useState("overview"),{data:r,isError:u}=W1(),d=iE[l];return E.useEffect(()=>{document.title=`${d.title} · GTC`},[d.title]),f.jsxs(O1,{page:l,onNavigate:o,stats:r,offline:u,dlqCount:r?.dlq.entries??0,title:d.title,description:d.description,children:[l==="overview"&&f.jsx(dx,{stats:r}),l==="tables"&&f.jsx(hx,{stats:r}),l==="schema"&&f.jsx(bx,{}),l==="backfill"&&f.jsx(IS,{stats:r}),l==="dlq"&&f.jsx(lE,{dlqEnabled:r?.dlq.enabled??!1})]})}function oE(l){const o=document.documentElement.classList.contains("dark");return f.jsx(Wx,{theme:o?"dark":"light",className:"toaster group",style:{"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)"},...l})}const rE=new wb({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1}}});Lb.createRoot(document.getElementById("root")).render(f.jsx(E.StrictMode,{children:f.jsxs(_b,{client:rE,children:[f.jsx(sE,{}),f.jsx(oE,{position:"bottom-right"})]})})); diff --git a/ui/dist/assets/index-LCMTR3-U.css b/ui/dist/assets/index-LCMTR3-U.css new file mode 100644 index 0000000..e171b65 --- /dev/null +++ b/ui/dist/assets/index-LCMTR3-U.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-600:oklch(58.8% .158 241.966);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-600:oklch(54.1% .281 293.009);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--radius-xs:.125rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv02","cv03","cv04","cv11";font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,sans-serif}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-4{right:calc(var(--spacing) * 4)}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.ml-14{margin-left:calc(var(--spacing) * 14)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-4\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-28{height:calc(var(--spacing) * 28)}.h-\[200px\]{height:200px}.h-\[220px\]{height:220px}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-screen{min-height:100vh}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-none{translate:none}.scale-3d{scale:var(--tw-scale-x) var(--tw-scale-y) var(--tw-scale-z)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-bs{border-block-start-style:var(--tw-border-style);border-block-start-width:1px}.border-be{border-block-end-style:var(--tw-border-style);border-block-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-input{border-color:var(--input)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--background) 80%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-card{background-color:var(--card)}.bg-destructive,.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-destructive\/90{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/90{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-muted{background-color:var(--muted)}.bg-primary,.bg-primary\/70{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/70{background-color:color-mix(in oklab,var(--primary) 70%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--success) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning\/15{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/15{background-color:color-mix(in oklab,var(--warning) 15%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-amber-400{--tw-gradient-from:var(--color-amber-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-500{--tw-gradient-to:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-repeat{background-repeat:repeat}.mask-no-clip{-webkit-mask-clip:no-clip;mask-clip:no-clip}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-amber-500{color:var(--color-amber-500)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-sidebar-foreground,.text-sidebar-foreground\/60{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/60{color:color-mix(in oklab,var(--sidebar-foreground) 60%,transparent)}}.text-sidebar-foreground\/65{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/65{color:color-mix(in oklab,var(--sidebar-foreground) 65%,transparent)}}.text-sky-600{color:var(--color-sky-600)}.text-success{color:var(--success)}.text-violet-600{color:var(--color-violet-600)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.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,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.inset-ring{--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.paused{animation-play-state:paused}.ring-inset{--tw-ring-inset:inset}.running{animation-play-state:running}.zoom-in{--tw-enter-scale:0}.zoom-out{--tw-exit-scale:0}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.first\:pl-4:first-child{padding-left:calc(var(--spacing) * 4)}.last\:pr-4:last-child{padding-right:calc(var(--spacing) * 4)}@media(hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:bg-sidebar-accent:hover,.hover\:bg-sidebar-accent\/60:hover{background-color:var(--sidebar-accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-sidebar-accent\/60:hover{background-color:color-mix(in oklab,var(--sidebar-accent) 60%,transparent)}}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\>svg\]\:px-2:has(>svg){padding-inline:calc(var(--spacing) * 2)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[error\=true\]\:text-destructive[data-error=true]{color:var(--destructive)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@media(min-width:40rem){.sm\:inline-flex{display:inline-flex}.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:whitespace-nowrap{white-space:nowrap}}@media(min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:64rem){.lg\:ml-56{margin-left:calc(var(--spacing) * 56)}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:inline-flex{display:inline-flex}.lg\:w-56{width:calc(var(--spacing) * 56)}.lg\:justify-start{justify-content:flex-start}.lg\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.dark\:bg-success\/15:is(.dark *){background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-success\/15:is(.dark *){background-color:color-mix(in oklab,var(--success) 15%,transparent)}}.dark\:text-emerald-400:is(.dark *){color:var(--color-emerald-400)}.dark\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\:text-sky-400:is(.dark *){color:var(--color-sky-400)}.dark\:text-violet-400:is(.dark *){color:var(--color-violet-400)}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(98.5% 0 0);--foreground:oklch(14.1% .005 285.823);--card:oklch(100% 0 0);--card-foreground:oklch(14.1% .005 285.823);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.1% .005 285.823);--primary:oklch(21% .006 285.885);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(96.7% .001 286.375);--muted-foreground:oklch(55.2% .016 285.938);--accent:oklch(96.7% .001 286.375);--accent-foreground:oklch(21% .006 285.885);--destructive:oklch(57.7% .245 27.325);--success:oklch(62.7% .17 149.2);--warning:oklch(66.6% .179 58.318);--border:oklch(92% .004 286.32);--input:oklch(92% .004 286.32);--ring:oklch(70.5% .015 286.067);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(100% 0 0);--sidebar-foreground:oklch(14.1% .005 285.823);--sidebar-primary:oklch(21% .006 285.885);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(96.7% .001 286.375);--sidebar-accent-foreground:oklch(21% .006 285.885);--sidebar-border:oklch(92% .004 286.32);--sidebar-ring:oklch(70.5% .015 286.067)}.dark{--background:oklch(14.1% .005 285.823);--foreground:oklch(98.5% 0 0);--card:oklch(17.5% .006 285.885);--card-foreground:oklch(98.5% 0 0);--popover:oklch(21% .006 285.885);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92% .004 286.32);--primary-foreground:oklch(21% .006 285.885);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(24.4% .006 286.033);--muted-foreground:oklch(70.5% .015 286.067);--accent:oklch(27.4% .006 286.033);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--success:oklch(72.3% .192 149.579);--warning:oklch(82.8% .189 84.429);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.2% .016 285.938);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(16.5% .006 285.885);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(27.4% .006 286.033);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.2% .016 285.938)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@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));filter:blur(var(--tw-enter-blur,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));filter:blur(var(--tw-exit-blur,0))}} diff --git a/ui/dist/index.html b/ui/dist/index.html index 26b9e21..b6ce13f 100644 --- a/ui/dist/index.html +++ b/ui/dist/index.html @@ -15,10 +15,10 @@ document.documentElement.classList.add('dark'); } - + - +
diff --git a/ui/src/app.tsx b/ui/src/app.tsx index 851c8c3..f9d496d 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import { Shell, type Page } from '@/components/shell'; import { OverviewPage } from '@/pages/overview'; import { TablesPage } from '@/pages/tables'; +import { SchemaPage } from '@/pages/schema'; import { BackfillPage } from '@/pages/backfill'; import { DlqPage } from '@/pages/dlq'; import { useStats } from '@/lib/hooks'; @@ -9,6 +10,7 @@ import { useStats } from '@/lib/hooks'; const PAGE_META: Record = { overview: { title: 'Overview', description: 'Pipeline health at a glance' }, tables: { title: 'Table activity', description: 'Change events by source table' }, + schema: { title: 'Schema changes', description: 'DDL detected on published tables' }, backfill: { title: 'Backfill', description: 'Sync existing data into the sinks' }, dlq: { title: 'Dead letters', description: 'Poison events parked for triage' }, }; @@ -34,6 +36,7 @@ export function App() { > {page === 'overview' && } {page === 'tables' && } + {page === 'schema' && } {page === 'backfill' && } {page === 'dlq' && } diff --git a/ui/src/components/shell.tsx b/ui/src/components/shell.tsx index b61b10f..5065429 100644 --- a/ui/src/components/shell.tsx +++ b/ui/src/components/shell.tsx @@ -9,6 +9,7 @@ import { Moon, Sun, Table2, + FileCode2, Zap, } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; @@ -16,11 +17,12 @@ import { cn } from '@/lib/utils'; import { formatDuration } from '@/lib/format'; import type { Stats } from '@/lib/api'; -export type Page = 'overview' | 'tables' | 'backfill' | 'dlq'; +export type Page = 'overview' | 'tables' | 'schema' | 'backfill' | 'dlq'; const NAV: { id: Page; label: string; icon: typeof LayoutDashboard }[] = [ { id: 'overview', label: 'Overview', icon: LayoutDashboard }, { id: 'tables', label: 'Tables', icon: Table2 }, + { id: 'schema', label: 'Schema', icon: FileCode2 }, { id: 'backfill', label: 'Backfill', icon: DatabaseBackup }, { id: 'dlq', label: 'Dead letters', icon: Inbox }, ]; diff --git a/ui/src/lib/api.ts b/ui/src/lib/api.ts index 6cc4bb9..de09134 100644 --- a/ui/src/lib/api.ts +++ b/ui/src/lib/api.ts @@ -79,6 +79,41 @@ export const historySchema = z.object({ .transform((v) => v ?? []), }); +export const columnDefSchema = z.object({ + name: z.string(), + type: z.string(), + type_oid: z.number(), + part_of_key: z.boolean(), +}); + +export const schemaChangeSchema = z.object({ + schema: z.string(), + table: z.string(), + relation_id: z.number(), + previous_schema: z.string().optional(), + previous_table: z.string().optional(), + added_columns: z.array(columnDefSchema).optional(), + dropped_columns: z.array(columnDefSchema).optional(), + changed_columns: z + .array(z.object({ name: z.string(), from: columnDefSchema, to: columnDefSchema })) + .optional(), + key_columns: z.array(z.string()).optional(), + previous_key_columns: z.array(z.string()).optional(), + replica_identity: z.string(), + previous_replica_identity: z.string().optional(), + kinds: z.array(z.string()), + lsn: z.string(), + transaction_id: z.number(), + timestamp: z.string(), + breaking: z.boolean(), + summary: z.string(), +}); + +export const schemaListSchema = z.object({ + total: z.number(), + changes: z.array(schemaChangeSchema).nullable().transform((v) => v ?? []), +}); + export const dlqEntrySchema = z.object({ id: z.string(), sink: z.string(), @@ -105,6 +140,8 @@ export type HistorySample = History['samples'][number]; export type SinkStats = z.infer; export type TableStats = z.infer; export type BackfillStatus = z.infer; +export type SchemaChange = z.infer; +export type ColumnDef = z.infer; export type DlqEntry = z.infer; export type DlqList = z.infer; @@ -125,6 +162,9 @@ export const getStats = async (): Promise => statsSchema.parse(await requ export const getHistory = async (): Promise => historySchema.parse(await request('/api/history')); +export const getSchemaChanges = async (): Promise> => + schemaListSchema.parse(await request('/api/schema')); + export const getDlq = async (limit = 100): Promise => dlqListSchema.parse(await request(`/dlq?limit=${limit}`)); diff --git a/ui/src/lib/hooks.ts b/ui/src/lib/hooks.ts index f1a72c9..7cf6ce8 100644 --- a/ui/src/lib/hooks.ts +++ b/ui/src/lib/hooks.ts @@ -1,6 +1,6 @@ import { useQuery } from '@tanstack/react-query'; import { useEffect, useMemo, useState } from 'react'; -import { getDlq, getHistory, getStats } from '@/lib/api'; +import { getDlq, getHistory, getSchemaChanges, getStats } from '@/lib/api'; export const POLL_INTERVAL = 2000; @@ -65,6 +65,15 @@ export function useIsDark(): boolean { return dark; } +// DDL is rare; a slower poll keeps the dashboard cheap. +export function useSchemaChanges() { + return useQuery({ + queryKey: ['schema'], + queryFn: getSchemaChanges, + refetchInterval: 10000, + }); +} + export function useDlq(enabled = true) { return useQuery({ queryKey: ['dlq'], diff --git a/ui/src/pages/schema.tsx b/ui/src/pages/schema.tsx new file mode 100644 index 0000000..ef08e59 --- /dev/null +++ b/ui/src/pages/schema.tsx @@ -0,0 +1,144 @@ +import { useMemo, useState } from 'react'; +import { useTable, type ColumnDef as TanstackColumnDef } from '@tanstack/react-table'; +import { FileCode2, Search, TriangleAlert } from 'lucide-react'; +import { Badge } from '@/components/ui/badge'; +import { Card, CardContent } from '@/components/ui/card'; +import { Input } from '@/components/ui/input'; +import { DataTable } from '@/components/data-table'; +import { features } from '@/lib/table'; +import { timeAgo } from '@/lib/format'; +import type { SchemaChange } from '@/lib/api'; +import { useSchemaChanges } from '@/lib/hooks'; + +const KIND_LABEL: Record = { + column_added: 'column added', + column_dropped: 'column dropped', + column_type_changed: 'type changed', + key_changed: 'key changed', + replica_identity_changed: 'replica identity', + table_renamed: 'renamed', +}; + +// Additive changes are safe; everything else can break existing consumers. +const SAFE_KINDS = new Set(['column_added']); + +const columns: Array> = [ + { + id: 'target', + accessorFn: (row) => `${row.schema}.${row.table}`, + header: 'Table', + sortFn: 'text', + cell: ({ row, getValue }) => ( + + {getValue()} + {row.original.breaking && ( + + )} + + ), + }, + { + id: 'kinds', + accessorFn: (row) => row.kinds.join(' '), + header: 'Change', + enableSorting: false, + cell: ({ row }) => ( +
+ {row.original.kinds.map((kind) => ( + + {KIND_LABEL[kind] ?? kind} + + ))} +
+ ), + }, + { + accessorKey: 'summary', + header: 'Details', + enableSorting: false, + cell: ({ getValue }) => ( + ()}> + {getValue()} + + ), + }, + { + accessorKey: 'lsn', + header: 'LSN', + enableSorting: false, + cell: ({ getValue }) => ( + {getValue()} + ), + }, + { + accessorKey: 'timestamp', + header: 'Detected', + sortFn: 'datetime', + cell: ({ getValue }) => ( + {timeAgo(getValue())} + ), + }, +]; + +export function SchemaPage() { + const [filter, setFilter] = useState(''); + const { data } = useSchemaChanges(); + const changes = useMemo(() => data?.changes ?? [], [data]); + const breaking = changes.filter((c) => c.breaking).length; + + const table = useTable({ + features, + columns, + data: changes, + globalFilterFn: 'includesString', + initialState: { sorting: [{ id: 'timestamp', desc: true }] }, + state: { globalFilter: filter }, + }); + + return ( +
+
+
+ + setFilter(e.target.value)} + className="h-8 pl-8 text-sm" + /> +
+ {breaking > 0 && ( + + + {breaking} potentially breaking + + )} +
+ + + + + No schema changes observed since start. +
+ } + /> + + +

+ PostgreSQL does not stream DDL statements. GTC reports the effect of a change — columns + added, dropped or retyped, replica identity, renames — the moment the table's next row + change arrives, so a change to an idle table surfaces when its traffic resumes. +

+ + ); +}