From 5a7722d1d2ca94eab4e216ed2cf396445dbce87c Mon Sep 17 00:00:00 2001 From: mei Date: Mon, 27 Jul 2026 08:09:11 +0800 Subject: [PATCH] feat: add embedded web UI Adds an optional web dashboard served by OpenGFW itself, enabled with a new `web` section in the config file. Backend (web package, decoupled from engine/io so it builds on any OS): - hub.go collects statistics off the engine logger callbacks: atomic counters, two ring-buffered time series (10s and 1min buckets), top N hosts/blocked destinations/rules/analyzers, and a 512 entry event buffer fanned out to connected clients over SSE. Slow clients drop frames instead of blocking the engine. - api.go exposes /api/v1 for info, meta, metrics, events, the SSE stream and ruleset read/validate/replace. - auth.go implements password login with in-memory session tokens and login rate limiting. Mutating endpoints require the bearer token (the session cookie is only accepted for GET), which makes them CSRF-safe. - cmd/web.go implements the rule manager: rules are compiled before anything is written, the file is replaced atomically and the engine is hot reloaded. The SIGHUP handler now shares that same path. - web/devserver serves the UI with synthetic traffic for frontend work on machines where the engine itself cannot be built. Frontend (web/frontend, Vue 3 + Vite + Tailwind CSS v4 + Reka UI): dashboard, live event feed with analyzer property inspection, visual and YAML rule editors, analyzer overview and settings. Responsive down to phone sizes with a bottom tab bar and bottom-sheet dialogs, plus light/dark themes and English/Chinese translations. The built UI in web/dist is committed and embedded with go:embed so that `go build` works without Node; CI builds the frontend and checks that the committed output is up to date. Co-Authored-By: Claude Opus 5 --- .github/workflows/check.yaml | 29 + .github/workflows/release.yaml | 14 +- .gitignore | 6 + Makefile | 46 + README.ja.md | 23 +- README.md | 23 +- README.zh.md | 21 +- cmd/root.go | 88 +- cmd/web.go | 291 ++ ruleset/expr.go | 7 +- web/README.md | 90 + web/api.go | 294 ++ web/auth.go | 152 + web/devserver/main.go | 229 ++ web/dist/assets/AnalyzersView-CHLlPReV.js | 11 + ...ue_type_script_setup_true_lang--8bF8KCa.js | 1 + ...ue_type_script_setup_true_lang-BcE23HB-.js | 1 + web/dist/assets/Collection-D-pf6tmY.js | 1 + web/dist/assets/DashboardView-BnrlcswN.js | 26 + ...ue_type_script_setup_true_lang-DS497KtL.js | 6 + web/dist/assets/EventsView-DvVZcEec.js | 21 + ...ue_type_script_setup_true_lang-gNNtNPLv.js | 6 + ...ue_type_script_setup_true_lang-CDyKzgiP.js | 1 + web/dist/assets/RulesView-SxOStRNP.js | 36 + ...ue_type_script_setup_true_lang-C15l-n0X.js | 13 + web/dist/assets/SettingsView-CQy8Fv4M.js | 16 + ...ue_type_script_setup_true_lang-C9uTg8Ty.js | 1 + ...ue_type_script_setup_true_lang-DTNukDpV.js | 1 + web/dist/assets/format-B6sc_rZ4.js | 1 + web/dist/assets/index-CNsDVyYx.css | 1 + web/dist/assets/index-D3ZCYstt.js | 106 + web/dist/favicon.svg | 11 + web/dist/index.html | 33 + web/embed.go | 10 + web/frontend/index.html | 32 + web/frontend/package-lock.json | 2501 +++++++++++++++++ web/frontend/package.json | 31 + web/frontend/public/favicon.svg | 11 + web/frontend/src/App.vue | 10 + web/frontend/src/assets/style.css | 208 ++ web/frontend/src/components/ActionBadge.vue | 36 + web/frontend/src/components/AppShell.vue | 117 + web/frontend/src/components/BarList.vue | 42 + web/frontend/src/components/EventItem.vue | 46 + web/frontend/src/components/PageHeader.vue | 17 + web/frontend/src/components/StatCard.vue | 49 + web/frontend/src/components/StatusPill.vue | 49 + web/frontend/src/components/Toaster.vue | 52 + web/frontend/src/components/TrafficChart.vue | 168 ++ web/frontend/src/components/ui/Badge.vue | 39 + web/frontend/src/components/ui/Button.vue | 61 + web/frontend/src/components/ui/Card.vue | 18 + .../src/components/ui/CardContent.vue | 11 + .../src/components/ui/CardDescription.vue | 11 + web/frontend/src/components/ui/CardHeader.vue | 11 + web/frontend/src/components/ui/CardTitle.vue | 11 + web/frontend/src/components/ui/Input.vue | 22 + web/frontend/src/components/ui/Label.vue | 21 + web/frontend/src/components/ui/Modal.vue | 71 + web/frontend/src/components/ui/Select.vue | 69 + web/frontend/src/components/ui/Separator.vue | 21 + web/frontend/src/components/ui/Skeleton.vue | 9 + web/frontend/src/components/ui/Switch.vue | 26 + web/frontend/src/components/ui/Tabs.vue | 18 + .../src/components/ui/TabsContent.vue | 13 + web/frontend/src/components/ui/TabsList.vue | 20 + .../src/components/ui/TabsTrigger.vue | 24 + web/frontend/src/components/ui/Textarea.vue | 22 + web/frontend/src/components/ui/index.ts | 19 + web/frontend/src/composables/useLive.ts | 105 + web/frontend/src/composables/useTheme.ts | 46 + web/frontend/src/composables/useToast.ts | 33 + web/frontend/src/env.d.ts | 7 + web/frontend/src/i18n/en.ts | 182 ++ web/frontend/src/i18n/index.ts | 46 + web/frontend/src/i18n/zh.ts | 182 ++ web/frontend/src/lib/api.ts | 110 + web/frontend/src/lib/format.ts | 48 + web/frontend/src/lib/types.ts | 110 + web/frontend/src/lib/utils.ts | 6 + web/frontend/src/main.ts | 14 + web/frontend/src/router/index.ts | 38 + web/frontend/src/views/AnalyzersView.vue | 103 + web/frontend/src/views/DashboardView.vue | 241 ++ web/frontend/src/views/EventsView.vue | 216 ++ web/frontend/src/views/LoginView.vue | 85 + web/frontend/src/views/RulesView.vue | 451 +++ web/frontend/src/views/SettingsView.vue | 183 ++ web/frontend/tsconfig.app.json | 25 + web/frontend/tsconfig.json | 4 + web/frontend/tsconfig.node.json | 16 + web/frontend/vite.config.ts | 29 + web/hub.go | 513 ++++ web/server.go | 262 ++ 94 files changed, 8534 insertions(+), 23 deletions(-) create mode 100644 Makefile create mode 100644 cmd/web.go create mode 100644 web/README.md create mode 100644 web/api.go create mode 100644 web/auth.go create mode 100644 web/devserver/main.go create mode 100644 web/dist/assets/AnalyzersView-CHLlPReV.js create mode 100644 web/dist/assets/Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js create mode 100644 web/dist/assets/CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js create mode 100644 web/dist/assets/Collection-D-pf6tmY.js create mode 100644 web/dist/assets/DashboardView-BnrlcswN.js create mode 100644 web/dist/assets/EventItem.vue_vue_type_script_setup_true_lang-DS497KtL.js create mode 100644 web/dist/assets/EventsView-DvVZcEec.js create mode 100644 web/dist/assets/Modal.vue_vue_type_script_setup_true_lang-gNNtNPLv.js create mode 100644 web/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js create mode 100644 web/dist/assets/RulesView-SxOStRNP.js create mode 100644 web/dist/assets/Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js create mode 100644 web/dist/assets/SettingsView-CQy8Fv4M.js create mode 100644 web/dist/assets/Skeleton.vue_vue_type_script_setup_true_lang-C9uTg8Ty.js create mode 100644 web/dist/assets/TabsTrigger.vue_vue_type_script_setup_true_lang-DTNukDpV.js create mode 100644 web/dist/assets/format-B6sc_rZ4.js create mode 100644 web/dist/assets/index-CNsDVyYx.css create mode 100644 web/dist/assets/index-D3ZCYstt.js create mode 100644 web/dist/favicon.svg create mode 100644 web/dist/index.html create mode 100644 web/embed.go create mode 100644 web/frontend/index.html create mode 100644 web/frontend/package-lock.json create mode 100644 web/frontend/package.json create mode 100644 web/frontend/public/favicon.svg create mode 100644 web/frontend/src/App.vue create mode 100644 web/frontend/src/assets/style.css create mode 100644 web/frontend/src/components/ActionBadge.vue create mode 100644 web/frontend/src/components/AppShell.vue create mode 100644 web/frontend/src/components/BarList.vue create mode 100644 web/frontend/src/components/EventItem.vue create mode 100644 web/frontend/src/components/PageHeader.vue create mode 100644 web/frontend/src/components/StatCard.vue create mode 100644 web/frontend/src/components/StatusPill.vue create mode 100644 web/frontend/src/components/Toaster.vue create mode 100644 web/frontend/src/components/TrafficChart.vue create mode 100644 web/frontend/src/components/ui/Badge.vue create mode 100644 web/frontend/src/components/ui/Button.vue create mode 100644 web/frontend/src/components/ui/Card.vue create mode 100644 web/frontend/src/components/ui/CardContent.vue create mode 100644 web/frontend/src/components/ui/CardDescription.vue create mode 100644 web/frontend/src/components/ui/CardHeader.vue create mode 100644 web/frontend/src/components/ui/CardTitle.vue create mode 100644 web/frontend/src/components/ui/Input.vue create mode 100644 web/frontend/src/components/ui/Label.vue create mode 100644 web/frontend/src/components/ui/Modal.vue create mode 100644 web/frontend/src/components/ui/Select.vue create mode 100644 web/frontend/src/components/ui/Separator.vue create mode 100644 web/frontend/src/components/ui/Skeleton.vue create mode 100644 web/frontend/src/components/ui/Switch.vue create mode 100644 web/frontend/src/components/ui/Tabs.vue create mode 100644 web/frontend/src/components/ui/TabsContent.vue create mode 100644 web/frontend/src/components/ui/TabsList.vue create mode 100644 web/frontend/src/components/ui/TabsTrigger.vue create mode 100644 web/frontend/src/components/ui/Textarea.vue create mode 100644 web/frontend/src/components/ui/index.ts create mode 100644 web/frontend/src/composables/useLive.ts create mode 100644 web/frontend/src/composables/useTheme.ts create mode 100644 web/frontend/src/composables/useToast.ts create mode 100644 web/frontend/src/env.d.ts create mode 100644 web/frontend/src/i18n/en.ts create mode 100644 web/frontend/src/i18n/index.ts create mode 100644 web/frontend/src/i18n/zh.ts create mode 100644 web/frontend/src/lib/api.ts create mode 100644 web/frontend/src/lib/format.ts create mode 100644 web/frontend/src/lib/types.ts create mode 100644 web/frontend/src/lib/utils.ts create mode 100644 web/frontend/src/main.ts create mode 100644 web/frontend/src/router/index.ts create mode 100644 web/frontend/src/views/AnalyzersView.vue create mode 100644 web/frontend/src/views/DashboardView.vue create mode 100644 web/frontend/src/views/EventsView.vue create mode 100644 web/frontend/src/views/LoginView.vue create mode 100644 web/frontend/src/views/RulesView.vue create mode 100644 web/frontend/src/views/SettingsView.vue create mode 100644 web/frontend/tsconfig.app.json create mode 100644 web/frontend/tsconfig.json create mode 100644 web/frontend/tsconfig.node.json create mode 100644 web/frontend/vite.config.ts create mode 100644 web/hub.go create mode 100644 web/server.go diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index ac9e66d..baa6f86 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -30,6 +30,35 @@ jobs: with: install-go: false + web-ui: + name: Web UI + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: npm + cache-dependency-path: web/frontend/package-lock.json + + - name: Install dependencies + run: npm ci + working-directory: web/frontend + + - name: Build + run: npm run build + working-directory: web/frontend + + - name: Check that the embedded web/dist is up to date + run: | + git diff --exit-code -- web/dist || + (echo "::error::web/dist is stale, run 'make web' and commit the result" && exit 1) + tests: name: Tests runs-on: ubuntu-latest diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0da1054..3616651 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -24,6 +24,17 @@ jobs: with: go-version: "1.22" + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "22" + cache: npm + cache-dependency-path: web/frontend/package-lock.json + + - name: Build web UI + run: npm ci && npm run build + working-directory: web/frontend + - name: Build env: GOOS: ${{ matrix.goos }} @@ -31,7 +42,8 @@ jobs: CGO_ENABLED: 0 run: | mkdir -p build - go build -o build/OpenGFW-${GOOS}-${GOARCH} -ldflags "-s -w" . + go build -o build/OpenGFW-${GOOS}-${GOARCH} \ + -ldflags "-s -w -X github.com/apernet/OpenGFW/cmd.appVersion=${GITHUB_REF_NAME} -X github.com/apernet/OpenGFW/cmd.appCommit=${GITHUB_SHA::7}" . - name: Upload uses: softprops/action-gh-release@v2 diff --git a/.gitignore b/.gitignore index 2518397..ec71154 100644 --- a/.gitignore +++ b/.gitignore @@ -208,3 +208,9 @@ $RECYCLE.BIN/ # Internal tools not ready for public use yet tools/flowseq/ + +### Web UI ### +# The built UI in web/dist IS committed, since it is embedded into the binary. +web/frontend/node_modules/ +web/frontend/*.tsbuildinfo +web/frontend/.vite/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c8e4a05 --- /dev/null +++ b/Makefile @@ -0,0 +1,46 @@ +GO ?= go +NPM ?= npm + +VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) +COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null) +LDFLAGS := -s -w \ + -X github.com/apernet/OpenGFW/cmd.appVersion=$(VERSION) \ + -X github.com/apernet/OpenGFW/cmd.appCommit=$(COMMIT) + +FRONTEND := web/frontend + +.PHONY: all +all: web build + +## build: build the OpenGFW binary (embeds the web UI in web/dist) +.PHONY: build +build: + $(GO) build -o OpenGFW -ldflags "$(LDFLAGS)" . + +## web: build the web UI into web/dist +.PHONY: web +web: + cd $(FRONTEND) && $(NPM) install && $(NPM) run build + +## web-dev: run the Vite dev server against a local OpenGFW instance +.PHONY: web-dev +web-dev: + cd $(FRONTEND) && $(NPM) run dev + +## devserver: serve the web UI with synthetic data (works on any OS) +.PHONY: devserver +devserver: + $(GO) run ./web/devserver + +.PHONY: test +test: + $(GO) test ./... + +.PHONY: vet +vet: + $(GO) vet ./... + +.PHONY: clean +clean: + rm -f OpenGFW + rm -rf $(FRONTEND)/node_modules diff --git a/README.ja.md b/README.ja.md index 49223f0..21edeb6 100644 --- a/README.ja.md +++ b/README.ja.md @@ -29,7 +29,28 @@ Telegram グループ: https://t.me/OpGFW - ルールのホットリロード (`SIGHUP` を送信してリロード) - 柔軟なアナライザ&モディファイアフレームワーク - 拡張可能な IO 実装 (今のところ NFQueue のみ) -- [WIP] ウェブ UI +- リアルタイムのトラフィックダッシュボードとルールエディタを備えたウェブ UI + +## ウェブ UI + +OpenGFW にはオプションのウェブダッシュボードが同梱されています。リアルタイムのトラフィック統計、 +アナライザのプロパティを含むイベントフィード、そしてルールを検証してホットリロードできるルールエディタが利用できます。 +スマートフォンでもデスクトップでも使えるレスポンシブ対応です。 + +設定ファイルで有効にします: + +```yaml +web: + enabled: true + listen: :8080 + secret: パスワード # 空の場合は起動時にランダム生成されログに出力されます + # cert: /path/to/fullchain.pem + # key: /path/to/privkey.pem +``` + +UI はバイナリに埋め込まれているため、追加のファイルを配置する必要はありません。 +パスワードを知る人はルールを変更できるため、信頼できるネットワークにのみ公開してください。 +開発方法は [web/README.md](web/README.md) を参照してください。 ## ユースケース diff --git a/README.md b/README.md index 123d76b..ca0ac11 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,28 @@ Telegram group: https://t.me/OpGFW - Hot-reloadable rules (send `SIGHUP` to reload) - Flexible analyzer & modifier framework - Extensible IO implementation (only NFQueue for now) -- [WIP] Web UI +- Web UI with live traffic dashboard and rule editor + +## Web UI + +OpenGFW ships with an optional web dashboard: live traffic statistics, a real-time event +feed with per-stream analyzer properties, and a rule editor that validates and hot reloads +the ruleset. It works on phones as well as on desktops. + +Enable it in your config file: + +```yaml +web: + enabled: true + listen: :8080 + secret: your-password-here # generated and logged on startup if left empty + # cert: /path/to/fullchain.pem + # key: /path/to/privkey.pem +``` + +The UI is embedded in the binary, so no extra files need to be deployed. Only expose it to +trusted networks — anyone with the password can change your rules. See +[web/README.md](web/README.md) for development instructions. ## Use cases diff --git a/README.zh.md b/README.zh.md index 244b9a1..14413c5 100644 --- a/README.zh.md +++ b/README.zh.md @@ -29,7 +29,26 @@ Telegram 群组: https://t.me/OpGFW - 规则可以热重载 (发送 `SIGHUP` 信号) - 灵活的协议解析和修改框架 - 可扩展的 IO 实现 (目前只有 NFQueue) -- [开发中] Web UI +- Web UI,包含实时流量面板与规则编辑器 + +## Web UI + +OpenGFW 内置了一个可选的 Web 控制面板:实时流量统计、带解析器属性的实时事件流,以及可以校验并热加载规则的规则编辑器。 +界面同时适配手机和桌面浏览器。 + +在配置文件中启用: + +```yaml +web: + enabled: true + listen: :8080 + secret: 你的密码 # 留空则启动时随机生成并打印到日志 + # cert: /path/to/fullchain.pem + # key: /path/to/privkey.pem +``` + +前端已经打包进二进制文件,无需额外部署静态资源。请只在可信网络中开放该端口——拿到密码即可修改你的规则。 +开发说明见 [web/README.md](web/README.md)。 ## 使用场景 diff --git a/cmd/root.go b/cmd/root.go index 756513a..a2f8893 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -16,6 +16,7 @@ import ( "github.com/apernet/OpenGFW/modifier" modUDP "github.com/apernet/OpenGFW/modifier/udp" "github.com/apernet/OpenGFW/ruleset" + "github.com/apernet/OpenGFW/web" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -36,6 +37,12 @@ const ( appLogFormatEnv = "OPENGFW_LOG_FORMAT" ) +// Build information, set with -ldflags at build time. +var ( + appVersion = "dev" + appCommit = "" +) + var logger *zap.Logger // Flags @@ -165,6 +172,7 @@ type cliConfig struct { IO cliConfigIO `mapstructure:"io"` Workers cliConfigWorkers `mapstructure:"workers"` Ruleset cliConfigRuleset `mapstructure:"ruleset"` + Web cliConfigWeb `mapstructure:"web"` } type cliConfigIO struct { @@ -188,6 +196,14 @@ type cliConfigRuleset struct { GeoSite string `mapstructure:"geosite"` } +type cliConfigWeb struct { + Enabled bool `mapstructure:"enabled"` + Listen string `mapstructure:"listen"` + Secret string `mapstructure:"secret"` + Cert string `mapstructure:"cert"` + Key string `mapstructure:"key"` +} + func (c *cliConfig) fillLogger(config *engine.Config) error { config.Logger = &engineLogger{} return nil @@ -249,18 +265,24 @@ func runMain(cmd *cobra.Command, args []string) { } defer engineConfig.IO.Close() // Make sure to close IO on exit - // Ruleset - rawRs, err := ruleset.ExprRulesFromYAML(args[0]) - if err != nil { - logger.Fatal("failed to load rules", zap.Error(err)) + // Statistics hub for the web UI + if config.Web.Enabled { + hub = web.NewHub() } + + // Ruleset rsConfig := &ruleset.BuiltinConfig{ Logger: &rulesetLogger{}, GeoSiteFilename: config.Ruleset.GeoSite, GeoIpFilename: config.Ruleset.GeoIp, ProtectedDialContext: engineConfig.IO.ProtectedDialContext, } - rs, err := ruleset.CompileExprRules(rawRs, analyzers, modifiers, rsConfig) + rm := newRuleManager(args[0], analyzers, modifiers, rsConfig) + rawRules, err := os.ReadFile(args[0]) + if err != nil { + logger.Fatal("failed to load rules", zap.Error(err)) + } + rs, _, err := rm.Compile(string(rawRules)) if err != nil { logger.Fatal("failed to compile rules", zap.Error(err)) } @@ -271,6 +293,7 @@ func runMain(cmd *cobra.Command, args []string) { if err != nil { logger.Fatal("failed to initialize engine", zap.Error(err)) } + rm.SetEngine(en) // Signal handling ctx, cancelFunc := context.WithCancel(context.Background()) @@ -289,25 +312,21 @@ func runMain(cmd *cobra.Command, args []string) { for { <-reloadChan logger.Info("reloading rules") - rawRs, err := ruleset.ExprRulesFromYAML(args[0]) - if err != nil { - logger.Error("failed to load rules, using old rules", zap.Error(err)) - continue - } - rs, err := ruleset.CompileExprRules(rawRs, analyzers, modifiers, rsConfig) - if err != nil { - logger.Error("failed to compile rules, using old rules", zap.Error(err)) - continue - } - err = en.UpdateRuleset(rs) - if err != nil { - logger.Error("failed to update ruleset", zap.Error(err)) + if err := rm.Reload(); err != nil { + logger.Error("failed to reload rules, using old rules", zap.Error(err)) } else { logger.Info("rules reloaded") } } }() + // Web UI + if config.Web.Enabled { + if err := startWebServer(ctx, &config, rm); err != nil { + logger.Fatal("failed to start web UI", zap.Error(err)) + } + } + logger.Info("engine started") logger.Info("engine exited", zap.Error(en.Run(ctx))) } @@ -315,14 +334,23 @@ func runMain(cmd *cobra.Command, args []string) { type engineLogger struct{} func (l *engineLogger) WorkerStart(id int) { + if hub != nil { + hub.WorkerStarted() + } logger.Debug("worker started", zap.Int("id", id)) } func (l *engineLogger) WorkerStop(id int) { + if hub != nil { + hub.WorkerStopped() + } logger.Debug("worker stopped", zap.Int("id", id)) } func (l *engineLogger) TCPStreamNew(workerID int, info ruleset.StreamInfo) { + if hub != nil { + hub.StreamNew("tcp") + } logger.Debug("new TCP stream", zap.Int("workerID", workerID), zap.Int64("id", info.ID), @@ -331,6 +359,9 @@ func (l *engineLogger) TCPStreamNew(workerID int, info ruleset.StreamInfo) { } func (l *engineLogger) TCPStreamPropUpdate(info ruleset.StreamInfo, close bool) { + if hub != nil { + hub.PropUpdate(toWebProps(info.Props)) + } logger.Debug("TCP stream property update", zap.Int64("id", info.ID), zap.String("src", info.SrcString()), @@ -340,6 +371,9 @@ func (l *engineLogger) TCPStreamPropUpdate(info ruleset.StreamInfo, close bool) } func (l *engineLogger) TCPStreamAction(info ruleset.StreamInfo, action ruleset.Action, noMatch bool) { + if hub != nil { + hub.StreamAction(hubInfo(info), action.String()) + } logger.Info("TCP stream action", zap.Int64("id", info.ID), zap.String("src", info.SrcString()), @@ -349,6 +383,9 @@ func (l *engineLogger) TCPStreamAction(info ruleset.StreamInfo, action ruleset.A } func (l *engineLogger) UDPStreamNew(workerID int, info ruleset.StreamInfo) { + if hub != nil { + hub.StreamNew("udp") + } logger.Debug("new UDP stream", zap.Int("workerID", workerID), zap.Int64("id", info.ID), @@ -357,6 +394,9 @@ func (l *engineLogger) UDPStreamNew(workerID int, info ruleset.StreamInfo) { } func (l *engineLogger) UDPStreamPropUpdate(info ruleset.StreamInfo, close bool) { + if hub != nil { + hub.PropUpdate(toWebProps(info.Props)) + } logger.Debug("UDP stream property update", zap.Int64("id", info.ID), zap.String("src", info.SrcString()), @@ -366,6 +406,9 @@ func (l *engineLogger) UDPStreamPropUpdate(info ruleset.StreamInfo, close bool) } func (l *engineLogger) UDPStreamAction(info ruleset.StreamInfo, action ruleset.Action, noMatch bool) { + if hub != nil { + hub.StreamAction(hubInfo(info), action.String()) + } logger.Info("UDP stream action", zap.Int64("id", info.ID), zap.String("src", info.SrcString()), @@ -375,6 +418,9 @@ func (l *engineLogger) UDPStreamAction(info ruleset.StreamInfo, action ruleset.A } func (l *engineLogger) ModifyError(info ruleset.StreamInfo, err error) { + if hub != nil { + hub.Error(hubInfo(info), "", err.Error()) + } logger.Error("modify error", zap.Int64("id", info.ID), zap.String("src", info.SrcString()), @@ -406,6 +452,9 @@ func (l *engineLogger) AnalyzerErrorf(streamID int64, name string, format string type rulesetLogger struct{} func (l *rulesetLogger) Log(info ruleset.StreamInfo, name string) { + if hub != nil { + hub.RuleLog(hubInfo(info), name) + } logger.Info("ruleset log", zap.String("name", name), zap.Int64("id", info.ID), @@ -415,6 +464,9 @@ func (l *rulesetLogger) Log(info ruleset.StreamInfo, name string) { } func (l *rulesetLogger) MatchError(info ruleset.StreamInfo, name string, err error) { + if hub != nil { + hub.Error(hubInfo(info), name, err.Error()) + } logger.Error("ruleset match error", zap.String("name", name), zap.Int64("id", info.ID), diff --git a/cmd/web.go b/cmd/web.go new file mode 100644 index 0000000..d7fbffa --- /dev/null +++ b/cmd/web.go @@ -0,0 +1,291 @@ +package cmd + +import ( + "context" + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + + "github.com/apernet/OpenGFW/analyzer" + "github.com/apernet/OpenGFW/engine" + "github.com/apernet/OpenGFW/modifier" + "github.com/apernet/OpenGFW/ruleset" + "github.com/apernet/OpenGFW/web" + + "go.uber.org/zap" + "gopkg.in/yaml.v3" +) + +// hub is the (optional) statistics collector feeding the web UI. It is nil +// when the web UI is disabled. +var hub *web.Hub + +// ruleManager owns the rule file and knows how to hot reload the engine. +// It is shared between the SIGHUP handler and the web UI. +type ruleManager struct { + path string + analyzers []analyzer.Analyzer + modifiers []modifier.Modifier + rsConfig *ruleset.BuiltinConfig + + mu sync.Mutex + engine engine.Engine +} + +var _ web.RuleManager = (*ruleManager)(nil) + +func newRuleManager(path string, ans []analyzer.Analyzer, mods []modifier.Modifier, rsConfig *ruleset.BuiltinConfig) *ruleManager { + return &ruleManager{path: path, analyzers: ans, modifiers: mods, rsConfig: rsConfig} +} + +func (m *ruleManager) SetEngine(en engine.Engine) { + m.mu.Lock() + m.engine = en + m.mu.Unlock() +} + +func (m *ruleManager) Path() string { return m.path } + +// Compile parses and compiles a rule file content, without applying it. +func (m *ruleManager) Compile(raw string) (ruleset.Ruleset, []ruleset.ExprRule, error) { + rawRs, err := ruleset.ExprRulesFromYAMLBytes([]byte(raw)) + if err != nil { + return nil, nil, fmt.Errorf("failed to parse rules: %w", err) + } + rs, err := ruleset.CompileExprRules(rawRs, m.analyzers, m.modifiers, m.rsConfig) + if err != nil { + return nil, nil, fmt.Errorf("failed to compile rules: %w", err) + } + return rs, rawRs, nil +} + +// Reload re-reads the rule file from disk and applies it to the engine. +func (m *ruleManager) Reload() error { + bs, err := os.ReadFile(m.path) + if err != nil { + return err + } + rs, _, err := m.Compile(string(bs)) + if err != nil { + return err + } + return m.update(rs) +} + +func (m *ruleManager) update(rs ruleset.Ruleset) error { + m.mu.Lock() + en := m.engine + m.mu.Unlock() + if en == nil { + return errors.New("engine is not running") + } + return en.UpdateRuleset(rs) +} + +func (m *ruleManager) Load() (string, []web.Rule, error) { + bs, err := os.ReadFile(m.path) + if err != nil { + return "", nil, err + } + rules, err := ruleset.ExprRulesFromYAMLBytes(bs) + if err != nil { + // The file is still shown as-is so that the user can fix it in the editor. + return string(bs), nil, nil + } + return string(bs), toWebRules(rules), nil +} + +func (m *ruleManager) Validate(raw string) ([]web.Rule, error) { + _, rules, err := m.Compile(raw) + if err != nil { + return nil, err + } + return toWebRules(rules), nil +} + +func (m *ruleManager) Marshal(rules []web.Rule) (string, error) { + out := make([]web.Rule, 0, len(rules)) + for _, r := range rules { + if r.Modifier != nil && r.Modifier.Name == "" { + r.Modifier = nil // Leftover from switching a rule away from `modify` + } + out = append(out, r) + } + bs, err := yaml.Marshal(out) + if err != nil { + return "", err + } + return string(bs), nil +} + +// Apply compiles the given rules, persists them to the rule file and hot +// reloads the engine. The file is only written once the rules compile. +func (m *ruleManager) Apply(raw string) ([]web.Rule, error) { + rs, rules, err := m.Compile(raw) + if err != nil { + return nil, err + } + if err := m.writeFile(raw); err != nil { + return nil, fmt.Errorf("failed to write rule file: %w", err) + } + if err := m.update(rs); err != nil { + return nil, fmt.Errorf("failed to update ruleset: %w", err) + } + return toWebRules(rules), nil +} + +// writeFile replaces the rule file atomically so that a crash in the middle of +// a save cannot leave a truncated ruleset behind. +func (m *ruleManager) writeFile(raw string) error { + mode := os.FileMode(0o644) + if fi, err := os.Stat(m.path); err == nil { + mode = fi.Mode().Perm() + } + dir := filepath.Dir(m.path) + tmp, err := os.CreateTemp(dir, ".rules-*.yaml") + if err != nil { + return err + } + tmpName := tmp.Name() + defer os.Remove(tmpName) // No-op once the rename succeeded + if _, err := tmp.WriteString(raw); err != nil { + tmp.Close() + return err + } + if err := tmp.Sync(); err != nil { + tmp.Close() + return err + } + if err := tmp.Close(); err != nil { + return err + } + if err := os.Chmod(tmpName, mode); err != nil { + return err + } + return os.Rename(tmpName, m.path) +} + +func toWebRules(rules []ruleset.ExprRule) []web.Rule { + out := make([]web.Rule, 0, len(rules)) + for _, r := range rules { + wr := web.Rule{Name: r.Name, Action: r.Action, Log: r.Log, Expr: r.Expr} + if r.Modifier.Name != "" { + wr.Modifier = &web.RuleModifier{Name: r.Modifier.Name, Args: r.Modifier.Args} + } + out = append(out, wr) + } + return out +} + +// startWebServer starts the web UI. It returns nil when the UI is disabled. +func startWebServer(ctx context.Context, config *cliConfig, rm *ruleManager) error { + secret := config.Web.Secret + generated := false + if secret == "" { + secret = web.RandomSecret() + generated = true + } + srv, err := web.NewServer(web.Config{ + Listen: config.Web.Listen, + Secret: secret, + CertFile: config.Web.Cert, + KeyFile: config.Web.Key, + Hub: hub, + Rules: rm, + Meta: webMeta(), + Info: func() web.Info { return webInfo(config, rm) }, + Logf: func(format string, args ...interface{}) { + logger.Info(fmt.Sprintf(format, args...)) + }, + }) + if err != nil { + return configError{Field: "web", Err: err} + } + scheme := "http" + if srv.TLS() { + scheme = "https" + } + fields := []zap.Field{ + zap.String("listen", srv.Addr()), + zap.String("scheme", scheme), + } + if generated { + fields = append(fields, zap.String("password", secret)) + logger.Warn("web UI password was not set, using a generated one", fields...) + } else { + logger.Info("web UI started", fields...) + } + go func() { + if err := srv.Run(ctx); err != nil { + logger.Error("web UI stopped", zap.Error(err)) + } + }() + return nil +} + +func webMeta() web.MetaInfo { + meta := web.MetaInfo{ + Actions: []string{"allow", "block", "drop", "modify"}, + Functions: []string{"geoip", "geosite", "cidr", "lookup"}, + } + for _, a := range analyzers { + proto := "tcp" + if _, ok := a.(analyzer.UDPAnalyzer); ok { + proto = "udp" + } + meta.Analyzers = append(meta.Analyzers, web.AnalyzerInfo{Name: a.Name(), Proto: proto}) + } + for _, m := range modifiers { + meta.Modifiers = append(meta.Modifiers, m.Name()) + } + return meta +} + +func webInfo(config *cliConfig, rm *ruleManager) web.Info { + hostname, _ := os.Hostname() + return web.Info{ + Version: appVersion, + Commit: appCommit, + Platform: runtime.GOOS + "/" + runtime.GOARCH, + GoVersion: runtime.Version(), + Hostname: hostname, + RuleFile: rm.Path(), + Config: web.ConfigDigest{ + IOQueueSize: config.IO.QueueSize, + IOLocal: config.IO.Local, + IORST: config.IO.RST, + Workers: config.Workers.Count, + WorkerQueue: config.Workers.QueueSize, + UDPMaxStreams: config.Workers.UDPMaxStreams, + GeoIP: config.Ruleset.GeoIp, + GeoSite: config.Ruleset.GeoSite, + }, + } +} + +// hubInfo converts engine stream info into the shape the hub understands. +func hubInfo(info ruleset.StreamInfo) web.StreamInfo { + return web.StreamInfo{ + ID: info.ID, + Proto: info.Protocol.String(), + SrcIP: info.SrcIP.String(), + SrcPort: info.SrcPort, + DstIP: info.DstIP.String(), + DstPort: info.DstPort, + Props: toWebProps(info.Props), + } +} + +func toWebProps(props analyzer.CombinedPropMap) web.Props { + if len(props) == 0 { + return nil + } + out := make(web.Props, len(props)) + for name, p := range props { + out[name] = p + } + return out +} diff --git a/ruleset/expr.go b/ruleset/expr.go index 868a115..2cdf9b6 100644 --- a/ruleset/expr.go +++ b/ruleset/expr.go @@ -42,8 +42,13 @@ func ExprRulesFromYAML(file string) ([]ExprRule, error) { if err != nil { return nil, err } + return ExprRulesFromYAMLBytes(bs) +} + +// ExprRulesFromYAMLBytes parses expression rules from a YAML document in memory. +func ExprRulesFromYAMLBytes(bs []byte) ([]ExprRule, error) { var rules []ExprRule - err = yaml.Unmarshal(bs, &rules) + err := yaml.Unmarshal(bs, &rules) return rules, err } diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..69eba4b --- /dev/null +++ b/web/README.md @@ -0,0 +1,90 @@ +# OpenGFW Web UI + +A Vue 3 + Tailwind CSS dashboard for OpenGFW, built with [shadcn/ui](https://ui.shadcn.com) +style components on top of [Reka UI](https://reka-ui.com) primitives. It is embedded into +the OpenGFW binary and served by the `web` package. + +- **Dashboard** — live counters, traffic chart, verdict/protocol split, top hosts, + blocked destinations and triggered rules +- **Events** — real-time feed of verdicts, rule logs and errors with filters and a + detail view showing raw analyzer properties +- **Rules** — visual rule editor and a raw YAML editor, both validated by the engine + itself; saving writes the rule file and hot reloads the running engine +- **Analyzers** — which analyzers are compiled in and how much traffic each one saw +- **Settings** — theme (light/dark/system), language (English/中文) and instance info + +The layout is responsive: a sidebar on desktop, a bottom tab bar and bottom-sheet +dialogs on phones. + +## Enabling it + +```yaml +# config.yaml +web: + enabled: true + listen: :8080 + secret: your-password-here + # cert: /path/to/fullchain.pem + # key: /path/to/privkey.pem +``` + +If `secret` is empty a random password is generated and printed to the log on startup. + +## Layout + +``` +web/ +├── api.go HTTP handlers (JSON API + SSE) +├── auth.go password login, session tokens +├── hub.go statistics collection and the live event fan-out +├── server.go routes, static file serving, public types +├── embed.go //go:embed of dist +├── devserver/ standalone server with synthetic data (any OS) +├── dist/ built UI, embedded into the binary (committed) +└── frontend/ Vue sources +``` + +## Development + +The engine only builds on Linux, so for UI work there is a standalone server that +feeds the UI synthetic traffic and an in-memory ruleset: + +```bash +go run ./web/devserver # http://127.0.0.1:8080, password: opengfw +``` + +Then, in another terminal, run Vite with hot reload (it proxies `/api` to `:8080`): + +```bash +cd web/frontend +npm install +npm run dev +``` + +To produce the embedded build (this is what `make web` runs): + +```bash +cd web/frontend && npm run build # writes ../dist +``` + +`web/dist` is committed so that `go build` works without Node installed. Rebuild it +whenever you change the frontend. + +## API + +All endpoints live under `/api/v1` and return JSON. Except for `login`, every request +must carry `Authorization: Bearer `; `GET` endpoints also accept the session +cookie set at login, which is what the `EventSource` connection uses. Mutating +endpoints only accept the bearer token, which makes them immune to CSRF. + +| Method | Path | Description | +| ---------- | -------------------- | -------------------------------------------------- | +| `POST` | `/login` | exchange the password for a session token | +| `POST` | `/logout` | invalidate the current session | +| `GET` | `/info` | version, platform and engine configuration | +| `GET` | `/meta` | available analyzers, modifiers, actions, functions | +| `GET` | `/metrics` | counters, time series and top N lists | +| `GET` | `/events?limit=` | recent events from the ring buffer | +| `GET` | `/live` | server-sent events: `event` and `metrics` frames | +| `GET/PUT` | `/rules` | read / replace the ruleset (`raw` YAML or `rules`) | +| `POST` | `/rules/validate` | compile without applying; also converts YAML ⇄ rules | diff --git a/web/api.go b/web/api.go new file mode 100644 index 0000000..f697e26 --- /dev/null +++ b/web/api.go @@ -0,0 +1,294 @@ +package web + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + "time" +) + +type apiError struct { + Error string `json:"error"` +} + +func writeJSON(w http.ResponseWriter, code int, v interface{}) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(code) + _ = json.NewEncoder(w).Encode(v) +} + +func writeError(w http.ResponseWriter, code int, msg string) { + writeJSON(w, code, apiError{Error: msg}) +} + +func methodAllowed(w http.ResponseWriter, r *http.Request, methods ...string) bool { + for _, m := range methods { + if r.Method == m { + return true + } + } + writeError(w, http.StatusMethodNotAllowed, "method not allowed") + return false +} + +func decodeBody(w http.ResponseWriter, r *http.Request, v interface{}) bool { + r.Body = http.MaxBytesReader(w, r.Body, 4<<20) // 4 MiB is plenty for a rule file + if err := json.NewDecoder(r.Body).Decode(v); err != nil { + writeError(w, http.StatusBadRequest, "invalid request body: "+err.Error()) + return false + } + return true +} + +// POST /api/v1/login +func (s *Server) handleLogin(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodPost) { + return + } + var req struct { + Password string `json:"password"` + } + if !decodeBody(w, r, &req) { + return + } + token, expiry, err := s.auth.login(r.RemoteAddr, req.Password) + if err != nil { + code := http.StatusUnauthorized + if errors.Is(err, errTooManyAttempts) { + code = http.StatusTooManyRequests + } + writeError(w, code, err.Error()) + return + } + http.SetCookie(w, &http.Cookie{ + Name: sessionCookieName, + Value: token, + Path: "/", + Expires: expiry, + HttpOnly: true, + Secure: s.TLS(), + SameSite: http.SameSiteLaxMode, + }) + writeJSON(w, http.StatusOK, map[string]interface{}{ + "token": token, + "expiresAt": expiry.UnixMilli(), + }) +} + +// POST /api/v1/logout +func (s *Server) handleLogout(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodPost) { + return + } + s.auth.logout(bearerToken(r)) + http.SetCookie(w, &http.Cookie{ + Name: sessionCookieName, + Value: "", + Path: "/", + MaxAge: -1, + HttpOnly: true, + Secure: s.TLS(), + SameSite: http.SameSiteLaxMode, + }) + writeJSON(w, http.StatusOK, map[string]string{"status": "ok"}) +} + +// GET /api/v1/info +func (s *Server) handleInfo(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodGet) { + return + } + var info Info + if s.config.Info != nil { + info = s.config.Info() + } + writeJSON(w, http.StatusOK, info) +} + +// GET /api/v1/meta +func (s *Server) handleMeta(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodGet) { + return + } + writeJSON(w, http.StatusOK, s.config.Meta) +} + +// GET /api/v1/metrics +func (s *Server) handleMetrics(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodGet) { + return + } + writeJSON(w, http.StatusOK, s.config.Hub.Metrics()) +} + +// GET /api/v1/events?limit=200 +func (s *Server) handleEvents(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodGet) { + return + } + limit := 200 + if v := r.URL.Query().Get("limit"); v != "" { + if n, err := strconv.Atoi(v); err == nil && n > 0 { + limit = n + } + } + writeJSON(w, http.StatusOK, map[string]interface{}{ + "events": s.config.Hub.Events(limit), + }) +} + +// GET /api/v1/live - server-sent events carrying live events and metrics. +func (s *Server) handleLive(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodGet) { + return + } + flusher, ok := w.(http.Flusher) + if !ok { + writeError(w, http.StatusInternalServerError, "streaming unsupported") + return + } + h := w.Header() + h.Set("Content-Type", "text/event-stream") + h.Set("Cache-Control", "no-cache") + h.Set("Connection", "keep-alive") + h.Set("X-Accel-Buffering", "no") + w.WriteHeader(http.StatusOK) + flusher.Flush() + + events, unsubscribe := s.config.Hub.Subscribe() + defer unsubscribe() + + metricsTicker := time.NewTicker(2 * time.Second) + defer metricsTicker.Stop() + keepAlive := time.NewTicker(20 * time.Second) + defer keepAlive.Stop() + + send := func(event string, v interface{}) bool { + data, err := json.Marshal(v) + if err != nil { + return true + } + if _, err := fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event, data); err != nil { + return false + } + flusher.Flush() + return true + } + + if !send("metrics", s.config.Hub.Metrics()) { + return + } + for { + select { + case <-r.Context().Done(): + return + case ev, ok := <-events: + if !ok { + return + } + if !send("event", ev) { + return + } + case <-metricsTicker.C: + if !send("metrics", s.config.Hub.Metrics()) { + return + } + case <-keepAlive.C: + if _, err := fmt.Fprint(w, ": ping\n\n"); err != nil { + return + } + flusher.Flush() + } + } +} + +type rulesRequest struct { + Raw string `json:"raw"` + Rules []Rule `json:"rules"` +} + +type rulesResponse struct { + Path string `json:"path"` + Raw string `json:"raw"` + Rules []Rule `json:"rules"` +} + +// resolveRaw turns a request into rule file content. +func (s *Server) resolveRaw(req rulesRequest) (string, error) { + if req.Rules != nil { + return s.config.Rules.Marshal(req.Rules) + } + return req.Raw, nil +} + +// GET/PUT /api/v1/rules +func (s *Server) handleRules(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodGet, http.MethodPut) { + return + } + if s.config.Rules == nil { + writeError(w, http.StatusNotImplemented, "rule management is unavailable") + return + } + if r.Method == http.MethodGet { + raw, rules, err := s.config.Rules.Load() + if err != nil { + writeError(w, http.StatusInternalServerError, err.Error()) + return + } + writeJSON(w, http.StatusOK, rulesResponse{Path: s.config.Rules.Path(), Raw: raw, Rules: rules}) + return + } + var req rulesRequest + if !decodeBody(w, r, &req) { + return + } + raw, err := s.resolveRaw(req) + if err != nil { + writeError(w, http.StatusBadRequest, err.Error()) + return + } + rules, err := s.config.Rules.Apply(raw) + if err != nil { + writeError(w, http.StatusBadRequest, err.Error()) + return + } + s.config.Logf("ruleset updated from web UI (%d rules)", len(rules)) + writeJSON(w, http.StatusOK, rulesResponse{Path: s.config.Rules.Path(), Raw: raw, Rules: rules}) +} + +// POST /api/v1/rules/validate +func (s *Server) handleRulesValidate(w http.ResponseWriter, r *http.Request) { + if !methodAllowed(w, r, http.MethodPost) { + return + } + if s.config.Rules == nil { + writeError(w, http.StatusNotImplemented, "rule management is unavailable") + return + } + var req rulesRequest + if !decodeBody(w, r, &req) { + return + } + raw, err := s.resolveRaw(req) + if err != nil { + writeJSON(w, http.StatusOK, map[string]interface{}{"valid": false, "error": err.Error()}) + return + } + rules, err := s.config.Rules.Validate(raw) + if err != nil { + writeJSON(w, http.StatusOK, map[string]interface{}{ + "valid": false, + "error": err.Error(), + "raw": raw, + }) + return + } + writeJSON(w, http.StatusOK, map[string]interface{}{ + "valid": true, + "rules": rules, + "raw": raw, + }) +} diff --git a/web/auth.go b/web/auth.go new file mode 100644 index 0000000..16a702f --- /dev/null +++ b/web/auth.go @@ -0,0 +1,152 @@ +package web + +import ( + "crypto/rand" + "crypto/subtle" + "encoding/hex" + "net" + "net/http" + "sync" + "time" +) + +const ( + sessionCookieName = "opengfw_session" + sessionTTL = 7 * 24 * time.Hour + maxLoginFailures = 8 + loginBanDuration = 5 * time.Minute +) + +type authenticator struct { + secret string + + mu sync.Mutex + sessions map[string]time.Time // token -> expiry + failures map[string]*failureRecord +} + +type failureRecord struct { + count int + until time.Time +} + +func newAuthenticator(secret string) *authenticator { + return &authenticator{ + secret: secret, + sessions: make(map[string]time.Time), + failures: make(map[string]*failureRecord), + } +} + +// RandomSecret generates a secret to be used when the user did not set one. +func RandomSecret() string { + b := make([]byte, 12) + if _, err := rand.Read(b); err != nil { + return "opengfw" + } + return hex.EncodeToString(b) +} + +func newToken() string { + b := make([]byte, 32) + if _, err := rand.Read(b); err != nil { + return "" + } + return hex.EncodeToString(b) +} + +// login verifies the password and returns a new session token. +func (a *authenticator) login(remoteAddr, password string) (string, time.Time, error) { + ip := hostOnly(remoteAddr) + a.mu.Lock() + defer a.mu.Unlock() + now := time.Now() + if rec, ok := a.failures[ip]; ok && rec.count >= maxLoginFailures && now.Before(rec.until) { + return "", time.Time{}, errTooManyAttempts + } + if subtle.ConstantTimeCompare([]byte(password), []byte(a.secret)) != 1 { + rec, ok := a.failures[ip] + if !ok || now.After(rec.until) { + rec = &failureRecord{} + a.failures[ip] = rec + } + rec.count++ + rec.until = now.Add(loginBanDuration) + return "", time.Time{}, errBadCredentials + } + delete(a.failures, ip) + token := newToken() + if token == "" { + return "", time.Time{}, errInternal + } + expiry := now.Add(sessionTTL) + a.sessions[token] = expiry + a.gcLocked(now) + return token, expiry, nil +} + +func (a *authenticator) logout(token string) { + if token == "" { + return + } + a.mu.Lock() + delete(a.sessions, token) + a.mu.Unlock() +} + +func (a *authenticator) valid(token string) bool { + if token == "" { + return false + } + a.mu.Lock() + defer a.mu.Unlock() + expiry, ok := a.sessions[token] + if !ok { + return false + } + if time.Now().After(expiry) { + delete(a.sessions, token) + return false + } + return true +} + +func (a *authenticator) gcLocked(now time.Time) { + for t, exp := range a.sessions { + if now.After(exp) { + delete(a.sessions, t) + } + } + for ip, rec := range a.failures { + if now.After(rec.until) { + delete(a.failures, ip) + } + } +} + +// bearerToken returns the token carried by the Authorization header, if any. +func bearerToken(r *http.Request) string { + const prefix = "Bearer " + h := r.Header.Get("Authorization") + if len(h) > len(prefix) && h[:len(prefix)] == prefix { + return h[len(prefix):] + } + return "" +} + +// cookieToken returns the token carried by the session cookie, if any. +func cookieToken(r *http.Request) string { + c, err := r.Cookie(sessionCookieName) + if err != nil { + return "" + } + return c.Value +} + +func hostOnly(addr string) string { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return addr + } + return host +} diff --git a/web/devserver/main.go b/web/devserver/main.go new file mode 100644 index 0000000..7920df5 --- /dev/null +++ b/web/devserver/main.go @@ -0,0 +1,229 @@ +// Command devserver runs the OpenGFW web UI against synthetic data. +// +// The engine itself only builds on Linux (it needs NFQueue), so this little +// program exists to let the frontend be developed and reviewed anywhere: +// +// go run ./web/devserver +// +// It serves the embedded UI on :8080 with the password "opengfw". +package main + +import ( + "context" + "fmt" + "log" + "math/rand" + "os" + "os/signal" + "runtime" + "syscall" + "time" + + "github.com/apernet/OpenGFW/web" + "gopkg.in/yaml.v3" +) + +const password = "opengfw" + +func main() { + hub := web.NewHub() + rm := &memoryRules{} + if err := rm.init(); err != nil { + log.Fatal(err) + } + + srv, err := web.NewServer(web.Config{ + Listen: ":8080", + Secret: password, + Hub: hub, + Rules: rm, + Meta: web.MetaInfo{ + Analyzers: []web.AnalyzerInfo{ + {Name: "http", Proto: "tcp"}, {Name: "tls", Proto: "tcp"}, + {Name: "ssh", Proto: "tcp"}, {Name: "socks", Proto: "tcp"}, + {Name: "trojan", Proto: "tcp"}, {Name: "fet", Proto: "tcp"}, + {Name: "dns", Proto: "udp"}, {Name: "quic", Proto: "udp"}, + {Name: "openvpn", Proto: "udp"}, {Name: "wireguard", Proto: "udp"}, + }, + Modifiers: []string{"dns"}, + Actions: []string{"allow", "block", "drop", "modify"}, + Functions: []string{"geoip", "geosite", "cidr", "lookup"}, + }, + Info: func() web.Info { + host, _ := os.Hostname() + return web.Info{ + Version: "devserver", + Platform: runtime.GOOS + "/" + runtime.GOARCH, + GoVersion: runtime.Version(), + Hostname: host, + RuleFile: "rules.yaml (in memory)", + Config: web.ConfigDigest{ + IOQueueSize: 1024, IORST: true, Workers: 4, + WorkerQueue: 64, UDPMaxStreams: 4096, + GeoIP: "geoip.dat", GeoSite: "geosite.dat", + }, + } + }, + Logf: log.Printf, + }) + if err != nil { + log.Fatal(err) + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go func() { + ch := make(chan os.Signal, 1) + signal.Notify(ch, os.Interrupt, syscall.SIGTERM) + <-ch + cancel() + }() + + for i := 0; i < 4; i++ { + hub.WorkerStarted() + } + go generate(ctx, hub) + + log.Printf("web UI on http://127.0.0.1:8080 (password: %s)", password) + if err := srv.Run(ctx); err != nil { + log.Fatal(err) + } +} + +var ( + hosts = []string{ + "www.google.com", "github.com", "cdn.jsdelivr.net", "telegram.org", + "ads.example.net", "tracker.evil.test", "api.openai.com", "www.wikipedia.org", + "registry.npmjs.org", "malware.bad.test", + } + ips = []string{"1.1.1.1", "8.8.8.8", "93.184.216.34", "104.16.132.229", "2606:4700::6810:84e5"} +) + +// generate feeds the hub with plausible looking traffic. +func generate(ctx context.Context, hub *web.Hub) { + rng := rand.New(rand.NewSource(42)) + ticker := time.NewTicker(120 * time.Millisecond) + defer ticker.Stop() + var id int64 + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + for n := rng.Intn(6); n >= 0; n-- { + id++ + udp := rng.Intn(3) == 0 + proto := "tcp" + if udp { + proto = "udp" + } + hub.StreamNew(proto) + + host := hosts[rng.Intn(len(hosts))] + props := web.Props{} + if udp { + props["dns"] = web.PropMap{ + "qr": false, + "questions": []map[string]interface{}{{"name": host, "type": 1}}, + } + } else { + props["tls"] = web.PropMap{"req": map[string]interface{}{ + "sni": host, "version": 771, + }} + } + hub.PropUpdate(props) + + info := web.StreamInfo{ + ID: id, + Proto: proto, + SrcIP: fmt.Sprintf("192.168.1.%d", 2+rng.Intn(60)), + SrcPort: uint16(20000 + rng.Intn(40000)), + DstIP: ips[rng.Intn(len(ips))], + DstPort: 443, + Props: props, + } + + switch { + case rng.Intn(10) == 0: + hub.RuleLog(info, "log-suspicious") + hub.StreamAction(info, "block") + case rng.Intn(12) == 0: + hub.StreamAction(info, "drop") + case rng.Intn(14) == 0: + hub.StreamAction(info, "modify") + case rng.Intn(30) == 0: + hub.Error(info, "geoip-rule", "lookup timeout") + default: + hub.StreamAction(info, "allow") + } + } + } + } +} + +// memoryRules is an in-memory web.RuleManager: it validates the YAML shape but +// does not compile expressions, which is enough for UI work. +type memoryRules struct { + raw string + rules []web.Rule +} + +const seedRules = `- name: block-malware + action: block + log: true + expr: 'tls != nil && tls.req != nil && string(tls.req.sni) endsWith ".bad.test"' +- name: block-ads-dns + action: drop + expr: 'dns != nil && any(dns.questions, {.name endsWith "ads.example.net"})' +- name: log-ssh + log: true + expr: 'ssh != nil' +` + +func (m *memoryRules) init() error { + rules, err := parse(seedRules) + if err != nil { + return err + } + m.raw, m.rules = seedRules, rules + return nil +} + +func (m *memoryRules) Path() string { return "rules.yaml" } + +func (m *memoryRules) Load() (string, []web.Rule, error) { return m.raw, m.rules, nil } + +func (m *memoryRules) Validate(raw string) ([]web.Rule, error) { return parse(raw) } + +func (m *memoryRules) Marshal(rules []web.Rule) (string, error) { + bs, err := yaml.Marshal(rules) + return string(bs), err +} + +func (m *memoryRules) Apply(raw string) ([]web.Rule, error) { + rules, err := parse(raw) + if err != nil { + return nil, err + } + m.raw, m.rules = raw, rules + return rules, nil +} + +func parse(raw string) ([]web.Rule, error) { + var rules []web.Rule + if err := yaml.Unmarshal([]byte(raw), &rules); err != nil { + return nil, err + } + for i, r := range rules { + if r.Name == "" { + return nil, fmt.Errorf("rule #%d has no name", i+1) + } + if r.Expr == "" { + return nil, fmt.Errorf("rule %q has no expression", r.Name) + } + if r.Action == "" && !r.Log { + return nil, fmt.Errorf("rule %q must have at least one of action or log", r.Name) + } + } + return rules, nil +} diff --git a/web/dist/assets/AnalyzersView-CHLlPReV.js b/web/dist/assets/AnalyzersView-CHLlPReV.js new file mode 100644 index 0000000..e0f1090 --- /dev/null +++ b/web/dist/assets/AnalyzersView-CHLlPReV.js @@ -0,0 +1,11 @@ +import{_ as b}from"./PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js";import{_ as y}from"./Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js";import{c as M,d as B,K as L,M as j,a as o,p as t,u as e,l as r,F as f,r as p,b as u,w as s,_ as g,m as F,g as v,o as n,h,t as l,k as i,j as N,q}from"./index-D3ZCYstt.js";import{_ as k,a as x,b as z,c as w}from"./CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js";import{_ as A}from"./Skeleton.vue_vue_type_script_setup_true_lang-C9uTg8Ty.js";import{c as C}from"./format-B6sc_rZ4.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const D=M("BoxesIcon",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const I=M("SquareFunctionIcon",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["path",{d:"M9 17c2 0 2.8-1 2.8-2.8V10c0-2 1-3.3 3.2-3",key:"m1af9g"}],["path",{d:"M9 11.2h5.7",key:"3zgcl2"}]]),S={key:0,class:"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4"},Z={class:"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4"},E={class:"flex items-center justify-between gap-2"},K={class:"truncate font-mono text-sm font-medium"},T={class:"mt-2 text-xl font-semibold tabular-nums"},G={class:"text-muted-foreground text-xs"},H={class:"mt-3 grid gap-3 md:grid-cols-2"},J={key:0,class:"text-muted-foreground text-xs"},Y=B({__name:"AnalyzersView",setup(O){const{metrics:V}=q(),c=F(null);L(async()=>{try{c.value=await j.meta()}catch{c.value={analyzers:[],modifiers:[],actions:[],functions:[]}}});const _=v(()=>{var m;const d=new Map;for(const a of((m=V.value)==null?void 0:m.analyzers)??[])d.set(a.name,a.count);return d}),$=v(()=>{var d;return[...((d=c.value)==null?void 0:d.analyzers)??[]].sort((m,a)=>(_.value.get(a.name)??0)-(_.value.get(m.name)??0))});return(d,m)=>(n(),o("div",null,[t(b,{title:e(r)("analyzers.title"),description:e(r)("analyzers.subtitle")},null,8,["title","description"]),c.value?(n(),o(f,{key:1},[u("div",Z,[(n(!0),o(f,null,p($.value,a=>(n(),h(e(g),{key:a.name,class:"p-3.5 sm:p-4"},{default:s(()=>[u("div",E,[u("span",K,l(a.name),1),t(e(y),{variant:a.proto==="udp"?"udp":"tcp",class:"uppercase"},{default:s(()=>[i(l(a.proto),1)]),_:2},1032,["variant"])]),u("p",T,l(e(C)(_.value.get(a.name)??0)),1),u("p",G,l(e(r)("analyzers.hits")),1)]),_:2},1024))),128))]),u("div",H,[t(e(g),null,{default:s(()=>[t(e(k),null,{default:s(()=>[t(e(x),{class:"flex items-center gap-2"},{default:s(()=>[t(e(D),{class:"size-4"}),i(" "+l(e(r)("analyzers.modifiers")),1)]),_:1}),t(e(z),null,{default:s(()=>[i(l(e(r)("analyzers.modifiersDesc")),1)]),_:1})]),_:1}),t(e(w),{class:"flex flex-wrap gap-1.5"},{default:s(()=>[(n(!0),o(f,null,p(c.value.modifiers,a=>(n(),h(e(y),{key:a,variant:"secondary",class:"font-mono"},{default:s(()=>[i(l(a),1)]),_:2},1024))),128)),c.value.modifiers.length?N("",!0):(n(),o("span",J,"—"))]),_:1})]),_:1}),t(e(g),null,{default:s(()=>[t(e(k),null,{default:s(()=>[t(e(x),{class:"flex items-center gap-2"},{default:s(()=>[t(e(I),{class:"size-4"}),i(" "+l(e(r)("analyzers.functions")),1)]),_:1}),t(e(z),null,{default:s(()=>[i(l(e(r)("analyzers.functionsDesc")),1)]),_:1})]),_:1}),t(e(w),{class:"flex flex-wrap gap-1.5"},{default:s(()=>[(n(!0),o(f,null,p(c.value.functions,a=>(n(),h(e(y),{key:a,variant:"secondary",class:"font-mono"},{default:s(()=>[i(l(a)+"() ",1)]),_:2},1024))),128))]),_:1})]),_:1})])],64)):(n(),o("div",S,[(n(),o(f,null,p(8,a=>t(e(A),{key:a,class:"h-24"})),64))]))]))}});export{Y as default}; diff --git a/web/dist/assets/Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js b/web/dist/assets/Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js new file mode 100644 index 0000000..345c84e --- /dev/null +++ b/web/dist/assets/Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js @@ -0,0 +1 @@ +import{d as o,a as n,e as d,u as e,f as s,H as l,o as p,a0 as c}from"./index-D3ZCYstt.js";const b=c("inline-flex items-center justify-center gap-1 rounded-md border px-1.5 py-0.5 text-[11px] font-medium whitespace-nowrap tabular-nums",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground",secondary:"border-transparent bg-secondary text-secondary-foreground",outline:"text-foreground",muted:"border-transparent bg-muted text-muted-foreground",allow:"border-allow/25 bg-allow/12 text-allow",block:"border-block/25 bg-block/12 text-block",drop:"border-drop/25 bg-drop/12 text-drop",modify:"border-modify/25 bg-modify/12 text-modify",log:"border-log/25 bg-log/12 text-log",tcp:"border-tcp/25 bg-tcp/12 text-tcp",udp:"border-udp/25 bg-udp/12 text-udp"}},defaultVariants:{variant:"default"}}),g=o({__name:"Badge",props:{variant:{},class:{}},setup(t){const r=t;return(a,u)=>(p(),n("span",{class:d(e(s)(e(b)({variant:r.variant}),r.class))},[l(a.$slots,"default")],2))}});export{g as _}; diff --git a/web/dist/assets/CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js b/web/dist/assets/CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js new file mode 100644 index 0000000..4950dc3 --- /dev/null +++ b/web/dist/assets/CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js @@ -0,0 +1 @@ +import{d as a,o as n,a as r,e as c,u as o,f as p,H as l}from"./index-D3ZCYstt.js";const u=a({__name:"CardContent",props:{class:{}},setup(s){const e=s;return(t,m)=>(n(),r("div",{class:c(o(p)("px-4 pb-4 sm:px-5 sm:pb-5",e.class))},[l(t.$slots,"default")],2))}}),d=a({__name:"CardDescription",props:{class:{}},setup(s){const e=s;return(t,m)=>(n(),r("p",{class:c(o(p)("text-muted-foreground text-xs sm:text-sm",e.class))},[l(t.$slots,"default")],2))}}),f=a({__name:"CardHeader",props:{class:{}},setup(s){const e=s;return(t,m)=>(n(),r("div",{class:c(o(p)("flex flex-col gap-1 px-4 pt-4 pb-3 sm:px-5 sm:pt-5",e.class))},[l(t.$slots,"default")],2))}}),i=a({__name:"CardTitle",props:{class:{}},setup(s){const e=s;return(t,m)=>(n(),r("h3",{class:c(o(p)("text-sm leading-none font-semibold tracking-tight sm:text-base",e.class))},[l(t.$slots,"default")],2))}});export{f as _,i as a,d as b,u as c}; diff --git a/web/dist/assets/Collection-D-pf6tmY.js b/web/dist/assets/Collection-D-pf6tmY.js new file mode 100644 index 0000000..c9970c7 --- /dev/null +++ b/web/dist/assets/Collection-D-pf6tmY.js @@ -0,0 +1 @@ +import{ax as I,ay as $,m as v,g as p,az as j,af as S,d as C,ad as b,ak as g,aA as w,x as k,aB as P}from"./index-D3ZCYstt.js";function T(e,i){const t=typeof e=="string"&&!i?`${e}Context`:i,o=Symbol(t);return[a=>{const c=I(o,a);if(c||c===null)return c;throw new Error(`Injection \`${o.toString()}\` not found. Component must be used within ${Array.isArray(e)?`one of the following components: ${e.join(", ")}`:`\`${e}\``}`)},a=>($(o,a),a)]}function D(){let e=document.activeElement;if(e==null)return null;for(;e!=null&&e.shadowRoot!=null&&e.shadowRoot.activeElement!=null;)e=e.shadowRoot.activeElement;return e}const[h]=T("ConfigProvider");function _(e){const i=h({dir:v("ltr")});return p(()=>{var t;return(e==null?void 0:e.value)||((t=i.dir)==null?void 0:t.value)||"ltr"})}function K(e,i="reka"){var n;let t;const o=h({useId:void 0});return o.useId?t=o.useId():t=(n=j)==null?void 0:n(),i?`${i}-${t}`:t}function x(){const e=v(),i=p(()=>{var t,o;return["#text","#comment"].includes((t=e.value)==null?void 0:t.$el.nodeName)?(o=e.value)==null?void 0:o.$el.nextElementSibling:S(e)});return{primitiveElement:e,currentElement:i}}const A="data-reka-collection-item";function q(e={}){const{key:i="",isProvider:t=!1}=e,o=`${i}CollectionProvider`;let n;if(t){const u=v(new Map);n={collectionRef:v(),itemMap:u},$(o,n)}else n=I(o);const y=(u=!1)=>{const r=n.collectionRef.value;if(!r)return[];const f=Array.from(r.querySelectorAll(`[${A}]`)),m=new Map(f.map((l,E)=>[l,E])),d=Array.from(n.itemMap.value.values()).sort((l,E)=>(m.get(l.ref)??-1)-(m.get(E.ref)??-1));return u?d:d.filter(l=>l.ref.dataset.disabled!=="")},a=C({name:"CollectionSlot",inheritAttrs:!1,setup(u,{slots:r,attrs:f}){const{primitiveElement:m,currentElement:s}=x();return k(s,()=>{n.collectionRef.value=s.value}),()=>g(w,{ref:m,...f},r)}}),c=C({name:"CollectionItem",inheritAttrs:!1,props:{value:{validator:()=>!0}},setup(u,{slots:r,attrs:f}){const{primitiveElement:m,currentElement:s}=x();return b(d=>{if(s.value){const l=P(s.value);n.itemMap.value.set(l,{ref:s.value,value:u.value}),d(()=>n.itemMap.value.delete(l))}}),()=>g(w,{...f,[A]:"",ref:m},r)}}),M=p(()=>Array.from(n.itemMap.value.values())),R=p(()=>n.itemMap.value.size);return{getItems:y,reactiveItems:M,itemMapSize:R,CollectionSlot:a,CollectionItem:c}}export{_ as a,q as b,T as c,K as d,D as g,h as i,x as u}; diff --git a/web/dist/assets/DashboardView-BnrlcswN.js b/web/dist/assets/DashboardView-BnrlcswN.js new file mode 100644 index 0000000..f5e13e1 --- /dev/null +++ b/web/dist/assets/DashboardView-BnrlcswN.js @@ -0,0 +1,26 @@ +import{c as A,d as H,o as c,a as r,F as w,r as M,b as l,n as q,e as C,u as e,f as W,t as n,g as b,h as X,w as u,_ as z,i as ee,j as S,k as v,l as s,m as Q,p as t,T as te,q as le,s as se,v as ae}from"./index-D3ZCYstt.js";import{c as y,t as oe,p as ne,d as ue}from"./format-B6sc_rZ4.js";import{A as ce,_ as de}from"./EventItem.vue_vue_type_script_setup_true_lang-DS497KtL.js";import{_ as re}from"./PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js";import{_ as j,a as P,b as Z,c as T}from"./CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js";import{_ as ie}from"./Skeleton.vue_vue_type_script_setup_true_lang-C9uTg8Ty.js";import{_ as me,a as pe,b as G}from"./TabsTrigger.vue_vue_type_script_setup_true_lang-DTNukDpV.js";import"./Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js";import"./Collection-D-pf6tmY.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fe=A("BanIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.9 4.9 14.2 14.2",key:"1m5liu"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _e=A("ClockIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const he=A("CpuIcon",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ve=A("ShieldCheckIcon",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const J=A("WavesIcon",[["path",{d:"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"knzxuh"}],["path",{d:"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"2jd2cc"}],["path",{d:"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"rd2r6e"}]]),be={key:0,class:"flex flex-col gap-1"},xe={class:"relative truncate font-mono text-xs sm:text-[13px]"},ke={class:"text-muted-foreground relative shrink-0 text-xs tabular-nums"},ye={key:1,class:"text-muted-foreground py-6 text-center text-xs"},N=H({__name:"BarList",props:{items:{},tone:{default:"primary"},empty:{}},setup(B){const f=B,a=b(()=>Math.max(1,...f.items.map(x=>x.count))),h={primary:"bg-primary/15",block:"bg-block/15",allow:"bg-allow/15"};return(x,I)=>f.items.length?(c(),r("div",be,[(c(!0),r(w,null,M(f.items,k=>(c(),r("div",{key:k.name,class:"relative flex items-center justify-between gap-3 overflow-hidden rounded-md px-2 py-1.5"},[l("div",{class:C(e(W)("absolute inset-y-0 left-0 rounded-md",h[f.tone])),style:q({width:`${Math.max(4,k.count/a.value*100)}%`})},null,6),l("span",xe,n(k.name),1),l("span",ke,n(e(y)(k.count)),1)]))),128))])):(c(),r("p",ye,n(f.empty??"—"),1))}}),ge={class:"flex items-start justify-between gap-2"},$e={class:"text-muted-foreground text-xs font-medium sm:text-sm"},we={class:"mt-1.5 flex items-baseline gap-1.5"},Me={key:0,class:"text-muted-foreground truncate text-xs"},V=H({__name:"StatCard",props:{label:{},value:{},hint:{},icon:{},tone:{}},setup(B){const f=B,a={default:"text-muted-foreground",allow:"text-allow",block:"text-block",drop:"text-drop",modify:"text-modify"};return(h,x)=>(c(),X(e(z),{class:"p-3.5 sm:p-4"},{default:u(()=>[l("div",ge,[l("span",$e,n(f.label),1),f.icon?(c(),X(ee(f.icon),{key:0,class:C(e(W)("size-4 shrink-0",a[f.tone??"default"]))},null,8,["class"])):S("",!0)]),l("div",we,[l("span",{class:C(e(W)("text-xl font-semibold tracking-tight tabular-nums sm:text-2xl",f.tone&&f.tone!=="default"?a[f.tone]:""))},n(f.value),3),f.hint?(c(),r("span",Me,n(f.hint),1)):S("",!0)])]),_:1}))}}),Ce=["viewBox"],ze=["y1","y2"],Be=["d"],je=["d"],Pe=["d"],Te=["x1","x2","y2"],Ve={class:"text-muted-foreground pointer-events-none absolute top-0 left-0 text-[10px] tabular-nums"},De={class:"text-muted-foreground mb-0.5"},Le={class:"flex items-center gap-2 tabular-nums"},Se={class:"ml-auto font-medium"},Ae={class:"flex items-center gap-2 tabular-nums"},Ie={class:"ml-auto font-medium"},Fe={class:"flex items-center gap-2 tabular-nums"},Re={class:"ml-auto font-medium"},qe={key:1,class:"text-muted-foreground absolute inset-0 flex items-center justify-center text-xs"},He={class:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1"},Ne={class:"text-muted-foreground"},Oe={class:"font-medium tabular-nums"},R=600,K=160,O=8,We=16,Xe=H({__name:"TrafficChart",props:{buckets:{}},setup(B){const f=B,a=Q(null),h=b(()=>f.buckets??[]),x=b(()=>Math.max(1,...h.value.map(d=>d.tcp+d.udp))),I=b(()=>h.value.some(d=>d.tcp+d.udp+d.blocked>0));function k(d){const m=h.value.length;return m<=1?0:d/(m-1)*R}function g(d){const m=K-O-We;return O+m-d/x.value*m}function D(d){if(d.length===0)return"";const m=d.map((L,U)=>`${U===0?"M":"L"}${k(U).toFixed(1)},${g(L).toFixed(1)}`),_=`L${R},${g(0)} L0,${g(0)} Z`;return m.join(" ")+" "+_}function F(d){return d.map((m,_)=>`${_===0?"M":"L"}${k(_).toFixed(1)},${g(m).toFixed(1)}`).join(" ")}const i=b(()=>D(h.value.map(d=>d.tcp+d.udp))),p=b(()=>D(h.value.map(d=>d.tcp))),o=b(()=>F(h.value.map(d=>d.blocked))),$=b(()=>a.value===null?null:h.value[a.value]);function E(d){const m=d.currentTarget.getBoundingClientRect(),_=(d.clientX-m.left)/m.width,L=Math.round(_*(h.value.length-1));a.value=Math.min(h.value.length-1,Math.max(0,L))}const Y=b(()=>{const d=m=>h.value.reduce((_,L)=>_+L[m],0);return[{label:s("dashboard.tcp"),color:"bg-tcp",value:d("tcp")},{label:s("dashboard.udp"),color:"bg-udp",value:d("udp")},{label:s("dashboard.blocked"),color:"bg-block",value:d("blocked")}]});return(d,m)=>(c(),r("div",null,[l("div",{class:"relative touch-pan-y",onPointermove:E,onPointerdown:E,onPointerleave:m[0]||(m[0]=_=>a.value=null)},[(c(),r("svg",{viewBox:`0 0 ${R} ${K}`,preserveAspectRatio:"none",class:"h-36 w-full sm:h-44",role:"img"},[(c(),r(w,null,M([0,.5,1],_=>l("line",{key:_,x1:0,x2:R,y1:g(x.value*_),y2:g(x.value*_),class:"stroke-border","stroke-width":"1","vector-effect":"non-scaling-stroke","stroke-dasharray":"3 4"},null,8,ze)),64)),l("path",{d:i.value,class:"fill-udp/25"},null,8,Be),l("path",{d:p.value,class:"fill-tcp/45"},null,8,je),l("path",{d:o.value,class:"stroke-block",fill:"none","stroke-width":"1.75","stroke-linejoin":"round","vector-effect":"non-scaling-stroke"},null,8,Pe),a.value!==null?(c(),r("line",{key:0,x1:k(a.value),x2:k(a.value),y1:O,y2:g(0),class:"stroke-foreground/40","stroke-width":"1","vector-effect":"non-scaling-stroke"},null,8,Te)):S("",!0)],8,Ce)),l("div",Ve,n(e(y)(x.value)),1),$.value?(c(),r("div",{key:0,class:"bg-popover pointer-events-none absolute top-1 z-10 rounded-md border px-2 py-1.5 text-[11px] shadow-md",style:q({left:`${a.value/Math.max(1,h.value.length-1)*100}%`,transform:a.value/Math.max(1,h.value.length-1)>.6?"translateX(-105%)":"translateX(8px)"})},[l("div",De,n(e(oe)($.value.time)),1),l("div",Le,[m[1]||(m[1]=l("span",{class:"bg-tcp size-2 rounded-full"},null,-1)),v(n(e(s)("dashboard.tcp"))+" ",1),l("span",Se,n($.value.tcp),1)]),l("div",Ae,[m[2]||(m[2]=l("span",{class:"bg-udp size-2 rounded-full"},null,-1)),v(n(e(s)("dashboard.udp"))+" ",1),l("span",Ie,n($.value.udp),1)]),l("div",Fe,[m[3]||(m[3]=l("span",{class:"bg-block size-2 rounded-full"},null,-1)),v(n(e(s)("dashboard.blocked"))+" ",1),l("span",Re,n($.value.blocked),1)])],4)):S("",!0),I.value?S("",!0):(c(),r("div",qe,n(e(s)("dashboard.noTraffic")),1))],32),l("div",He,[(c(!0),r(w,null,M(Y.value,_=>(c(),r("div",{key:_.label,class:"flex items-center gap-1.5 text-xs"},[l("span",{class:C(["size-2 rounded-full",_.color])},null,2),l("span",Ne,n(_.label),1),l("span",Oe,n(e(y)(_.value)),1)]))),128))])]))}}),Ee={key:0,class:"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6"},Ue={class:"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6"},Ze={class:"mt-3 grid gap-3 lg:grid-cols-3"},Ge={class:"min-w-0"},Je={class:"bg-muted flex h-2 overflow-hidden rounded-full"},Ke={class:"mt-2.5 flex flex-col gap-1.5"},Qe={class:"text-muted-foreground"},Ye={class:"ml-auto font-medium tabular-nums"},et={class:"text-muted-foreground mb-2 text-xs font-medium"},tt={class:"bg-muted flex h-2 overflow-hidden rounded-full"},lt={class:"mt-2.5 flex flex-col gap-1.5"},st={class:"text-muted-foreground"},at={class:"ml-auto font-medium tabular-nums"},ot={class:"mt-3 grid gap-3 md:grid-cols-2 xl:grid-cols-3"},nt={key:0,class:"flex flex-col"},ut={key:1,class:"text-muted-foreground py-6 text-center text-xs"},vt=H({__name:"DashboardView",setup(B){const f=ae(),{metrics:a,events:h}=le(),x=Q("short"),I=b(()=>{var i,p;return(x.value==="short"?(i=a.value)==null?void 0:i.short:(p=a.value)==null?void 0:p.long)??[]}),k=b(()=>h.value.slice(0,8)),g=b(()=>{var o;const i=(o=a.value)==null?void 0:o.actions;if(!i)return[];const p=i.allow+i.block+i.drop+i.modify||1;return[{key:"allow",label:s("action.allow"),value:i.allow,color:"bg-allow",total:p},{key:"block",label:s("action.block"),value:i.block,color:"bg-block",total:p},{key:"drop",label:s("action.drop"),value:i.drop,color:"bg-drop",total:p},{key:"modify",label:s("action.modify"),value:i.modify,color:"bg-modify",total:p}].filter($=>$.value>0||$.key==="allow"||$.key==="block")}),D=b(()=>{var o;const i=(o=a.value)==null?void 0:o.streams;if(!i)return[];const p=i.total||1;return[{key:"tcp",label:s("dashboard.tcp"),value:i.tcp,color:"bg-tcp",total:p},{key:"udp",label:s("dashboard.udp"),value:i.udp,color:"bg-udp",total:p}]}),F=b(()=>{var p;const i=(p=a.value)==null?void 0:p.actions;return i?i.block+i.drop:0});return(i,p)=>(c(),r("div",null,[t(re,{title:e(s)("dashboard.title"),description:e(s)("dashboard.subtitle")},null,8,["title","description"]),e(a)?(c(),r(w,{key:1},[l("div",Ue,[t(V,{label:e(s)("dashboard.streams"),value:e(y)(e(a).streams.total),hint:`${e(y)(e(a).streams.tcp)} / ${e(y)(e(a).streams.udp)}`,icon:e(J)},null,8,["label","value","hint","icon"]),t(V,{label:e(s)("dashboard.blocked"),value:e(y)(F.value),hint:`${e(ne)(F.value,e(a).streams.total)}%`,icon:e(fe),tone:"block"},null,8,["label","value","hint","icon"]),t(V,{label:e(s)("dashboard.allowed"),value:e(y)(e(a).actions.allow),icon:e(ve),tone:"allow"},null,8,["label","value","icon"]),t(V,{label:e(s)("dashboard.modified"),value:e(y)(e(a).actions.modify),icon:e(J),tone:"modify"},null,8,["label","value","icon"]),t(V,{label:e(s)("dashboard.uptime"),value:e(ue)(e(a).uptimeSeconds),icon:e(_e)},null,8,["label","value","icon"]),t(V,{label:e(a).errors>0?e(s)("dashboard.errors"):e(s)("dashboard.workers"),value:e(a).errors>0?e(y)(e(a).errors):String(e(a).workers),icon:e(a).errors>0?e(te):e(he),tone:e(a).errors>0?"drop":"default"},null,8,["label","value","icon","tone"])]),l("div",Ze,[t(e(z),{class:"lg:col-span-2"},{default:u(()=>[t(e(j),{class:"flex-row items-start justify-between gap-3"},{default:u(()=>[l("div",Ge,[t(e(P),null,{default:u(()=>[v(n(e(s)("dashboard.traffic")),1)]),_:1}),t(e(Z),null,{default:u(()=>[v(n(e(s)("dashboard.trafficDesc")),1)]),_:1})]),t(e(me),{modelValue:x.value,"onUpdate:modelValue":p[0]||(p[0]=o=>x.value=o),class:"shrink-0"},{default:u(()=>[t(e(pe),{class:"h-8"},{default:u(()=>[t(e(G),{value:"short",class:"text-xs"},{default:u(()=>[v(n(e(s)("dashboard.range10m")),1)]),_:1}),t(e(G),{value:"long",class:"text-xs"},{default:u(()=>[v(n(e(s)("dashboard.range1h")),1)]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(e(T),null,{default:u(()=>[t(Xe,{buckets:I.value},null,8,["buckets"])]),_:1})]),_:1}),t(e(z),null,{default:u(()=>[t(e(j),null,{default:u(()=>[t(e(P),null,{default:u(()=>[v(n(e(s)("dashboard.verdicts")),1)]),_:1})]),_:1}),t(e(T),{class:"flex flex-col gap-4"},{default:u(()=>[l("div",null,[l("div",Je,[(c(!0),r(w,null,M(g.value,o=>(c(),r("div",{key:o.key,class:C(o.color),style:q({width:`${o.value/o.total*100}%`})},null,6))),128))]),l("div",Ke,[(c(!0),r(w,null,M(g.value,o=>(c(),r("div",{key:o.key,class:"flex items-center gap-2 text-xs sm:text-[13px]"},[l("span",{class:C(["size-2 rounded-full",o.color])},null,2),l("span",Qe,n(o.label),1),l("span",Ye,n(e(y)(o.value)),1)]))),128))])]),l("div",null,[l("p",et,n(e(s)("dashboard.protocols")),1),l("div",tt,[(c(!0),r(w,null,M(D.value,o=>(c(),r("div",{key:o.key,class:C(o.color),style:q({width:`${o.value/o.total*100}%`})},null,6))),128))]),l("div",lt,[(c(!0),r(w,null,M(D.value,o=>(c(),r("div",{key:o.key,class:"flex items-center gap-2 text-xs sm:text-[13px]"},[l("span",{class:C(["size-2 rounded-full",o.color])},null,2),l("span",st,n(o.label),1),l("span",at,n(e(y)(o.value)),1)]))),128))])])]),_:1})]),_:1})]),l("div",ot,[t(e(z),null,{default:u(()=>[t(e(j),null,{default:u(()=>[t(e(P),null,{default:u(()=>[v(n(e(s)("dashboard.topHosts")),1)]),_:1}),t(e(Z),null,{default:u(()=>[v(n(e(s)("dashboard.topHostsDesc")),1)]),_:1})]),_:1}),t(e(T),null,{default:u(()=>[t(N,{items:e(a).topHosts,empty:e(s)("common.empty")},null,8,["items","empty"])]),_:1})]),_:1}),t(e(z),null,{default:u(()=>[t(e(j),null,{default:u(()=>[t(e(P),null,{default:u(()=>[v(n(e(s)("dashboard.topBlocked")),1)]),_:1})]),_:1}),t(e(T),null,{default:u(()=>[t(N,{items:e(a).topBlockedIPs,tone:"block",empty:e(s)("common.empty")},null,8,["items","empty"])]),_:1})]),_:1}),t(e(z),{class:"md:col-span-2 xl:col-span-1"},{default:u(()=>[t(e(j),null,{default:u(()=>[t(e(P),null,{default:u(()=>[v(n(e(s)("dashboard.topRules")),1)]),_:1})]),_:1}),t(e(T),null,{default:u(()=>[t(N,{items:e(a).topRules,tone:"allow",empty:e(s)("common.empty")},null,8,["items","empty"])]),_:1})]),_:1})]),t(e(z),{class:"mt-3"},{default:u(()=>[t(e(j),{class:"flex-row items-center justify-between"},{default:u(()=>[t(e(P),null,{default:u(()=>[v(n(e(s)("dashboard.recent")),1)]),_:1}),t(e(se),{variant:"ghost",size:"sm",onClick:p[1]||(p[1]=o=>e(f).push("/events"))},{default:u(()=>[v(n(e(s)("dashboard.viewAll"))+" ",1),t(e(ce),{class:"size-3.5"})]),_:1})]),_:1}),t(e(T),{class:"px-1.5 sm:px-2.5"},{default:u(()=>[k.value.length?(c(),r("div",nt,[(c(!0),r(w,null,M(k.value,o=>(c(),X(de,{key:o.seq,event:o,onSelect:p[2]||(p[2]=$=>e(f).push("/events"))},null,8,["event"]))),128))])):(c(),r("p",ut,n(e(s)("events.empty")),1))]),_:1})]),_:1})],64)):(c(),r("div",Ee,[(c(),r(w,null,M(6,o=>t(e(ie),{key:o,class:"h-20"})),64))]))]))}});export{vt as default}; diff --git a/web/dist/assets/EventItem.vue_vue_type_script_setup_true_lang-DS497KtL.js b/web/dist/assets/EventItem.vue_vue_type_script_setup_true_lang-DS497KtL.js new file mode 100644 index 0000000..387be7e --- /dev/null +++ b/web/dist/assets/EventItem.vue_vue_type_script_setup_true_lang-DS497KtL.js @@ -0,0 +1,6 @@ +import{_ as a}from"./Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js";import{c as h,d as x,o,h as m,u as t,w as c,k as i,t as n,g as v,l as d,a as k,b as r,p,j as f}from"./index-D3ZCYstt.js";import{t as b,e as _}from"./format-B6sc_rZ4.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const w=h("ArrowRightIcon",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]),y=x({__name:"ActionBadge",props:{event:{}},setup(l){const e=l,u=v(()=>{if(e.event.kind==="error")return"block";if(e.event.kind==="log")return"log";switch(e.event.action){case"allow":return"allow";case"block":return"block";case"drop":return"drop";case"modify":return"modify";default:return"muted"}}),s=v(()=>e.event.kind==="error"?d("action.error"):e.event.kind==="log"?d("action.log"):d(`action.${e.event.action??"maybe"}`));return(g,N)=>(o(),m(t(a),{variant:u.value,class:"uppercase"},{default:c(()=>[i(n(s.value),1)]),_:1},8,["variant"]))}}),B={class:"flex items-center gap-2"},I={class:"text-muted-foreground shrink-0 font-mono text-[11px] tabular-nums"},$={class:"flex min-w-0 flex-1 items-center gap-1.5 font-mono text-xs"},A={class:"text-muted-foreground truncate"},C={class:"truncate"},E=x({__name:"EventItem",props:{event:{}},emits:["select"],setup(l){const e=l;return(u,s)=>(o(),k("button",{type:"button",class:"hover:bg-accent/60 focus-visible:ring-ring/40 flex w-full flex-col gap-1.5 rounded-lg px-2.5 py-2 text-left transition-colors outline-none focus-visible:ring-[3px] sm:flex-row sm:items-center sm:gap-3",onClick:s[0]||(s[0]=g=>u.$emit("select",e.event))},[r("div",B,[r("span",I,n(t(b)(e.event.time)),1),p(y,{event:e.event},null,8,["event"]),p(t(a),{variant:e.event.proto==="udp"?"udp":"tcp",class:"uppercase"},{default:c(()=>[i(n(e.event.proto),1)]),_:1},8,["variant"]),e.event.rule?(o(),m(t(a),{key:0,variant:"outline",class:"max-w-32 truncate sm:hidden"},{default:c(()=>[i(n(e.event.rule),1)]),_:1})):f("",!0)]),r("div",$,[r("span",A,n(t(_)(e.event.srcIP,e.event.srcPort)),1),p(t(w),{class:"text-muted-foreground/60 size-3 shrink-0"}),r("span",C,n(e.event.host||t(_)(e.event.dstIP,e.event.dstPort)),1)]),e.event.rule?(o(),m(t(a),{key:0,variant:"outline",class:"hidden max-w-40 truncate sm:inline-flex"},{default:c(()=>[i(n(e.event.rule),1)]),_:1})):f("",!0)]))}});export{w as A,E as _,y as a}; diff --git a/web/dist/assets/EventsView-DvVZcEec.js b/web/dist/assets/EventsView-DvVZcEec.js new file mode 100644 index 0000000..05cd279 --- /dev/null +++ b/web/dist/assets/EventsView-DvVZcEec.js @@ -0,0 +1,21 @@ +import{_ as D,a as F}from"./EventItem.vue_vue_type_script_setup_true_lang-DS497KtL.js";import{_ as J}from"./PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js";import{_ as q}from"./Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js";import{c as b,d as A,x as M,a as i,p as r,w as d,u as e,l as t,b as l,y as G,t as s,j as p,_ as H,m as f,g as _,o as n,s as g,h as V,k,F as x,r as N,z as S,A as K,q as Q}from"./index-D3ZCYstt.js";import{_ as R,T as W}from"./Modal.vue_vue_type_script_setup_true_lang-gNNtNPLv.js";import{_ as T}from"./Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js";import{a as X,e as j}from"./format-B6sc_rZ4.js";import"./Collection-D-pf6tmY.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Y=b("CopyIcon",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Z=b("PauseIcon",[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ee=b("PlayIcon",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const te=b("SearchIcon",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]),se={class:"hidden sm:inline"},le={class:"hidden sm:inline"},ae={class:"mb-3 flex flex-col gap-2 sm:flex-row"},oe={class:"relative flex-1"},ne={class:"grid grid-cols-2 gap-2 sm:flex"},re={key:0,class:"text-muted-foreground mb-2 flex items-center justify-between gap-2 text-xs"},ue={key:0},ie={key:0,class:"flex flex-col"},ce={key:1,class:"text-muted-foreground py-12 text-center text-sm"},de={key:0,class:"flex flex-col gap-3 text-sm"},ve={class:"flex flex-wrap items-center gap-2"},me={class:"text-muted-foreground text-xs"},pe={class:"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-xs sm:text-sm"},fe={class:"text-muted-foreground"},_e={class:"font-mono break-all"},xe={class:"text-muted-foreground"},he={class:"font-mono break-all"},ye={class:"text-muted-foreground"},ge={class:"font-mono break-all"},ke={class:"text-muted-foreground"},be={class:"font-mono break-all"},we={class:"text-muted-foreground"},Ce={class:"break-all"},Pe={class:"text-muted-foreground"},Ve={class:"text-destructive break-all"},ze={class:"text-muted-foreground mb-1.5 text-xs font-medium"},$e={key:0,class:"flex flex-col gap-2"},Ie={class:"border-b px-2.5 py-1.5 text-xs font-medium"},Le={class:"overflow-x-auto px-2.5 py-2 font-mono text-[11px] leading-relaxed"},qe={key:1,class:"text-muted-foreground text-xs"},Fe=A({__name:"EventsView",setup(Ne){const{events:w}=Q(),v=f(!1),h=f([]),C=f(""),m=f("all"),y=f("all"),a=f(null);M(v,c=>{h.value=c?w.value:[]});const z=_(()=>v.value?h.value:w.value),$=_(()=>v.value?Math.max(0,w.value.length-h.value.length):0),I=_(()=>{const c=C.value.trim().toLowerCase();return z.value.filter(o=>{if(m.value!=="all"){if(m.value==="log"||m.value==="error"){if(o.kind!==m.value)return!1}else if(o.kind!=="action"||o.action!==m.value)return!1}return y.value!=="all"&&o.proto!==y.value?!1:c?o.srcIP.toLowerCase().includes(c)||o.dstIP.toLowerCase().includes(c)||(o.host??"").toLowerCase().includes(c)||(o.rule??"").toLowerCase().includes(c):!0})}),O=_(()=>[{value:"all",label:t("common.all")},{value:"block",label:t("action.block")},{value:"drop",label:t("action.drop")},{value:"allow",label:t("action.allow")},{value:"modify",label:t("action.modify")},{value:"log",label:t("action.log")},{value:"error",label:t("action.error")}]),U=_(()=>[{value:"all",label:t("common.all")},{value:"tcp",label:"TCP"},{value:"udp",label:"UDP"}]),L=_(()=>{var c;return Object.entries(((c=a.value)==null?void 0:c.props)??{})});async function B(){if(a.value)try{await navigator.clipboard.writeText(JSON.stringify(a.value,null,2)),S.success(t("common.copied"))}catch{S.error(t("common.error"))}}function E(){K(),h.value=[]}return(c,o)=>(n(),i("div",null,[r(J,{title:e(t)("events.title"),description:e(t)("events.subtitle")},{actions:d(()=>[r(e(g),{variant:"outline",size:"sm",onClick:o[0]||(o[0]=u=>v.value=!v.value)},{default:d(()=>[v.value?(n(),V(e(ee),{key:0,class:"size-3.5"})):(n(),V(e(Z),{key:1,class:"size-3.5"})),l("span",se,s(v.value?e(t)("events.resume"):e(t)("events.pause")),1)]),_:1}),r(e(g),{variant:"outline",size:"sm",onClick:E},{default:d(()=>[r(e(W),{class:"size-3.5"}),l("span",le,s(e(t)("events.clear")),1)]),_:1})]),_:1},8,["title","description"]),l("div",ae,[l("div",oe,[r(e(te),{class:"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2"}),r(e(G),{modelValue:C.value,"onUpdate:modelValue":o[1]||(o[1]=u=>C.value=u),placeholder:e(t)("events.searchPlaceholder"),class:"pl-9",type:"search"},null,8,["modelValue","placeholder"])]),l("div",ne,[r(e(T),{modelValue:m.value,"onUpdate:modelValue":o[2]||(o[2]=u=>m.value=u),options:O.value,"aria-label":e(t)("events.filterAction"),class:"sm:w-32"},null,8,["modelValue","options","aria-label"]),r(e(T),{modelValue:y.value,"onUpdate:modelValue":o[3]||(o[3]=u=>y.value=u),options:U.value,"aria-label":e(t)("events.filterProto"),class:"sm:w-28"},null,8,["modelValue","options","aria-label"])])]),v.value?(n(),i("div",re,[r(e(q),{variant:"drop"},{default:d(()=>[k(s(e(t)("events.paused")),1)]),_:1}),$.value>0?(n(),i("span",ue,s(e(t)("events.buffered",{n:$.value})),1)):p("",!0)])):p("",!0),r(e(H),{class:"px-1.5 py-1.5 sm:px-2.5"},{default:d(()=>[I.value.length?(n(),i("div",ie,[(n(!0),i(x,null,N(I.value,u=>(n(),V(D,{key:u.seq,event:u,onSelect:o[4]||(o[4]=P=>a.value=P)},null,8,["event"]))),128))])):(n(),i("p",ce,s(z.value.length?e(t)("events.emptyFiltered"):e(t)("events.empty")),1))]),_:1}),r(e(R),{open:a.value!==null,title:e(t)("events.detail"),"onUpdate:open":o[6]||(o[6]=u=>!u&&(a.value=null))},{footer:d(()=>[r(e(g),{variant:"outline",onClick:B},{default:d(()=>[r(e(Y),{class:"size-4"}),k(" "+s(e(t)("events.copyJson")),1)]),_:1}),r(e(g),{onClick:o[5]||(o[5]=u=>a.value=null)},{default:d(()=>[k(s(e(t)("common.close")),1)]),_:1})]),default:d(()=>[a.value?(n(),i("div",de,[l("div",ve,[r(F,{event:a.value},null,8,["event"]),r(e(q),{variant:a.value.proto==="udp"?"udp":"tcp",class:"uppercase"},{default:d(()=>[k(s(a.value.proto),1)]),_:1},8,["variant"]),l("span",me,s(e(X)(a.value.time)),1)]),l("dl",pe,[l("dt",fe,s(e(t)("events.stream")),1),l("dd",_e,s(a.value.id),1),l("dt",xe,s(e(t)("events.source")),1),l("dd",he,s(e(j)(a.value.srcIP,a.value.srcPort)),1),l("dt",ye,s(e(t)("events.destination")),1),l("dd",ge,s(e(j)(a.value.dstIP,a.value.dstPort)),1),a.value.host?(n(),i(x,{key:0},[l("dt",ke,s(e(t)("events.host")),1),l("dd",be,s(a.value.host),1)],64)):p("",!0),a.value.rule?(n(),i(x,{key:1},[l("dt",we,s(e(t)("events.rule")),1),l("dd",Ce,s(a.value.rule),1)],64)):p("",!0),a.value.message?(n(),i(x,{key:2},[l("dt",Pe,s(e(t)("common.error")),1),l("dd",Ve,s(a.value.message),1)],64)):p("",!0)]),l("div",null,[l("p",ze,s(e(t)("events.props")),1),L.value.length?(n(),i("div",$e,[(n(!0),i(x,null,N(L.value,([u,P])=>(n(),i("div",{key:u,class:"rounded-lg border"},[l("div",Ie,s(u),1),l("pre",Le,s(JSON.stringify(P,null,2)),1)]))),128))])):(n(),i("p",qe,s(e(t)("events.noProps")),1))])])):p("",!0)]),_:1},8,["open","title"])]))}});export{Fe as default}; diff --git a/web/dist/assets/Modal.vue_vue_type_script_setup_true_lang-gNNtNPLv.js b/web/dist/assets/Modal.vue_vue_type_script_setup_true_lang-gNNtNPLv.js new file mode 100644 index 0000000..2c5688f --- /dev/null +++ b/web/dist/assets/Modal.vue_vue_type_script_setup_true_lang-gNNtNPLv.js @@ -0,0 +1,6 @@ +import{c as V,d as y,E as N,D as S,H as g,u as e,m as w,G as O,o as m,h as _,w as p,C as D,P,K as j,p as C,x as I,g as E,W as k,X as x,J as z,j as M,Y as L,Z as U,e as X,f as G,b as h,k as $,t as A,$ as J,a as W}from"./index-D3ZCYstt.js";import{c as Y,d as R,g as H}from"./Collection-D-pf6tmY.js";import{D as Z,g as Q,F as ee,a as F,b as te,P as T,c as oe,T as se}from"./Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $e=V("Trash2Icon",[["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"}]]),[b,ae]=Y("DialogRoot");var re=y({inheritAttrs:!1,__name:"DialogRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1,default:!1},modal:{type:Boolean,required:!1,default:!0},unmountOnHide:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(u,{emit:r}){const o=u,t=N(o,"open",r,{defaultValue:o.defaultOpen,passive:o.open===void 0}),n=w(),f=w(),{modal:i,unmountOnHide:d}=S(o);return ae({open:t,modal:i,unmountOnHide:d,openModal:()=>{t.value=!0},onOpenChange:a=>{t.value=a},onOpenToggle:()=>{t.value=!t.value},contentId:"",titleId:"",descriptionId:"",triggerElement:n,contentElement:f}),(a,c)=>g(a.$slots,"default",{open:e(t),close:()=>t.value=!1})}}),ne=re,le=y({__name:"DialogClose",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(u){const r=u;O();const o=b();return(s,t)=>(m(),_(e(P),D(r,{type:s.as==="button"?"button":void 0,onClick:t[0]||(t[0]=n=>e(o).onOpenChange(!1))}),{default:p(()=>[g(s.$slots,"default")]),_:3},16,["type"]))}}),ue=le,ie=y({__name:"DialogContentImpl",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(u,{emit:r}){const o=u,s=r,t=b(),{forwardRef:n,currentElement:f}=O();return t.titleId||(t.titleId=R(void 0,"reka-dialog-title")),t.descriptionId||(t.descriptionId=R(void 0,"reka-dialog-description")),j(()=>{t.contentElement=f,H()!==document.body&&(t.triggerElement.value=H())}),(i,d)=>(m(),_(e(ee),{"as-child":"",loop:"",trapped:o.trapFocus,present:o.present,onMountAutoFocus:d[5]||(d[5]=a=>s("openAutoFocus",a)),onUnmountAutoFocus:d[6]||(d[6]=a=>s("closeAutoFocus",a))},{default:p(()=>[C(e(Z),D({id:e(t).contentId,ref:e(n),as:i.as,"as-child":i.asChild,present:o.present,"disable-outside-pointer-events":i.disableOutsidePointerEvents,role:"dialog","aria-describedby":e(t).descriptionId,"aria-labelledby":e(t).titleId,"data-state":e(Q)(e(t).open.value)},i.$attrs,{onDismiss:d[0]||(d[0]=a=>e(t).onOpenChange(!1)),onEscapeKeyDown:d[1]||(d[1]=a=>s("escapeKeyDown",a)),onFocusOutside:d[2]||(d[2]=a=>s("focusOutside",a)),onInteractOutside:d[3]||(d[3]=a=>s("interactOutside",a)),onPointerDownOutside:d[4]||(d[4]=a=>s("pointerDownOutside",a))}),{default:p(()=>[g(i.$slots,"default")]),_:3},16,["id","as","as-child","present","disable-outside-pointer-events","aria-describedby","aria-labelledby","data-state"])]),_:3},8,["trapped","present"]))}}),K=ie,de=y({__name:"DialogContentModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!0}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(u,{emit:r}){const o=u,s=r,t=b(),n=F(s),{forwardRef:f,currentElement:i}=O(),d=E(()=>o.present?i.value:void 0);te(d);const a=E(()=>{const{present:c,...l}=o;return l});return I(()=>o.present,(c,l)=>{var v;!c&&l&&((v=t.triggerElement.value)==null||v.focus())}),(c,l)=>(m(),_(K,D({...a.value,...e(n)},{ref:e(f),present:c.present,"trap-focus":e(t).open.value,"disable-outside-pointer-events":o.disableOutsidePointerEvents,onCloseAutoFocus:l[0]||(l[0]=v=>{var q;v.defaultPrevented||(v.preventDefault(),(q=e(t).triggerElement.value)==null||q.focus())}),onPointerDownOutside:l[1]||(l[1]=v=>{const q=v.detail.originalEvent,B=q.button===0&&q.ctrlKey===!0;(q.button===2||B)&&v.preventDefault()}),onFocusOutside:l[2]||(l[2]=v=>{v.preventDefault()})}),{default:p(()=>[g(c.$slots,"default")]),_:3},16,["present","trap-focus","disable-outside-pointer-events"]))}}),pe=de,fe=y({__name:"DialogContentNonModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!0}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(u,{emit:r}){const o=u,t=F(r);O();const n=b(),f=w(!1),i=w(!1),d=E(()=>{const{present:a,...c}=o;return c});return I(()=>o.present,(a,c)=>{var l;!a&&c&&(f.value||(l=n.triggerElement.value)==null||l.focus(),f.value=!1,i.value=!1)}),(a,c)=>(m(),_(K,D({...d.value,...e(t)},{present:a.present,"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:c[0]||(c[0]=l=>{var v;l.defaultPrevented||(f.value||(v=e(n).triggerElement.value)==null||v.focus(),l.preventDefault()),f.value=!1,i.value=!1}),onInteractOutside:c[1]||(c[1]=l=>{var B;l.defaultPrevented||(f.value=!0,l.detail.originalEvent.type==="pointerdown"&&(i.value=!0));const v=l.target;((B=e(n).triggerElement.value)==null?void 0:B.contains(v))&&l.preventDefault(),l.detail.originalEvent.type==="focusin"&&i.value&&l.preventDefault()})}),{default:p(()=>[g(a.$slots,"default")]),_:3},16,["present"]))}}),ce=fe,ve=y({__name:"DialogContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(u,{emit:r}){const o=u,s=r,t=b(),n=F(s),{forwardRef:f}=O();return(i,d)=>(m(),_(e(T),{present:i.forceMount||e(t).open.value,"force-mount":i.forceMount||!e(t).unmountOnHide.value},{default:p(({present:a})=>[e(t).modal.value?k((m(),_(pe,D({key:0,ref:e(f),present:e(t).unmountOnHide.value||a},{...o,...e(n),...i.$attrs}),{default:p(()=>[g(i.$slots,"default")]),_:2},1040,["present"])),[[x,e(t).unmountOnHide.value||a]]):k((m(),_(ce,D({key:1,ref:e(f),present:e(t).unmountOnHide.value||a},{...o,...e(n),...i.$attrs}),{default:p(()=>[g(i.$slots,"default")]),_:2},1040,["present"])),[[x,e(t).unmountOnHide.value||a]])]),_:3},8,["present","force-mount"]))}}),me=ve,_e=y({__name:"DialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(u){const r=u;O();const o=b();return(s,t)=>(m(),_(e(P),D(r,{id:e(o).descriptionId}),{default:p(()=>[g(s.$slots,"default")]),_:3},16,["id"]))}}),ge=_e,ye=y({__name:"DialogOverlayImpl",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!1,default:!0}},setup(u){const r=u,o=b(),s=oe(r.present);return I(()=>r.present,t=>s.value=t),O(),(t,n)=>(m(),_(e(P),{as:t.as,"as-child":t.asChild,"data-state":e(o).open.value?"open":"closed",style:{"pointer-events":"auto"},onPointerdown:n[0]||(n[0]=z(()=>{},["left","self","prevent"]))},{default:p(()=>[g(t.$slots,"default")]),_:3},8,["as","as-child","data-state"]))}}),De=ye,Oe=y({__name:"DialogOverlay",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u){const r=b(),{forwardRef:o}=O();return(s,t)=>{var n;return(n=e(r))!=null&&n.modal.value?(m(),_(e(T),{key:0,present:s.forceMount||e(r).open.value,"force-mount":s.forceMount||!e(r).unmountOnHide.value},{default:p(({present:f})=>[k(C(De,D(s.$attrs,{ref:e(o),as:s.as,"as-child":s.asChild,present:e(r).unmountOnHide.value||f}),{default:p(()=>[g(s.$slots,"default")]),_:2},1040,["as","as-child","present"]),[[x,e(r).unmountOnHide.value||f]])]),_:3},8,["present","force-mount"])):M("v-if",!0)}}}),be=Oe,Ce=y({__name:"DialogPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(u){const r=u;return(o,s)=>(m(),_(e(se),L(U(r)),{default:p(()=>[g(o.$slots,"default")]),_:3},16))}}),qe=Ce,Be=y({__name:"DialogTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h2"}},setup(u){const r=u,o=b();return O(),(s,t)=>(m(),_(e(P),D(r,{id:e(o).titleId}),{default:p(()=>[g(s.$slots,"default")]),_:3},16,["id"]))}}),he=Be;const we={class:"flex items-start justify-between gap-4"},Pe={class:"flex flex-col gap-1"},Ee={class:"min-h-0 flex-1 overflow-y-auto"},ke={key:0,class:"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end"},Ae=y({__name:"Modal",props:{open:{type:Boolean},title:{},description:{},class:{}},emits:["update:open"],setup(u,{emit:r}){const o=u,s=r;return(t,n)=>(m(),_(e(ne),{open:o.open,"onUpdate:open":n[0]||(n[0]=f=>s("update:open",f))},{default:p(()=>[C(e(qe),null,{default:p(()=>[C(e(be),{class:"animate-fade-in fixed inset-0 z-50 bg-black/60 backdrop-blur-[2px]"}),C(e(me),{class:X(e(G)("bg-background fixed z-50 flex flex-col gap-4 border shadow-lg outline-none","animate-slide-up inset-x-0 bottom-0 max-h-[92vh] rounded-t-2xl border-b-0 p-4 pb-[max(1rem,env(safe-area-inset-bottom))]","sm:top-1/2 sm:bottom-auto sm:left-1/2 sm:max-h-[85vh] sm:w-full sm:max-w-lg sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:border-b sm:p-6",o.class))},{default:p(()=>[n[1]||(n[1]=h("div",{class:"bg-muted-foreground/25 mx-auto -mt-1 mb-1 h-1 w-10 shrink-0 rounded-full sm:hidden"},null,-1)),h("div",we,[h("div",Pe,[C(e(he),{class:"text-base font-semibold"},{default:p(()=>[$(A(o.title),1)]),_:1}),o.description?(m(),_(e(ge),{key:0,class:"text-muted-foreground text-sm"},{default:p(()=>[$(A(o.description),1)]),_:1})):M("",!0)]),C(e(ue),{class:"text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring/40 -mt-1 -mr-1 rounded-md p-1.5 transition-colors outline-none focus-visible:ring-[3px]"},{default:p(()=>[C(e(J),{class:"size-4"})]),_:1})]),h("div",Ee,[g(t.$slots,"default")]),t.$slots.footer?(m(),W("div",ke,[g(t.$slots,"footer")])):M("",!0)]),_:3},8,["class"])]),_:3})]),_:3},8,["open"]))}});export{$e as T,Ae as _}; diff --git a/web/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js b/web/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js new file mode 100644 index 0000000..aef7ab2 --- /dev/null +++ b/web/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js @@ -0,0 +1 @@ +import{d as c,a as t,b as n,t as i,j as a,H as d,o as s}from"./index-D3ZCYstt.js";const l={class:"mb-4 flex flex-wrap items-end justify-between gap-3 sm:mb-6"},m={class:"min-w-0"},p={class:"text-lg font-semibold tracking-tight sm:text-2xl"},_={key:0,class:"text-muted-foreground mt-0.5 text-xs sm:text-sm"},x={key:0,class:"flex shrink-0 items-center gap-2"},g=c({__name:"PageHeader",props:{title:{},description:{}},setup(r){const e=r;return(o,f)=>(s(),t("div",l,[n("div",m,[n("h1",p,i(e.title),1),e.description?(s(),t("p",_,i(e.description),1)):a("",!0)]),o.$slots.actions?(s(),t("div",x,[d(o.$slots,"actions")])):a("",!0)]))}});export{g as _}; diff --git a/web/dist/assets/RulesView-SxOStRNP.js b/web/dist/assets/RulesView-SxOStRNP.js new file mode 100644 index 0000000..fac631a --- /dev/null +++ b/web/dist/assets/RulesView-SxOStRNP.js @@ -0,0 +1,36 @@ +import{c as E,B as ge,d as M,x as be,o as c,h as C,C as F,g as B,a as q,j as $,F as N,r as ie,D as ke,E as xe,G as Q,p as u,w as o,H as L,u as e,I as we,J as de,P as W,m as V,K as ce,L as Ve,n as Ce,e as X,f as Y,M as T,N as j,l as n,b as g,t as r,s as I,O as qe,Q as $e,k as b,_ as Se,R as P,y as Ie,z as K}from"./index-D3ZCYstt.js";import{_ as ze}from"./PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js";import{_ as O}from"./Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js";import{_ as te,T as Ae}from"./Modal.vue_vue_type_script_setup_true_lang-gNNtNPLv.js";import{V as Be,u as Me,P as Re,_ as se}from"./Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js";import{u as Ee,c as Te}from"./Collection-D-pf6tmY.js";import{i as Pe,m as Ue,c as He,_ as ue,a as je,b as ne}from"./TabsTrigger.vue_vue_type_script_setup_true_lang-DTNukDpV.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Oe=E("ArrowDownIcon",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Fe=E("ArrowUpIcon",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ne=E("FileCode2Icon",[["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"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Le=E("PencilIcon",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const De=E("PlusIcon",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Je=E("RotateCcwIcon",[["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"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ke=E("SaveIcon",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);function Ge(){var l,t;const k=(t=(l=ge())==null?void 0:l.vnode)==null?void 0:t.scopeId;return k?{[k]:""}:{}}var Qe=M({inheritAttrs:!1,__name:"VisuallyHiddenInputBubble",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(k){const l=k,{primitiveElement:t,currentElement:i}=Ee(),m=B(()=>l.checked??l.value);return be(m,(f,p)=>{if(!i.value)return;const _=i.value,w=window.HTMLInputElement.prototype,v=Object.getOwnPropertyDescriptor(w,"value").set;if(v&&f!==p){const A=new Event("input",{bubbles:!0}),S=new Event("change",{bubbles:!0});v.call(_,f),_.dispatchEvent(A),_.dispatchEvent(S)}}),(f,p)=>(c(),C(Be,F({ref_key:"primitiveElement",ref:t},{...l,...f.$attrs},{as:"input"}),null,16))}}),oe=Qe,We=M({inheritAttrs:!1,__name:"VisuallyHiddenInput",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(k){const l=k,t=B(()=>typeof l.value=="object"&&Array.isArray(l.value)&&l.value.length===0&&l.required),i=B(()=>typeof l.value=="string"||typeof l.value=="number"||typeof l.value=="boolean"||l.value===null||l.value===void 0?[{name:l.name,value:l.value}]:typeof l.value=="object"&&Array.isArray(l.value)?l.value.flatMap((m,f)=>typeof m=="object"?Object.entries(m).map(([p,_])=>({name:`${l.name}[${f}][${p}]`,value:_})):{name:`${l.name}[${f}]`,value:m}):l.value!==null&&typeof l.value=="object"&&!Array.isArray(l.value)?Object.entries(l.value).map(([m,f])=>({name:`${l.name}[${m}]`,value:f})):[]);return(m,f)=>(c(),q(N,null,[$(" We render single input if it's required "),t.value?(c(),C(oe,F({key:m.name},{...l,...m.$attrs},{name:m.name,value:m.value}),null,16,["name","value"])):(c(!0),q(N,{key:1},ie(i.value,p=>(c(),C(oe,F({key:p.name},{ref_for:!0},{...l,...m.$attrs},{name:p.name,value:p.value}),null,16,["name","value"]))),128))],2112))}}),Xe=We;const[Ye,Ze]=Te("SwitchRoot");var ea=M({inheritAttrs:!1,__name:"SwitchRoot",props:{defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1,default:void 0},disabled:{type:Boolean,required:!1},id:{type:String,required:!1},value:{type:String,required:!1,default:"on"},trueValue:{type:null,required:!1,default:()=>!0},falseValue:{type:null,required:!1,default:()=>!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue"],setup(k,{emit:l}){const t=k,i=l,{disabled:m}=ke(t),f=xe(t,"modelValue",i,{defaultValue:t.defaultValue??t.falseValue,passive:t.modelValue===void 0}),p=B(()=>f.value===t.trueValue);function _(){m.value||(f.value=p.value?t.falseValue:t.trueValue)}const{forwardRef:w,currentElement:h}=Q(),v=Me(h),A=Ge(),S=B(()=>{var x;return t.id&&h.value?(x=document.querySelector(`[for="${t.id}"]`))==null?void 0:x.innerText:void 0});return Ze({checked:p,toggleCheck:_,disabled:m}),(x,D)=>(c(),q(N,null,[u(e(W),F({id:x.id,ref:e(w),role:"switch",type:x.as==="button"?"button":void 0,value:x.value,"aria-label":x.$attrs["aria-label"]||S.value,"aria-checked":p.value,"aria-required":x.required,"data-state":p.value?"checked":"unchecked","data-disabled":e(m)?"":void 0,"as-child":x.asChild,as:x.as,disabled:e(m)},{...e(A),...x.$attrs},{onClick:_,onKeydown:we(de(_,["prevent"]),["enter"])}),{default:o(()=>[L(x.$slots,"default",{modelValue:e(f),checked:p.value})]),_:3},16,["id","type","value","aria-label","aria-checked","aria-required","data-state","data-disabled","as-child","as","disabled","onKeydown"]),e(v)&&x.name?(c(),C(e(Xe),F({key:0,type:"checkbox",name:x.name,disabled:e(m),required:x.required,value:x.value,checked:p.value},e(A)),null,16,["name","disabled","required","value","checked"])):$("v-if",!0)],64))}}),aa=ea,la=M({__name:"SwitchThumb",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(k){const l=Ye();return Q(),(t,i)=>(c(),C(e(W),{"data-state":e(l).checked.value?"checked":"unchecked","data-disabled":e(l).disabled.value?"":void 0,"as-child":t.asChild,as:t.as},{default:o(()=>[L(t.$slots,"default")]),_:3},8,["data-state","data-disabled","as-child","as"]))}}),ta=la,sa=M({__name:"TabsContent",props:{value:{type:[String,Number],required:!0},forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(k){const l=k,{forwardRef:t}=Q(),i=Pe(),m=B(()=>Ue(i.baseId,l.value)),f=B(()=>He(i.baseId,l.value)),p=B(()=>l.value===i.modelValue.value),_=V(p.value);return ce(()=>{i.registerContent(l.value),requestAnimationFrame(()=>{_.value=!1})}),Ve(()=>{i.unregisterContent(l.value)}),(w,h)=>(c(),C(e(Re),{present:w.forceMount||p.value,"force-mount":""},{default:o(({present:v})=>[u(e(W),{id:f.value,ref:e(t),"as-child":w.asChild,as:w.as,role:"tabpanel","data-state":p.value?"active":"inactive","data-orientation":e(i).orientation.value,"aria-labelledby":m.value,hidden:!v,tabindex:"0",style:Ce({animationDuration:_.value?"0s":void 0})},{default:o(()=>[!e(i).unmountOnHide.value||v?L(w.$slots,"default",{key:0}):$("v-if",!0)]),_:2},1032,["id","as-child","as","data-state","data-orientation","aria-labelledby","hidden","style"])]),_:3},8,["present"]))}}),ua=sa;const na=M({__name:"Switch",props:{class:{},modelValue:{type:Boolean},id:{}},emits:["update:modelValue"],setup(k,{emit:l}){const t=k,i=l;return(m,f)=>(c(),C(e(aa),{id:t.id,"model-value":t.modelValue,class:X(e(Y)("peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border border-transparent transition-colors outline-none focus-visible:ring-[3px] focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:opacity-50",t.class)),"onUpdate:modelValue":f[0]||(f[0]=p=>i("update:modelValue",p))},{default:o(()=>[u(e(ta),{class:"bg-background pointer-events-none block size-4 rounded-full shadow-sm ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0.5"})]),_:1},8,["id","model-value","class"]))}}),re=M({__name:"TabsContent",props:{class:{},value:{}},setup(k){const l=k;return(t,i)=>(c(),C(e(ua),{value:l.value,class:X(e(Y)("outline-none",l.class))},{default:o(()=>[L(t.$slots,"default")]),_:3},8,["value","class"]))}}),oa=["value"],G=M({__name:"Textarea",props:{class:{},modelValue:{}},emits:["update:modelValue"],setup(k,{emit:l}){const t=k,i=l;return(m,f)=>(c(),q("textarea",{value:t.modelValue,class:X(e(Y)("border-input bg-background flex min-h-20 w-full rounded-md border px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none sm:text-sm","placeholder:text-muted-foreground field-sizing-content","focus-visible:border-ring focus-visible:ring-ring/40 focus-visible:ring-[3px]","disabled:cursor-not-allowed disabled:opacity-50",t.class)),onInput:f[0]||(f[0]=p=>i("update:modelValue",p.target.value))},null,42,oa))}}),ra={class:"hidden sm:inline"},ia={class:"hidden sm:inline"},da={class:"mb-3 flex flex-wrap items-center gap-2"},ca={key:1,class:"text-muted-foreground ml-auto hidden truncate font-mono text-[11px] sm:inline"},va={key:0,class:"border-destructive/40 bg-destructive/10 text-destructive mb-3 rounded-lg border px-3 py-2 font-mono text-xs break-words whitespace-pre-wrap"},ma={key:0,class:"text-muted-foreground py-12 text-center text-sm"},fa={key:1,class:"flex flex-col gap-2"},pa={class:"flex items-start justify-between gap-3"},_a={class:"flex min-w-0 flex-col gap-1.5"},ya={class:"flex flex-wrap items-center gap-1.5"},ha={class:"text-muted-foreground font-mono text-[11px] tabular-nums"},ga={class:"truncate text-sm font-medium"},ba={class:"text-muted-foreground bg-muted/60 rounded-md px-2 py-1.5 font-mono text-[11px] leading-relaxed break-all sm:text-xs"},ka={class:"flex shrink-0 flex-col gap-1 sm:flex-row"},xa={key:0,class:"text-muted-foreground py-10 text-center text-sm"},wa={class:"text-muted-foreground mt-2 text-xs"},Va={class:"flex flex-col gap-2"},Ca={class:"grid gap-4 sm:grid-cols-2"},qa={class:"flex flex-col gap-2"},$a={class:"flex flex-col justify-end gap-2"},Sa={class:"flex h-9 items-center"},Ia={key:0,class:"flex flex-col gap-4"},za={class:"flex flex-col gap-2"},Aa={class:"flex flex-col gap-2"},Ba={class:"flex flex-col gap-2"},Ma={key:1,class:"text-destructive text-sm"},Oa=M({__name:"RulesView",setup(k){const l=V("visual"),t=V([]),i=V(""),m=V(""),f=V(null),p=V(!0),_=V(!1),w=V(!1),h=V(""),v=V(null),A=V(-1),S=V(-1),x=B(()=>{var a;return[{value:"",label:n("rules.actionNone")},...(((a=f.value)==null?void 0:a.actions)??[]).map(s=>({value:s,label:n(`action.${s}`)}))]}),D=B(()=>{var a;return(((a=f.value)==null?void 0:a.modifiers)??[]).map(s=>({value:s,label:s}))}),ve=a=>{switch(a){case"allow":return"allow";case"block":return"block";case"drop":return"drop";case"modify":return"modify";default:return"muted"}};ce(async()=>{try{const[a,s]=await Promise.all([T.rules(),T.meta()]);t.value=a.rules??[],i.value=a.raw,m.value=a.path,f.value=s}catch(a){h.value=a instanceof j?a.message:String(a)}finally{p.value=!1}});async function Z(a){if(!(a===l.value||_.value)){_.value=!0,h.value="";try{const s=await T.validateRules(a==="yaml"?{rules:t.value}:{raw:i.value});if(a==="yaml")i.value=s.raw;else{if(!s.valid){h.value=s.error??n("rules.invalid");return}t.value=s.rules??[]}l.value=a}catch(s){h.value=s instanceof j?s.message:String(s)}finally{_.value=!1}}}function ee(){return l.value==="yaml"?{raw:i.value}:{rules:t.value}}async function me(){_.value=!0,h.value="";try{const a=await T.validateRules(ee());a.valid?K.success(n("rules.valid")):h.value=a.error??n("rules.invalid")}catch(a){h.value=a instanceof j?a.message:String(a)}finally{_.value=!1}}async function fe(){_.value=!0,h.value="";try{const a=await T.saveRules(ee());t.value=a.rules??[],i.value=a.raw,w.value=!1,K.success(n("rules.saved"),n("rules.count",{n:t.value.length}))}catch(a){h.value=a instanceof j?a.message:String(a),K.error(n("rules.invalid"),h.value)}finally{_.value=!1}}async function pe(){_.value=!0,h.value="";try{const a=await T.rules();t.value=a.rules??[],i.value=a.raw,w.value=!1}catch(a){h.value=a instanceof j?a.message:String(a)}finally{_.value=!1}}function ae(a,s){const z=a+s;if(z<0||z>=t.value.length)return;const d=[...t.value],[y]=d.splice(a,1);d.splice(z,0,y),t.value=d,w.value=!0}function _e(){A.value=-1,v.value={name:"",action:"block",log:!1,expr:""},U.value="{}"}function ye(a){var s;A.value=a,v.value={...t.value[a]},U.value=JSON.stringify(((s=t.value[a].modifier)==null?void 0:s.args)??{},null,2)}const U=V("{}"),R=V("");function le(){var z,d;const a=v.value;if(!a)return;if(!a.name.trim()){R.value=n("rules.nameRequired");return}if(!a.expr.trim()){R.value=n("rules.exprRequired");return}if(a.action==="modify")try{const y=JSON.parse(U.value||"{}");a.modifier={name:((z=a.modifier)==null?void 0:z.name)??((d=D.value[0])==null?void 0:d.value)??"",args:y}}catch{R.value="JSON";return}else a.modifier=null;const s=[...t.value];A.value>=0?s[A.value]=a:s.push(a),t.value=s,w.value=!0,v.value=null,R.value=""}function he(a){t.value=t.value.filter((s,z)=>z!==a),w.value=!0,S.value=-1}return(a,s)=>{var z;return c(),q("div",null,[u(ze,{title:e(n)("rules.title"),description:e(n)("rules.subtitle")},{actions:o(()=>[u(e(I),{variant:"ghost",size:"sm",disabled:_.value,onClick:pe},{default:o(()=>[u(e(Je),{class:"size-3.5"}),g("span",ra,r(e(n)("common.refresh")),1)]),_:1},8,["disabled"]),u(e(I),{variant:"outline",size:"sm",disabled:_.value,onClick:me},{default:o(()=>[u(e(qe),{class:"size-3.5"}),g("span",ia,r(e(n)("rules.validate")),1)]),_:1},8,["disabled"]),u(e(I),{size:"sm",disabled:_.value,onClick:fe},{default:o(()=>[_.value?(c(),C(e($e),{key:0,class:"size-3.5 animate-spin"})):(c(),C(e(Ke),{key:1,class:"size-3.5"})),b(" "+r(e(n)("rules.save")),1)]),_:1},8,["disabled"])]),_:1},8,["title","description"]),g("div",da,[u(e(ue),{"model-value":l.value,"onUpdate:modelValue":Z},{default:o(()=>[u(e(je),null,{default:o(()=>[u(e(ne),{value:"visual"},{default:o(()=>[b(r(e(n)("rules.visual")),1)]),_:1}),u(e(ne),{value:"yaml"},{default:o(()=>[u(e(Ne)),b(" "+r(e(n)("rules.yaml")),1)]),_:1})]),_:1})]),_:1},8,["model-value"]),u(e(O),{variant:"secondary"},{default:o(()=>[b(r(e(n)("rules.count",{n:t.value.length})),1)]),_:1}),w.value?(c(),C(e(O),{key:0,variant:"drop"},{default:o(()=>[b(r(e(n)("rules.unsaved")),1)]),_:1})):$("",!0),m.value?(c(),q("span",ca,r(m.value),1)):$("",!0)]),h.value?(c(),q("p",va,r(h.value),1)):$("",!0),u(e(ue),{"model-value":l.value,"onUpdate:modelValue":Z},{default:o(()=>[u(e(re),{value:"visual"},{default:o(()=>[p.value?(c(),q("div",ma,r(e(n)("common.loading")),1)):(c(),q("div",fa,[(c(!0),q(N,null,ie(t.value,(d,y)=>(c(),C(e(Se),{key:`${d.name}-${y}`,class:"p-3 sm:p-4"},{default:o(()=>{var H;return[g("div",pa,[g("div",_a,[g("div",ya,[g("span",ha,"#"+r(y+1),1),g("span",ga,r(d.name),1),d.action?(c(),C(e(O),{key:0,variant:ve(d.action),class:"uppercase"},{default:o(()=>[b(r(e(n)(`action.${d.action}`)),1)]),_:2},1032,["variant"])):$("",!0),d.log?(c(),C(e(O),{key:1,variant:"log"},{default:o(()=>[b(r(e(n)("action.log")),1)]),_:1})):$("",!0),(H=d.modifier)!=null&&H.name?(c(),C(e(O),{key:2,variant:"outline"},{default:o(()=>[b(r(d.modifier.name),1)]),_:2},1024)):$("",!0)]),g("code",ba,r(d.expr),1)]),g("div",ka,[u(e(I),{variant:"ghost",size:"icon-sm","aria-label":e(n)("rules.moveUp"),disabled:y===0,onClick:J=>ae(y,-1)},{default:o(()=>[u(e(Fe),{class:"size-3.5"})]),_:1},8,["aria-label","disabled","onClick"]),u(e(I),{variant:"ghost",size:"icon-sm","aria-label":e(n)("rules.moveDown"),disabled:y===t.value.length-1,onClick:J=>ae(y,1)},{default:o(()=>[u(e(Oe),{class:"size-3.5"})]),_:1},8,["aria-label","disabled","onClick"]),u(e(I),{variant:"ghost",size:"icon-sm","aria-label":e(n)("common.edit"),onClick:J=>ye(y)},{default:o(()=>[u(e(Le),{class:"size-3.5"})]),_:1},8,["aria-label","onClick"]),u(e(I),{variant:"ghost",size:"icon-sm",class:"text-destructive","aria-label":e(n)("common.delete"),onClick:J=>S.value=y},{default:o(()=>[u(e(Ae),{class:"size-3.5"})]),_:1},8,["aria-label","onClick"])])])]}),_:2},1024))),128)),t.value.length?$("",!0):(c(),q("p",xa,r(e(n)("rules.empty")),1)),u(e(I),{variant:"outline",class:"mt-1 w-full",onClick:_e},{default:o(()=>[u(e(De),{class:"size-4"}),b(" "+r(e(n)("rules.add")),1)]),_:1})]))]),_:1}),u(e(re),{value:"yaml"},{default:o(()=>[u(e(G),{modelValue:i.value,"onUpdate:modelValue":[s[0]||(s[0]=d=>i.value=d),s[1]||(s[1]=d=>w.value=!0)],spellcheck:"false",class:"h-[60vh] resize-y font-mono text-xs leading-relaxed"},null,8,["modelValue"]),g("p",wa,r(e(n)("rules.hint")),1)]),_:1})]),_:1},8,["model-value"]),u(e(te),{open:v.value!==null,title:A.value>=0?e(n)("rules.editTitle"):e(n)("rules.addTitle"),"onUpdate:open":s[9]||(s[9]=d=>!d&&(v.value=null,R.value=""))},{footer:o(()=>[u(e(I),{variant:"outline",onClick:s[8]||(s[8]=d=>(v.value=null,R.value=""))},{default:o(()=>[b(r(e(n)("common.cancel")),1)]),_:1}),u(e(I),{onClick:le},{default:o(()=>[b(r(e(n)("common.save")),1)]),_:1})]),default:o(()=>{var d;return[v.value?(c(),q("form",{key:0,class:"flex flex-col gap-4",onSubmit:de(le,["prevent"])},[g("div",Va,[u(e(P),{for:"rule-name"},{default:o(()=>[b(r(e(n)("rules.name")),1)]),_:1}),u(e(Ie),{id:"rule-name",modelValue:v.value.name,"onUpdate:modelValue":s[2]||(s[2]=y=>v.value.name=y),placeholder:e(n)("rules.namePlaceholder")},null,8,["modelValue","placeholder"])]),g("div",Ca,[g("div",qa,[u(e(P),null,{default:o(()=>[b(r(e(n)("rules.action")),1)]),_:1}),u(e(se),{"model-value":v.value.action??"",options:x.value,"onUpdate:modelValue":s[3]||(s[3]=y=>v.value.action=y)},null,8,["model-value","options"])]),g("div",$a,[u(e(P),{for:"rule-log"},{default:o(()=>[b(r(e(n)("rules.log")),1)]),_:1}),g("div",Sa,[u(e(na),{id:"rule-log",modelValue:v.value.log,"onUpdate:modelValue":s[4]||(s[4]=y=>v.value.log=y)},null,8,["modelValue"])])])]),v.value.action==="modify"?(c(),q("div",Ia,[g("div",za,[u(e(P),null,{default:o(()=>[b(r(e(n)("rules.modifier")),1)]),_:1}),u(e(se),{"model-value":((d=v.value.modifier)==null?void 0:d.name)??"",options:D.value,"onUpdate:modelValue":s[5]||(s[5]=y=>{var H;return v.value.modifier={name:y,args:(H=v.value.modifier)==null?void 0:H.args}})},null,8,["model-value","options"])]),g("div",Aa,[u(e(P),{for:"rule-args"},{default:o(()=>[b(r(e(n)("rules.modifierArgs")),1)]),_:1}),u(e(G),{id:"rule-args",modelValue:U.value,"onUpdate:modelValue":s[6]||(s[6]=y=>U.value=y),class:"font-mono text-xs",rows:"4"},null,8,["modelValue"])])])):$("",!0),g("div",Ba,[u(e(P),{for:"rule-expr"},{default:o(()=>[b(r(e(n)("rules.expr")),1)]),_:1}),u(e(G),{id:"rule-expr",modelValue:v.value.expr,"onUpdate:modelValue":s[7]||(s[7]=y=>v.value.expr=y),spellcheck:"false",placeholder:e(n)("rules.exprPlaceholder"),class:"min-h-28 font-mono text-xs leading-relaxed"},null,8,["modelValue","placeholder"])]),R.value?(c(),q("p",Ma,r(R.value),1)):$("",!0)],32)):$("",!0)]}),_:1},8,["open","title"]),u(e(te),{open:S.value>=0,title:e(n)("common.delete"),description:S.value>=0?e(n)("rules.deleteConfirm",{name:((z=t.value[S.value])==null?void 0:z.name)??""}):"","onUpdate:open":s[12]||(s[12]=d=>!d&&(S.value=-1))},{footer:o(()=>[u(e(I),{variant:"outline",onClick:s[10]||(s[10]=d=>S.value=-1)},{default:o(()=>[b(r(e(n)("common.cancel")),1)]),_:1}),u(e(I),{variant:"destructive",onClick:s[11]||(s[11]=d=>he(S.value))},{default:o(()=>[b(r(e(n)("common.delete")),1)]),_:1})]),_:1},8,["open","title","description"])])}}});export{Oa as default}; diff --git a/web/dist/assets/Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js b/web/dist/assets/Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js new file mode 100644 index 0000000..7eec7ee --- /dev/null +++ b/web/dist/assets/Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js @@ -0,0 +1,13 @@ +var kt=e=>{throw TypeError(e)};var In=(e,t,n)=>t.has(e)||kt("Cannot "+n);var Re=(e,t,n)=>(In(e,t,"read from private field"),n?n.call(e):t.get(e)),It=(e,t,n)=>t.has(e)?kt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{i as bt,g as J,c as qe,a as tn,b as Me,d as nn}from"./Collection-D-pf6tmY.js";import{c as on,a6 as $n,a7 as Ln,g as O,m as A,x as H,a8 as be,a9 as $t,aa as Mn,U as X,ab as Fn,ac as rn,B as xt,ad as de,ae as Pe,af as Fe,ag as Nn,S as Ne,K as me,ah as Vn,ai as Wn,d as I,D as Xe,aj as zn,ak as Hn,G as ne,al as jn,o as R,h as B,w as q,H as k,u as g,n as St,P as U,am as an,an as Un,ao as sn,j as ke,ap as Kn,aq as ln,ar as Ee,V as Yn,as as Xn,at as Gn,a as ce,au as Jn,C as Q,av as Zn,E as Lt,r as un,F as _t,b as Qn,p as M,J as Be,i as eo,aw as to,Y as cn,Z as dn,k as Ct,t as fn,e as no,f as oo}from"./index-D3ZCYstt.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ro=on("CheckIcon",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const io=on("ChevronDownIcon",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);function Mt(e){return typeof e=="string"?`'${e}'`:new ao().serialize(e)}const ao=(function(){var t;class e{constructor(){It(this,t,new Map)}compare(o,r){const i=typeof o,a=typeof r;return i==="string"&&a==="string"?o.localeCompare(r):i==="number"&&a==="number"?o-r:String.prototype.localeCompare.call(this.serialize(o,!0),this.serialize(r,!0))}serialize(o,r){if(o===null)return"null";switch(typeof o){case"string":return r?o:`'${o}'`;case"bigint":return`${o}n`;case"object":return this.$object(o);case"function":return this.$function(o)}return String(o)}serializeObject(o){const r=Object.prototype.toString.call(o);if(r!=="[object Object]")return this.serializeBuiltInType(r.length<10?`unknown:${r}`:r.slice(8,-1),o);const i=o.constructor,a=i===Object||i===void 0?"":i.name;if(a!==""&&globalThis[a]===i)return this.serializeBuiltInType(a,o);if(typeof o.toJSON=="function"){const s=o.toJSON();return a+(s!==null&&typeof s=="object"?this.$object(s):`(${this.serialize(s)})`)}return this.serializeObjectEntries(a,Object.entries(o))}serializeBuiltInType(o,r){const i=this["$"+o];if(i)return i.call(this,r);if(typeof(r==null?void 0:r.entries)=="function")return this.serializeObjectEntries(o,r.entries());throw new Error(`Cannot serialize ${o}`)}serializeObjectEntries(o,r){const i=Array.from(r).sort((s,c)=>this.compare(s[0],c[0]));let a=`${o}{`;for(let s=0;sthis.compare(r,i)))}`}$Map(o){return this.serializeObjectEntries("Map",o.entries())}}t=new WeakMap;for(const n of["Error","RegExp","URL"])e.prototype["$"+n]=function(o){return`${n}(${o})`};for(const n of["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"])e.prototype["$"+n]=function(o){return`${n}[${o.join(",")}]`};for(const n of["BigInt64Array","BigUint64Array"])e.prototype["$"+n]=function(o){return`${n}[${o.join("n,")}${o.length>0?"n":""}]`};return e})();function so(e,t){return e===t||Mt(e)===Mt(t)}function Ft(e,t=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY){return Math.min(n,Math.max(t,e))}function Et(e,t,n){const o=n.originalEvent.target,r=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),o.dispatchEvent(r)}function pt(e){return e==null}function at(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function mt(e,t,n=".",o){if(!at(t))return mt(e,{},n,o);const r={...t};for(const i of Object.keys(e)){if(i==="__proto__"||i==="constructor")continue;const a=e[i];a!=null&&(o&&o(r,i,a,n)||(Array.isArray(a)&&Array.isArray(r[i])?r[i]=[...a,...r[i]]:at(a)&&at(r[i])?r[i]=mt(a,r[i],(n?`${n}.`:"")+i.toString(),o):r[i]=a))}return r}function lo(e){return(...t)=>t.reduce((n,o)=>mt(n,o,"",e),{})}const uo=lo(),co=Ln(()=>{const e=A(new Map),t=A(),n=O(()=>{for(const a of e.value.values())if(a)return!0;return!1}),o=bt({scrollBody:A(!0)});let r=null;const i=()=>{document.body.style.paddingRight="",document.body.style.marginRight="",document.body.style.pointerEvents="",document.documentElement.style.removeProperty("--scrollbar-width"),document.body.style.overflow=t.value??"",$t&&(r==null||r()),t.value=void 0};return H(n,(a,s)=>{var l;if(!be)return;if(!a){s&&i();return}t.value===void 0&&(t.value=document.body.style.overflow);const c=window.innerWidth-document.documentElement.clientWidth,f={padding:c,margin:0},p=(l=o.scrollBody)!=null&&l.value?typeof o.scrollBody.value=="object"?uo({padding:o.scrollBody.value.padding===!0?c:o.scrollBody.value.padding,margin:o.scrollBody.value.margin===!0?c:o.scrollBody.value.margin},f):f:{padding:0,margin:0};c>0&&(document.body.style.paddingRight=typeof p.padding=="number"?`${p.padding}px`:String(p.padding),document.body.style.marginRight=typeof p.margin=="number"?`${p.margin}px`:String(p.margin),document.documentElement.style.setProperty("--scrollbar-width",`${c}px`),document.body.style.overflow="hidden"),$t&&(r=Mn(document,"touchmove",d=>po(d),{passive:!1})),X(()=>{n.value&&(document.body.style.pointerEvents="none",document.body.style.overflow="hidden")})},{immediate:!0,flush:"sync"}),e});function fo(e){const t=Math.random().toString(36).substring(2,7),n=co();n.value.set(t,e??!1);const o=O({get:()=>n.value.get(t)??!1,set:r=>n.value.set(t,r)});return $n(()=>{n.value.delete(t)}),o}function pn(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.cancelable&&t.preventDefault(),!1)}function mo(e){const t=xt(),n=t==null?void 0:t.type.emits,o={};return n!=null&&n.length||console.warn(`No emitted event found. Please check component: ${t==null?void 0:t.type.__name}`),n==null||n.forEach(r=>{o[Fn(rn(r))]=(...i)=>e(r,...i)}),o}let st=0;function vo(){de(e=>{if(!be)return;const t=document.querySelectorAll("[data-reka-focus-guard]");document.body.insertAdjacentElement("afterbegin",t[0]??Nt()),document.body.insertAdjacentElement("beforeend",t[1]??Nt()),st++,e(()=>{st===1&&document.querySelectorAll("[data-reka-focus-guard]").forEach(n=>n.remove()),st--})})}function Nt(){const e=document.createElement("span");return e.setAttribute("data-reka-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}function ho(e){return O(()=>{var t;return Pe(e)?!!((t=Fe(e))!=null&&t.closest("form")):!0})}function At(e){const t=xt(),n=Object.keys((t==null?void 0:t.type.props)??{}).reduce((r,i)=>{const a=(t==null?void 0:t.type.props[i]).default;return a!==void 0&&(r[i]=a),r},{}),o=Nn(e);return O(()=>{const r={},i=(t==null?void 0:t.vnode.props)??{};return Object.keys(i).forEach(a=>{r[rn(a)]=i[a]}),Object.keys({...n,...r}).reduce((a,s)=>(o.value[s]!==void 0&&(a[s]=o.value[s]),a),{})})}function yo(e,t){const n=At(e),o=t?mo(t):{};return O(()=>({...n.value,...o}))}var go=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},Ae=new WeakMap,We=new WeakMap,ze={},lt=0,mn=function(e){return e&&(e.host||mn(e.parentNode))},wo=function(e,t){return t.map(function(n){if(e.contains(n))return n;var o=mn(n);return o&&e.contains(o)?o:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},bo=function(e,t,n,o){var r=wo(t,Array.isArray(e)?e:[e]);ze[n]||(ze[n]=new WeakMap);var i=ze[n],a=[],s=new Set,c=new Set(r),f=function(l){!l||s.has(l)||(s.add(l),f(l.parentNode))};r.forEach(f);var p=function(l){!l||c.has(l)||Array.prototype.forEach.call(l.children,function(d){if(s.has(d))p(d);else try{var u=d.getAttribute(o),m=u!==null&&u!=="false",y=(Ae.get(d)||0)+1,x=(i.get(d)||0)+1;Ae.set(d,y),i.set(d,x),a.push(d),y===1&&m&&We.set(d,!0),x===1&&d.setAttribute(n,"true"),m||d.setAttribute(o,"true")}catch(v){console.error("aria-hidden: cannot operate on ",d,v)}})};return p(t),s.clear(),lt++,function(){a.forEach(function(l){var d=Ae.get(l)-1,u=i.get(l)-1;Ae.set(l,d),i.set(l,u),d||(We.has(l)||l.removeAttribute(o),We.delete(l)),u||l.removeAttribute(n)}),lt--,lt||(Ae=new WeakMap,Ae=new WeakMap,We=new WeakMap,ze={})}},xo=function(e,t,n){n===void 0&&(n="data-aria-hidden");var o=Array.from(Array.isArray(e)?e:[e]),r=go(e);return r?(o.push.apply(o,Array.from(r.querySelectorAll("[aria-live], script"))),bo(o,r,n,"aria-hidden")):function(){return null}};function So(e){let t;H(()=>Fe(e),n=>{let o=!1;try{o=!!(n!=null&&n.closest("[popover]:not(:popover-open)"))}catch{}n&&!o?t=xo(n):t&&t()}),Ne(()=>{t&&t()})}function _o(e){const t=A(),n=O(()=>{var i;return((i=t.value)==null?void 0:i.width)??0}),o=O(()=>{var i;return((i=t.value)==null?void 0:i.height)??0});let r;return me(()=>{const i=Fe(e);i?(t.value={width:i.offsetWidth,height:i.offsetHeight},r=new ResizeObserver(a=>{if(!Array.isArray(a)||!a.length)return;const s=a[0];let c,f;if("borderBoxSize"in s){const p=s.borderBoxSize,l=Array.isArray(p)?p[0]:p;c=l.inlineSize,f=l.blockSize}else c=i.offsetWidth,f=i.offsetHeight;t.value={width:c,height:f}}),r.observe(i,{box:"border-box"})):t.value=void 0}),Ne(()=>{r==null||r.disconnect(),r=void 0}),{width:n,height:o}}function Co(e,t){const n=A(e);function o(i){return t[n.value][i]??n.value}return{state:n,dispatch:i=>{n.value=o(i)}}}function vn(e){const t=Vn("",1e3);return{search:t,handleTypeaheadSearch:(r,i)=>{t.value=t.value+r;{const a=J(),s=i.map(d=>{var u,m;return{...d,textValue:((u=d.value)==null?void 0:u.textValue)??((m=d.ref.textContent)==null?void 0:m.trim())??""}}),c=s.find(d=>d.ref===a),f=s.map(d=>d.textValue),p=Ao(f,t.value,c==null?void 0:c.textValue),l=s.find(d=>d.textValue===p);return l&&l.ref.focus(),l==null?void 0:l.ref}},resetTypeahead:()=>{t.value=""}}}function Eo(e,t){return e.map((n,o)=>e[(t+o)%e.length])}function Ao(e,t,n){const r=t.length>1&&Array.from(t).every(f=>f===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let a=Eo(e,Math.max(i,0));r.length===1&&(a=a.filter(f=>f!==n));const c=a.find(f=>f.toLowerCase().startsWith(r.toLowerCase()));return c!==n?c:void 0}function Oo(e,t){var x;const n=A({}),o=A("none"),r=A(e),i=e.value?"mounted":"unmounted";let a;const s=((x=t.value)==null?void 0:x.ownerDocument.defaultView)??Wn,{state:c,dispatch:f}=Co(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}}),p=v=>{var b;if(be){const C=new CustomEvent(v,{bubbles:!1,cancelable:!1});(b=t.value)==null||b.dispatchEvent(C)}};H(e,async(v,b)=>{var h;const C=b!==v;if(await X(),C){const _=o.value,w=He(t.value);v?(f("MOUNT"),p("enter"),w==="none"&&p("after-enter")):w==="none"||w==="undefined"||((h=n.value)==null?void 0:h.display)==="none"?(f("UNMOUNT"),p("leave"),p("after-leave")):b&&_!==w?(f("ANIMATION_OUT"),p("leave")):(f("UNMOUNT"),p("after-leave"))}},{immediate:!0});const l=v=>{const b=He(t.value),C=b.includes(CSS.escape(v.animationName)),h=c.value==="mounted"?"enter":"leave";if(v.target===t.value&&C&&(p(`after-${h}`),f("ANIMATION_END"),!r.value)){const _=t.value.style.animationFillMode;t.value.style.animationFillMode="forwards",a=s==null?void 0:s.setTimeout(()=>{var w;((w=t.value)==null?void 0:w.style.animationFillMode)==="forwards"&&(t.value.style.animationFillMode=_)})}v.target===t.value&&b==="none"&&f("ANIMATION_END")},d=v=>{v.target===t.value&&(o.value=He(t.value))},u=H(t,(v,b)=>{v?(n.value=getComputedStyle(v),v.addEventListener("animationstart",d),v.addEventListener("animationcancel",l),v.addEventListener("animationend",l)):(f("ANIMATION_END"),a!==void 0&&(s==null||s.clearTimeout(a)),b==null||b.removeEventListener("animationstart",d),b==null||b.removeEventListener("animationcancel",l),b==null||b.removeEventListener("animationend",l))},{immediate:!0}),m=H(c,()=>{const v=He(t.value);o.value=c.value==="mounted"?v:"none"});return Ne(()=>{u(),m(),t.value&&(t.value.removeEventListener("animationstart",d),t.value.removeEventListener("animationcancel",l),t.value.removeEventListener("animationend",l)),a!==void 0&&(s==null||s.clearTimeout(a))}),{isPresent:O(()=>["mounted","unmountSuspended"].includes(c.value))}}function He(e){return e&&getComputedStyle(e).animationName||"none"}var Po=I({name:"Presence",props:{present:{type:Boolean,required:!0},forceMount:{type:Boolean}},slots:{},setup(e,{slots:t,expose:n}){var f;const{present:o,forceMount:r}=Xe(e),i=A(),{isPresent:a}=Oo(o,i);n({present:a});let s=t.default({present:a.value});s=zn(s||[]);const c=xt();if(s&&(s==null?void 0:s.length)>1){const p=(f=c==null?void 0:c.parent)!=null&&f.type.name?`<${c.parent.type.name} />`:"component";throw new Error([`Detected an invalid children for \`${p}\` for \`Presence\` component.`,"","Note: Presence works similarly to `v-if` directly, but it waits for animation/transition to finished before unmounting. So it expect only one direct child of valid VNode type.","You can apply a few solutions:",["Provide a single child element so that `presence` directive attach correctly.","Ensure the first child is an actual element instead of a raw text node or comment node."].map(l=>` - ${l}`).join(` +`)].join(` +`))}return()=>r.value||o.value||a.value?Hn(t.default({present:a.value})[0],{ref:p=>{const l=Fe(p);return typeof(l==null?void 0:l.hasAttribute)>"u"||(l!=null&&l.hasAttribute("data-reka-popper-content-wrapper")?i.value=l.firstElementChild:i.value=l),l}}):null}});const To="dismissableLayer.pointerDownOutside",qo="dismissableLayer.focusOutside";function hn(e,t){if(!(t instanceof Element))return!1;const n=t.closest("[data-dismissable-layer]"),o=e.dataset.dismissableLayer===""?e:e.querySelector("[data-dismissable-layer]"),r=Array.from(e.ownerDocument.querySelectorAll("[data-dismissable-layer]"));return!!(n&&(o===n||r.indexOf(o){});return de(s=>{if(!be||!Pe(n))return;const c=async p=>{const l=p.target;if(!(!(t!=null&&t.value)||!l)){if(hn(t.value,l)){r.value=!1;return}if(p.target&&!r.value){let u=function(){Et(To,e,d)};const d={originalEvent:p};p.pointerType==="touch"?(o.removeEventListener("click",i.value),i.value=u,o.addEventListener("click",i.value,{once:!0})):u()}else o.removeEventListener("click",i.value);r.value=!1}},f=window.setTimeout(()=>{o.addEventListener("pointerdown",c)},0);s(()=>{window.clearTimeout(f),o.removeEventListener("pointerdown",c),o.removeEventListener("click",i.value)})}),{onPointerDownCapture:()=>{Pe(n)&&(r.value=!0)}}}function Ro(e,t,n=!0){var i;const o=((i=t==null?void 0:t.value)==null?void 0:i.ownerDocument)??(globalThis==null?void 0:globalThis.document),r=A(!1);return de(a=>{if(!be||!Pe(n))return;const s=async c=>{if(!(t!=null&&t.value))return;await X(),await X();const f=c.target;!t.value||!f||hn(t.value,f)||c.target&&!r.value&&Et(qo,e,{originalEvent:c})};o.addEventListener("focusin",s),a(()=>o.removeEventListener("focusin",s))}),{onFocusCapture:()=>{Pe(n)&&(r.value=!0)},onBlurCapture:()=>{Pe(n)&&(r.value=!1)}}}const Y=an({layersRoot:new Set,layersWithOutsidePointerEventsDisabled:new Set,originalBodyPointerEvents:void 0,branches:new Set});var Bo=I({__name:"DismissableLayer",props:{disableOutsidePointerEvents:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!1,default:!0}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","dismiss"],setup(e,{emit:t}){const n=e,o=t,{forwardRef:r,currentElement:i}=ne(),a=O(()=>{var u;return((u=i.value)==null?void 0:u.ownerDocument)??globalThis.document}),s=O(()=>Y.layersRoot),c=O(()=>i.value?Array.from(s.value).indexOf(i.value):-1),f=O(()=>Y.layersWithOutsidePointerEventsDisabled.size>0),p=O(()=>{const u=Array.from(s.value),[m]=[...Y.layersWithOutsidePointerEventsDisabled].slice(-1),y=u.indexOf(m);return c.value>=y}),l=Do(async u=>{const m=[...Y.branches].some(y=>y==null?void 0:y.contains(u.target));!n.present||!p.value||m||(o("pointerDownOutside",u),o("interactOutside",u),await X(),u.defaultPrevented||o("dismiss"))},i),d=Ro(u=>{const m=[...Y.branches].some(y=>y==null?void 0:y.contains(u.target));!n.present||m||(o("focusOutside",u),o("interactOutside",u),u.defaultPrevented||o("dismiss"))},i);return jn("Escape",u=>{!n.present||!(c.value===s.value.size-1)||(o("escapeKeyDown",u),u.defaultPrevented||o("dismiss"))}),H([i,()=>n.disableOutsidePointerEvents,()=>n.present],([u,m,y],x,v)=>{!u||!y||m&&(Y.layersWithOutsidePointerEventsDisabled.size===0&&(Y.originalBodyPointerEvents=a.value.body.style.pointerEvents,a.value.body.style.pointerEvents="none"),Y.layersWithOutsidePointerEventsDisabled.add(u),v(()=>{Y.layersWithOutsidePointerEventsDisabled.delete(u),Y.layersWithOutsidePointerEventsDisabled.size===0&&!pt(Y.originalBodyPointerEvents)&&(a.value.body.style.pointerEvents=Y.originalBodyPointerEvents)}))},{immediate:!0}),H([i,()=>n.present],([u,m],y,x)=>{!u||!m||(s.value.add(u),x(()=>{s.value.delete(u)}))},{immediate:!0}),de(u=>{u(()=>{i.value&&(s.value.delete(i.value),Y.layersWithOutsidePointerEventsDisabled.delete(i.value))})}),(u,m)=>(R(),B(g(U),{ref:g(r),"as-child":u.asChild,as:u.as,"data-dismissable-layer":"",style:St({pointerEvents:f.value?p.value?"auto":"none":void 0}),onFocusCapture:g(d).onFocusCapture,onBlurCapture:g(d).onBlurCapture,onPointerdownCapture:g(l).onPointerDownCapture},{default:q(()=>[k(u.$slots,"default")]),_:3},8,["as-child","as","style","onFocusCapture","onBlurCapture","onPointerdownCapture"]))}}),ko=Bo;const Io=Un(()=>A([]));function $o(){const e=Io();return{add(t){const n=e.value[0];t!==n&&(n==null||n.pause()),e.value=Vt(e.value,t),e.value.unshift(t)},remove(t){var n;e.value=Vt(e.value,t),(n=e.value[0])==null||n.resume()}}}function Vt(e,t){const n=[...e],o=n.indexOf(t);return o!==-1&&n.splice(o,1),n}const ut="focusScope.autoFocusOnMount",ct="focusScope.autoFocusOnUnmount",Wt={bubbles:!1,cancelable:!0};function Lo(e,{select:t=!1}={}){const n=J();for(const o of e)if(ue(o,{select:t}),J()!==n)return!0}function Mo(e){const t=yn(e),n=zt(t,e),o=zt(t.reverse(),e);return[n,o]}function yn(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const r=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||r?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function zt(e,t){for(const n of e)if(!Fo(n,{upTo:t}))return n}function Fo(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function No(e){return e instanceof HTMLInputElement&&"select"in e}function ue(e,{select:t=!1}={}){if(e&&e.focus){const n=J();e.focus({preventScroll:!0}),e!==n&&No(e)&&t&&e.select()}}var Vo=I({__name:"FocusScope",props:{loop:{type:Boolean,required:!1,default:!1},trapped:{type:Boolean,required:!1,default:!1},present:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["mountAutoFocus","unmountAutoFocus"],setup(e,{emit:t}){const n=e,o=t,{currentRef:r,currentElement:i}=ne(),a=A(null),s=$o(),c=an({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}});de(l=>{if(!be)return;const d=i.value;if(!n.trapped)return;function u(v){if(c.paused||!d)return;const b=v.target;d.contains(b)?a.value=b:ue(a.value,{select:!0})}function m(v){if(c.paused||!d)return;const b=v.relatedTarget;b!==null&&(d.contains(b)||ue(a.value,{select:!0}))}function y(v){const b=a.value;if(b===null||!v.some(_=>_.removedNodes.length>0))return;d.contains(b)||ue(d)}document.addEventListener("focusin",u),document.addEventListener("focusout",m);const x=new MutationObserver(y);d&&x.observe(d,{childList:!0,subtree:!0}),l(()=>{document.removeEventListener("focusin",u),document.removeEventListener("focusout",m),x.disconnect()})});function f(l,d){const u=new CustomEvent(ut,Wt),m=y=>o("mountAutoFocus",y);l.addEventListener(ut,m),l.dispatchEvent(u),l.removeEventListener(ut,m),u.defaultPrevented||(Lo(yn(l),{select:!0}),J()===d&&ue(l))}de(async l=>{const d=i.value;if(await X(),!d)return;n.present!==!1&&s.add(c);const u=J();!d.contains(u)&&n.present!==!1&&f(d,u),l(()=>{const y=new CustomEvent(ct,Wt),x=v=>{o("unmountAutoFocus",v)};d.addEventListener(ct,x),d.dispatchEvent(y),d.setAttribute("data-focus-scope-unmounting",""),setTimeout(()=>{y.defaultPrevented||ue(u??document.body,{select:!0}),d.removeEventListener(ct,x),s.remove(c),d.removeAttribute("data-focus-scope-unmounting")},0)})}),H(()=>n.present,async(l,d)=>{if(!be)return;if(l===!1&&d===!0){s.remove(c);return}if(l!==!0||d!==!1)return;s.add(c),await X();const u=i.value;if(!u)return;const m=J();u.contains(m)||f(u,m)});function p(l){if(!n.loop&&!n.trapped||c.paused)return;const d=l.key==="Tab"&&!l.altKey&&!l.ctrlKey&&!l.metaKey,u=J();if(d&&u){const m=l.currentTarget,[y,x]=Mo(m);y&&x?!l.shiftKey&&u===x?(l.preventDefault(),n.loop&&ue(y,{select:!0})):l.shiftKey&&u===y&&(l.preventDefault(),n.loop&&ue(x,{select:!0})):u===m&&l.preventDefault()}}return(l,d)=>(R(),B(g(U),{ref_key:"currentRef",ref:r,tabindex:"-1","as-child":l.asChild,as:l.as,onKeydown:p},{default:q(()=>[k(l.$slots,"default")]),_:3},8,["as-child","as"]))}}),Wo=Vo;function Hi(e){return e?"open":"closed"}function Ht(e){const t=J();for(const n of e)if(n===t||(n.focus(),J()!==t))return}var zo=I({__name:"Teleport",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e,n=bt({}),o=O(()=>{var i;return t.to??((i=n.teleportTo)==null?void 0:i.value)??"body"}),r=Kn();return(i,a)=>g(r)||i.forceMount?(R(),B(sn,{key:0,to:o.value,disabled:i.disabled,defer:i.defer},[k(i.$slots,"default")],8,["to","disabled","defer"])):ke("v-if",!0)}}),Ho=zo,jo=I({__name:"VisuallyHidden",props:{feature:{type:String,required:!1,default:"focusable"},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){return(t,n)=>(R(),B(g(U),{as:t.as,"as-child":t.asChild,"aria-hidden":t.feature==="focusable"||t.feature==="fully-hidden"?"true":void 0,"data-hidden":t.feature==="fully-hidden"?"":void 0,tabindex:t.feature==="fully-hidden"?"-1":void 0,style:{position:"absolute",border:0,width:"1px",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",clipPath:"inset(50%)",whiteSpace:"nowrap",wordWrap:"normal",top:"-1px",left:"-1px"}},{default:q(()=>[k(t.$slots,"default")]),_:3},8,["as","as-child","aria-hidden","data-hidden","tabindex"]))}}),Uo=jo;const[gn,Ko]=qe("PopperRoot");var Yo=I({inheritAttrs:!1,__name:"PopperRoot",setup(e){const t=A();return Ko({anchor:t,onAnchorChange:n=>t.value=n}),(n,o)=>k(n.$slots,"default")}}),Xo=Yo,Go=I({__name:"PopperAnchor",props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{forwardRef:n,currentElement:o}=ne(),r=gn();return ln(()=>{r.onAnchorChange(t.reference??o.value)}),(i,a)=>(R(),B(g(U),{ref:g(n),as:i.as,"as-child":i.asChild},{default:q(()=>[k(i.$slots,"default")]),_:3},8,["as","as-child"]))}}),Jo=Go;function Zo(e){return e!==null}function Qo(e){return{name:"transformOrigin",options:e,fn(t){var v,b,C;const{placement:n,rects:o,middlewareData:r}=t,a=((v=r.arrow)==null?void 0:v.centerOffset)!==0,s=a?0:e.arrowWidth,c=a?0:e.arrowHeight,[f,p]=vt(n),l={start:e.dir==="rtl"?"100%":"0%",center:"50%",end:e.dir==="rtl"?"0%":"100%"}[p],d={start:"0%",center:"50%",end:"100%"}[p],u=(((b=r.arrow)==null?void 0:b.x)??0)+s/2,m=(((C=r.arrow)==null?void 0:C.y)??0)+c/2;let y="",x="";return f==="bottom"?(y=a?l:`${u}px`,x=`${-c}px`):f==="top"?(y=a?l:`${u}px`,x=`${o.floating.height+c}px`):f==="right"?(y=`${-c}px`,x=a?d:`${m}px`):f==="left"&&(y=`${o.floating.width+c}px`,x=a?d:`${m}px`),{data:{x:y,y:x}}}}}function vt(e){const[t,n="center"]=e.split("-");return[t,n]}const er=["top","right","bottom","left"],fe=Math.min,re=Math.max,Ue=Math.round,je=Math.floor,ie=e=>({x:e,y:e}),tr={left:"right",right:"left",bottom:"top",top:"bottom"};function wn(e,t,n){return re(e,fe(t,n))}function ae(e,t){return typeof e=="function"?e(t):e}function pe(e){return e.split("-")[0]}function De(e){return e.split("-")[1]}function Ot(e){return e==="x"?"y":"x"}function Pt(e){return e==="y"?"height":"width"}function Z(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function Tt(e){return Ot(Z(e))}function nr(e,t,n){n===void 0&&(n=!1);const o=De(e),r=Tt(e),i=Pt(r);let a=r==="x"?o===(n?"end":"start")?"right":"left":o==="start"?"bottom":"top";return t.reference[i]>t.floating[i]&&(a=Ke(a)),[a,Ke(a)]}function or(e){const t=Ke(e);return[ht(e),t,ht(t)]}function ht(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const jt=["left","right"],Ut=["right","left"],rr=["top","bottom"],ir=["bottom","top"];function ar(e,t,n){switch(e){case"top":case"bottom":return n?t?Ut:jt:t?jt:Ut;case"left":case"right":return t?rr:ir;default:return[]}}function sr(e,t,n,o){const r=De(e);let i=ar(pe(e),n==="start",o);return r&&(i=i.map(a=>a+"-"+r),t&&(i=i.concat(i.map(ht)))),i}function Ke(e){const t=pe(e);return tr[t]+e.slice(t.length)}function lr(e){var t,n,o,r;return{top:(t=e.top)!=null?t:0,right:(n=e.right)!=null?n:0,bottom:(o=e.bottom)!=null?o:0,left:(r=e.left)!=null?r:0}}function bn(e){return typeof e!="number"?lr(e):{top:e,right:e,bottom:e,left:e}}function Ye(e){const{x:t,y:n,width:o,height:r}=e;return{width:o,height:r,top:n,left:t,right:t+o,bottom:n+r,x:t,y:n}}function Kt(e,t,n){let{reference:o,floating:r}=e;const i=Z(t),a=Tt(t),s=Pt(a),c=pe(t),f=i==="y",p=o.x+o.width/2-r.width/2,l=o.y+o.height/2-r.height/2,d=o[s]/2-r[s]/2;let u;switch(c){case"top":u={x:p,y:o.y-r.height};break;case"bottom":u={x:p,y:o.y+o.height};break;case"right":u={x:o.x+o.width,y:l};break;case"left":u={x:o.x-r.width,y:l};break;default:u={x:o.x,y:o.y}}const m=De(t);return m&&(u[a]+=d*(m==="end"?1:-1)*(n&&f?-1:1)),u}async function ur(e,t){var n;t===void 0&&(t={});const{x:o,y:r,platform:i,rects:a,elements:s,strategy:c}=e,{boundary:f="clippingAncestors",rootBoundary:p="viewport",elementContext:l="floating",altBoundary:d=!1,padding:u=0}=ae(t,e),m=bn(u),x=s[d?l==="floating"?"reference":"floating":l],v=Ye(await i.getClippingRect({element:(n=await(i.isElement==null?void 0:i.isElement(x)))==null||n?x:x.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(s.floating)),boundary:f,rootBoundary:p,strategy:c})),b=l==="floating"?{x:o,y:r,width:a.floating.width,height:a.floating.height}:a.reference,C=await(i.getOffsetParent==null?void 0:i.getOffsetParent(s.floating)),h=await(i.isElement==null?void 0:i.isElement(C))&&await(i.getScale==null?void 0:i.getScale(C))||{x:1,y:1},_=Ye(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:s,rect:b,offsetParent:C,strategy:c}):b);return{top:(v.top-_.top+m.top)/h.y,bottom:(_.bottom-v.bottom+m.bottom)/h.y,left:(v.left-_.left+m.left)/h.x,right:(_.right-v.right+m.right)/h.x}}const cr=50,dr=async(e,t,n)=>{const{placement:o="bottom",strategy:r="absolute",middleware:i=[],platform:a}=n,s=a.detectOverflow?a:{...a,detectOverflow:ur},c=await(a.isRTL==null?void 0:a.isRTL(t));let f=await a.getElementRects({reference:e,floating:t,strategy:r}),{x:p,y:l}=Kt(f,o,c),d=o,u=0;const m={};for(let y=0;y({name:"arrow",options:e,async fn(t){const{x:n,y:o,placement:r,rects:i,platform:a,elements:s,middlewareData:c}=t,{element:f,padding:p=0}=ae(e,t)||{};if(f==null)return{};const l=bn(p),d={x:n,y:o},u=Tt(r),m=Pt(u),y=await a.getDimensions(f),x=u==="y",v=x?"top":"left",b=x?"bottom":"right",C=x?"clientHeight":"clientWidth",h=i.reference[m]+i.reference[u]-d[u]-i.floating[m],_=d[u]-i.reference[u],w=await(a.getOffsetParent==null?void 0:a.getOffsetParent(f));let S=w?w[C]:0;(!S||!await(a.isElement==null?void 0:a.isElement(w)))&&(S=s.floating[C]||i.floating[m]);const E=h/2-_/2,P=S/2-y[m]/2-1,T=fe(l[v],P),L=fe(l[b],P),K=S-y[m]-L,D=S/2-y[m]/2+E,$=wn(T,D,K),N=!c.arrow&&De(r)!=null&&D!==$&&i.reference[m]/2-(D$<=0)){var L,K;const $=(((L=i.flip)==null?void 0:L.index)||0)+1,N=S[$];if(N&&(!(l==="alignment"?b!==Z(N):!1)||T.every(W=>Z(W.placement)===b?W.overflows[0]>0:!0)))return{data:{index:$,overflows:T},reset:{placement:N}};let F=(K=T.filter(V=>V.overflows[0]<=0).sort((V,W)=>V.overflows[1]-W.overflows[1])[0])==null?void 0:K.placement;if(!F)switch(u){case"bestFit":{var D;const V=(D=T.filter(W=>{if(w){const z=Z(W.placement);return z===b||z==="y"}return!0}).map(W=>[W.placement,W.overflows.filter(z=>z>0).reduce((z,Ce)=>z+Ce,0)]).sort((W,z)=>W[1]-z[1])[0])==null?void 0:D[0];V&&(F=V);break}case"initialPlacement":F=s;break}if(r!==F)return{reset:{placement:F}}}return{}}}};function Yt(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Xt(e){return er.some(t=>e[t]>=0)}const mr=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:n,platform:o}=t,{strategy:r="referenceHidden",...i}=ae(e,t);switch(r){case"referenceHidden":{const a=await o.detectOverflow(t,{...i,elementContext:"reference"}),s=Yt(a,n.reference);return{data:{referenceHiddenOffsets:s,referenceHidden:Xt(s)}}}case"escaped":{const a=await o.detectOverflow(t,{...i,altBoundary:!0}),s=Yt(a,n.floating);return{data:{escapedOffsets:s,escaped:Xt(s)}}}default:return{}}}}},xn=new Set(["left","top"]);async function vr(e,t){const{placement:n,platform:o,elements:r}=e,i=await(o.isRTL==null?void 0:o.isRTL(r.floating)),a=pe(n),s=De(n),c=Z(n)==="y",f=xn.has(a)?-1:1,p=i&&c?-1:1,l=ae(t,e);let{mainAxis:d,crossAxis:u,alignmentAxis:m}=typeof l=="number"?{mainAxis:l,crossAxis:0,alignmentAxis:null}:{mainAxis:l.mainAxis||0,crossAxis:l.crossAxis||0,alignmentAxis:l.alignmentAxis};return s&&typeof m=="number"&&(u=s==="end"?m*-1:m),c?{x:u*p,y:d*f}:{x:d*f,y:u*p}}const hr=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,o;const{x:r,y:i,placement:a,middlewareData:s}=t,c=await vr(t,e);return a===((n=s.offset)==null?void 0:n.placement)&&(o=s.arrow)!=null&&o.alignmentOffset?{}:{x:r+c.x,y:i+c.y,data:{...c,placement:a}}}}},yr=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:o,placement:r,platform:i}=t,{mainAxis:a=!0,crossAxis:s=!1,limiter:c={fn:b=>{let{x:C,y:h}=b;return{x:C,y:h}}},...f}=ae(e,t),p={x:n,y:o},l=await i.detectOverflow(t,f),d=Z(r),u=Ot(d);let m=p[u],y=p[d];const x=(b,C)=>wn(C+l[b==="y"?"top":"left"],C,C-l[b==="y"?"bottom":"right"]);a&&(m=x(u,m)),s&&(y=x(d,y));const v=c.fn({...t,[u]:m,[d]:y});return{...v,data:{x:v.x-n,y:v.y-o,enabled:{[u]:a,[d]:s}}}}}},gr=function(e){return e===void 0&&(e={}),{options:e,fn(t){var n,o;const{x:r,y:i,placement:a,rects:s,middlewareData:c}=t,{offset:f=0,mainAxis:p=!0,crossAxis:l=!0}=ae(e,t),d={x:r,y:i},u=Z(a),m=Ot(u);let y=d[m],x=d[u];const v=ae(f,t),b=typeof v=="number"?{mainAxis:v,crossAxis:0}:{mainAxis:(n=v.mainAxis)!=null?n:0,crossAxis:(o=v.crossAxis)!=null?o:0};if(p){const _=m==="y"?"height":"width",w=s.reference[m]-s.floating[_]+b.mainAxis,S=s.reference[m]+s.reference[_]-b.mainAxis;yS&&(y=S)}if(l){var C,h;const _=m==="y"?"width":"height",w=xn.has(pe(a)),S=s.reference[u]-s.floating[_]+(w&&((C=c.offset)==null?void 0:C[u])||0)+(w?0:b.crossAxis),E=s.reference[u]+s.reference[_]+(w?0:((h=c.offset)==null?void 0:h[u])||0)-(w?b.crossAxis:0);xE&&(x=E)}return{[m]:y,[u]:x}}}},wr=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:n,rects:o,platform:r,elements:i}=t,{apply:a=()=>{},...s}=ae(e,t),c=await r.detectOverflow(t,s),f=pe(n),p=De(n),l=Z(n)==="y",{width:d,height:u}=o.floating;let m,y;f==="top"||f==="bottom"?(m=f,y=p===(await(r.isRTL==null?void 0:r.isRTL(i.floating))?"start":"end")?"left":"right"):(y=f,m=p==="end"?"top":"bottom");const x=u-c.top-c.bottom,v=d-c.left-c.right,b=fe(u-c[m],x),C=fe(d-c[y],v),h=t.middlewareData.shift,_=!h;let w=b,S=C;h!=null&&h.enabled.x&&(S=v),h!=null&&h.enabled.y&&(w=x),_&&!p&&(l?S=d-2*re(c.left,c.right):w=u-2*re(c.top,c.bottom)),await a({...t,availableWidth:S,availableHeight:w});const E=await r.getDimensions(i.floating);return d!==E.width||u!==E.height?{reset:{rects:!0}}:{}}}};function Ge(){return typeof window<"u"}function _e(e){return qt(e)?(e.nodeName||"").toLowerCase():"#document"}function j(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function se(e){var t;return(t=(qt(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function qt(e){return Ge()?e instanceof Node||e instanceof j(e).Node:!1}function ee(e){return Ge()?e instanceof Element||e instanceof j(e).Element:!1}function ve(e){return Ge()?e instanceof HTMLElement||e instanceof j(e).HTMLElement:!1}function Gt(e){return!Ge()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof j(e).ShadowRoot}function Je(e){const{overflow:t,overflowX:n,overflowY:o,display:r}=te(e);return/auto|scroll|overlay|hidden|clip/.test(t+o+n)&&r!=="inline"&&r!=="contents"}function br(e){return/^(table|td|th)$/.test(_e(e))}function Ze(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const xr=/transform|translate|scale|rotate|perspective|filter/,Sr=/paint|layout|strict|content/,we=e=>!!e&&e!=="none";let dt;function Dt(e){const t=ee(e)?te(e):e;return we(t.transform)||we(t.translate)||we(t.scale)||we(t.rotate)||we(t.perspective)||!Rt()&&(we(t.backdropFilter)||we(t.filter))||xr.test(t.willChange||"")||Sr.test(t.contain||"")}function _r(e){let t=xe(e);for(;ve(t)&&!Ie(t);){if(Dt(t))return t;if(Ze(t))return null;t=xe(t)}return null}function Rt(){return dt==null&&(dt=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),dt}function Ie(e){return/^(html|body|#document)$/.test(_e(e))}function te(e){return j(e).getComputedStyle(e)}function Qe(e){return ee(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function xe(e){if(_e(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Gt(e)&&e.host||se(e);return Gt(t)?t.host:t}function Sn(e){const t=xe(e);return Ie(t)?(e.ownerDocument||e).body:ve(t)&&Je(t)?t:Sn(t)}function $e(e,t,n){var o;t===void 0&&(t=[]),n===void 0&&(n=!0);const r=Sn(e),i=r===((o=e.ownerDocument)==null?void 0:o.body),a=j(r);if(i){const s=yt(a);return t.concat(a,a.visualViewport||[],Je(r)?r:[],s&&n?$e(s):[])}else return t.concat(r,$e(r,[],n))}function yt(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function _n(e){const t=te(e);let n=parseFloat(t.width)||0,o=parseFloat(t.height)||0;const r=ve(e),i=r?e.offsetWidth:n,a=r?e.offsetHeight:o,s=Ue(n)!==i||Ue(o)!==a;return s&&(n=i,o=a),{width:n,height:o,$:s}}function Bt(e){return ee(e)?e:e.contextElement}function Te(e){const t=Bt(e);if(!ve(t))return ie(1);const n=t.getBoundingClientRect(),{width:o,height:r,$:i}=_n(t);let a=(i?Ue(n.width):n.width)/o,s=(i?Ue(n.height):n.height)/r;return(!a||!Number.isFinite(a))&&(a=1),(!s||!Number.isFinite(s))&&(s=1),{x:a,y:s}}const Cr=ie(0);function Cn(e){const t=j(e);return!Rt()||!t.visualViewport?Cr:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Er(e,t,n){return t===void 0&&(t=!1),!!n&&t&&n===j(e)}function Se(e,t,n,o){t===void 0&&(t=!1),n===void 0&&(n=!1);const r=e.getBoundingClientRect(),i=Bt(e);let a=ie(1);t&&(o?ee(o)&&(a=Te(o)):a=Te(e));const s=Er(i,n,o)?Cn(i):ie(0);let c=(r.left+s.x)/a.x,f=(r.top+s.y)/a.y,p=r.width/a.x,l=r.height/a.y;if(i&&o){const d=j(i),u=ee(o)?j(o):o;let m=d,y=yt(m);for(;y&&u!==m;){const x=Te(y),v=y.getBoundingClientRect(),b=te(y),C=v.left+(y.clientLeft+parseFloat(b.paddingLeft))*x.x,h=v.top+(y.clientTop+parseFloat(b.paddingTop))*x.y;c*=x.x,f*=x.y,p*=x.x,l*=x.y,c+=C,f+=h,m=j(y),y=yt(m)}}return Ye({width:p,height:l,x:c,y:f})}function et(e,t){const n=Qe(e).scrollLeft;return t?t.left+n:Se(se(e)).left+n}function En(e,t){const n=e.getBoundingClientRect(),o=n.left+t.scrollLeft-et(e,n),r=n.top+t.scrollTop;return{x:o,y:r}}function Ar(e){let{elements:t,rect:n,offsetParent:o,strategy:r}=e;const i=r==="fixed",a=se(o),s=t?Ze(t.floating):!1;if(o===a||s&&i)return n;let c={scrollLeft:0,scrollTop:0},f=ie(1);const p=ie(0),l=ve(o);if((l||!i)&&((_e(o)!=="body"||Je(a))&&(c=Qe(o)),l)){const u=Se(o);f=Te(o),p.x=u.x+o.clientLeft,p.y=u.y+o.clientTop}const d=a&&!l&&!i?En(a,c):ie(0);return{width:n.width*f.x,height:n.height*f.y,x:n.x*f.x-c.scrollLeft*f.x+p.x+d.x,y:n.y*f.y-c.scrollTop*f.y+p.y+d.y}}function Or(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function Pr(e){const t=Qe(e),n=e.ownerDocument.body,o=re(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),r=re(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight);let i=-t.scrollLeft+et(e);const a=-t.scrollTop;return te(n).direction==="rtl"&&(i+=re(e.clientWidth,n.clientWidth)-o),{width:o,height:r,x:i,y:a}}const Tr=25;function qr(e,t,n){n===void 0&&(n="viewport");const o=n==="layoutViewport",r=j(e),i=se(e),a=r.visualViewport;let s=i.clientWidth,c=i.clientHeight,f=0,p=0;if(a){const d=!Rt()||t==="fixed";o?d||(f=-a.offsetLeft,p=-a.offsetTop):(s=a.width,c=a.height,d&&(f=a.offsetLeft,p=a.offsetTop))}if(et(i)<=0){const d=i.ownerDocument,u=d.body,m=getComputedStyle(u),y=d.compatMode==="CSS1Compat"&&parseFloat(m.marginLeft)+parseFloat(m.marginRight)||0,x=Math.abs(i.clientWidth-u.clientWidth-y),v=getComputedStyle(i).scrollbarGutter==="stable both-edges"?x/2:x;v<=Tr&&(s-=v)}return{width:s,height:c,x:f,y:p}}function Dr(e,t){const n=Se(e,!0,t==="fixed"),o=n.top+e.clientTop,r=n.left+e.clientLeft,i=Te(e),a=e.clientWidth*i.x,s=e.clientHeight*i.y,c=r*i.x,f=o*i.y;return{width:a,height:s,x:c,y:f}}function Jt(e,t,n){let o;if(t==="viewport"||t==="layoutViewport")o=qr(e,n,t);else if(t==="document")o=Pr(se(e));else if(ee(t))o=Dr(t,n);else{const r=Cn(e);o={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return Ye(o)}function Rr(e,t){const n=t.get(e);if(n)return n;let o=$e(e,[],!1).filter(s=>ee(s)&&_e(s)!=="body"),r=null;const i=te(e).position==="fixed";let a=i?xe(e):e;for(;ee(a)&&!Ie(a);){const s=te(a),c=Dt(a),f=r?r.position:i?"fixed":"";!c&&(f==="fixed"||f==="absolute"&&s.position==="static")?o=o.filter(l=>l!==a):r=s,a=xe(a)}return t.set(e,o),o}function Br(e){let{element:t,boundary:n,rootBoundary:o,strategy:r}=e;const a=[...n==="clippingAncestors"?Ze(t)?[]:Rr(t,this._c):[].concat(n),o],s=Jt(t,a[0],r);let c=s.top,f=s.right,p=s.bottom,l=s.left;for(let d=1;d{s(!1,1e-7)},1e3)}S=!1}try{o=new IntersectionObserver(E,{...w,root:i.ownerDocument})}catch{o=new IntersectionObserver(E,w)}o.observe(e)}const c=j(e),f=()=>s(n);return c.addEventListener("resize",f),s(!0),()=>{c.removeEventListener("resize",f),a()}}function Nr(e,t,n,o){o===void 0&&(o={});const{ancestorScroll:r=!0,ancestorResize:i=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:c=!1}=o,f=Bt(e),p=r||i?[...f?$e(f):[],...t?$e(t):[]]:[];p.forEach(v=>{r&&v.addEventListener("scroll",n),i&&v.addEventListener("resize",n)});const l=f&&s?Fr(f,n,i):null;let d=-1,u=null;a&&(u=new ResizeObserver(v=>{let[b]=v;b&&b.target===f&&u&&t&&(u.unobserve(t),cancelAnimationFrame(d),d=requestAnimationFrame(()=>{var C;(C=u)==null||C.observe(t)})),n()}),f&&!c&&u.observe(f),t&&u.observe(t));let m,y=c?Se(e):null;c&&x();function x(){const v=Se(e);y&&!On(y,v)&&n(),y=v,m=requestAnimationFrame(x)}return n(),()=>{var v;p.forEach(b=>{r&&b.removeEventListener("scroll",n),i&&b.removeEventListener("resize",n)}),l==null||l(),(v=u)==null||v.disconnect(),u=null,c&&cancelAnimationFrame(m)}}const Vr=hr,Wr=yr,Qt=pr,zr=wr,Hr=mr,jr=fr,Ur=gr,Kr=(e,t,n)=>{const o=new Map,r=n??{},i={...Mr,...r.platform,_c:o};return dr(e,t,{...r,platform:i})};function Yr(e){return e!=null&&typeof e=="object"&&"$el"in e}function gt(e){if(Yr(e)){const t=e.$el;return qt(t)&&_e(t)==="#comment"?null:t}return e}function Oe(e){return typeof e=="function"?e():g(e)}function Xr(e){return{name:"arrow",options:e,fn(t){const n=gt(Oe(e.element));return n==null?{}:jr({element:n,padding:e.padding}).fn(t)}}}function Pn(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function en(e,t){const n=Pn(e);return Math.round(t*n)/n}function Gr(e,t,n){n===void 0&&(n={});const o=n.whileElementsMounted,r=O(()=>{var S;return(S=Oe(n.open))!=null?S:!0}),i=O(()=>Oe(n.middleware)),a=O(()=>{var S;return(S=Oe(n.placement))!=null?S:"bottom"}),s=O(()=>{var S;return(S=Oe(n.strategy))!=null?S:"absolute"}),c=O(()=>{var S;return(S=Oe(n.transform))!=null?S:!0}),f=O(()=>gt(e.value)),p=O(()=>gt(t.value)),l=A(0),d=A(0),u=A(s.value),m=A(a.value),y=Yn({}),x=A(!1),v=O(()=>{const S={position:u.value,left:"0",top:"0"};if(!p.value)return S;const E=en(p.value,l.value),P=en(p.value,d.value);return c.value?{...S,transform:"translate("+E+"px, "+P+"px)",...Pn(p.value)>=1.5&&{willChange:"transform"}}:{position:u.value,left:E+"px",top:P+"px"}});let b;function C(){if(f.value==null||p.value==null)return;const S=r.value;Kr(f.value,p.value,{middleware:i.value,placement:a.value,strategy:s.value}).then(E=>{l.value=E.x,d.value=E.y,u.value=E.strategy,m.value=E.placement,y.value=E.middlewareData,x.value=S!==!1})}function h(){typeof b=="function"&&(b(),b=void 0)}function _(){if(h(),o===void 0){C();return}if(f.value!=null&&p.value!=null){b=o(f.value,p.value,C);return}}function w(){r.value||(x.value=!1)}return H([i,a,s,r],C,{flush:"sync"}),H([f,p],_,{flush:"sync"}),H(r,w,{flush:"sync"}),Xn()&&Gn(h),{x:Ee(l),y:Ee(d),strategy:Ee(u),placement:Ee(m),middlewareData:Ee(y),isPositioned:Ee(x),floatingStyles:v,update:C}}const Jr=["dir"],Zr={side:"bottom",sideOffset:0,sideFlip:!0,align:"center",alignOffset:0,alignFlip:!0,arrowPadding:0,hideShiftedArrow:!0,avoidCollisions:!0,collisionBoundary:()=>[],collisionPadding:0,sticky:"partial",hideWhenDetached:!1,positionStrategy:"fixed",updatePositionStrategy:"optimized",prioritizePosition:!1},[ji,Qr]=qe("PopperContent");var ei=I({inheritAttrs:!1,__name:"PopperContent",props:Zn({memoDependencies:{type:Array,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},dir:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},{...Zr}),emits:["placed"],setup(e,{emit:t}){const n=e,o=t,r=gn(),{forwardRef:i,currentElement:a}=ne(),s=tn(O(()=>n.dir)),c=A(),f=A(),{width:p,height:l}=_o(f),d=O(()=>n.side+(n.align!=="center"?`-${n.align}`:"")),u=O(()=>typeof n.collisionPadding=="number"?n.collisionPadding:{top:0,right:0,bottom:0,left:0,...n.collisionPadding}),m=O(()=>Array.isArray(n.collisionBoundary)?n.collisionBoundary:[n.collisionBoundary]),y=O(()=>({padding:u.value,boundary:m.value.filter(Zo),altBoundary:m.value.length>0})),x=O(()=>({mainAxis:n.sideFlip,crossAxis:n.alignFlip})),v=O(()=>[Vr({mainAxis:n.sideOffset+l.value,alignmentAxis:n.alignOffset}),n.prioritizePosition&&n.avoidCollisions&&Qt({...y.value,...x.value}),n.avoidCollisions&&Wr({mainAxis:!0,crossAxis:!!n.prioritizePosition,limiter:n.sticky==="partial"?Ur():void 0,...y.value}),!n.prioritizePosition&&n.avoidCollisions&&Qt({...y.value,...x.value}),zr({...y.value,apply:({elements:D,rects:$,availableWidth:N,availableHeight:F})=>{const{width:V,height:W}=$.reference,z=D.floating.style;z.setProperty("--reka-popper-available-width",`${N}px`),z.setProperty("--reka-popper-available-height",`${F}px`),z.setProperty("--reka-popper-anchor-width",`${V}px`),z.setProperty("--reka-popper-anchor-height",`${W}px`)}}),f.value&&Xr({element:f.value,padding:n.arrowPadding}),Qo({arrowWidth:p.value,arrowHeight:l.value,dir:s.value}),n.hideWhenDetached&&Hr({strategy:"referenceHidden",...y.value})]),b=O(()=>n.reference??r.anchor.value),{floatingStyles:C,placement:h,isPositioned:_,middlewareData:w}=Gr(b,c,{strategy:n.positionStrategy,placement:d,whileElementsMounted:(...D)=>Nr(...D,{layoutShift:!n.disableUpdateOnLayoutShift,animationFrame:n.updatePositionStrategy==="always"}),middleware:v}),S=O(()=>vt(h.value)[0]),E=O(()=>vt(h.value)[1]);ln(()=>{_.value&&o("placed")});const P=O(()=>{var $;const D=(($=w.value.arrow)==null?void 0:$.centerOffset)!==0;return n.hideShiftedArrow&&D}),T=A("");de(()=>{a.value&&(T.value=window.getComputedStyle(a.value).zIndex)});const L=O(()=>{var D;return((D=w.value.arrow)==null?void 0:D.x)??0}),K=O(()=>{var D;return((D=w.value.arrow)==null?void 0:D.y)??0});return Qr({placedSide:S,onArrowChange:D=>f.value=D,arrowX:L,arrowY:K,shouldHideArrow:P}),(D,$)=>{var N,F,V;return R(),ce("div",{ref_key:"floatingRef",ref:c,"data-reka-popper-content-wrapper":"",dir:g(s),style:St({...g(C),transform:g(_)?g(C).transform:"translate(0, -200%)",minWidth:"max-content",zIndex:T.value,"--reka-popper-transform-origin":[(N=g(w).transformOrigin)==null?void 0:N.x,(F=g(w).transformOrigin)==null?void 0:F.y].join(" "),...((V=g(w).hide)==null?void 0:V.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}})},[n.memoDependencies?Jn([n.asChild,n.as,S.value,E.value,g(_),...Object.values(D.$attrs),...n.memoDependencies],()=>(R(),B(g(U),Q({key:0,ref:g(i)},D.$attrs,{"as-child":n.asChild,as:n.as,"data-side":S.value,"data-align":E.value,style:{animation:g(_)?void 0:"none"}}),{default:q(()=>[k(D.$slots,"default")]),_:3},16,["as-child","as","data-side","data-align","style"])),$,0):(R(),B(g(U),Q({key:1,ref:g(i)},D.$attrs,{"as-child":n.asChild,as:n.as,"data-side":S.value,"data-align":E.value,dir:g(s),style:{animation:g(_)?void 0:"none"}}),{default:q(()=>[k(D.$slots,"default")]),_:3},16,["as-child","as","data-side","data-align","dir","style"]))],12,Jr)}}}),ti=ei;function ni(e){const t=bt({nonce:A()});return O(()=>{var n;return(e==null?void 0:e.value)||((n=t.nonce)==null?void 0:n.value)})}const oi=[" ","Enter","ArrowUp","ArrowDown"],ri=[" ","Enter"],G=10;function Le(e,t,n){return e===void 0?!1:Array.isArray(e)?e.some(o=>wt(o,t,n)):wt(e,t,n)}function wt(e,t,n){return e===void 0||t===void 0?!1:typeof e=="string"?e===t:typeof n=="function"?n(e,t):typeof n=="string"?(e==null?void 0:e[n])===(t==null?void 0:t[n]):so(e,t)}function ii(e){return e==null||e===""||Array.isArray(e)&&e.length===0}const ai=["value"],[he,Tn]=qe("SelectRoot");var si=I({inheritAttrs:!1,__name:"SelectRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1},defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1,default:void 0},nullableValue:{type:String,required:!1,default:""},by:{type:[String,Function],required:!1},dir:{type:String,required:!1},multiple:{type:Boolean,required:!1},autocomplete:{type:String,required:!1},disabled:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue","update:open"],setup(e,{emit:t}){const n=e,o=t,{required:r,disabled:i,multiple:a,dir:s}=Xe(n),c=Lt(n,"modelValue",o,{defaultValue:n.defaultValue??(a.value?[]:void 0),passive:n.modelValue===void 0,deep:!0}),f=Lt(n,"open",o,{defaultValue:n.defaultOpen,passive:n.open===void 0}),p=A(),l=A(),d=A({x:0,y:0}),u=O(()=>{var h;return a.value&&Array.isArray(c.value)?((h=c.value)==null?void 0:h.length)===0:pt(c.value)});Me({isProvider:!0});const m=tn(s),y=ho(p),x=A(new Set),v=O(()=>Array.from(x.value).map(h=>h.value).join(";"));function b(h){if(a.value){const _=Array.isArray(c.value)?[...c.value]:[],w=_.findIndex(S=>wt(S,h,n.by));w===-1?_.push(h):_.splice(w,1),c.value=[..._]}else c.value=h}function C(h){return Array.from(x.value).find(_=>Le(h,_.value,n.by))}return Tn({triggerElement:p,onTriggerChange:h=>{p.value=h},valueElement:l,onValueElementChange:h=>{l.value=h},contentId:"",modelValue:c,onValueChange:b,by:n.by,open:f,multiple:a,required:r,onOpenChange:h=>{f.value=h},dir:m,triggerPointerDownPosRef:d,disabled:i,isEmptyModelValue:u,optionsSet:x,onOptionAdd:h=>{const _=C(h.value);_&&x.value.delete(_),x.value.add(h)},onOptionRemove:h=>{const _=C(h.value);_&&x.value.delete(_)}}),(h,_)=>(R(),B(g(Xo),null,{default:q(()=>[k(h.$slots,"default",{modelValue:g(c),open:g(f)}),g(y)&&h.name?(R(),B(ci,{key:v.value,"aria-hidden":"true",tabindex:"-1",multiple:g(a),required:g(r),name:h.name,autocomplete:h.autocomplete,disabled:g(i),value:g(c)},{default:q(()=>[g(pt)(g(c))?(R(),ce("option",{key:0,value:h.nullableValue},null,8,ai)):ke("v-if",!0),(R(!0),ce(_t,null,un(Array.from(x.value),w=>(R(),ce("option",Q({key:w.value??""},{ref_for:!0},w),null,16))),128))]),_:1},8,["multiple","required","name","autocomplete","disabled","value"])):ke("v-if",!0)]),_:3}))}}),li=si,ui=I({__name:"BubbleSelect",props:{autocomplete:{type:String,required:!1},autofocus:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},form:{type:String,required:!1},multiple:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1},size:{type:Number,required:!1},value:{type:null,required:!1}},setup(e){const t=e,n=A(),o=he();H(()=>t.value,(i,a)=>{const s=window.HTMLSelectElement.prototype,f=Object.getOwnPropertyDescriptor(s,"value").set;if(i!==a&&f&&n.value){const p=new Event("change",{bubbles:!0});f.call(n.value,i),n.value.dispatchEvent(p)}});function r(i){o.onValueChange(i.target.value)}return(i,a)=>(R(),B(g(Uo),{"as-child":""},{default:q(()=>[Qn("select",Q({ref_key:"selectElement",ref:n},t,{onInput:r}),[k(i.$slots,"default")],16)]),_:3}))}}),ci=ui,di=I({__name:"SelectPopperPosition",props:{memoDependencies:{type:Array,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1,default:"start"},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1,default:G},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},dir:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const n=At(e);return(o,r)=>(R(),B(g(ti),Q(g(n),{style:{boxSizing:"border-box","--reka-select-content-transform-origin":"var(--reka-popper-transform-origin)","--reka-select-content-available-width":"var(--reka-popper-available-width)","--reka-select-content-available-height":"var(--reka-popper-available-height)","--reka-select-trigger-width":"var(--reka-popper-anchor-width)","--reka-select-trigger-height":"var(--reka-popper-anchor-height)"}}),{default:q(()=>[k(o.$slots,"default")]),_:3},16))}}),fi=di;const pi={onViewportChange:()=>{},itemTextRefCallback:()=>{},itemRefCallback:()=>{}},[tt,qn]=qe("SelectContent");var mi=I({__name:"SelectContentImpl",props:{position:{type:String,required:!1,default:"item-aligned"},bodyLock:{type:Boolean,required:!1,default:!0},memoDependencies:{type:Array,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1,default:"start"},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},dir:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:!0}},emits:["closeAutoFocus","escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,o=t,r=he();vo(),fo(n.bodyLock);const{CollectionSlot:i,getItems:a}=Me(),s=A();So(s);const{search:c,handleTypeaheadSearch:f}=vn(),p=A(),l=A(),d=A(),u=A(!1),m=A(!1),y=A(!1);function x(){l.value&&s.value&&Ht([l.value,s.value])}H(u,()=>{x()});const{onOpenChange:v,triggerPointerDownPosRef:b}=r;de(w=>{if(!s.value)return;let S={x:0,y:0};const E=T=>{var L,K;S={x:Math.abs(Math.round(T.pageX)-(((L=b.value)==null?void 0:L.x)??0)),y:Math.abs(Math.round(T.pageY)-(((K=b.value)==null?void 0:K.y)??0))}},P=T=>{var L;T.pointerType!=="touch"&&(S.x<=10&&S.y<=10?T.preventDefault():(L=s.value)!=null&&L.contains(T.target)||v(!1),document.removeEventListener("pointermove",E),b.value=null)};b.value!==null&&(document.addEventListener("pointermove",E),document.addEventListener("pointerup",P,{capture:!0,once:!0})),w(()=>{document.removeEventListener("pointermove",E),document.removeEventListener("pointerup",P,{capture:!0})})});function C(w){const S=w.ctrlKey||w.altKey||w.metaKey;if(w.key==="Tab"&&w.preventDefault(),!S&&w.key.length===1&&f(w.key,a()),["ArrowUp","ArrowDown","Home","End"].includes(w.key)){let P=[...a().map(T=>T.ref)];if(["ArrowUp","End"].includes(w.key)&&(P=P.slice().reverse()),["ArrowUp","ArrowDown"].includes(w.key)){const T=w.target,L=P.indexOf(T);P=P.slice(L+1)}setTimeout(()=>Ht(P)),w.preventDefault()}}const h=O(()=>n.position==="popper"?n:{}),_=At(h.value);return qn({content:s,viewport:p,onViewportChange:w=>{p.value=w},itemRefCallback:(w,S,E)=>{const P=!m.value&&!E,T=Le(r.modelValue.value,S,r.by);if(r.multiple.value){if(y.value)return;(T||P)&&(l.value=w,T&&(y.value=!0))}else(T||P)&&(l.value=w);P&&(m.value=!0)},selectedItem:l,selectedItemText:d,onItemLeave:()=>{var w;(w=s.value)==null||w.focus()},itemTextRefCallback:(w,S,E)=>{const P=!m.value&&!E;(Le(r.modelValue.value,S,r.by)||P)&&(d.value=w)},focusSelectedItem:x,position:n.position,isPositioned:u,searchRef:c}),(w,S)=>(R(),B(g(i),null,{default:q(()=>[M(g(Wo),{"as-child":"",onMountAutoFocus:S[6]||(S[6]=Be(()=>{},["prevent"])),onUnmountAutoFocus:S[7]||(S[7]=E=>{var P;o("closeAutoFocus",E),!E.defaultPrevented&&((P=g(r).triggerElement.value)==null||P.focus({preventScroll:!0}),E.preventDefault())})},{default:q(()=>[M(g(ko),{"as-child":"","disable-outside-pointer-events":w.disableOutsidePointerEvents,onFocusOutside:S[2]||(S[2]=Be(()=>{},["prevent"])),onDismiss:S[3]||(S[3]=E=>g(r).onOpenChange(!1)),onEscapeKeyDown:S[4]||(S[4]=E=>o("escapeKeyDown",E)),onPointerDownOutside:S[5]||(S[5]=E=>o("pointerDownOutside",E))},{default:q(()=>[(R(),B(eo(w.position==="popper"?fi:wi),Q({...w.$attrs,...g(_)},{id:g(r).contentId,ref:E=>{if(!E)return;const P=g(Fe)(E);P!=null&&P.hasAttribute("data-reka-popper-content-wrapper")?s.value=P.firstElementChild:s.value=P},role:"listbox","data-state":g(r).open.value?"open":"closed",dir:g(r).dir.value,style:{display:"flex",flexDirection:"column",outline:"none"},onContextmenu:S[0]||(S[0]=Be(()=>{},["prevent"])),onPlaced:S[1]||(S[1]=E=>u.value=!0),onKeydown:C}),{default:q(()=>[k(w.$slots,"default")]),_:3},16,["id","data-state","dir","onKeydown"]))]),_:3},8,["disable-outside-pointer-events"])]),_:3})]),_:3}))}}),vi=mi;const[hi,yi]=qe("SelectItemAlignedPosition");var gi=I({inheritAttrs:!1,__name:"SelectItemAlignedPosition",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["placed"],setup(e,{emit:t}){const n=e,o=t,{getItems:r}=Me(),i=he(),a=tt(),s=A(!1),c=A(!0),f=A(),{forwardRef:p,currentElement:l}=ne(),{viewport:d,selectedItem:u,selectedItemText:m,focusSelectedItem:y}=a;function x(){if(i.triggerElement.value&&i.valueElement.value&&f.value&&l.value&&(d!=null&&d.value)&&(u!=null&&u.value)&&(m!=null&&m.value)){const C=i.triggerElement.value.getBoundingClientRect(),h=l.value.getBoundingClientRect(),_=i.valueElement.value.getBoundingClientRect(),w=m.value.getBoundingClientRect();if(i.dir.value!=="rtl"){const oe=w.left-h.left,le=_.left-oe,ye=C.left-le,ge=C.width+ye,ot=Math.max(ge,h.width),rt=window.innerWidth-G,it=Ft(le,G,Math.max(G,rt-ot));f.value.style.minWidth=`${ge}px`,f.value.style.left=`${it}px`}else{const oe=h.right-w.right,le=window.innerWidth-_.right-oe,ye=window.innerWidth-C.right-le,ge=C.width+ye,ot=Math.max(ge,h.width),rt=window.innerWidth-G,it=Ft(le,G,Math.max(G,rt-ot));f.value.style.minWidth=`${ge}px`,f.value.style.right=`${it}px`}const S=r().map(oe=>oe.ref),E=window.innerHeight-G*2,P=d.value.scrollHeight,T=window.getComputedStyle(l.value),L=Number.parseInt(T.borderTopWidth,10),K=Number.parseInt(T.paddingTop,10),D=Number.parseInt(T.borderBottomWidth,10),$=Number.parseInt(T.paddingBottom,10),N=L+K+P+$+D,F=Math.min(u.value.offsetHeight*5,N),V=window.getComputedStyle(d.value),W=Number.parseInt(V.paddingTop,10),z=Number.parseInt(V.paddingBottom,10),Ce=C.top+C.height/2-G,Rn=E-Ce,nt=u.value.offsetHeight/2,Bn=u.value.offsetTop+nt,Ve=L+K+Bn,kn=N-Ve;if(Ve<=Ce){const oe=u.value===S.at(-1);f.value.style.bottom="0px";const le=l.value.clientHeight-d.value.offsetTop-d.value.offsetHeight,ye=Math.max(Rn,nt+(oe?z:0)+le+D),ge=Ve+ye;f.value.style.height=`${ge}px`}else{const oe=u.value===S[0];f.value.style.top="0px";const ye=Math.max(Ce,L+d.value.offsetTop+(oe?W:0)+nt)+kn;f.value.style.height=`${ye}px`,d.value.scrollTop=Ve-Ce+d.value.offsetTop}f.value.style.margin=`${G}px 0`,f.value.style.minHeight=`${F}px`,f.value.style.maxHeight=`${E}px`,o("placed"),requestAnimationFrame(()=>s.value=!0)}}const v=A("");me(async()=>{await X(),x(),l.value&&(v.value=window.getComputedStyle(l.value).zIndex)});function b(C){C&&c.value===!0&&(x(),y==null||y(),c.value=!1)}return to(i.triggerElement,()=>{x()}),yi({contentWrapper:f,shouldExpandOnScrollRef:s,onScrollButtonChange:b}),(C,h)=>(R(),ce("div",{ref_key:"contentWrapperElement",ref:f,style:St({display:"flex",flexDirection:"column",position:"fixed",zIndex:v.value})},[M(g(U),Q({ref:g(p),style:{boxSizing:"border-box",maxHeight:"100%"}},{...C.$attrs,...n}),{default:q(()=>[k(C.$slots,"default")]),_:3},16)],4))}}),wi=gi,bi=I({inheritAttrs:!1,__name:"SelectProvider",props:{context:{type:Object,required:!0}},setup(e){return Tn(e.context),qn(pi),(n,o)=>k(n.$slots,"default")}}),xi=bi;const Si={key:1};var _i=I({inheritAttrs:!1,__name:"SelectContent",props:{forceMount:{type:Boolean,required:!1},position:{type:String,required:!1},bodyLock:{type:Boolean,required:!1},memoDependencies:{type:Array,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},sideFlip:{type:Boolean,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},alignFlip:{type:Boolean,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},hideShiftedArrow:{type:Boolean,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1},disableUpdateOnLayoutShift:{type:Boolean,required:!1},prioritizePosition:{type:Boolean,required:!1},reference:{type:null,required:!1},dir:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1}},emits:["closeAutoFocus","escapeKeyDown","pointerDownOutside"],setup(e,{emit:t}){const n=e,r=yo(n,t),i=he(),a=A();me(()=>{a.value=new DocumentFragment});const s=A(),c=O(()=>n.forceMount||i.open.value),f=A(c.value);let p;function l(){p&&(clearTimeout(p),p=void 0)}return H(c,(d,u,m)=>{l(),p=setTimeout(()=>{f.value=c.value,p=void 0}),m(l)}),Ne(l),(d,u)=>{var m;return c.value||f.value||(m=s.value)!=null&&m.present?(R(),B(g(Po),{key:0,ref_key:"presenceRef",ref:s,present:c.value},{default:q(()=>[M(vi,cn(dn({...g(r),...d.$attrs})),{default:q(()=>[k(d.$slots,"default")]),_:3},16)]),_:3},8,["present"])):a.value?(R(),ce("div",Si,[(R(),B(sn,{to:a.value},[M(xi,{context:g(i)},{default:q(()=>[k(d.$slots,"default")]),_:3},8,["context"])],8,["to"]))])):ke("v-if",!0)}}}),Ci=_i;const[Dn,Ei]=qe("SelectItem");var Ai=I({__name:"SelectItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},textValue:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["select"],setup(e,{emit:t}){const n=e,o=t,{disabled:r}=Xe(n),i=he(),a=tt(),{forwardRef:s,currentElement:c}=ne(),{CollectionItem:f}=Me(),p=O(()=>{var h;return Le((h=i.modelValue)==null?void 0:h.value,n.value,i.by)}),l=A(!1),d=A(n.textValue??""),u=nn(void 0,"reka-select-item-text"),m="select.select";async function y(h){if(h.defaultPrevented)return;const _={originalEvent:h,value:n.value};Et(m,x,_)}async function x(h){await X(),o("select",h),!h.defaultPrevented&&(r.value||(i.onValueChange(n.value),i.multiple.value||i.onOpenChange(!1)))}async function v(h){var _,w;await X(),!h.defaultPrevented&&(r.value?(_=a.onItemLeave)==null||_.call(a):(w=h.currentTarget)==null||w.focus({preventScroll:!0}))}async function b(h){var _;await X(),!h.defaultPrevented&&h.currentTarget===J()&&((_=a.onItemLeave)==null||_.call(a))}async function C(h){var w;await X(),!(h.defaultPrevented||((w=a.searchRef)==null?void 0:w.value)!==""&&h.key===" ")&&(ri.includes(h.key)&&y(h),h.key===" "&&h.preventDefault())}if(n.value==="")throw new Error("A must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return me(()=>{c.value&&a.itemRefCallback(c.value,n.value,n.disabled)}),Ei({value:n.value,disabled:r,textId:u,isSelected:p,onItemTextChange:h=>{d.value=((d.value||(h==null?void 0:h.textContent))??"").trim()}}),(h,_)=>(R(),B(g(f),{value:{textValue:d.value}},{default:q(()=>[M(g(U),{ref:g(s),role:"option","aria-labelledby":g(u),"data-highlighted":l.value?"":void 0,"aria-selected":p.value,"data-state":p.value?"checked":"unchecked","aria-disabled":g(r)||void 0,"data-disabled":g(r)?"":void 0,tabindex:g(r)?void 0:-1,as:h.as,"as-child":h.asChild,onFocus:_[0]||(_[0]=w=>l.value=!0),onBlur:_[1]||(_[1]=w=>l.value=!1),onPointerup:y,onPointerdown:_[2]||(_[2]=w=>{w.currentTarget.focus({preventScroll:!0})}),onTouchend:_[3]||(_[3]=Be(()=>{},["prevent","stop"])),onPointermove:v,onPointerleave:b,onKeydown:C},{default:q(()=>[k(h.$slots,"default")]),_:3},8,["aria-labelledby","data-highlighted","aria-selected","data-state","aria-disabled","data-disabled","tabindex","as","as-child"])]),_:3},8,["value"]))}}),Oi=Ai,Pi=I({__name:"SelectItemIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=e,n=Dn();return(o,r)=>g(n).isSelected.value?(R(),B(g(U),Q({key:0,"aria-hidden":"true"},t),{default:q(()=>[k(o.$slots,"default")]),_:3},16)):ke("v-if",!0)}}),Ti=Pi,qi=I({inheritAttrs:!1,__name:"SelectItemText",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=e,n=he(),o=tt(),r=Dn(),{forwardRef:i,currentElement:a}=ne(),s=O(()=>{var c,f;return{value:r.value,disabled:r.disabled.value,textContent:((c=a.value)==null?void 0:c.textContent)??((f=r.value)==null?void 0:f.toString())??""}});return me(()=>{a.value&&(r.onItemTextChange(a.value),o.itemTextRefCallback(a.value,r.value,r.disabled.value),n.onOptionAdd(s.value))}),Ne(()=>{n.onOptionRemove(s.value)}),(c,f)=>(R(),B(g(U),Q({id:g(r).textId,ref:g(i)},{...t,...c.$attrs}),{default:q(()=>[k(c.$slots,"default")]),_:3},16,["id"]))}}),Di=qi,Ri=I({__name:"SelectPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){const t=e;return(n,o)=>(R(),B(g(Ho),cn(dn(t)),{default:q(()=>[k(n.$slots,"default")]),_:3},16))}}),Bi=Ri,ki=I({__name:"SelectTrigger",props:{disabled:{type:Boolean,required:!1},reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(e){const t=e,n=he(),{forwardRef:o,currentElement:r}=ne(),i=O(()=>{var v;return((v=n.disabled)==null?void 0:v.value)||t.disabled});n.contentId||(n.contentId=nn(void 0,"reka-select-content")),me(()=>{n.onTriggerChange(r.value)});const{getItems:a}=Me(),{search:s,handleTypeaheadSearch:c,resetTypeahead:f}=vn();function p(){i.value||(n.onOpenChange(!0),f())}function l(v){p(),n.triggerPointerDownPosRef.value={x:Math.round(v.pageX),y:Math.round(v.pageY)}}function d(v){return v.button===0&&v.ctrlKey===!1}let u=!1;function m(v){if(v.pointerType==="touch")return v.preventDefault();const b=v.target;b.hasPointerCapture(v.pointerId)&&b.releasePointerCapture(v.pointerId),d(v)&&(l(v),u=!0)}function y(v){d(v)&&v.preventDefault()}function x(v){var b;u||(b=v.currentTarget)==null||b.focus(),u=!1}return(v,b)=>(R(),B(g(Jo),{"as-child":"",reference:v.reference},{default:q(()=>{var C,h,_,w;return[M(g(U),{ref:g(o),role:"combobox",type:v.as==="button"?"button":void 0,"aria-controls":g(n).contentId,"aria-expanded":g(n).open.value||!1,"aria-required":(C=g(n).required)==null?void 0:C.value,"aria-autocomplete":"none",disabled:i.value,dir:(h=g(n))==null?void 0:h.dir.value,"data-state":(_=g(n))!=null&&_.open.value?"open":"closed","data-disabled":i.value?"":void 0,"data-placeholder":g(ii)((w=g(n).modelValue)==null?void 0:w.value)?"":void 0,"as-child":v.asChild,as:v.as,onClick:x,onPointerdown:m,onMousedown:y,onPointerup:b[0]||(b[0]=Be(S=>{S.pointerType==="touch"&&l(S)},["prevent"])),onKeydown:b[1]||(b[1]=S=>{const E=g(s)!=="";!(S.ctrlKey||S.altKey||S.metaKey)&&S.key.length===1&&E&&S.key===" "||(g(c)(S.key,g(a)()),g(oi).includes(S.key)&&(p(),S.preventDefault()))})},{default:q(()=>[k(v.$slots,"default")]),_:3},8,["type","aria-controls","aria-expanded","aria-required","disabled","dir","data-state","data-disabled","data-placeholder","as-child","as"])]}),_:3},8,["reference"]))}}),Ii=ki,$i=I({__name:"SelectValue",props:{placeholder:{type:String,required:!1,default:""},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(e){const t=e,{forwardRef:n,currentElement:o}=ne(),r=he();me(()=>{r.valueElement=o});const i=O(()=>{var p;let s=[];const c=Array.from(r.optionsSet.value),f=l=>c.find(d=>Le(l,d.value,r.by));return Array.isArray(r.modelValue.value)?s=r.modelValue.value.map(l=>{var d;return((d=f(l))==null?void 0:d.textContent)??""}):s=[((p=f(r.modelValue.value))==null?void 0:p.textContent)??""],s.filter(Boolean)}),a=O(()=>i.value.length?i.value.join(", "):t.placeholder);return(s,c)=>(R(),B(g(U),{ref:g(n),as:s.as,"as-child":s.asChild,style:{pointerEvents:"none"},"data-placeholder":i.value.length?void 0:t.placeholder},{default:q(()=>[k(s.$slots,"default",{selectedLabel:i.value,modelValue:g(r).modelValue.value},()=>[Ct(fn(a.value),1)])]),_:3},8,["as","as-child","data-placeholder"]))}}),Li=$i,Mi=I({__name:"SelectViewport",props:{nonce:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){const t=e,{nonce:n}=Xe(t),o=ni(n),r=tt(),i=r.position==="item-aligned"?hi():void 0,{forwardRef:a,currentElement:s}=ne();me(()=>{r==null||r.onViewportChange(s.value)});const c=A(0);function f(p){const l=p.currentTarget,{shouldExpandOnScrollRef:d,contentWrapper:u}=i??{};if(d!=null&&d.value&&(u!=null&&u.value)){const m=Math.abs(c.value-l.scrollTop);if(m>0){const y=window.innerHeight-G*2,x=Number.parseFloat(u.value.style.minHeight),v=Number.parseFloat(u.value.style.height),b=Math.max(x,v);if(b0?_:0,u.value.style.justifyContent="flex-end")}}}c.value=l.scrollTop}return(p,l)=>(R(),ce(_t,null,[M(g(U),Q({ref:g(a),"data-reka-select-viewport":"",role:"presentation"},{...p.$attrs,...t},{style:{position:"relative",flex:1,overflow:"hidden auto"},onScroll:f}),{default:q(()=>[k(p.$slots,"default")]),_:3},16),M(g(U),{as:"style",nonce:g(o)},{default:q(()=>l[0]||(l[0]=[Ct(" /* Hide scrollbars cross-browser and enable momentum scroll for touch devices */ [data-reka-select-viewport] { scrollbar-width:none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } [data-reka-select-viewport]::-webkit-scrollbar { display: none; } ")])),_:1,__:[0]},8,["nonce"])],64))}}),Fi=Mi;const Ui=I({__name:"Select",props:{modelValue:{},options:{},placeholder:{},ariaLabel:{},class:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,o=t;return(r,i)=>(R(),B(g(li),{"model-value":n.modelValue,"onUpdate:modelValue":i[0]||(i[0]=a=>o("update:modelValue",String(a)))},{default:q(()=>[M(g(Ii),{"aria-label":n.ariaLabel,class:no(g(oo)("border-input bg-background flex h-9 w-full items-center justify-between gap-2 rounded-md border px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none","focus-visible:border-ring focus-visible:ring-ring/40 focus-visible:ring-[3px]","data-[placeholder]:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",n.class))},{default:q(()=>[M(g(Li),{placeholder:n.placeholder??"",class:"truncate"},null,8,["placeholder"]),M(g(io),{class:"size-4 shrink-0 opacity-50"})]),_:1},8,["aria-label","class"]),M(g(Bi),null,{default:q(()=>[M(g(Ci),{position:"popper","side-offset":4,class:"bg-popover text-popover-foreground animate-fade-in relative z-50 max-h-72 min-w-[var(--reka-select-trigger-width)] overflow-hidden rounded-md border shadow-md"},{default:q(()=>[M(g(Fi),{class:"p-1"},{default:q(()=>[(R(!0),ce(_t,null,un(n.options,a=>(R(),B(g(Oi),{key:a.value,value:a.value,class:"focus:bg-accent focus:text-accent-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50"},{default:q(()=>[M(g(Di),null,{default:q(()=>[Ct(fn(a.label),1)]),_:2},1024),M(g(Ti),{class:"absolute right-2 flex items-center"},{default:q(()=>[M(g(ro),{class:"size-4"})]),_:1})]),_:2},1032,["value"]))),128))]),_:1})]),_:1})]),_:1})]),_:1},8,["model-value"]))}});export{ko as D,Wo as F,Po as P,Ho as T,Uo as V,Ui as _,mo as a,So as b,fo as c,Hi as g,ho as u}; diff --git a/web/dist/assets/SettingsView-CQy8Fv4M.js b/web/dist/assets/SettingsView-CQy8Fv4M.js new file mode 100644 index 0000000..91333bb --- /dev/null +++ b/web/dist/assets/SettingsView-CQy8Fv4M.js @@ -0,0 +1,16 @@ +import{c as y,d as M,o as u,a as r,e as L,u as t,f as T,K as F,M as z,p as a,l as e,w as n,_ as f,m as R,k as c,t as o,b as i,F as _,r as p,h as D,i as N,s as $,a1 as E,a2 as q,g as v,a3 as H,v as K,a4 as U,a5 as A}from"./index-D3ZCYstt.js";import{_ as G}from"./PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js";import{_ as x,a as h,c as b,b as J}from"./CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js";import{_ as P}from"./Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js";import"./Collection-D-pf6tmY.js";/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const W=y("BookOpenIcon",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const X=y("LogOutIcon",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Y=y("MonitorIcon",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]),Z=M({__name:"Separator",props:{class:{},orientation:{default:"horizontal"}},setup(k){const g=k;return(w,S)=>(u(),r("div",{role:"separator",class:L(t(T)("bg-border shrink-0",g.orientation==="vertical"?"h-full w-px":"h-px w-full",g.class))},null,2))}}),ee={class:"max-w-3xl"},te={class:"flex flex-col gap-2"},se={class:"text-sm font-medium"},ae={class:"bg-muted grid grid-cols-3 gap-1 rounded-lg p-1"},le=["onClick"],ne={class:"flex items-center justify-between gap-4"},oe={class:"text-sm font-medium"},ie={class:"flex flex-col"},ue={class:"text-muted-foreground shrink-0"},re={class:"truncate font-mono text-xs sm:text-[13px]"},ce={class:"flex flex-col"},de={class:"text-muted-foreground shrink-0"},ge={class:"truncate font-mono text-xs sm:text-[13px]"},he=M({__name:"SettingsView",setup(k){const g=K(),{theme:w,setTheme:S}=E(),{lang:V,setLang:C}=q(),m=R(null);F(async()=>{try{m.value=await z.info()}catch{}});const B=v(()=>[{value:"light",label:e("settings.themeLight"),icon:U},{value:"dark",label:e("settings.themeDark"),icon:A},{value:"system",label:e("settings.themeSystem"),icon:Y}]),Q=[{value:"en",label:"English"},{value:"zh",label:"中文"}],j=v(()=>{const s=m.value;return s?[{label:e("settings.version"),value:s.commit?`${s.version} (${s.commit})`:s.version},{label:e("settings.platform"),value:s.platform},{label:e("settings.goVersion"),value:s.goVersion},{label:e("settings.hostname"),value:s.hostname},{label:e("settings.ruleFile"),value:s.ruleFile}]:[]}),I=v(()=>{var l;const s=(l=m.value)==null?void 0:l.config;if(!s)return[];const d=[{label:e("settings.workers"),value:s.workers>0?String(s.workers):e("settings.auto")},{label:e("settings.workerQueueSize"),value:s.workerQueueSize>0?String(s.workerQueueSize):e("settings.auto")},{label:e("settings.ioQueueSize"),value:s.ioQueueSize>0?String(s.ioQueueSize):e("settings.auto")},{label:e("settings.ioLocal"),value:s.ioLocal?e("common.enabled"):e("common.disabled")},{label:e("settings.ioRST"),value:s.ioRST?e("common.enabled"):e("common.disabled")},{label:e("settings.udpMaxStreams"),value:s.udpMaxStreams>0?String(s.udpMaxStreams):e("settings.auto")}];return s.geoip&&d.push({label:e("settings.geoip"),value:s.geoip}),s.geosite&&d.push({label:e("settings.geosite"),value:s.geosite}),d});async function O(){H(),await z.logout(),await g.replace({name:"login"})}return(s,d)=>(u(),r("div",ee,[a(G,{title:t(e)("settings.title"),description:t(e)("settings.subtitle")},null,8,["title","description"]),a(t(f),null,{default:n(()=>[a(t(x),null,{default:n(()=>[a(t(h),null,{default:n(()=>[c(o(t(e)("settings.appearance")),1)]),_:1})]),_:1}),a(t(b),{class:"flex flex-col gap-4"},{default:n(()=>[i("div",te,[i("span",se,o(t(e)("settings.theme")),1),i("div",ae,[(u(!0),r(_,null,p(B.value,l=>(u(),r("button",{key:l.value,type:"button",class:L(["flex items-center justify-center gap-1.5 rounded-md px-2 py-1.5 text-xs font-medium transition-colors sm:text-sm",t(w)===l.value?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"]),onClick:me=>t(S)(l.value)},[(u(),D(N(l.icon),{class:"size-3.5"})),c(" "+o(l.label),1)],10,le))),128))])]),i("div",ne,[i("span",oe,o(t(e)("settings.language")),1),a(t(P),{"model-value":t(V),options:Q,class:"w-36","aria-label":t(e)("settings.language"),"onUpdate:modelValue":d[0]||(d[0]=l=>t(C)(l))},null,8,["model-value","aria-label"])])]),_:1})]),_:1}),a(t(f),{class:"mt-3"},{default:n(()=>[a(t(x),null,{default:n(()=>[a(t(h),null,{default:n(()=>[c(o(t(e)("settings.instance")),1)]),_:1}),a(t(J),null,{default:n(()=>[c(o(t(e)("settings.engineConfig")),1)]),_:1})]),_:1}),a(t(b),null,{default:n(()=>[i("dl",ie,[(u(!0),r(_,null,p(j.value,l=>(u(),r("div",{key:l.label,class:"flex items-start justify-between gap-4 py-1.5 text-sm"},[i("dt",ue,o(l.label),1),i("dd",re,o(l.value),1)]))),128))]),a(t(Z),{class:"my-3"}),i("dl",ce,[(u(!0),r(_,null,p(I.value,l=>(u(),r("div",{key:l.label,class:"flex items-start justify-between gap-4 py-1.5 text-sm"},[i("dt",de,o(l.label),1),i("dd",ge,o(l.value),1)]))),128))])]),_:1})]),_:1}),a(t(f),{class:"mt-3"},{default:n(()=>[a(t(x),null,{default:n(()=>[a(t(h),null,{default:n(()=>[c(o(t(e)("settings.session")),1)]),_:1})]),_:1}),a(t(b),{class:"flex flex-wrap gap-2"},{default:n(()=>[a(t($),{variant:"destructive",onClick:O},{default:n(()=>[a(t(X),{class:"size-4"}),c(" "+o(t(e)("settings.logout")),1)]),_:1}),a(t($),{variant:"outline",as:"a",href:"https://gfw.dev/",target:"_blank",rel:"noreferrer"},{default:n(()=>[a(t(W),{class:"size-4"}),c(" "+o(t(e)("settings.docs")),1)]),_:1})]),_:1})]),_:1})]))}});export{he as default}; diff --git a/web/dist/assets/Skeleton.vue_vue_type_script_setup_true_lang-C9uTg8Ty.js b/web/dist/assets/Skeleton.vue_vue_type_script_setup_true_lang-C9uTg8Ty.js new file mode 100644 index 0000000..dddd413 --- /dev/null +++ b/web/dist/assets/Skeleton.vue_vue_type_script_setup_true_lang-C9uTg8Ty.js @@ -0,0 +1 @@ +import{d as a,o as n,a as o,e as t,u as c,f as r}from"./index-D3ZCYstt.js";const u=a({__name:"Skeleton",props:{class:{}},setup(e){const s=e;return(l,m)=>(n(),o("div",{class:t(c(r)("bg-muted animate-pulse rounded-md",s.class))},null,2))}});export{u as _}; diff --git a/web/dist/assets/TabsTrigger.vue_vue_type_script_setup_true_lang-DTNukDpV.js b/web/dist/assets/TabsTrigger.vue_vue_type_script_setup_true_lang-DTNukDpV.js new file mode 100644 index 0000000..c19c980 --- /dev/null +++ b/web/dist/assets/TabsTrigger.vue_vue_type_script_setup_true_lang-DTNukDpV.js @@ -0,0 +1 @@ +import{d as g,D as R,E as $,o as y,h as _,w as v,p as q,u as o,P as S,H as h,m as C,K as Y,S as J,x as Q,g as w,U as W,G as V,V as X,I as Z,J as ee,e as A,f as E}from"./index-D3ZCYstt.js";import{g as M,a as K,b as O,c as D,d as L}from"./Collection-D-pf6tmY.js";const te="rovingFocusGroup.onEntryFocus",ae={bubbles:!1,cancelable:!0},oe={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function se(r,t){return t!=="rtl"?r:r==="ArrowLeft"?"ArrowRight":r==="ArrowRight"?"ArrowLeft":r}function re(r,t,e){const a=se(r.key,e);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(a))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(a)))return oe[a]}function x(r,t=!1){const e=M();for(const a of r)if(a===e||(a.focus({preventScroll:t}),M()!==e))return}function ne(r,t){return r.map((e,a)=>r[(t+a)%r.length])}const[le,ue]=D("RovingFocusGroup");var ie=g({__name:"RovingFocusGroup",props:{orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!1},currentTabStopId:{type:[String,null],required:!1},defaultCurrentTabStopId:{type:String,required:!1},preventScrollOnEntryFocus:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["entryFocus","update:currentTabStopId"],setup(r,{expose:t,emit:e}){const a=r,d=e,{loop:c,orientation:i,dir:u}=R(a),f=K(u),s=$(a,"currentTabStopId",d,{defaultValue:a.defaultCurrentTabStopId,passive:a.currentTabStopId===void 0}),l=C(!1),n=C(!1),p=C(0),{getItems:B,CollectionSlot:k}=O({isProvider:!0});function N(m){const I=!n.value;if(m.currentTarget&&m.target===m.currentTarget&&I&&!l.value){const T=new CustomEvent(te,ae);if(m.currentTarget.dispatchEvent(T),d("entryFocus",T),!T.defaultPrevented){const F=B().map(b=>b.ref).filter(b=>b.dataset.disabled!==""),G=F.find(b=>b.getAttribute("data-active")===""),j=F.find(b=>b.getAttribute("data-highlighted")===""),z=F.find(b=>b.id===s.value),H=[G,j,z,...F].filter(Boolean);x(H,a.preventScrollOnEntryFocus)}}n.value=!1}function P(){setTimeout(()=>{n.value=!1},1)}return t({getItems:B}),ue({loop:c,dir:f,orientation:i,currentTabStopId:s,onItemFocus:m=>{s.value=m},onItemShiftTab:()=>{l.value=!0},onFocusableItemAdd:()=>{p.value++},onFocusableItemRemove:()=>{p.value--}}),(m,I)=>(y(),_(o(k),null,{default:v(()=>[q(o(S),{tabindex:l.value||p.value===0?-1:0,"data-orientation":o(i),as:m.as,"as-child":m.asChild,dir:o(f),style:{outline:"none"},onMousedown:I[0]||(I[0]=T=>n.value=!0),onMouseup:P,onFocus:N,onBlur:I[1]||(I[1]=T=>l.value=!1)},{default:v(()=>[h(m.$slots,"default")]),_:3},8,["tabindex","data-orientation","as","as-child","dir"])]),_:3}))}}),de=ie,ce=g({__name:"RovingFocusItem",props:{tabStopId:{type:String,required:!1},focusable:{type:Boolean,required:!1,default:!0},active:{type:Boolean,required:!1},allowShiftKey:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(r){const t=r,e=le(),a=L(),d=w(()=>t.tabStopId||a),c=w(()=>e.currentTabStopId.value===d.value),{getItems:i,CollectionItem:u}=O();Y(()=>{t.focusable&&e.onFocusableItemAdd()}),J(()=>{t.focusable&&e.onFocusableItemRemove()}),Q(()=>t.focusable,(s,l)=>{s!==l&&(s?e.onFocusableItemAdd():e.onFocusableItemRemove())});function f(s){if(s.key==="Tab"&&s.shiftKey){e.onItemShiftTab();return}if(s.target!==s.currentTarget)return;const l=re(s,e.orientation.value,e.dir.value);if(l!==void 0){if(s.metaKey||s.ctrlKey||s.altKey||!t.allowShiftKey&&s.shiftKey)return;s.preventDefault();let n=[...i().map(p=>p.ref).filter(p=>p.dataset.disabled!=="")];if(l==="last")n.reverse();else if(l==="prev"||l==="next"){l==="prev"&&n.reverse();const p=n.indexOf(s.currentTarget);n=e.loop.value?ne(n,p+1):n.slice(p+1)}W(()=>x(n))}}return(s,l)=>(y(),_(o(u),null,{default:v(()=>[q(o(S),{tabindex:c.value?0:-1,"data-orientation":o(e).orientation.value,"data-active":s.active?"":void 0,"data-disabled":s.focusable?void 0:"",as:s.as,"as-child":s.asChild,onMousedown:l[0]||(l[0]=n=>{s.focusable?o(e).onItemFocus(d.value):n.preventDefault()}),onFocus:l[1]||(l[1]=n=>o(e).onItemFocus(d.value)),onKeydown:f},{default:v(()=>[h(s.$slots,"default")]),_:3},8,["tabindex","data-orientation","data-active","data-disabled","as","as-child"])]),_:3}))}}),fe=ce;const[U,pe]=D("TabsRoot");var ve=g({__name:"TabsRoot",props:{defaultValue:{type:null,required:!1},orientation:{type:String,required:!1,default:"horizontal"},dir:{type:String,required:!1},activationMode:{type:String,required:!1,default:"automatic"},modelValue:{type:null,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:modelValue"],setup(r,{emit:t}){const e=r,a=t,{orientation:d,unmountOnHide:c,dir:i}=R(e),u=K(i);V();const f=$(e,"modelValue",a,{defaultValue:e.defaultValue,passive:e.modelValue===void 0}),s=C(),l=X(new Set);return pe({modelValue:f,changeModelValue:n=>{f.value=n},orientation:d,dir:u,unmountOnHide:c,activationMode:e.activationMode,baseId:L(void 0,"reka-tabs"),tabsList:s,contentIds:l,registerContent:n=>{l.value=new Set([...l.value,n])},unregisterContent:n=>{const p=new Set(l.value);p.delete(n),l.value=p}}),(n,p)=>(y(),_(o(S),{dir:o(u),"data-orientation":o(d),"as-child":n.asChild,as:n.as},{default:v(()=>[h(n.$slots,"default",{modelValue:o(f)})]),_:3},8,["dir","data-orientation","as-child","as"]))}}),me=ve;function be(r,t){return`${r}-trigger-${t}`}function ge(r,t){return`${r}-content-${t}`}var ye=g({__name:"TabsList",props:{loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(r){const t=r,{loop:e}=R(t),{forwardRef:a,currentElement:d}=V(),c=U();return c.tabsList=d,(i,u)=>(y(),_(o(de),{"as-child":"",orientation:o(c).orientation.value,dir:o(c).dir.value,loop:o(e)},{default:v(()=>[q(o(S),{ref:o(a),role:"tablist","as-child":i.asChild,as:i.as,"aria-orientation":o(c).orientation.value},{default:v(()=>[h(i.$slots,"default")]),_:3},8,["as-child","as","aria-orientation"])]),_:3},8,["orientation","dir","loop"]))}}),_e=ye,he=g({__name:"TabsTrigger",props:{value:{type:[String,Number],required:!0},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(r){const t=r,{forwardRef:e}=V(),a=U(),d=w(()=>be(a.baseId,t.value)),c=w(()=>a.contentIds.value.has(t.value)?ge(a.baseId,t.value):void 0),i=w(()=>t.value===a.modelValue.value);return(u,f)=>(y(),_(o(fe),{"as-child":"",focusable:!u.disabled,active:i.value},{default:v(()=>[q(o(S),{id:d.value,ref:o(e),role:"tab",type:u.as==="button"?"button":void 0,as:u.as,"as-child":u.asChild,"aria-selected":i.value?"true":"false","aria-controls":c.value,"data-state":i.value?"active":"inactive",disabled:u.disabled,"data-disabled":u.disabled?"":void 0,"data-orientation":o(a).orientation.value,onMousedown:f[0]||(f[0]=ee(s=>{!u.disabled&&s.ctrlKey===!1?o(a).changeModelValue(u.value):s.preventDefault()},["left"])),onKeydown:f[1]||(f[1]=Z(s=>o(a).changeModelValue(u.value),["enter","space"])),onFocus:f[2]||(f[2]=()=>{const s=o(a).activationMode!=="manual";!i.value&&!u.disabled&&s&&o(a).changeModelValue(u.value)})},{default:v(()=>[h(u.$slots,"default")]),_:3},8,["id","type","as","as-child","aria-selected","aria-controls","data-state","disabled","data-disabled","data-orientation"])]),_:3},8,["focusable","active"]))}}),Ie=he;const Se=g({__name:"Tabs",props:{class:{},modelValue:{}},emits:["update:modelValue"],setup(r,{emit:t}){const e=r,a=t;return(d,c)=>(y(),_(o(me),{"model-value":e.modelValue,class:A(o(E)("flex flex-col gap-3",e.class)),"onUpdate:modelValue":c[0]||(c[0]=i=>a("update:modelValue",String(i)))},{default:v(()=>[h(d.$slots,"default")]),_:3},8,["model-value","class"]))}}),Fe=g({__name:"TabsList",props:{class:{}},setup(r){const t=r;return(e,a)=>(y(),_(o(_e),{class:A(o(E)("bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-1",t.class))},{default:v(()=>[h(e.$slots,"default")]),_:3},8,["class"]))}}),Ce=g({__name:"TabsTrigger",props:{class:{},value:{}},setup(r){const t=r;return(e,a)=>(y(),_(o(Ie),{value:t.value,class:A(o(E)("inline-flex flex-1 items-center justify-center gap-1.5 rounded-md px-3 py-1 text-sm font-medium whitespace-nowrap transition-all outline-none","data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm","focus-visible:ring-ring/40 focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50","[&_svg]:size-3.5",t.class))},{default:v(()=>[h(e.$slots,"default")]),_:3},8,["value","class"]))}});export{Se as _,Fe as a,Ce as b,ge as c,U as i,be as m}; diff --git a/web/dist/assets/format-B6sc_rZ4.js b/web/dist/assets/format-B6sc_rZ4.js new file mode 100644 index 0000000..0aaaa89 --- /dev/null +++ b/web/dist/assets/format-B6sc_rZ4.js @@ -0,0 +1 @@ +function o(t){if(!Number.isFinite(t))return"0";if(t<1e3)return String(t);const e=["k","M","G","T"];let n=t,r=-1;for(;n>=1e3&&r=100?Math.round(n):n.toFixed(1).replace(/\.0$/,"")}${e[r]}`}function i(t,e){return e?Math.round(t/e*100):0}function u(t){if(t<60)return`${Math.max(0,Math.floor(t))}s`;const e=Math.floor(t/86400),n=Math.floor(t%86400/3600),r=Math.floor(t%3600/60);return e>0?`${e}d ${n}h`:n>0?`${n}h ${r}m`:`${r}m`}function a(t){return new Date(t).toLocaleTimeString(void 0,{hour12:!1})}function f(t){const e=new Date(t);return`${e.toLocaleDateString()} ${e.toLocaleTimeString(void 0,{hour12:!1})}`}function c(t,e){return t.includes(":")?`[${t}]:${e}`:`${t}:${e}`}export{f as a,o as c,u as d,c as e,i as p,a as t}; diff --git a/web/dist/assets/index-CNsDVyYx.css b/web/dist/assets/index-CNsDVyYx.css new file mode 100644 index 0000000..2160faa --- /dev/null +++ b/web/dist/assets/index-CNsDVyYx.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-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-border-style:solid;--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}}}@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";--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-3xl:48rem;--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;--leading-relaxed:1.625;--radius-2xl:1rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--color-background:var(--background);--color-foreground:var(--foreground);--color-muted-foreground:var(--muted-foreground);--color-border:var(--border)}}@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%;-moz-tab-size:4;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance: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(--color-border)}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}body{background-color:var(--color-background);color:var(--color-foreground);font-feature-settings:"cv02","cv03","cv04","cv11";overscroll-behavior-y:none;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb{background:color-mix(in oklab,var(--color-muted-foreground) 35%,transparent)}}::-webkit-scrollbar-thumb{background-clip:content-box;border:3px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb:hover{background:color-mix(in oklab,var(--color-muted-foreground) 55%,transparent)}}::-webkit-scrollbar-thumb:hover{background-clip:content-box}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\/2{top:50%}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:0}.left-0{left:0}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-100{z-index:100}.-m-1{margin:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-3{margin-block:calc(var(--spacing) * 3)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.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)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.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-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.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-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.h-1{height:var(--spacing)}.h-2{height:calc(var(--spacing) * 2)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-36{height:calc(var(--spacing) * 36)}.h-\[60vh\]{height:60vh}.h-full{height:100%}.h-px{height:1px}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[92vh\]{max-height:92vh}.min-h-0{min-height:0}.min-h-20{min-height:calc(var(--spacing) * 20)}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-dvh{min-height:100dvh}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-36{width:calc(var(--spacing) * 36)}.w-56{width:calc(var(--spacing) * 56)}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-3xl{max-width:var(--container-3xl)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-\[var\(--reka-select-trigger-width\)\]{min-width:var(--reka-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-2{--tw-translate-y:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-fade-in{animation:.18s ease-out fade-in}.animate-pulse{animation:var(--animate-pulse)}.animate-pulse-dot{animation:1.8s ease-in-out infinite pulse-dot}.animate-slide-up{animation:.22s cubic-bezier(.32,.72,0,1) slide-up}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.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\.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)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-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-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-allow\/25{border-color:var(--allow)}@supports (color:color-mix(in lab,red,red)){.border-allow\/25{border-color:color-mix(in oklab,var(--allow) 25%,transparent)}}.border-allow\/30{border-color:var(--allow)}@supports (color:color-mix(in lab,red,red)){.border-allow\/30{border-color:color-mix(in oklab,var(--allow) 30%,transparent)}}.border-allow\/40{border-color:var(--allow)}@supports (color:color-mix(in lab,red,red)){.border-allow\/40{border-color:color-mix(in oklab,var(--allow) 40%,transparent)}}.border-block\/25{border-color:var(--block)}@supports (color:color-mix(in lab,red,red)){.border-block\/25{border-color:color-mix(in oklab,var(--block) 25%,transparent)}}.border-block\/30{border-color:var(--block)}@supports (color:color-mix(in lab,red,red)){.border-block\/30{border-color:color-mix(in oklab,var(--block) 30%,transparent)}}.border-block\/40{border-color:var(--block)}@supports (color:color-mix(in lab,red,red)){.border-block\/40{border-color:color-mix(in oklab,var(--block) 40%,transparent)}}.border-destructive\/40{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/40{border-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}.border-drop\/25{border-color:var(--drop)}@supports (color:color-mix(in lab,red,red)){.border-drop\/25{border-color:color-mix(in oklab,var(--drop) 25%,transparent)}}.border-drop\/30{border-color:var(--drop)}@supports (color:color-mix(in lab,red,red)){.border-drop\/30{border-color:color-mix(in oklab,var(--drop) 30%,transparent)}}.border-input{border-color:var(--input)}.border-log\/25{border-color:var(--log)}@supports (color:color-mix(in lab,red,red)){.border-log\/25{border-color:color-mix(in oklab,var(--log) 25%,transparent)}}.border-modify\/25{border-color:var(--modify)}@supports (color:color-mix(in lab,red,red)){.border-modify\/25{border-color:color-mix(in oklab,var(--modify) 25%,transparent)}}.border-tcp\/25{border-color:var(--tcp)}@supports (color:color-mix(in lab,red,red)){.border-tcp\/25{border-color:color-mix(in oklab,var(--tcp) 25%,transparent)}}.border-transparent{border-color:#0000}.border-udp\/25{border-color:var(--udp)}@supports (color:color-mix(in lab,red,red)){.border-udp\/25{border-color:color-mix(in oklab,var(--udp) 25%,transparent)}}.bg-accent{background-color:var(--accent)}.bg-allow,.bg-allow\/10{background-color:var(--allow)}@supports (color:color-mix(in lab,red,red)){.bg-allow\/10{background-color:color-mix(in oklab,var(--allow) 10%,transparent)}}.bg-allow\/12{background-color:var(--allow)}@supports (color:color-mix(in lab,red,red)){.bg-allow\/12{background-color:color-mix(in oklab,var(--allow) 12%,transparent)}}.bg-allow\/15{background-color:var(--allow)}@supports (color:color-mix(in lab,red,red)){.bg-allow\/15{background-color:color-mix(in oklab,var(--allow) 15%,transparent)}}.bg-background,.bg-background\/85{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/85{background-color:color-mix(in oklab,var(--background) 85%,transparent)}}.bg-background\/90{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/90{background-color:color-mix(in oklab,var(--background) 90%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-block,.bg-block\/10{background-color:var(--block)}@supports (color:color-mix(in lab,red,red)){.bg-block\/10{background-color:color-mix(in oklab,var(--block) 10%,transparent)}}.bg-block\/12{background-color:var(--block)}@supports (color:color-mix(in lab,red,red)){.bg-block\/12{background-color:color-mix(in oklab,var(--block) 12%,transparent)}}.bg-block\/15{background-color:var(--block)}@supports (color:color-mix(in lab,red,red)){.bg-block\/15{background-color:color-mix(in oklab,var(--block) 15%,transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/40{background-color:var(--card)}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,var(--card) 40%,transparent)}}.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-drop,.bg-drop\/10{background-color:var(--drop)}@supports (color:color-mix(in lab,red,red)){.bg-drop\/10{background-color:color-mix(in oklab,var(--drop) 10%,transparent)}}.bg-drop\/12{background-color:var(--drop)}@supports (color:color-mix(in lab,red,red)){.bg-drop\/12{background-color:color-mix(in oklab,var(--drop) 12%,transparent)}}.bg-log\/12{background-color:var(--log)}@supports (color:color-mix(in lab,red,red)){.bg-log\/12{background-color:color-mix(in oklab,var(--log) 12%,transparent)}}.bg-modify,.bg-modify\/12{background-color:var(--modify)}@supports (color:color-mix(in lab,red,red)){.bg-modify\/12{background-color:color-mix(in oklab,var(--modify) 12%,transparent)}}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/25{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/25{background-color:color-mix(in oklab,var(--muted-foreground) 25%,transparent)}}.bg-muted\/60{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/60{background-color:color-mix(in oklab,var(--muted) 60%,transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/15{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,var(--primary) 15%,transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-tcp,.bg-tcp\/12{background-color:var(--tcp)}@supports (color:color-mix(in lab,red,red)){.bg-tcp\/12{background-color:color-mix(in oklab,var(--tcp) 12%,transparent)}}.bg-udp,.bg-udp\/12{background-color:var(--udp)}@supports (color:color-mix(in lab,red,red)){.bg-udp\/12{background-color:color-mix(in oklab,var(--udp) 12%,transparent)}}.fill-tcp\/45{fill:var(--tcp)}@supports (color:color-mix(in lab,red,red)){.fill-tcp\/45{fill:color-mix(in oklab,var(--tcp) 45%,transparent)}}.fill-udp\/25{fill:var(--udp)}@supports (color:color-mix(in lab,red,red)){.fill-udp\/25{fill:color-mix(in oklab,var(--udp) 25%,transparent)}}.stroke-block{stroke:var(--block)}.stroke-border{stroke:var(--border)}.stroke-foreground\/40{stroke:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.stroke-foreground\/40{stroke:color-mix(in oklab,var(--foreground) 40%,transparent)}}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.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\.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-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.safe-top{padding-top:max(env(safe-area-inset-top),0px)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[max\(1rem\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(1rem,env(safe-area-inset-bottom))}.safe-bottom{padding-bottom:max(env(safe-area-inset-bottom),0px)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}.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}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.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)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:var(--accent-foreground)}.text-allow{color:var(--allow)}.text-block{color:var(--block)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-drop{color:var(--drop)}.text-foreground{color:var(--foreground)}.text-log{color:var(--log)}.text-modify{color:var(--modify)}.text-muted-foreground,.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--muted-foreground) 60%,transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-tcp{color:var(--tcp)}.text-udp{color:var(--udp)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.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-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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-\[2px\]{--tw-backdrop-blur:blur(2px);-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-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\,background-color\]{transition-property:color,box-shadow,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.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}.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)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media(hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.hover\:bg-accent\/60:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/60:hover{background-color:color-mix(in oklab,var(--accent) 60%,transparent)}}.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-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\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.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\/30:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/30:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.focus-visible\:ring-ring\/40:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 40%, transparent)}}.active\:scale-\[0\.98\]:active{scale:.98}.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\.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)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=unchecked\]\:translate-x-0\.5[data-state=unchecked]{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}@media(min-width:40rem){.sm\:top-1\/2{top:50%}.sm\:top-auto{top:auto}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:bottom-auto{bottom:auto}.sm\:left-1\/2{left:50%}.sm\:left-auto{left:auto}.sm\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:h-44{height:calc(var(--spacing) * 44)}.sm\:max-h-\[85vh\]{max-height:85vh}.sm\:w-28{width:calc(var(--spacing) * 28)}.sm\:w-32{width:calc(var(--spacing) * 32)}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:translate-y-2{--tw-translate-y:calc(var(--spacing) * 2);translate:var(--tw-translate-x) var(--tw-translate-y)}.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\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:justify-end{justify-content:flex-end}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:rounded-xl{border-radius:calc(var(--radius) + 4px)}.sm\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pt-5{padding-top:calc(var(--spacing) * 5)}.sm\:pt-6{padding-top:calc(var(--spacing) * 6)}.sm\:pb-5{padding-bottom:calc(var(--spacing) * 5)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[13px\]{font-size:13px}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.md\:pl-56{padding-left:calc(var(--spacing) * 56)}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:w-60{width:calc(var(--spacing) * 60)}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:pl-60{padding-left:calc(var(--spacing) * 60)}}@media(min-width:80rem){.xl\:col-span-1{grid-column:span 1/span 1}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-3\.5 svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}:root{--radius:.65rem;--background:oklch(100% 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);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(92% .004 286.32);--input:oklch(92% .004 286.32);--ring:oklch(70.5% .015 286.067);--allow:oklch(63% .14 155);--block:oklch(58% .22 27);--drop:oklch(72% .16 70);--modify:oklch(60% .16 255);--log:oklch(62% .11 215);--tcp:oklch(62% .15 265);--udp:oklch(68% .13 190)}.dark{--background:oklch(14.1% .005 285.823);--foreground:oklch(98.5% 0 0);--card:oklch(19% .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(27.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);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.2% .016 285.938);--allow:oklch(72% .16 155);--block:oklch(68% .2 22);--drop:oklch(79% .15 75);--modify:oklch(70% .15 255);--log:oklch(72% .11 215);--tcp:oklch(70% .15 265);--udp:oklch(76% .12 190)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.35}}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@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 pulse{50%{opacity:.5}} diff --git a/web/dist/assets/index-D3ZCYstt.js b/web/dist/assets/index-D3ZCYstt.js new file mode 100644 index 0000000..36821ac --- /dev/null +++ b/web/dist/assets/index-D3ZCYstt.js @@ -0,0 +1,106 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DashboardView-BnrlcswN.js","assets/format-B6sc_rZ4.js","assets/EventItem.vue_vue_type_script_setup_true_lang-DS497KtL.js","assets/Badge.vue_vue_type_script_setup_true_lang--8bF8KCa.js","assets/PageHeader.vue_vue_type_script_setup_true_lang-CDyKzgiP.js","assets/CardTitle.vue_vue_type_script_setup_true_lang-BcE23HB-.js","assets/Skeleton.vue_vue_type_script_setup_true_lang-C9uTg8Ty.js","assets/TabsTrigger.vue_vue_type_script_setup_true_lang-DTNukDpV.js","assets/Collection-D-pf6tmY.js","assets/EventsView-DvVZcEec.js","assets/Modal.vue_vue_type_script_setup_true_lang-gNNtNPLv.js","assets/Select.vue_vue_type_script_setup_true_lang-C15l-n0X.js","assets/RulesView-SxOStRNP.js","assets/AnalyzersView-CHLlPReV.js","assets/SettingsView-CQy8Fv4M.js"])))=>i.map(i=>d[i]); +var Ba=Object.defineProperty;var Ga=(e,t,n)=>t in e?Ba(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var To=(e,t,n)=>Ga(e,typeof t!="symbol"?t+"":t,n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function n(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(r){if(r.ep)return;r.ep=!0;const o=n(r);fetch(r.href,o)}})();/** +* @vue/shared v3.5.40 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Jr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ge={},vn=[],xt=()=>{},Fi=()=>!1,Ts=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ps=e=>e.startsWith("onUpdate:"),Ae=Object.assign,Yr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ha=Object.prototype.hasOwnProperty,ue=(e,t)=>Ha.call(e,t),U=Array.isArray,yn=e=>ts(e)==="[object Map]",ji=e=>ts(e)==="[object Set]",Po=e=>ts(e)==="[object Date]",q=e=>typeof e=="function",ye=e=>typeof e=="string",et=e=>typeof e=="symbol",ae=e=>e!==null&&typeof e=="object",Bi=e=>(ae(e)||q(e))&&q(e.then)&&q(e.catch),Gi=Object.prototype.toString,ts=e=>Gi.call(e),$a=e=>ts(e).slice(8,-1),Hi=e=>ts(e)==="[object Object]",Os=e=>ye(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,jn=Jr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Is=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Ua=/-\w/g,$e=Is(e=>e.replace(Ua,t=>t.slice(1).toUpperCase())),Wa=/\B([A-Z])/g,Yt=Is(e=>e.replace(Wa,"-$1").toLowerCase()),Ns=Is(e=>e.charAt(0).toUpperCase()+e.slice(1)),er=Is(e=>e?`on${Ns(e)}`:""),rt=(e,t)=>!Object.is(e,t),tr=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Ka=e=>{const t=parseFloat(e);return isNaN(t)?e:t},qa=e=>{const t=ye(e)?Number(e):NaN;return isNaN(t)?e:t};let Oo;const Ms=()=>Oo||(Oo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ls(e){if(U(e)){const t={};for(let n=0;n{if(n){const s=n.split(Ya);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ue(e){let t="";if(ye(e))t=e;else if(U(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Le=e=>ye(e)?e:e==null?"":U(e)||ae(e)&&(e.toString===Gi||!q(e.toString))?Wi(e)?Le(e.value):JSON.stringify(e,Ki,2):String(e),Ki=(e,t)=>Wi(t)?Ki(e,t.value):yn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],o)=>(n[nr(s,o)+" =>"]=r,n),{})}:ji(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>nr(n))}:et(t)?nr(t):ae(t)&&!U(t)&&!Hi(t)?String(t):t,nr=(e,t="")=>{var n;return et(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.40 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Re;class qi{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Re&&(Re.active?(this.parent=Re,this.index=(Re.scopes||(Re.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes){const s=this.scopes.slice();for(t=0,n=s.length;t0&&--this._on===0){if(Re===this)Re=this.prevScope;else{let t=Re;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Gn){let t=Gn;for(Gn=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Bn;){let t=Bn;for(Bn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function el(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function tl(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),eo(s),sc(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function wr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(nl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function nl(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Kn)||(e.globalVersion=Kn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!wr(e))))return;e.flags|=2;const t=e.dep,n=ve,s=ot;ve=e,ot=!0;try{el(e);const r=e.fn(e._value);(t.version===0||rt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ve=n,ot=s,tl(e),e.flags&=-3}}function eo(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let o=n.computed.deps;o;o=o.nextDep)eo(o,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function sc(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let ot=!0;const sl=[];function Lt(){sl.push(ot),ot=!1}function Dt(){const e=sl.pop();ot=e===void 0?!0:e}function Io(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ve;ve=void 0;try{t()}finally{ve=n}}}let Kn=0;class rc{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ds{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ve||!ot||ve===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ve)n=this.activeLink=new rc(ve,this),ve.deps?(n.prevDep=ve.depsTail,ve.depsTail.nextDep=n,ve.depsTail=n):ve.deps=ve.depsTail=n,rl(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=ve.depsTail,n.nextDep=void 0,ve.depsTail.nextDep=n,ve.depsTail=n,ve.deps===n&&(ve.deps=s)}return n}trigger(t){this.version++,Kn++,this.notify(t)}notify(t){Xr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Zr()}}}function rl(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)rl(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const ms=new WeakMap,ln=Symbol(""),Sr=Symbol(""),qn=Symbol("");function De(e,t,n){if(ot&&ve){let s=ms.get(e);s||ms.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Ds),r.map=s,r.key=n),r.track()}}function Pt(e,t,n,s,r,o){const i=ms.get(e);if(!i){Kn++;return}const l=a=>{a&&a.trigger()};if(Xr(),t==="clear")i.forEach(l);else{const a=U(e),c=a&&Os(n);if(a&&n==="length"){const u=Number(s);i.forEach((f,h)=>{(h==="length"||h===qn||!et(h)&&h>=u)&&l(f)})}else switch((n!==void 0||i.has(void 0))&&l(i.get(n)),c&&l(i.get(qn)),t){case"add":a?c&&l(i.get("length")):(l(i.get(ln)),yn(e)&&l(i.get(Sr)));break;case"delete":a||(l(i.get(ln)),yn(e)&&l(i.get(Sr)));break;case"set":yn(e)&&l(i.get(ln));break}}Zr()}function oc(e,t){const n=ms.get(e);return n&&n.get(t)}function pn(e){const t=ie(e);return t===e?t:(De(t,"iterate",qn),Xe(e)?t:t.map(lt))}function zs(e){return De(e=ie(e),"iterate",qn),e}function yt(e,t){return zt(e)?En(an(e)?lt(t):t):lt(t)}const ic={__proto__:null,[Symbol.iterator](){return rr(this,Symbol.iterator,e=>yt(this,e))},concat(...e){return pn(this).concat(...e.map(t=>U(t)?pn(t):t))},entries(){return rr(this,"entries",e=>(e[1]=yt(this,e[1]),e))},every(e,t){return Et(this,"every",e,t,void 0,arguments)},filter(e,t){return Et(this,"filter",e,t,n=>n.map(s=>yt(this,s)),arguments)},find(e,t){return Et(this,"find",e,t,n=>yt(this,n),arguments)},findIndex(e,t){return Et(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Et(this,"findLast",e,t,n=>yt(this,n),arguments)},findLastIndex(e,t){return Et(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Et(this,"forEach",e,t,void 0,arguments)},includes(...e){return or(this,"includes",e)},indexOf(...e){return or(this,"indexOf",e)},join(e){return pn(this).join(e)},lastIndexOf(...e){return or(this,"lastIndexOf",e)},map(e,t){return Et(this,"map",e,t,void 0,arguments)},pop(){return Pn(this,"pop")},push(...e){return Pn(this,"push",e)},reduce(e,...t){return No(this,"reduce",e,t)},reduceRight(e,...t){return No(this,"reduceRight",e,t)},shift(){return Pn(this,"shift")},some(e,t){return Et(this,"some",e,t,void 0,arguments)},splice(...e){return Pn(this,"splice",e)},toReversed(){return pn(this).toReversed()},toSorted(e){return pn(this).toSorted(e)},toSpliced(...e){return pn(this).toSpliced(...e)},unshift(...e){return Pn(this,"unshift",e)},values(){return rr(this,"values",e=>yt(this,e))}};function rr(e,t,n){const s=zs(e),r=s[t]();return s!==e&&!Xe(e)&&(r._next=r.next,r.next=()=>{const o=r._next();return o.done||(o.value=n(o.value)),o}),r}const lc=Array.prototype;function Et(e,t,n,s,r,o){const i=zs(e),l=i!==e&&!Xe(e),a=i[t];if(a!==lc[t]){const f=a.apply(e,o);return l?lt(f):f}let c=n;i!==e&&(l?c=function(f,h){return n.call(this,yt(e,f),h,e)}:n.length>2&&(c=function(f,h){return n.call(this,f,h,e)}));const u=a.call(i,c,s);return l&&r?r(u):u}function No(e,t,n,s){const r=zs(e),o=r!==e&&!Xe(e);let i=n,l=!1;r!==e&&(o?(l=s.length===0,i=function(c,u,f){return l&&(l=!1,c=yt(e,c)),n.call(this,c,yt(e,u),f,e)}):n.length>3&&(i=function(c,u,f){return n.call(this,c,u,f,e)}));const a=r[t](i,...s);return l?yt(e,a):a}function or(e,t,n){const s=ie(e);De(s,"iterate",qn);const r=s[t](...n);return(r===-1||r===!1)&&Bs(n[0])?(n[0]=ie(n[0]),s[t](...n)):r}function Pn(e,t,n=[]){Lt(),Xr();const s=ie(e)[t].apply(e,n);return Zr(),Dt(),s}const ac=Jr("__proto__,__v_isRef,__isVue"),ol=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(et));function cc(e){et(e)||(e=String(e));const t=ie(this);return De(t,"has",e),t.hasOwnProperty(e)}class il{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return o;if(n==="__v_raw")return s===(r?o?dl:fl:o?ul:cl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=U(t);if(!r){let a;if(i&&(a=ic[n]))return a;if(n==="hasOwnProperty")return cc}const l=Reflect.get(t,n,Oe(t)?t:s);if((et(n)?ol.has(n):ac(n))||(r||De(t,"get",n),o))return l;if(Oe(l)){const a=i&&Os(n)?l:l.value;return r&&ae(a)?Ar(a):a}return ae(l)?r?Ar(l):Fs(l):l}}class ll extends il{constructor(t=!1){super(!1,t)}set(t,n,s,r){let o=t[n];const i=U(t)&&Os(n);if(!this._isShallow){const c=zt(o);if(!Xe(s)&&!zt(s)&&(o=ie(o),s=ie(s)),!i&&Oe(o)&&!Oe(s))return c||(o.value=s),!0}const l=i?Number(n)e,rs=e=>Reflect.getPrototypeOf(e);function hc(e,t,n){return function(...s){const r=this.__v_raw,o=ie(r),i=yn(o),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,c=r[e](...s),u=n?Er:t?En:lt;return!t&&De(o,"iterate",a?Sr:ln),Ae(Object.create(c),{next(){const{value:f,done:h}=c.next();return h?{value:f,done:h}:{value:l?[u(f[0]),u(f[1])]:u(f),done:h}}})}}function os(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function mc(e,t){const n={get(r){const o=this.__v_raw,i=ie(o),l=ie(r);e||(rt(r,l)&&De(i,"get",r),De(i,"get",l));const{has:a}=rs(i),c=t?Er:e?En:lt;if(a.call(i,r))return c(o.get(r));if(a.call(i,l))return c(o.get(l));o!==i&&o.get(r)},get size(){const r=this.__v_raw;return!e&&De(ie(r),"iterate",ln),r.size},has(r){const o=this.__v_raw,i=ie(o),l=ie(r);return e||(rt(r,l)&&De(i,"has",r),De(i,"has",l)),r===l?o.has(r):o.has(r)||o.has(l)},forEach(r,o){const i=this,l=i.__v_raw,a=ie(l),c=t?Er:e?En:lt;return!e&&De(a,"iterate",ln),l.forEach((u,f)=>r.call(o,c(u),c(f),i))}};return Ae(n,e?{add:os("add"),set:os("set"),delete:os("delete"),clear:os("clear")}:{add(r){const o=ie(this),i=rs(o),l=ie(r),a=!t&&!Xe(r)&&!zt(r)?l:r;return i.has.call(o,a)||rt(r,a)&&i.has.call(o,r)||rt(l,a)&&i.has.call(o,l)||(o.add(a),Pt(o,"add",a,a)),this},set(r,o){!t&&!Xe(o)&&!zt(o)&&(o=ie(o));const i=ie(this),{has:l,get:a}=rs(i);let c=l.call(i,r);c||(r=ie(r),c=l.call(i,r));const u=a.call(i,r);return i.set(r,o),c?rt(o,u)&&Pt(i,"set",r,o):Pt(i,"add",r,o),this},delete(r){const o=ie(this),{has:i,get:l}=rs(o);let a=i.call(o,r);a||(r=ie(r),a=i.call(o,r)),l&&l.call(o,r);const c=o.delete(r);return a&&Pt(o,"delete",r,void 0),c},clear(){const r=ie(this),o=r.size!==0,i=r.clear();return o&&Pt(r,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=hc(r,e,t)}),n}function Vs(e,t){const n=mc(e,t);return(s,r,o)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(ue(n,r)&&r in s?n:s,r,o)}const gc={get:Vs(!1,!1)},bc={get:Vs(!1,!0)},vc={get:Vs(!0,!1)},yc={get:Vs(!0,!0)},cl=new WeakMap,ul=new WeakMap,fl=new WeakMap,dl=new WeakMap;function _c(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Fs(e){return zt(e)?e:js(e,!1,uc,gc,cl)}function pl(e){return js(e,!1,dc,bc,ul)}function Ar(e){return js(e,!0,fc,vc,fl)}function im(e){return js(e,!0,pc,yc,dl)}function js(e,t,n,s,r){if(!ae(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const o=r.get(e);if(o)return o;const i=_c($a(e));if(i===0)return e;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function an(e){return zt(e)?an(e.__v_raw):!!(e&&e.__v_isReactive)}function zt(e){return!!(e&&e.__v_isReadonly)}function Xe(e){return!!(e&&e.__v_isShallow)}function Bs(e){return e?!!e.__v_raw:!1}function ie(e){const t=e&&e.__v_raw;return t?ie(t):e}function xc(e){return!ue(e,"__v_skip")&&Object.isExtensible(e)&&$i(e,"__v_skip",!0),e}const lt=e=>ae(e)?Fs(e):e,En=e=>ae(e)?Ar(e):e;function Oe(e){return e?e.__v_isRef===!0:!1}function Ze(e){return hl(e,!1)}function to(e){return hl(e,!0)}function hl(e,t){return Oe(e)?e:new wc(e,t)}class wc{constructor(t,n){this.dep=new Ds,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:ie(t),this._value=n?t:lt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Xe(t)||zt(t);t=s?t:ie(t),rt(t,n)&&(this._rawValue=t,this._value=s?t:lt(t),this.dep.trigger())}}function Sc(e){e.dep&&e.dep.trigger()}function B(e){return Oe(e)?e.value:e}function It(e){return q(e)?e():B(e)}const Ec={get:(e,t,n)=>t==="__v_raw"?e:B(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return Oe(r)&&!Oe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function ml(e){return an(e)?e:new Proxy(e,Ec)}class Ac{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Ds,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Cc(e){return new Ac(e)}function lm(e){const t=U(e)?new Array(e.length):{};for(const n in e)t[n]=gl(e,n);return t}class kc{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=et(n)?n:String(n),this._raw=ie(t);let r=!0,o=t;if(!U(t)||et(this._key)||!Os(this._key))do r=!Bs(o)||Xe(o);while(r&&(o=o.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=B(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Oe(this._raw[this._key])){const n=this._object[this._key];if(Oe(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return oc(this._raw,this._key)}}class Rc{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function am(e,t,n){return Oe(e)?e:q(e)?new Rc(e):ae(e)&&arguments.length>1?gl(e,t,n):Ze(e)}function gl(e,t,n){return new kc(e,t,n)}class Tc{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Ds(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&ve!==this)return Zi(this,!0),!0}get value(){const t=this.dep.track();return nl(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Pc(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Tc(s,r,n)}const is={},gs=new WeakMap;let nn;function Oc(e,t=!1,n=nn){if(n){let s=gs.get(n);s||gs.set(n,s=[]),s.push(e)}}function Ic(e,t,n=ge){const{immediate:s,deep:r,once:o,scheduler:i,augmentJob:l,call:a}=n,c=T=>r?T:Xe(T)||r===!1||r===0?Ot(T,1):Ot(T);let u,f,h,m,E=!1,x=!1;if(Oe(e)?(f=()=>e.value,E=Xe(e)):an(e)?(f=()=>c(e),E=!0):U(e)?(x=!0,E=e.some(T=>an(T)||Xe(T)),f=()=>e.map(T=>{if(Oe(T))return T.value;if(an(T))return c(T);if(q(T))return a?a(T,2):T()})):q(e)?t?f=a?()=>a(e,2):e:f=()=>{if(h){Lt();try{h()}finally{Dt()}}const T=nn;nn=u;try{return a?a(e,3,[m]):e(m)}finally{nn=T}}:f=xt,t&&r){const T=f,J=r===!0?1/0:r;f=()=>Ot(T(),J)}const k=Yi(),I=()=>{u.stop(),k&&k.active&&Yr(k.effects,u)};if(o&&t){const T=t;t=(...J)=>{const Y=T(...J);return I(),Y}}let _=x?new Array(e.length).fill(is):is;const M=T=>{if(!(!(u.flags&1)||!u.dirty&&!T))if(t){const J=u.run();if(T||r||E||(x?J.some((Y,j)=>rt(Y,_[j])):rt(J,_))){h&&h();const Y=nn;nn=u;try{const j=[J,_===is?void 0:x&&_[0]===is?[]:_,m];_=J,a?a(t,3,j):t(...j)}finally{nn=Y}}}else u.run()};return l&&l(M),u=new Qi(f),u.scheduler=i?()=>i(M,!1):M,m=T=>Oc(T,!1,u),h=u.onStop=()=>{const T=gs.get(u);if(T){if(a)a(T,4);else for(const J of T)J();gs.delete(u)}},t?s?M(!0):_=u.run():i?i(M.bind(null,!0),!0):u.run(),I.pause=u.pause.bind(u),I.resume=u.resume.bind(u),I.stop=I,I}function Ot(e,t=1/0,n){if(t<=0||!ae(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Oe(e))Ot(e.value,t,n);else if(U(e))for(let s=0;s{Ot(s,t,n)});else if(Hi(e)){for(const s in e)Ot(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Ot(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.40 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function ns(e,t,n,s){try{return s?e(...s):e()}catch(r){Gs(r,t,n)}}function nt(e,t,n,s){if(q(e)){const r=ns(e,t,n,s);return r&&Bi(r)&&r.catch(o=>{Gs(o,t,n)}),r}if(U(e)){const r=[];for(let o=0;o>>1,r=Ge[s],o=Jn(r);o=Jn(n)?Ge.push(e):Ge.splice(Mc(t),0,e),e.flags|=1,vl()}}function vl(){bs||(bs=bl.then(_l))}function Lc(e){U(e)?_n.push(...e):Ut&&e.id===-1?Ut.splice(hn+1,0,e):e.flags&1||(_n.push(e),e.flags|=1),vl()}function Mo(e,t,n=bt+1){for(;nJn(n)-Jn(s));if(_n.length=0,Ut){Ut.push(...t);return}for(Ut=t,hn=0;hne.id==null?e.flags&2?-1:1/0:e.id;function _l(e){try{for(bt=0;bt{s._d&&xs(-1);const o=vs(t),i=Mt.length;let l;try{l=e(...r)}finally{for(let a=Mt.length;a>i;a--)uo();vs(o),s._d&&xs(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function cm(e,t){if(Me===null)return e;const n=Js(Me),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&q(t)?t.call(s&&s.proxy):t}}const Dc=Symbol.for("v-scx"),zc=()=>it(Dc);function um(e,t){return Hs(e,null,t)}function fm(e,t){return Hs(e,null,{flush:"post"})}function Nt(e,t,n){return Hs(e,t,n)}function Hs(e,t,n=ge){const{immediate:s,deep:r,flush:o,once:i}=n,l=Ae({},n),a=t&&s||!t&&o!=="post";let c;if(Xn){if(o==="sync"){const m=zc();c=m.__watcherHandles||(m.__watcherHandles=[])}else if(!a){const m=()=>{};return m.stop=xt,m.resume=xt,m.pause=xt,m}}const u=Ve;l.call=(m,E,x)=>nt(m,u,E,x);let f=!1;o==="post"?l.scheduler=m=>{je(m,u&&u.suspense)}:o!=="sync"&&(f=!0,l.scheduler=(m,E)=>{E?m():so(m)}),l.augmentJob=m=>{t&&(m.flags|=4),f&&(m.flags|=2,u&&(m.id=u.uid,m.i=u))};const h=Ic(e,t,l);return Xn&&(c?c.push(h):a&&h()),h}function Vc(e,t,n){const s=this.proxy,r=ye(e)?e.includes(".")?wl(s,e):()=>s[e]:e.bind(s,s);let o;q(t)?o=t:(o=t.handler,n=t);const i=ss(this),l=Hs(r,o.bind(s),n);return i(),l}function wl(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,sn=e=>e&&(e.disabled||e.disabled===""),jc=e=>e&&(e.defer||e.defer===""),Lo=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Do=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Cr=(e,t)=>{const n=e&&e.to;return ye(n)?t?t(n):null:n},Bc={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,o,i,l,a,c){const{mc:u,pc:f,pbc:h,o:{insert:m,querySelector:E,createText:x,createComment:k,parentNode:I}}=c,_=sn(t.props);let{dynamicChildren:M}=t;const T=(j,C,N)=>{j.shapeFlag&16&&u(j.children,C,N,r,o,i,l,a)},J=(j=t)=>{const C=sn(j.props),N=j.target=Cr(j.props,E),Z=kr(N,j,x,m);N&&(i!=="svg"&&Lo(N)?i="svg":i!=="mathml"&&Do(N)&&(i="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(N),C||(T(j,N,Z),zn(j,!1)))},Y=j=>{const C=()=>{if(Ht.get(j)===C){if(Ht.delete(j),sn(j.props)){const N=I(j.el)||n;T(j,N,j.anchor),zn(j,!0)}J(j)}};Ht.set(j,C),je(C,o)};if(e==null){const j=t.el=x(""),C=t.anchor=x("");if(m(j,n,s),m(C,n,s),jc(t.props)||o&&o.pendingBranch){Y(t);return}_&&(T(t,n,C),zn(t,!0)),J()}else{t.el=e.el;const j=t.anchor=e.anchor,C=Ht.get(e);if(C){C.flags|=8,Ht.delete(e),Y(t);return}t.targetStart=e.targetStart;const N=t.target=e.target,Z=t.targetAnchor=e.targetAnchor,ne=sn(e.props),L=ne?n:N,te=ne?j:Z;if(i==="svg"||Lo(N)?i="svg":(i==="mathml"||Do(N))&&(i="mathml"),M?(h(e.dynamicChildren,M,L,r,o,i,l),co(e,t,!0)):a||f(e,t,L,te,r,o,i,l,!1),_)ne?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):ls(t,n,j,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const be=Cr(t.props,E);be&&(t.target=be,ls(t,be,null,c,0))}else ne&&ls(t,N,Z,c,1);zn(t,_)}},remove(e,t,n,{um:s,o:{remove:r}},o){const{shapeFlag:i,children:l,anchor:a,targetStart:c,targetAnchor:u,target:f,props:h}=e,m=sn(h),E=o||!m,x=Ht.get(e);if(x&&(x.flags|=8,Ht.delete(e)),f&&(r(c),r(u)),o&&r(a),!x&&(m||f)&&i&16)for(let k=0;k{e.isMounted=!0}),oo(()=>{e.isUnmounting=!0}),e}const tt=[Function,Array],$c={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:tt,onEnter:tt,onAfterEnter:tt,onEnterCancelled:tt,onBeforeLeave:tt,onLeave:tt,onAfterLeave:tt,onLeaveCancelled:tt,onBeforeAppear:tt,onAppear:tt,onAfterAppear:tt,onAppearCancelled:tt};function Uc(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Rr(e,t,n,s,r){const{appear:o,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:h,onLeave:m,onAfterLeave:E,onLeaveCancelled:x,onBeforeAppear:k,onAppear:I,onAfterAppear:_,onAppearCancelled:M}=t,T=String(e.key),J=Uc(n,e),Y=(N,Z)=>{N&&nt(N,s,9,Z)},j=(N,Z)=>{const ne=Z[1];Y(N,Z),U(N)?N.every(L=>L.length<=1)&&ne():N.length<=1&&ne()},C={mode:i,persisted:l,beforeEnter(N){let Z=a;if(!n.isMounted)if(o)Z=k||a;else return;N[vt]&&N[vt](!0);const ne=J[T];ne&&mn(e,ne)&&ne.el[vt]&&ne.el[vt](),Y(Z,[N])},enter(N){if(J[T]===e)return;let Z=c,ne=u,L=f;if(!n.isMounted)if(o)Z=I||c,ne=_||u,L=M||f;else return;let te=!1;N[On]=Se=>{te||(te=!0,Se?Y(L,[N]):Y(ne,[N]),C.delayedLeave&&C.delayedLeave(),N[On]=void 0)};const be=N[On].bind(null,!1);Z?j(Z,[N,be]):be()},leave(N,Z){const ne=String(e.key);if(N[On]&&N[On](!0),n.isUnmounting)return Z();Y(h,[N]);let L=!1;N[vt]=be=>{L||(L=!0,Z(),be?Y(x,[N]):Y(E,[N]),N[vt]=void 0,J[ne]===e&&delete J[ne])};const te=N[vt].bind(null,!1);J[ne]=e,m?j(m,[N,te]):te()},clone(N){return Rr(N,t,n,s)}};return C}function Yn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Yn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function El(e,t=!1,n){let s=[],r=0;for(let o=0;o1)for(let o=0;oHn(x,t&&(U(t)?t[k]:t),n,s,r));return}if(xn(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Hn(e,t,n,s.component.subTree);return}const o=s.shapeFlag&4?Js(s.component):s.el,i=r?null:o,{i:l,r:a}=e,c=t&&t.r,u=l.refs===ge?l.refs={}:l.refs,f=l.setupState,h=ie(f),m=f===ge?Fi:x=>zo(u,x)?!1:ue(h,x),E=(x,k)=>!(k&&zo(u,k));if(c!=null&&c!==a){if(Vo(t),ye(c))u[c]=null,m(c)&&(f[c]=null);else if(Oe(c)){const x=t;E(c,x.k)&&(c.value=null),x.k&&(u[x.k]=null)}}if(q(a))ns(a,l,12,[i,u]);else{const x=ye(a),k=Oe(a);if(x||k){const I=()=>{if(e.f){const _=x?m(a)?f[a]:u[a]:E()||!e.k?a.value:u[e.k];if(r)U(_)&&Yr(_,o);else if(U(_))_.includes(o)||_.push(o);else if(x)u[a]=[o],m(a)&&(f[a]=u[a]);else{const M=[o];E(a,e.k)&&(a.value=M),e.k&&(u[e.k]=M)}}else x?(u[a]=i,m(a)&&(f[a]=i)):k&&(E(a,e.k)&&(a.value=i),e.k&&(u[e.k]=i))};if(i){const _=()=>{I(),ys.delete(e)};_.id=-1,ys.set(e,_),je(_,n)}else Vo(e),I()}}}function Vo(e){const t=ys.get(e);t&&(t.flags|=8,ys.delete(e))}Ms().requestIdleCallback;Ms().cancelIdleCallback;const xn=e=>!!e.type.__asyncLoader,Cl=e=>e.type.__isKeepAlive;function Wc(e,t){kl(e,"a",t)}function Kc(e,t){kl(e,"da",t)}function kl(e,t,n=Ve){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if($s(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Cl(r.parent.vnode)&&qc(s,t,n,r),r=r.parent}}function qc(e,t,n,s){const r=$s(t,e,s,!0);io(()=>{Yr(s[t],r)},n)}function $s(e,t,n=Ve,s=!1){if(n){const r=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{Lt();const l=ss(n),a=nt(t,n,e,i);return l(),Dt(),a});return s?r.unshift(o):r.push(o),o}}const Ft=e=>(t,n=Ve)=>{(!Xn||e==="sp")&&$s(e,(...s)=>t(...s),n)},Jc=Ft("bm"),Us=Ft("m"),Yc=Ft("bu"),ro=Ft("u"),oo=Ft("bum"),io=Ft("um"),Qc=Ft("sp"),Xc=Ft("rtg"),Zc=Ft("rtc");function eu(e,t=Ve){$s("ec",e,t)}const tu="components",Rl=Symbol.for("v-ndc");function ir(e){return ye(e)?nu(tu,e,!1)||e:e||Rl}function nu(e,t,n=!0,s=!1){const r=Me||Ve;if(r){const o=r.type;{const l=Vu(o,!1);if(l&&(l===t||l===$e(t)||l===Ns($e(t))))return o}const i=Fo(r[e]||o[e],t)||Fo(r.appContext[e],t);return!i&&s?o:i}}function Fo(e,t){return e&&(e[t]||e[$e(t)]||e[Ns($e(t))])}function Tr(e,t,n,s){let r;const o=n,i=U(e);if(i||ye(e)){const l=i&&an(e);let a=!1,c=!1;l&&(a=!Xe(e),c=zt(e),e=zs(e)),r=new Array(e.length);for(let u=0,f=e.length;ut(l,a,void 0,o));else{const l=Object.keys(e);r=new Array(l.length);for(let a=0,c=l.length;a0;return t!=="default"&&(c.name=t),fe(),ze(Pe,null,[de("slot",c,s&&s())],u?-2:64)}let i=e[t];i&&i._c&&(i._d=!1);const l=Mt.length;fe();let a;try{const c=i&&Tl(i(n)),u=n.key||o||c&&c.key;a=ze(Pe,{key:(u&&!et(u)?u:`_${t}`)+(!c&&s?"_fb":"")},c||(s?s():[]),c&&e._===1?64:-2)}catch(c){for(let u=Mt.length;u>l;u--)uo();throw c}finally{i&&i._c&&(i._d=!0)}return a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),a}function Tl(e){return e.some(t=>Qn(t)?!(t.type===at||t.type===Pe&&!Tl(t.children)):!0)?e:null}const Pr=e=>e?ql(e)?Js(e):Pr(e.parent):null,$n=Ae(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Pr(e.parent),$root:e=>Pr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ol(e),$forceUpdate:e=>e.f||(e.f=()=>{so(e.update)}),$nextTick:e=>e.n||(e.n=no.bind(e.proxy)),$watch:e=>Vc.bind(e)}),lr=(e,t)=>e!==ge&&!e.__isScriptSetup&&ue(e,t),su={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:o,accessCache:i,type:l,appContext:a}=e;if(t[0]!=="$"){const h=i[t];if(h!==void 0)switch(h){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return o[t]}else{if(lr(s,t))return i[t]=1,s[t];if(r!==ge&&ue(r,t))return i[t]=2,r[t];if(ue(o,t))return i[t]=3,o[t];if(n!==ge&&ue(n,t))return i[t]=4,n[t];Ir&&(i[t]=0)}}const c=$n[t];let u,f;if(c)return t==="$attrs"&&De(e.attrs,"get",""),c(e);if((u=l.__cssModules)&&(u=u[t]))return u;if(n!==ge&&ue(n,t))return i[t]=4,n[t];if(f=a.config.globalProperties,ue(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:o}=e;return lr(r,t)?(r[t]=n,!0):s!==ge&&ue(s,t)?(s[t]=n,!0):ue(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:o,type:i}},l){let a;return!!(n[l]||e!==ge&&l[0]!=="$"&&ue(e,l)||lr(t,l)||ue(o,l)||ue(s,l)||ue($n,l)||ue(r.config.globalProperties,l)||(a=i.__cssModules)&&a[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ue(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Or(e){return U(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function hm(e,t){const n=Or(e);for(const s in t){if(s.startsWith("__skip"))continue;let r=n[s];r?U(r)||q(r)?r=n[s]={type:r,default:t[s]}:r.default=t[s]:r===null&&(r=n[s]={default:t[s]}),r&&t[`__skip_${s}`]&&(r.skipFactory=!0)}return n}let Ir=!0;function ru(e){const t=Ol(e),n=e.proxy,s=e.ctx;Ir=!1,t.beforeCreate&&jo(t.beforeCreate,e,"bc");const{data:r,computed:o,methods:i,watch:l,provide:a,inject:c,created:u,beforeMount:f,mounted:h,beforeUpdate:m,updated:E,activated:x,deactivated:k,beforeDestroy:I,beforeUnmount:_,destroyed:M,unmounted:T,render:J,renderTracked:Y,renderTriggered:j,errorCaptured:C,serverPrefetch:N,expose:Z,inheritAttrs:ne,components:L,directives:te,filters:be}=t;if(c&&ou(c,s,null),i)for(const ee in i){const se=i[ee];q(se)&&(s[ee]=se.bind(n))}if(r){const ee=r.call(n,n);ae(ee)&&(e.data=Fs(ee))}if(Ir=!0,o)for(const ee in o){const se=o[ee],Ke=q(se)?se.bind(n,n):q(se.get)?se.get.bind(n,n):xt,G=!q(se)&&q(se.set)?se.set.bind(n):xt,qe=we({get:Ke,set:G});Object.defineProperty(s,ee,{enumerable:!0,configurable:!0,get:()=>qe.value,set:Ie=>qe.value=Ie})}if(l)for(const ee in l)Pl(l[ee],s,n,ee);if(a){const ee=q(a)?a.call(n):a;Reflect.ownKeys(ee).forEach(se=>{ds(se,ee[se])})}u&&jo(u,e,"c");function re(ee,se){U(se)?se.forEach(Ke=>ee(Ke.bind(n))):se&&ee(se.bind(n))}if(re(Jc,f),re(Us,h),re(Yc,m),re(ro,E),re(Wc,x),re(Kc,k),re(eu,C),re(Zc,Y),re(Xc,j),re(oo,_),re(io,T),re(Qc,N),U(Z))if(Z.length){const ee=e.exposed||(e.exposed={});Z.forEach(se=>{Object.defineProperty(ee,se,{get:()=>n[se],set:Ke=>n[se]=Ke,enumerable:!0})})}else e.exposed||(e.exposed={});J&&e.render===xt&&(e.render=J),ne!=null&&(e.inheritAttrs=ne),L&&(e.components=L),te&&(e.directives=te),N&&Al(e)}function ou(e,t,n=xt){U(e)&&(e=Nr(e));for(const s in e){const r=e[s];let o;ae(r)?"default"in r?o=it(r.from||s,r.default,!0):o=it(r.from||s):o=it(r),Oe(o)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[s]=o}}function jo(e,t,n){nt(U(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Pl(e,t,n,s){let r=s.includes(".")?wl(n,s):()=>n[s];if(ye(e)){const o=t[e];q(o)&&Nt(r,o)}else if(q(e))Nt(r,e.bind(n));else if(ae(e))if(U(e))e.forEach(o=>Pl(o,t,n,s));else{const o=q(e.handler)?e.handler.bind(n):t[e.handler];q(o)&&Nt(r,o,e)}}function Ol(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let a;return l?a=l:!r.length&&!n&&!s?a=t:(a={},r.length&&r.forEach(c=>_s(a,c,i,!0)),_s(a,t,i)),ae(t)&&o.set(t,a),a}function _s(e,t,n,s=!1){const{mixins:r,extends:o}=t;o&&_s(e,o,n,!0),r&&r.forEach(i=>_s(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=iu[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const iu={data:Bo,props:Go,emits:Go,methods:Vn,computed:Vn,beforeCreate:Fe,created:Fe,beforeMount:Fe,mounted:Fe,beforeUpdate:Fe,updated:Fe,beforeDestroy:Fe,beforeUnmount:Fe,destroyed:Fe,unmounted:Fe,activated:Fe,deactivated:Fe,errorCaptured:Fe,serverPrefetch:Fe,components:Vn,directives:Vn,watch:au,provide:Bo,inject:lu};function Bo(e,t){return t?e?function(){return Ae(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function lu(e,t){return Vn(Nr(e),Nr(t))}function Nr(e){if(U(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${$e(t)}Modifiers`]||e[`${Yt(t)}Modifiers`];function du(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ge;let r=n;const o=t.startsWith("update:"),i=o&&fu(s,t.slice(7));i&&(i.trim&&(r=n.map(u=>ye(u)?u.trim():u)),i.number&&(r=n.map(Ka)));let l,a=s[l=er(t)]||s[l=er($e(t))];!a&&o&&(a=s[l=er(Yt(t))]),a&&nt(a,e,6,r);const c=s[l+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,nt(c,e,6,r)}}const pu=new WeakMap;function Nl(e,t,n=!1){const s=n?pu:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const o=e.emits;let i={},l=!1;if(!q(e)){const a=c=>{const u=Nl(c,t,!0);u&&(l=!0,Ae(i,u))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!o&&!l?(ae(e)&&s.set(e,null),null):(U(o)?o.forEach(a=>i[a]=null):Ae(i,o),ae(e)&&s.set(e,i),i)}function Ks(e,t){return!e||!Ts(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),ue(e,t[0].toLowerCase()+t.slice(1))||ue(e,Yt(t))||ue(e,t))}function Ho(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[o],slots:i,attrs:l,emit:a,render:c,renderCache:u,props:f,data:h,setupState:m,ctx:E,inheritAttrs:x}=e,k=vs(e);let I,_;try{if(n.shapeFlag&4){const T=r||s,J=T;I=_t(c.call(J,T,u,f,m,h,E)),_=l}else{const T=t;I=_t(T.length>1?T(f,{attrs:l,slots:i,emit:a}):T(f,null)),_=t.props?l:hu(l)}}catch(T){Mt.length=0,Gs(T,e,1),I=de(at)}let M=I;if(_&&x!==!1){const T=Object.keys(_),{shapeFlag:J}=M;T.length&&J&7&&(o&&T.some(Ps)&&(_=mu(_,o)),M=Jt(M,_,!1,!0))}return n.dirs&&(M=Jt(M,null,!1,!0),M.dirs=M.dirs?M.dirs.concat(n.dirs):n.dirs),n.transition&&Yn(M,n.transition),I=M,vs(k),I}const hu=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ts(n))&&((t||(t={}))[n]=e[n]);return t},mu=(e,t)=>{const n={};for(const s in e)(!Ps(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function gu(e,t,n){const{props:s,children:r,component:o}=e,{props:i,children:l,patchFlag:a}=t,c=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return s?$o(s,i,c):!!i;if(a&8){const u=t.dynamicProps;for(let f=0;fObject.create(Ll),zl=e=>Object.getPrototypeOf(e)===Ll;function vu(e,t,n,s=!1){const r={},o=Dl();e.propsDefaults=Object.create(null),Vl(e,t,r,o);for(const i in e.propsOptions[0])i in r||(r[i]=void 0);n?e.props=s?r:pl(r):e.type.props?e.props=r:e.props=o,e.attrs=o}function yu(e,t,n,s){const{props:r,attrs:o,vnode:{patchFlag:i}}=e,l=ie(r),[a]=e.propsOptions;let c=!1;if((s||i>0)&&!(i&16)){if(i&8){const u=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[h,m]=Fl(f,t,!0);Ae(i,h),m&&l.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!o&&!a)return ae(e)&&s.set(e,vn),vn;if(U(o))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",ao=e=>U(e)?e.map(_t):[_t(e)],xu=(e,t,n)=>{if(t._n)return t;const s=Ye((...r)=>ao(t(...r)),n);return s._c=!1,s},jl=(e,t,n)=>{const s=e._ctx;for(const r in e){if(lo(r))continue;const o=e[r];if(q(o))t[r]=xu(r,o,s);else if(o!=null){const i=ao(o);t[r]=()=>i}}},Bl=(e,t)=>{const n=ao(t);e.slots.default=()=>n},Gl=(e,t,n)=>{for(const s in t)(n||!lo(s))&&(e[s]=t[s])},wu=(e,t,n)=>{const s=e.slots=Dl();if(e.vnode.shapeFlag&32){const r=t._;r?(Gl(s,t,n),n&&$i(s,"_",r,!0)):jl(t,s)}else t&&Bl(e,t)},Su=(e,t,n)=>{const{vnode:s,slots:r}=e;let o=!0,i=ge;if(s.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:Gl(r,t,n):(o=!t.$stable,jl(t,r)),i=t}else t&&(Bl(e,t),i={default:1});if(o)for(const l in r)!lo(l)&&i[l]==null&&delete r[l]},je=Ru;function Eu(e){return Au(e)}function Au(e,t){const n=Ms();n.__VUE__=!0;const{insert:s,remove:r,patchProp:o,createElement:i,createText:l,createComment:a,setText:c,setElementText:u,parentNode:f,nextSibling:h,setScopeId:m=xt,insertStaticContent:E}=e,x=(d,p,g,y=null,w=null,b=null,O=void 0,P=null,R=!!p.dynamicChildren)=>{if(d===p)return;d&&!mn(d,p)&&(y=v(d),Ie(d,w,b,!0),d=null),p.patchFlag===-2&&(R=!1,p.dynamicChildren=null);const{type:S,ref:W,shapeFlag:D}=p;switch(S){case qs:k(d,p,g,y);break;case at:I(d,p,g,y);break;case cr:d==null&&_(p,g,y,O);break;case Pe:L(d,p,g,y,w,b,O,P,R);break;default:D&1?J(d,p,g,y,w,b,O,P,R):D&6?te(d,p,g,y,w,b,O,P,R):(D&64||D&128)&&S.process(d,p,g,y,w,b,O,P,R,H)}W!=null&&w?Hn(W,d&&d.ref,b,p||d,!p):W==null&&d&&d.ref!=null&&Hn(d.ref,null,b,d,!0)},k=(d,p,g,y)=>{if(d==null)s(p.el=l(p.children),g,y);else{const w=p.el=d.el;p.children!==d.children&&c(w,p.children)}},I=(d,p,g,y)=>{d==null?s(p.el=a(p.children||""),g,y):p.el=d.el},_=(d,p,g,y)=>{[d.el,d.anchor]=E(d.children,p,g,y,d.el,d.anchor)},M=({el:d,anchor:p},g,y)=>{let w;for(;d&&d!==p;)w=h(d),s(d,g,y),d=w;s(p,g,y)},T=({el:d,anchor:p})=>{let g;for(;d&&d!==p;)g=h(d),r(d),d=g;r(p)},J=(d,p,g,y,w,b,O,P,R)=>{if(p.type==="svg"?O="svg":p.type==="math"&&(O="mathml"),d==null)Y(p,g,y,w,b,O,P,R);else{const S=d.el&&d.el._isVueCE?d.el:null;try{S&&S._beginPatch(),N(d,p,w,b,O,P,R)}finally{S&&S._endPatch()}}},Y=(d,p,g,y,w,b,O,P)=>{let R,S;const{props:W,shapeFlag:D,transition:$,dirs:K}=d;if(R=d.el=i(d.type,b,W&&W.is,W),D&8?u(R,d.children):D&16&&C(d.children,R,null,y,w,ar(d,b),O,P),K&&Xt(d,null,y,"created"),j(R,d,d.scopeId,O,y),W){for(const me in W)me!=="value"&&!jn(me)&&o(R,me,null,W[me],b,y);"value"in W&&o(R,"value",null,W.value,b),(S=W.onVnodeBeforeMount)&&ht(S,y,d)}K&&Xt(d,null,y,"beforeMount");const oe=Cu(w,$);oe&&$.beforeEnter(R),s(R,p,g),((S=W&&W.onVnodeMounted)||oe||K)&&je(()=>{try{S&&ht(S,y,d),oe&&$.enter(R),K&&Xt(d,null,y,"mounted")}finally{}},w)},j=(d,p,g,y,w)=>{if(g&&m(d,g),y)for(let b=0;b{for(let S=R;S{const P=p.el=d.el;let{patchFlag:R,dynamicChildren:S,dirs:W}=p;R|=d.patchFlag&16;const D=d.props||ge,$=p.props||ge;let K;if(g&&Zt(g,!1),(K=$.onVnodeBeforeUpdate)&&ht(K,g,p,d),W&&Xt(p,d,g,"beforeUpdate"),g&&Zt(g,!0),S&&(!d.dynamicChildren||d.dynamicChildren.length!==S.length)&&(R=0,O=!1,S=null),(D.innerHTML&&$.innerHTML==null||D.textContent&&$.textContent==null)&&u(P,""),S?Z(d.dynamicChildren,S,P,g,y,ar(p,w),b):O||se(d,p,P,null,g,y,ar(p,w),b,!1),R>0){if(R&16)ne(P,D,$,g,w);else if(R&2&&D.class!==$.class&&o(P,"class",null,$.class,w),R&4&&o(P,"style",D.style,$.style,w),R&8){const oe=p.dynamicProps;for(let me=0;me{K&&ht(K,g,p,d),W&&Xt(p,d,g,"updated")},y)},Z=(d,p,g,y,w,b,O)=>{for(let P=0;P{if(p!==g){if(p!==ge)for(const b in p)!jn(b)&&!(b in g)&&o(d,b,p[b],null,w,y);for(const b in g){if(jn(b))continue;const O=g[b],P=p[b];O!==P&&b!=="value"&&o(d,b,P,O,w,y)}"value"in g&&o(d,"value",p.value,g.value,w)}},L=(d,p,g,y,w,b,O,P,R)=>{const S=p.el=d?d.el:l(""),W=p.anchor=d?d.anchor:l("");let{patchFlag:D,dynamicChildren:$,slotScopeIds:K}=p;K&&(P=P?P.concat(K):K),d==null?(s(S,g,y),s(W,g,y),C(p.children||[],g,W,w,b,O,P,R)):D>0&&D&64&&$&&d.dynamicChildren&&d.dynamicChildren.length===$.length?(Z(d.dynamicChildren,$,g,w,b,O,P),(p.key!=null||w&&p===w.subTree)&&co(d,p,!0)):se(d,p,g,W,w,b,O,P,R)},te=(d,p,g,y,w,b,O,P,R)=>{p.slotScopeIds=P,d==null?p.shapeFlag&512?w.ctx.activate(p,g,y,O,R):be(p,g,y,w,b,O,R):Se(d,p,R)},be=(d,p,g,y,w,b,O)=>{const P=d.component=Nu(d,y,w);if(Cl(d)&&(P.ctx.renderer=H),Mu(P,!1,O),P.asyncDep){if(w&&w.registerDep(P,re,O),!d.el){const R=P.subTree=de(at);I(null,R,p,g),d.placeholder=R.el}}else re(P,d,p,g,w,b,O)},Se=(d,p,g)=>{const y=p.component=d.component;if(gu(d,p,g))if(y.asyncDep&&!y.asyncResolved){ee(y,p,g);return}else y.next=p,y.update();else p.el=d.el,y.vnode=p},re=(d,p,g,y,w,b,O)=>{const P=()=>{if(d.isMounted){let{next:D,bu:$,u:K,parent:oe,vnode:me}=d;{const dt=Hl(d);if(dt){D&&(D.el=me.el,ee(d,D,O)),dt.asyncDep.then(()=>{je(()=>{d.isUnmounted||S()},w)});return}}let he=D,Ee;Zt(d,!1),D?(D.el=me.el,ee(d,D,O)):D=me,$&&tr($),(Ee=D.props&&D.props.onVnodeBeforeUpdate)&&ht(Ee,oe,D,me),Zt(d,!0);const Ne=Ho(d),ft=d.subTree;d.subTree=Ne,x(ft,Ne,f(ft.el),v(ft),d,w,b),D.el=Ne.el,he===null&&bu(d,Ne.el),K&&je(K,w),(Ee=D.props&&D.props.onVnodeUpdated)&&je(()=>ht(Ee,oe,D,me),w)}else{let D;const{el:$,props:K}=p,{bm:oe,m:me,parent:he,root:Ee,type:Ne}=d,ft=xn(p);Zt(d,!1),oe&&tr(oe),!ft&&(D=K&&K.onVnodeBeforeMount)&&ht(D,he,p),Zt(d,!0);{Ee.ce&&Ee.ce._hasShadowRoot()&&Ee.ce._injectChildStyle(Ne,d.parent?d.parent.type:void 0);const dt=d.subTree=Ho(d);x(null,dt,g,y,d,w,b),p.el=dt.el}if(me&&je(me,w),!ft&&(D=K&&K.onVnodeMounted)){const dt=p;je(()=>ht(D,he,dt),w)}(p.shapeFlag&256||he&&xn(he.vnode)&&he.vnode.shapeFlag&256)&&d.a&&je(d.a,w),d.isMounted=!0,p=g=y=null}};d.scope.on();const R=d.effect=new Qi(P);d.scope.off();const S=d.update=R.run.bind(R),W=d.job=R.runIfDirty.bind(R);W.i=d,W.id=d.uid,R.scheduler=()=>so(W),Zt(d,!0),S()},ee=(d,p,g)=>{p.component=d;const y=d.vnode.props;d.vnode=p,d.next=null,yu(d,p.props,y,g),Su(d,p.children,g),Lt(),Mo(d),Dt()},se=(d,p,g,y,w,b,O,P,R=!1)=>{const S=d&&d.children,W=d?d.shapeFlag:0,D=p.children,{patchFlag:$,shapeFlag:K}=p;if($>0){if($&128){G(S,D,g,y,w,b,O,P,R);return}else if($&256){Ke(S,D,g,y,w,b,O,P,R);return}}K&8?(W&16&&pe(S,w,b),D!==S&&u(g,D)):W&16?K&16?G(S,D,g,y,w,b,O,P,R):pe(S,w,b,!0):(W&8&&u(g,""),K&16&&C(D,g,y,w,b,O,P,R))},Ke=(d,p,g,y,w,b,O,P,R)=>{d=d||vn,p=p||vn;const S=d.length,W=p.length,D=Math.min(S,W);let $;for($=0;$W?pe(d,w,b,!0,!1,D):C(p,g,y,w,b,O,P,R,D)},G=(d,p,g,y,w,b,O,P,R)=>{let S=0;const W=p.length;let D=d.length-1,$=W-1;for(;S<=D&&S<=$;){const K=d[S],oe=p[S]=R?Tt(p[S]):_t(p[S]);if(mn(K,oe))x(K,oe,g,null,w,b,O,P,R);else break;S++}for(;S<=D&&S<=$;){const K=d[D],oe=p[$]=R?Tt(p[$]):_t(p[$]);if(mn(K,oe))x(K,oe,g,null,w,b,O,P,R);else break;D--,$--}if(S>D){if(S<=$){const K=$+1,oe=K$)for(;S<=D;)Ie(d[S],w,b,!0),S++;else{const K=S,oe=S,me=new Map;for(S=oe;S<=$;S++){const Je=p[S]=R?Tt(p[S]):_t(p[S]);Je.key!=null&&me.set(Je.key,S)}let he,Ee=0;const Ne=$-oe+1;let ft=!1,dt=0;const Tn=new Array(Ne);for(S=0;S=Ne){Ie(Je,w,b,!0);continue}let pt;if(Je.key!=null)pt=me.get(Je.key);else for(he=oe;he<=$;he++)if(Tn[he-oe]===0&&mn(Je,p[he])){pt=he;break}pt===void 0?Ie(Je,w,b,!0):(Tn[pt-oe]=S+1,pt>=dt?dt=pt:ft=!0,x(Je,p[pt],g,null,w,b,O,P,R),Ee++)}const Co=ft?ku(Tn):vn;for(he=Co.length-1,S=Ne-1;S>=0;S--){const Je=oe+S,pt=p[Je],ko=p[Je+1],Ro=Je+1{const{el:b,type:O,transition:P,children:R,shapeFlag:S}=d;if(S&6){qe(d.component.subTree,p,g,y);return}if(S&128){d.suspense.move(p,g,y);return}if(S&64){O.move(d,p,g,H);return}if(O===Pe){s(b,p,g);for(let D=0;DP.enter(b),w));else{const{leave:D,delayLeave:$,afterLeave:K}=P,oe=()=>{d.ctx.isUnmounted?r(b):s(b,p,g)},me=()=>{const he=b._isLeaving||!!b[vt];b._isLeaving&&b[vt](!0),P.persisted&&!he?oe():D(b,()=>{oe(),K&&K()})};$?$(b,oe,me):me()}else s(b,p,g)},Ie=(d,p,g,y=!1,w=!1)=>{const{type:b,props:O,ref:P,children:R,dynamicChildren:S,shapeFlag:W,patchFlag:D,dirs:$,cacheIndex:K,memo:oe}=d;if(D===-2&&(w=!1),P!=null&&(Lt(),Hn(P,null,g,d,!0),Dt()),K!=null&&(p.renderCache[K]=void 0),W&256){p.ctx.deactivate(d);return}const me=W&1&&$,he=!xn(d);let Ee;if(he&&(Ee=O&&O.onVnodeBeforeUnmount)&&ht(Ee,p,d),W&6)_e(d.component,g,y);else{if(W&128){d.suspense.unmount(g,y);return}me&&Xt(d,null,p,"beforeUnmount"),W&64?d.type.remove(d,p,g,H,y):S&&!S.hasOnce&&(b!==Pe||D>0&&D&64)?pe(S,p,g,!1,!0):(b===Pe&&D&384||!w&&W&16)&&pe(R,p,g),y&&St(d)}const Ne=oe!=null&&K==null;(he&&(Ee=O&&O.onVnodeUnmounted)||me||Ne)&&je(()=>{Ee&&ht(Ee,p,d),me&&Xt(d,null,p,"unmounted"),Ne&&(d.el=null)},g)},St=d=>{const{type:p,el:g,anchor:y,transition:w}=d;if(p===Pe){ut(g,y);return}if(p===cr){T(d);return}const b=()=>{r(g),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(d.shapeFlag&1&&w&&!w.persisted){const{leave:O,delayLeave:P}=w,R=()=>O(g,b);P?P(d.el,b,R):R()}else b()},ut=(d,p)=>{let g;for(;d!==p;)g=h(d),r(d),d=g;r(p)},_e=(d,p,g)=>{const{bum:y,scope:w,job:b,subTree:O,um:P,m:R,a:S}=d;Wo(R),Wo(S),y&&tr(y),w.stop(),b&&(b.flags|=8,Ie(O,d,p,g)),P&&je(P,p),je(()=>{d.isUnmounted=!0},p)},pe=(d,p,g,y=!1,w=!1,b=0)=>{for(let O=b;O{if(d.shapeFlag&6)return v(d.component.subTree);if(d.shapeFlag&128)return d.suspense.next();const p=h(d.anchor||d.el),g=p&&p[Sl];return g?h(g):p};let z=!1;const A=(d,p,g)=>{let y;d==null?p._vnode&&(Ie(p._vnode,null,null,!0),y=p._vnode.component):x(p._vnode||null,d,p,null,null,null,g),p._vnode=d,z||(z=!0,Mo(y),yl(),z=!1)},H={p:x,um:Ie,m:qe,r:St,mt:be,mc:C,pc:se,pbc:Z,n:v,o:e};return{render:A,hydrate:void 0,createApp:uu(A)}}function ar({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Zt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Cu(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function co(e,t,n=!1){const s=e.children,r=t.children;if(U(s)&&U(r))for(let o=0;o>1,e[n[l]]0&&(t[s]=n[o-1]),n[o]=s)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function Hl(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Hl(t)}function Wo(e){if(e)for(let t=0;te.__isSuspense;function Ru(e,t){t&&t.pendingBranch?U(e)?t.effects.push(...e):t.effects.push(e):Lc(e)}const Pe=Symbol.for("v-fgt"),qs=Symbol.for("v-txt"),at=Symbol.for("v-cmt"),cr=Symbol.for("v-stc"),Mt=[];let He=null;function fe(e=!1){Mt.push(He=e?null:[])}function uo(){Mt.pop(),He=Mt[Mt.length-1]||null}let An=1;function xs(e,t=!1){An+=e,e<0&&He&&t&&(He.hasOnce=!0)}function Wl(e){return e.dynamicChildren=An>0?He||vn:null,uo(),An>0&&He&&He.push(e),e}function Qe(e,t,n,s,r,o){return Wl(le(e,t,n,s,r,o,!0))}function ze(e,t,n,s,r){return Wl(de(e,t,n,s,r,!0))}function Qn(e){return e?e.__v_isVNode===!0:!1}function mn(e,t){return e.type===t.type&&e.key===t.key}const Kl=({key:e})=>e??null,ps=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ye(e)||Oe(e)||q(e)?{i:Me,r:e,k:t,f:!!n}:e:null);function le(e,t=null,n=null,s=0,r=null,o=e===Pe?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Kl(t),ref:t&&ps(t),scopeId:xl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Me};return l?(Ss(a,n),o&128&&e.normalize(a)):n&&(a.shapeFlag|=ye(n)?8:16),An>0&&!i&&He&&(a.patchFlag>0||o&6)&&a.patchFlag!==32&&He.push(a),a}const de=Tu;function Tu(e,t=null,n=null,s=0,r=null,o=!1){if((!e||e===Rl)&&(e=at),Qn(e)){const l=Jt(e,t,!0);return n&&Ss(l,n),An>0&&!o&&He&&(l.shapeFlag&6?He[He.indexOf(e)]=l:He.push(l)),l.patchFlag=-2,l}if(Fu(e)&&(e=e.__vccOpts),t){t=Pu(t);let{class:l,style:a}=t;l&&!ye(l)&&(t.class=Ue(l)),ae(a)&&(Bs(a)&&!U(a)&&(a=Ae({},a)),t.style=Ls(a))}const i=ye(e)?1:Ul(e)?128:Fc(e)?64:ae(e)?4:q(e)?2:0;return le(e,t,n,s,r,i,o,!0)}function Pu(e){return e?Bs(e)||zl(e)?Ae({},e):e:null}function Jt(e,t,n=!1,s=!1){const{props:r,ref:o,patchFlag:i,children:l,transition:a}=e,c=t?fo(r||{},t):r,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Kl(c),ref:t&&t.ref?n&&o?U(o)?o.concat(ps(t)):[o,ps(t)]:ps(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Pe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Jt(e.ssContent),ssFallback:e.ssFallback&&Jt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&s&&Yn(u,a.clone(u)),u}function Sn(e=" ",t=0){return de(qs,null,e,t)}function ws(e="",t=!1){return t?(fe(),ze(at,null,e)):de(at,null,e)}function _t(e){return e==null||typeof e=="boolean"?de(at):U(e)?de(Pe,null,e.slice()):Qn(e)?Tt(e):de(qs,null,String(e))}function Tt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Jt(e)}function Ss(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(U(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Ss(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!zl(t)?t._ctx=Me:r===3&&Me&&(Me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(q(t)){if(s&65){Ss(e,{default:t});return}t={default:t,_ctx:Me},n=32}else t=String(t),s&64?(n=16,t=[Sn(t)]):n=8;e.children=t,e.shapeFlag|=n}function fo(...e){const t={};for(let n=0;nVe||Me;let Es,Lr;{const e=Ms(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),o=>{r.length>1?r.forEach(i=>i(o)):r[0](o)}};Es=t("__VUE_INSTANCE_SETTERS__",n=>Ve=n),Lr=t("__VUE_SSR_SETTERS__",n=>Xn=n)}const ss=e=>{const t=Ve;return Es(e),e.scope.on(),()=>{e.scope.off(),Es(t)}},Ko=()=>{Ve&&Ve.scope.off(),Es(null)};function ql(e){return e.vnode.shapeFlag&4}let Xn=!1;function Mu(e,t=!1,n=!1){t&&Lr(t);const{props:s,children:r}=e.vnode,o=ql(e);vu(e,s,o,t),wu(e,r,n||t);const i=o?Lu(e,t):void 0;return t&&Lr(!1),i}function Lu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,su);const{setup:s}=n;if(s){Lt();const r=e.setupContext=s.length>1?zu(e):null,o=ss(e),i=ns(s,e,0,[e.props,r]),l=Bi(i);if(Dt(),o(),(l||e.sp)&&!xn(e)&&Al(e),l){if(i.then(Ko,Ko),t)return i.then(a=>{qo(e,a)}).catch(a=>{Gs(a,e,0)});e.asyncDep=i}else qo(e,i)}else Jl(e)}function qo(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ae(t)&&(e.setupState=ml(t)),Jl(e)}function Jl(e,t,n){const s=e.type;e.render||(e.render=s.render||xt);{const r=ss(e);Lt();try{ru(e)}finally{Dt(),r()}}}const Du={get(e,t){return De(e,"get",""),e[t]}};function zu(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Du),slots:e.slots,emit:e.emit,expose:t}}function Js(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ml(xc(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in $n)return $n[n](e)},has(t,n){return n in t||n in $n}})):e.proxy}function Vu(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Fu(e){return q(e)&&"__vccOpts"in e}const we=(e,t)=>Pc(e,t,Xn);function qt(e,t,n){try{xs(-1);const s=arguments.length;return s===2?ae(t)&&!U(t)?Qn(t)?de(e,null,[t]):de(e,t):de(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Qn(n)&&(n=[n]),de(e,t,n))}finally{xs(1)}}function mm(e,t,n,s){const r=n[s];if(r&&ju(r,e))return r;const o=t();return o.memo=e.slice(),o.cacheIndex=s,n[s]=o}function ju(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let s=0;s0&&He&&He.push(e),!0}const Bu="3.5.40";/** +* @vue/runtime-dom v3.5.40 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Dr;const Jo=typeof window<"u"&&window.trustedTypes;if(Jo)try{Dr=Jo.createPolicy("vue",{createHTML:e=>e})}catch{}const Yl=Dr?e=>Dr.createHTML(e):e=>e,Gu="http://www.w3.org/2000/svg",Hu="http://www.w3.org/1998/Math/MathML",Rt=typeof document<"u"?document:null,Yo=Rt&&Rt.createElement("template"),$u={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Rt.createElementNS(Gu,e):t==="mathml"?Rt.createElementNS(Hu,e):n?Rt.createElement(e,{is:n}):Rt.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Rt.createTextNode(e),createComment:e=>Rt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Rt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,o){const i=n?n.previousSibling:t.lastChild;if(r&&(r===o||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===o||!(r=r.nextSibling)););else{Yo.innerHTML=Yl(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Yo.content;if(s==="svg"||s==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},jt="transition",In="animation",Cn=Symbol("_vtc"),Ql={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Uu=Ae({},$c,Ql),en=(e,t=[])=>{U(e)?e.forEach(n=>n(...t)):e&&e(...t)},Qo=e=>e?U(e)?e.some(t=>t.length>1):e.length>1:!1;function Wu(e){const t={};for(const L in e)L in Ql||(t[L]=e[L]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=o,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,E=Ku(r),x=E&&E[0],k=E&&E[1],{onBeforeEnter:I,onEnter:_,onEnterCancelled:M,onLeave:T,onLeaveCancelled:J,onBeforeAppear:Y=I,onAppear:j=_,onAppearCancelled:C=M}=t,N=(L,te,be,Se)=>{L._enterCancelled=Se,$t(L,te?u:l),$t(L,te?c:i),be&&be()},Z=(L,te)=>{L._isLeaving=!1,$t(L,f),$t(L,m),$t(L,h),te&&te()},ne=L=>(te,be)=>{const Se=L?j:_,re=()=>N(te,L,be);en(Se,[te,re]),Xo(()=>{$t(te,L?a:o),gt(te,L?u:l),Qo(Se)||Zo(te,s,x,re)})};return Ae(t,{onBeforeEnter(L){en(I,[L]),gt(L,o),gt(L,i)},onBeforeAppear(L){en(Y,[L]),gt(L,a),gt(L,c)},onEnter:ne(!1),onAppear:ne(!0),onLeave(L,te){L._isLeaving=!0;const be=()=>Z(L,te);gt(L,f),L._enterCancelled?(gt(L,h),zr(L)):(zr(L),gt(L,h)),Xo(()=>{L._isLeaving&&($t(L,f),gt(L,m),Qo(T)||Zo(L,s,k,be))}),en(T,[L,be])},onEnterCancelled(L){N(L,!1,void 0,!0),en(M,[L])},onAppearCancelled(L){N(L,!0,void 0,!0),en(C,[L])},onLeaveCancelled(L){Z(L),en(J,[L])}})}function Ku(e){if(e==null)return null;if(ae(e))return[ur(e.enter),ur(e.leave)];{const t=ur(e);return[t,t]}}function ur(e){return qa(e)}function gt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Cn]||(e[Cn]=new Set)).add(t)}function $t(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Cn];n&&(n.delete(t),n.size||(e[Cn]=void 0))}function Xo(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let qu=0;function Zo(e,t,n,s){const r=e._endId=++qu,o=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(o,n);const{type:i,timeout:l,propCount:a}=Xl(e,t);if(!i)return s();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,h),o()},h=m=>{m.target===e&&++u>=a&&f()};setTimeout(()=>{u(n[E]||"").split(", "),r=s(`${jt}Delay`),o=s(`${jt}Duration`),i=ei(r,o),l=s(`${In}Delay`),a=s(`${In}Duration`),c=ei(l,a);let u=null,f=0,h=0;t===jt?i>0&&(u=jt,f=i,h=o.length):t===In?c>0&&(u=In,f=c,h=a.length):(f=Math.max(i,c),u=f>0?i>c?jt:In:null,h=u?u===jt?o.length:a.length:0);const m=u===jt&&/\b(?:transform|all)(?:,|$)/.test(s(`${jt}Property`).toString());return{type:u,timeout:f,propCount:h,hasTransform:m}}function ei(e,t){for(;e.lengthti(n)+ti(e[s])))}function ti(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function zr(e){return(e?e.ownerDocument:document).body.offsetHeight}function Ju(e,t,n){const s=e[Cn];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const As=Symbol("_vod"),po=Symbol("_vsh"),gm={name:"show",beforeMount(e,{value:t},{transition:n}){e[As]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Nn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Nn(e,!0),s.enter(e)):s.leave(e,()=>{Nn(e,!1)}):Nn(e,t))},beforeUnmount(e,{value:t}){Nn(e,t)}};function Nn(e,t){e.style.display=t?e[As]:"none",e[po]=!t}const Yu=Symbol(""),Qu=/(?:^|;)\s*display\s*:/;function Xu(e,t,n){const s=e.style,r=ye(n);let o=!1;if(n&&!r){if(t)if(ye(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Fn(s,l,"")}else for(const i in t)n[i]==null&&Fn(s,i,"");for(const i in n){i==="display"&&(o=!0);const l=n[i];l!=null?ef(e,i,!ye(t)&&t?t[i]:void 0,l)||Fn(s,i,l):Fn(s,i,"")}}else if(r){if(t!==n){const i=s[Yu];i&&(n+=";"+i),s.cssText=n,o=Qu.test(n)}}else t&&e.removeAttribute("style");As in e&&(e[As]=o?s.display:"",e[po]&&(s.display="none"))}const ni=/\s*!important$/;function Fn(e,t,n){if(U(n))n.forEach(s=>Fn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Zu(e,t);ni.test(n)?e.setProperty(Yt(s),n.replace(ni,""),"important"):e[s]=n}}const si=["Webkit","Moz","ms"],fr={};function Zu(e,t){const n=fr[t];if(n)return n;let s=$e(t);if(s!=="filter"&&s in e)return fr[t]=s;s=Ns(s);for(let r=0;rdr||(af.then(()=>dr=0),dr=Date.now());function uf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const r=n.value;if(U(r)){const o=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{o.call(s),s._stopped=!0};const i=r.slice(),l=[s];for(let a=0;ae.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ff=(e,t,n,s,r,o)=>{const i=r==="svg";t==="class"?Ju(e,s,i):t==="style"?Xu(e,n,s):Ts(t)?Ps(t)||sf(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):df(e,t,s,i))?(ii(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&oi(e,t,s,i,o,t!=="value")):e._isVueCE&&(pf(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ye(s)))?ii(e,$e(t),s,o,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),oi(e,t,s,i))};function df(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ai(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ai(t)&&ye(n)?!1:t in e}function pf(e,t){const n=e._def.props;if(!n)return!1;const s=$e(t);return Array.isArray(n)?n.some(r=>$e(r)===s):Object.keys(n).some(r=>$e(r)===s)}const Zl=new WeakMap,ea=new WeakMap,Cs=Symbol("_moveCb"),ci=Symbol("_enterCb"),hf=e=>(delete e.props.mode,e),mf=hf({name:"TransitionGroup",props:Ae({},Uu,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=fn(),s=Hc();let r,o;return ro(()=>{if(!r.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!_f(r[0].el,n.vnode.el,i)){r=[];return}r.forEach(bf),r.forEach(vf);const l=r.filter(yf);zr(n.vnode.el),l.forEach(a=>{const c=a.el,u=c.style;gt(c,i),u.transform=u.webkitTransform=u.transitionDuration="";const f=c[Cs]=h=>{h&&h.target!==c||(!h||h.propertyName.endsWith("transform"))&&(c.removeEventListener("transitionend",f),c[Cs]=null,$t(c,i))};c.addEventListener("transitionend",f)}),r=[]}),()=>{const i=ie(e),l=Wu(i);let a=i.tag||Pe;if(r=[],o)for(let c=0;c{l.split(/\s+/).forEach(a=>a&&s.classList.remove(a))}),n.split(/\s+/).forEach(l=>l&&s.classList.add(l)),s.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(s);const{hasTransform:i}=Xl(s);return o.removeChild(s),i}const xf=["ctrl","shift","alt","meta"],wf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>xf.some(n=>e[`${n}Key`]&&!t.includes(n))},Sf=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((r,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(r=>{if(!("key"in r))return;const o=Yt(r.key);if(t.some(i=>i===o||Ef[i]===o))return e(r)}))},Af=Ae({patchProp:ff},$u);let ui;function Cf(){return ui||(ui=Eu(Af))}const kf=((...e)=>{const t=Cf().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Tf(s);if(!r)return;const o=t._component;!q(o)&&!o.render&&!o.template&&(o.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const i=n(r,!1,Rf(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t});function Rf(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Tf(e){return ye(e)?document.querySelector(e):e}/*! + * vue-router v4.6.4 + * (c) 2025 Eduardo San Martin Morote + * @license MIT + */const gn=typeof document<"u";function na(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Pf(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&na(e.default)}const ce=Object.assign;function pr(e,t){const n={};for(const s in t){const r=t[s];n[s]=ct(r)?r.map(e):e(r)}return n}const Un=()=>{},ct=Array.isArray;function fi(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const sa=/#/g,Of=/&/g,If=/\//g,Nf=/=/g,Mf=/\?/g,ra=/\+/g,Lf=/%5B/g,Df=/%5D/g,oa=/%5E/g,zf=/%60/g,ia=/%7B/g,Vf=/%7C/g,la=/%7D/g,Ff=/%20/g;function ho(e){return e==null?"":encodeURI(""+e).replace(Vf,"|").replace(Lf,"[").replace(Df,"]")}function jf(e){return ho(e).replace(ia,"{").replace(la,"}").replace(oa,"^")}function Vr(e){return ho(e).replace(ra,"%2B").replace(Ff,"+").replace(sa,"%23").replace(Of,"%26").replace(zf,"`").replace(ia,"{").replace(la,"}").replace(oa,"^")}function Bf(e){return Vr(e).replace(Nf,"%3D")}function Gf(e){return ho(e).replace(sa,"%23").replace(Mf,"%3F")}function Hf(e){return Gf(e).replace(If,"%2F")}function Zn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const $f=/\/$/,Uf=e=>e.replace($f,"");function hr(e,t,n="/"){let s,r={},o="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return a=l>=0&&a>l?-1:a,a>=0&&(s=t.slice(0,a),o=t.slice(a,l>0?l:t.length),r=e(o.slice(1))),l>=0&&(s=s||t.slice(0,l),i=t.slice(l,t.length)),s=Jf(s??t,n),{fullPath:s+o+i,path:s,query:r,hash:Zn(i)}}function Wf(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function di(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Kf(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&kn(t.matched[s],n.matched[r])&&aa(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function kn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function aa(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!qf(e[n],t[n]))return!1;return!0}function qf(e,t){return ct(e)?pi(e,t):ct(t)?pi(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function pi(e,t){return ct(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Jf(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),r=s[s.length-1];(r===".."||r===".")&&s.push("");let o=n.length-1,i,l;for(i=0;i1&&o--;else break;return n.slice(0,o).join("/")+"/"+s.slice(i).join("/")}const Bt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Fr=(function(e){return e.pop="pop",e.push="push",e})({}),mr=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function Yf(e){if(!e)if(gn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Uf(e)}const Qf=/^[^#]+#/;function Xf(e,t){return e.replace(Qf,"#")+t}function Zf(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Ys=()=>({left:window.scrollX,top:window.scrollY});function ed(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=Zf(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function hi(e,t){return(history.state?history.state.position-t:-1)+e}const jr=new Map;function td(e,t){jr.set(e,t)}function nd(e){const t=jr.get(e);return jr.delete(e),t}function sd(e){return typeof e=="string"||e&&typeof e=="object"}function ca(e){return typeof e=="string"||typeof e=="symbol"}let xe=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({});const ua=Symbol("");xe.MATCHER_NOT_FOUND+"",xe.NAVIGATION_GUARD_REDIRECT+"",xe.NAVIGATION_ABORTED+"",xe.NAVIGATION_CANCELLED+"",xe.NAVIGATION_DUPLICATED+"";function Rn(e,t){return ce(new Error,{type:e,[ua]:!0},t)}function At(e,t){return e instanceof Error&&ua in e&&(t==null||!!(e.type&t))}const rd=["params","query","hash"];function od(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of rd)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function id(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;sr&&Vr(r)):[s&&Vr(s)]).forEach(r=>{r!==void 0&&(t+=(t.length?"&":"")+n,r!=null&&(t+="="+r))})}return t}function ld(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=ct(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const ad=Symbol(""),gi=Symbol(""),Qs=Symbol(""),mo=Symbol(""),Br=Symbol("");function Mn(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function Wt(e,t,n,s,r,o=i=>i()){const i=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((l,a)=>{const c=h=>{h===!1?a(Rn(xe.NAVIGATION_ABORTED,{from:n,to:t})):h instanceof Error?a(h):sd(h)?a(Rn(xe.NAVIGATION_GUARD_REDIRECT,{from:t,to:h})):(i&&s.enterCallbacks[r]===i&&typeof h=="function"&&i.push(h),l())},u=o(()=>e.call(s&&s.instances[r],t,n,c));let f=Promise.resolve(u);e.length<3&&(f=f.then(c)),f.catch(h=>a(h))})}function gr(e,t,n,s,r=o=>o()){const o=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(na(a)){const c=(a.__vccOpts||a)[t];c&&o.push(Wt(c,n,s,i,l,r))}else{let c=a();o.push(()=>c.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const f=Pf(u)?u.default:u;i.mods[l]=u,i.components[l]=f;const h=(f.__vccOpts||f)[t];return h&&Wt(h,n,s,i,l,r)()}))}}return o}function cd(e,t){const n=[],s=[],r=[],o=Math.max(t.matched.length,e.matched.length);for(let i=0;ikn(c,l))?s.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(c=>kn(c,a))||r.push(a))}return[n,s,r]}/*! + * vue-router v4.6.4 + * (c) 2025 Eduardo San Martin Morote + * @license MIT + */let ud=()=>location.protocol+"//"+location.host;function fa(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let i=r.includes(e.slice(o))?e.slice(o).length:1,l=r.slice(i);return l[0]!=="/"&&(l="/"+l),di(l,"")}return di(n,e)+s+r}function fd(e,t,n,s){let r=[],o=[],i=null;const l=({state:h})=>{const m=fa(e,location),E=n.value,x=t.value;let k=0;if(h){if(n.value=m,t.value=h,i&&i===E){i=null;return}k=x?h.position-x.position:0}else s(m);r.forEach(I=>{I(n.value,E,{delta:k,type:Fr.pop,direction:k?k>0?mr.forward:mr.back:mr.unknown})})};function a(){i=n.value}function c(h){r.push(h);const m=()=>{const E=r.indexOf(h);E>-1&&r.splice(E,1)};return o.push(m),m}function u(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(ce({},h.state,{scroll:Ys()}),"")}}function f(){for(const h of o)h();o=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:a,listen:c,destroy:f}}function bi(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?Ys():null}}function dd(e){const{history:t,location:n}=window,s={value:fa(e,n)},r={value:t.state};r.value||o(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(a,c,u){const f=e.indexOf("#"),h=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:ud()+e+a;try{t[u?"replaceState":"pushState"](c,"",h),r.value=c}catch(m){console.error(m),n[u?"replace":"assign"](h)}}function i(a,c){o(a,ce({},t.state,bi(r.value.back,a,r.value.forward,!0),c,{position:r.value.position}),!0),s.value=a}function l(a,c){const u=ce({},r.value,t.state,{forward:a,scroll:Ys()});o(u.current,u,!0),o(a,ce({},bi(s.value,a,null),{position:u.position+1},c),!1),s.value=a}return{location:s,state:r,push:l,replace:i}}function pd(e){e=Yf(e);const t=dd(e),n=fd(e,t.state,t.location,t.replace);function s(o,i=!0){i||n.pauseListeners(),history.go(o)}const r=ce({location:"",base:e,go:s,createHref:Xf.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}let rn=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var ke=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(ke||{});const hd={type:rn.Static,value:""},md=/[a-zA-Z0-9_]/;function gd(e){if(!e)return[[]];if(e==="/")return[[hd]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${c}": ${m}`)}let n=ke.Static,s=n;const r=[];let o;function i(){o&&r.push(o),o=[]}let l=0,a,c="",u="";function f(){c&&(n===ke.Static?o.push({type:rn.Static,value:c}):n===ke.Param||n===ke.ParamRegExp||n===ke.ParamRegExpEnd?(o.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),o.push({type:rn.Param,value:c,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),c="")}function h(){c+=a}for(;lt.length?t.length===1&&t[0]===Be.Static+Be.Segment?1:-1:0}function da(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const xd={strict:!1,end:!0,sensitive:!1};function wd(e,t,n){const s=yd(gd(e.path),n),r=ce(s,{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Sd(e,t){const n=[],s=new Map;t=fi(xd,t);function r(f){return s.get(f)}function o(f,h,m){const E=!m,x=xi(f);x.aliasOf=m&&m.record;const k=fi(t,f),I=[x];if("alias"in f){const T=typeof f.alias=="string"?[f.alias]:f.alias;for(const J of T)I.push(xi(ce({},x,{components:m?m.record.components:x.components,path:J,aliasOf:m?m.record:x})))}let _,M;for(const T of I){const{path:J}=T;if(h&&J[0]!=="/"){const Y=h.record.path,j=Y[Y.length-1]==="/"?"":"/";T.path=h.record.path+(J&&j+J)}if(_=wd(T,h,k),m?m.alias.push(_):(M=M||_,M!==_&&M.alias.push(_),E&&f.name&&!wi(_)&&i(f.name)),pa(_)&&a(_),x.children){const Y=x.children;for(let j=0;j{i(M)}:Un}function i(f){if(ca(f)){const h=s.get(f);h&&(s.delete(f),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(f);h>-1&&(n.splice(h,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function l(){return n}function a(f){const h=Cd(f,n);n.splice(h,0,f),f.record.name&&!wi(f)&&s.set(f.record.name,f)}function c(f,h){let m,E={},x,k;if("name"in f&&f.name){if(m=s.get(f.name),!m)throw Rn(xe.MATCHER_NOT_FOUND,{location:f});k=m.record.name,E=ce(_i(h.params,m.keys.filter(M=>!M.optional).concat(m.parent?m.parent.keys.filter(M=>M.optional):[]).map(M=>M.name)),f.params&&_i(f.params,m.keys.map(M=>M.name))),x=m.stringify(E)}else if(f.path!=null)x=f.path,m=n.find(M=>M.re.test(x)),m&&(E=m.parse(x),k=m.record.name);else{if(m=h.name?s.get(h.name):n.find(M=>M.re.test(h.path)),!m)throw Rn(xe.MATCHER_NOT_FOUND,{location:f,currentLocation:h});k=m.record.name,E=ce({},h.params,f.params),x=m.stringify(E)}const I=[];let _=m;for(;_;)I.unshift(_.record),_=_.parent;return{name:k,path:x,params:E,matched:I,meta:Ad(I)}}e.forEach(f=>o(f));function u(){n.length=0,s.clear()}return{addRoute:o,resolve:c,removeRoute:i,clearRoutes:u,getRoutes:l,getRecordMatcher:r}}function _i(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function xi(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Ed(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Ed(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function wi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ad(e){return e.reduce((t,n)=>ce(t,n.meta),{})}function Cd(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;da(e,t[o])<0?s=o:n=o+1}const r=kd(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function kd(e){let t=e;for(;t=t.parent;)if(pa(t)&&da(e,t)===0)return t}function pa({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Si(e){const t=it(Qs),n=it(mo),s=we(()=>{const a=B(e.to);return t.resolve(a)}),r=we(()=>{const{matched:a}=s.value,{length:c}=a,u=a[c-1],f=n.matched;if(!u||!f.length)return-1;const h=f.findIndex(kn.bind(null,u));if(h>-1)return h;const m=Ei(a[c-2]);return c>1&&Ei(u)===m&&f[f.length-1].path!==m?f.findIndex(kn.bind(null,a[c-2])):h}),o=we(()=>r.value>-1&&Od(n.params,s.value.params)),i=we(()=>r.value>-1&&r.value===n.matched.length-1&&aa(n.params,s.value.params));function l(a={}){if(Pd(a)){const c=t[B(e.replace)?"replace":"push"](B(e.to)).catch(Un);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:s,href:we(()=>s.value.href),isActive:o,isExactActive:i,navigate:l}}function Rd(e){return e.length===1?e[0]:e}const Td=We({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Si,setup(e,{slots:t}){const n=Fs(Si(e)),{options:s}=it(Qs),r=we(()=>({[Ai(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[Ai(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Rd(t.default(n));return e.custom?o:qt("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),Gr=Td;function Pd(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Od(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!ct(r)||r.length!==s.length||s.some((o,i)=>o.valueOf()!==r[i].valueOf()))return!1}return!0}function Ei(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ai=(e,t,n)=>e??t??n,Id=We({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=it(Br),r=we(()=>e.route||s.value),o=it(gi,0),i=we(()=>{let c=B(o);const{matched:u}=r.value;let f;for(;(f=u[c])&&!f.components;)c++;return c}),l=we(()=>r.value.matched[i.value]);ds(gi,we(()=>i.value+1)),ds(ad,l),ds(Br,r);const a=Ze();return Nt(()=>[a.value,l.value,e.name],([c,u,f],[h,m,E])=>{u&&(u.instances[f]=c,m&&m!==u&&c&&c===h&&(u.leaveGuards.size||(u.leaveGuards=m.leaveGuards),u.updateGuards.size||(u.updateGuards=m.updateGuards))),c&&u&&(!m||!kn(u,m)||!h)&&(u.enterCallbacks[f]||[]).forEach(x=>x(c))},{flush:"post"}),()=>{const c=r.value,u=e.name,f=l.value,h=f&&f.components[u];if(!h)return Ci(n.default,{Component:h,route:c});const m=f.props[u],E=m?m===!0?c.params:typeof m=="function"?m(c):m:null,k=qt(h,ce({},E,t,{onVnodeUnmounted:I=>{I.component.isUnmounted&&(f.instances[u]=null)},ref:a}));return Ci(n.default,{Component:k,route:c})||k}}});function Ci(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const go=Id;function Nd(e){const t=Sd(e.routes,e),n=e.parseQuery||id,s=e.stringifyQuery||mi,r=e.history,o=Mn(),i=Mn(),l=Mn(),a=to(Bt);let c=Bt;gn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=pr.bind(null,v=>""+v),f=pr.bind(null,Hf),h=pr.bind(null,Zn);function m(v,z){let A,H;return ca(v)?(A=t.getRecordMatcher(v),H=z):H=v,t.addRoute(H,A)}function E(v){const z=t.getRecordMatcher(v);z&&t.removeRoute(z)}function x(){return t.getRoutes().map(v=>v.record)}function k(v){return!!t.getRecordMatcher(v)}function I(v,z){if(z=ce({},z||a.value),typeof v=="string"){const g=hr(n,v,z.path),y=t.resolve({path:g.path},z),w=r.createHref(g.fullPath);return ce(g,y,{params:h(y.params),hash:Zn(g.hash),redirectedFrom:void 0,href:w})}let A;if(v.path!=null)A=ce({},v,{path:hr(n,v.path,z.path).path});else{const g=ce({},v.params);for(const y in g)g[y]==null&&delete g[y];A=ce({},v,{params:f(g)}),z.params=f(z.params)}const H=t.resolve(A,z),Q=v.hash||"";H.params=u(h(H.params));const d=Wf(s,ce({},v,{hash:jf(Q),path:H.path})),p=r.createHref(d);return ce({fullPath:d,hash:Q,query:s===mi?ld(v.query):v.query||{}},H,{redirectedFrom:void 0,href:p})}function _(v){return typeof v=="string"?hr(n,v,a.value.path):ce({},v)}function M(v,z){if(c!==v)return Rn(xe.NAVIGATION_CANCELLED,{from:z,to:v})}function T(v){return j(v)}function J(v){return T(ce(_(v),{replace:!0}))}function Y(v,z){const A=v.matched[v.matched.length-1];if(A&&A.redirect){const{redirect:H}=A;let Q=typeof H=="function"?H(v,z):H;return typeof Q=="string"&&(Q=Q.includes("?")||Q.includes("#")?Q=_(Q):{path:Q},Q.params={}),ce({query:v.query,hash:v.hash,params:Q.path!=null?{}:v.params},Q)}}function j(v,z){const A=c=I(v),H=a.value,Q=v.state,d=v.force,p=v.replace===!0,g=Y(A,H);if(g)return j(ce(_(g),{state:typeof g=="object"?ce({},Q,g.state):Q,force:d,replace:p}),z||A);const y=A;y.redirectedFrom=z;let w;return!d&&Kf(s,H,A)&&(w=Rn(xe.NAVIGATION_DUPLICATED,{to:y,from:H}),qe(H,H,!0,!1)),(w?Promise.resolve(w):Z(y,H)).catch(b=>At(b)?At(b,xe.NAVIGATION_GUARD_REDIRECT)?b:G(b):se(b,y,H)).then(b=>{if(b){if(At(b,xe.NAVIGATION_GUARD_REDIRECT))return j(ce({replace:p},_(b.to),{state:typeof b.to=="object"?ce({},Q,b.to.state):Q,force:d}),z||y)}else b=L(y,H,!0,p,Q);return ne(y,H,b),b})}function C(v,z){const A=M(v,z);return A?Promise.reject(A):Promise.resolve()}function N(v){const z=ut.values().next().value;return z&&typeof z.runWithContext=="function"?z.runWithContext(v):v()}function Z(v,z){let A;const[H,Q,d]=cd(v,z);A=gr(H.reverse(),"beforeRouteLeave",v,z);for(const g of H)g.leaveGuards.forEach(y=>{A.push(Wt(y,v,z))});const p=C.bind(null,v,z);return A.push(p),pe(A).then(()=>{A=[];for(const g of o.list())A.push(Wt(g,v,z));return A.push(p),pe(A)}).then(()=>{A=gr(Q,"beforeRouteUpdate",v,z);for(const g of Q)g.updateGuards.forEach(y=>{A.push(Wt(y,v,z))});return A.push(p),pe(A)}).then(()=>{A=[];for(const g of d)if(g.beforeEnter)if(ct(g.beforeEnter))for(const y of g.beforeEnter)A.push(Wt(y,v,z));else A.push(Wt(g.beforeEnter,v,z));return A.push(p),pe(A)}).then(()=>(v.matched.forEach(g=>g.enterCallbacks={}),A=gr(d,"beforeRouteEnter",v,z,N),A.push(p),pe(A))).then(()=>{A=[];for(const g of i.list())A.push(Wt(g,v,z));return A.push(p),pe(A)}).catch(g=>At(g,xe.NAVIGATION_CANCELLED)?g:Promise.reject(g))}function ne(v,z,A){l.list().forEach(H=>N(()=>H(v,z,A)))}function L(v,z,A,H,Q){const d=M(v,z);if(d)return d;const p=z===Bt,g=gn?history.state:{};A&&(H||p?r.replace(v.fullPath,ce({scroll:p&&g&&g.scroll},Q)):r.push(v.fullPath,Q)),a.value=v,qe(v,z,A,p),G()}let te;function be(){te||(te=r.listen((v,z,A)=>{if(!_e.listening)return;const H=I(v),Q=Y(H,_e.currentRoute.value);if(Q){j(ce(Q,{replace:!0,force:!0}),H).catch(Un);return}c=H;const d=a.value;gn&&td(hi(d.fullPath,A.delta),Ys()),Z(H,d).catch(p=>At(p,xe.NAVIGATION_ABORTED|xe.NAVIGATION_CANCELLED)?p:At(p,xe.NAVIGATION_GUARD_REDIRECT)?(j(ce(_(p.to),{force:!0}),H).then(g=>{At(g,xe.NAVIGATION_ABORTED|xe.NAVIGATION_DUPLICATED)&&!A.delta&&A.type===Fr.pop&&r.go(-1,!1)}).catch(Un),Promise.reject()):(A.delta&&r.go(-A.delta,!1),se(p,H,d))).then(p=>{p=p||L(H,d,!1),p&&(A.delta&&!At(p,xe.NAVIGATION_CANCELLED)?r.go(-A.delta,!1):A.type===Fr.pop&&At(p,xe.NAVIGATION_ABORTED|xe.NAVIGATION_DUPLICATED)&&r.go(-1,!1)),ne(H,d,p)}).catch(Un)}))}let Se=Mn(),re=Mn(),ee;function se(v,z,A){G(v);const H=re.list();return H.length?H.forEach(Q=>Q(v,z,A)):console.error(v),Promise.reject(v)}function Ke(){return ee&&a.value!==Bt?Promise.resolve():new Promise((v,z)=>{Se.add([v,z])})}function G(v){return ee||(ee=!v,be(),Se.list().forEach(([z,A])=>v?A(v):z()),Se.reset()),v}function qe(v,z,A,H){const{scrollBehavior:Q}=e;if(!gn||!Q)return Promise.resolve();const d=!A&&nd(hi(v.fullPath,0))||(H||!A)&&history.state&&history.state.scroll||null;return no().then(()=>Q(v,z,d)).then(p=>p&&ed(p)).catch(p=>se(p,v,z))}const Ie=v=>r.go(v);let St;const ut=new Set,_e={currentRoute:a,listening:!0,addRoute:m,removeRoute:E,clearRoutes:t.clearRoutes,hasRoute:k,getRoutes:x,resolve:I,options:e,push:T,replace:J,go:Ie,back:()=>Ie(-1),forward:()=>Ie(1),beforeEach:o.add,beforeResolve:i.add,afterEach:l.add,onError:re.add,isReady:Ke,install(v){v.component("RouterLink",Gr),v.component("RouterView",go),v.config.globalProperties.$router=_e,Object.defineProperty(v.config.globalProperties,"$route",{enumerable:!0,get:()=>B(a)}),gn&&!St&&a.value===Bt&&(St=!0,T(r.location).catch(H=>{}));const z={};for(const H in Bt)Object.defineProperty(z,H,{get:()=>a.value[H],enumerable:!0});v.provide(Qs,_e),v.provide(mo,pl(z)),v.provide(Br,a);const A=v.unmount;ut.add(v),v.unmount=function(){ut.delete(v),ut.size<1&&(c=Bt,te&&te(),te=null,a.value=Bt,St=!1,ee=!1),A()}}};function pe(v){return v.reduce((z,A)=>z.then(()=>N(A)),Promise.resolve())}return _e}function Md(){return it(Qs)}function ha(e){return it(mo)}/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ld=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var as={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Dd=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:s,iconNode:r,name:o,class:i,...l},{slots:a})=>qt("svg",{...as,width:e||as.width,height:e||as.height,stroke:s||as.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:["lucide",`lucide-${Ld(o??"icon")}`],...l},[...r.map(c=>qt(...c)),...a.default?[a.default()]:[]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const st=(e,t)=>(n,{slots:s})=>qt(Dd,{...n,iconNode:t,name:e},s);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zd=st("ActivityIcon",[["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"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Vd=st("CircleCheckIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Fd=st("LayoutDashboardIcon",[["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"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jd=st("ListFilterIcon",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M7 12h10",key:"b7w52i"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Bd=st("LoaderCircleIcon",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Gd=st("LockKeyholeIcon",[["circle",{cx:"12",cy:"16",r:"1",key:"1au0dj"}],["rect",{x:"3",y:"10",width:"18",height:"12",rx:"2",key:"6s8ecr"}],["path",{d:"M7 10V7a5 5 0 0 1 10 0v3",key:"1pqi11"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Hd=st("MoonIcon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $d=st("RadioIcon",[["path",{d:"M4.9 19.1C1 15.2 1 8.8 4.9 4.9",key:"1vaf9d"}],["path",{d:"M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5",key:"u1ii0m"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}],["path",{d:"M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5",key:"1j5fej"}],["path",{d:"M19.1 4.9C23 8.8 23 15.1 19.1 19",key:"10b0cb"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ud=st("Settings2Icon",[["path",{d:"M20 7h-9",key:"3s1dr2"}],["path",{d:"M14 17H5",key:"gfn3mx"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Wd=st("SunIcon",[["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"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Kd=st("TriangleAlertIcon",[["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"}]]);/** + * @license lucide-vue-next v0.469.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qd=st("XIcon",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),es=Ze([]);let Jd=1;function br(e,t,n){const s=Jd++;es.value=[...es.value,{id:s,title:e,description:n,variant:t}],window.setTimeout(()=>bo(s),t==="error"?6e3:3500)}function bo(e){es.value=es.value.filter(t=>t.id!==e)}const Yd={info:(e,t)=>br(e,"default",t),success:(e,t)=>br(e,"success",t),error:(e,t)=>br(e,"error",t)};function Qd(){return{toasts:es,toast:Yd,dismiss:bo}}function ma(e){var t,n,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t{const n=new Array(e.length+t.length);for(let s=0;s({classGroupId:e,validator:t}),ba=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),ks="-",ki=[],ep="arbitrary..",tp=e=>{const t=sp(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:s}=e;return{getClassGroupId:i=>{if(i.startsWith("[")&&i.endsWith("]"))return np(i);const l=i.split(ks),a=l[0]===""&&l.length>1?1:0;return va(l,a,t)},getConflictingClassGroupIds:(i,l)=>{if(l){const a=s[i],c=n[i];return a?c?Xd(c,a):a:c||ki}return n[i]||ki}}},va=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;const r=e[t],o=n.nextPart.get(r);if(o){const c=va(e,t+1,o);if(c)return c}const i=n.validators;if(i===null)return;const l=t===0?e.join(ks):e.slice(t).join(ks),a=i.length;for(let c=0;ce.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const t=e.slice(1,-1),n=t.indexOf(":"),s=t.slice(0,n);return s?ep+s:void 0})(),sp=e=>{const{theme:t,classGroups:n}=e;return rp(n,t)},rp=(e,t)=>{const n=ba();for(const s in e){const r=e[s];vo(r,n,s,t)}return n},vo=(e,t,n,s)=>{const r=e.length;for(let o=0;o{if(typeof e=="string"){ip(e,t,n);return}if(typeof e=="function"){lp(e,t,n,s);return}ap(e,t,n,s)},ip=(e,t,n)=>{const s=e===""?t:ya(t,e);s.classGroupId=n},lp=(e,t,n,s)=>{if(cp(e)){vo(e(s),t,n,s);return}t.validators===null&&(t.validators=[]),t.validators.push(Zd(n,e))},ap=(e,t,n,s)=>{const r=Object.entries(e),o=r.length;for(let i=0;i{let n=e;const s=t.split(ks),r=s.length;for(let o=0;o"isThemeGetter"in e&&e.isThemeGetter===!0,up=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=Object.create(null),s=Object.create(null);const r=(o,i)=>{n[o]=i,t++,t>e&&(t=0,s=n,n=Object.create(null))};return{get(o){let i=n[o];if(i!==void 0)return i;if((i=s[o])!==void 0)return r(o,i),i},set(o,i){o in n?n[o]=i:r(o,i)}}},Hr="!",Ri=":",fp=[],Ti=(e,t,n,s,r)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:s,isExternal:r}),dp=e=>{const{prefix:t,experimentalParseClassName:n}=e;let s=r=>{const o=[];let i=0,l=0,a=0,c;const u=r.length;for(let x=0;xa?c-a:void 0;return Ti(o,m,h,E)};if(t){const r=t+Ri,o=s;s=i=>i.startsWith(r)?o(i.slice(r.length)):Ti(fp,!1,i,void 0,!0)}if(n){const r=s;s=o=>n({className:o,parseClassName:r})}return s},pp=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((n,s)=>{t.set(n,1e6+s)}),n=>{const s=[];let r=[];for(let o=0;o0&&(r.sort(),s.push(...r),r=[]),s.push(i)):r.push(i)}return r.length>0&&(r.sort(),s.push(...r)),s}},hp=e=>({cache:up(e.cacheSize),parseClassName:dp(e),sortModifiers:pp(e),postfixLookupClassGroupIds:mp(e),...tp(e)}),mp=e=>{const t=Object.create(null),n=e.postfixLookupClassGroups;if(n)for(let s=0;s{const{parseClassName:n,getClassGroupId:s,getConflictingClassGroupIds:r,sortModifiers:o,postfixLookupClassGroupIds:i}=t,l=[],a=e.trim().split(gp);let c="";for(let u=a.length-1;u>=0;u-=1){const f=a[u],{isExternal:h,modifiers:m,hasImportantModifier:E,baseClassName:x,maybePostfixModifierPosition:k}=n(f);if(h){c=f+(c.length>0?" "+c:c);continue}let I=!!k,_;if(I){const j=x.substring(0,k);_=s(j);const C=_&&i[_]?s(x):void 0;C&&C!==_&&(_=C,I=!1)}else _=s(x);if(!_){if(!I){c=f+(c.length>0?" "+c:c);continue}if(_=s(x),!_){c=f+(c.length>0?" "+c:c);continue}I=!1}const M=m.length===0?"":m.length===1?m[0]:o(m).join(":"),T=E?M+Hr:M,J=T+_;if(l.indexOf(J)>-1)continue;l.push(J);const Y=r(_,I);for(let j=0;j0?" "+c:c)}return c},vp=(...e)=>{let t=0,n,s,r="";for(;t{if(typeof e=="string")return e;let t,n="";for(let s=0;s{let n,s,r,o;const i=a=>{const c=t.reduce((u,f)=>f(u),e());return n=hp(c),s=n.cache.get,r=n.cache.set,o=l,l(a)},l=a=>{const c=s(a);if(c)return c;const u=bp(a,n);return r(a,u),u};return o=i,(...a)=>o(vp(...a))},_p=[],Ce=e=>{const t=n=>n[e]||_p;return t.isThemeGetter=!0,t},xa=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,wa=/^\((?:(\w[\w-]*):)?(.+)\)$/i,xp=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,wp=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Sp=/\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$/,Ep=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Ap=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Cp=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Gt=e=>xp.test(e),X=e=>!!e&&!Number.isNaN(Number(e)),mt=e=>!!e&&Number.isInteger(Number(e)),vr=e=>e.endsWith("%")&&X(e.slice(0,-1)),Ct=e=>wp.test(e),Sa=()=>!0,kp=e=>Sp.test(e)&&!Ep.test(e),yo=()=>!1,Rp=e=>Ap.test(e),Tp=e=>Cp.test(e),Pp=e=>!V(e)&&!F(e),Op=e=>e.startsWith("@container")&&(e[10]==="/"&&e[11]!==void 0||e[11]==="s"&&e[16]!==void 0&&e.startsWith("-size/",10)||e[11]==="n"&&e[18]!==void 0&&e.startsWith("-normal/",10)),Ip=e=>Qt(e,Ca,yo),V=e=>xa.test(e),tn=e=>Qt(e,ka,kp),Pi=e=>Qt(e,jp,X),Np=e=>Qt(e,Ta,Sa),Mp=e=>Qt(e,Ra,yo),Oi=e=>Qt(e,Ea,yo),Lp=e=>Qt(e,Aa,Tp),cs=e=>Qt(e,Pa,Rp),F=e=>wa.test(e),Ln=e=>dn(e,ka),Dp=e=>dn(e,Ra),Ii=e=>dn(e,Ea),zp=e=>dn(e,Ca),Vp=e=>dn(e,Aa),us=e=>dn(e,Pa,!0),Fp=e=>dn(e,Ta,!0),Qt=(e,t,n)=>{const s=xa.exec(e);return s?s[1]?t(s[1]):n(s[2]):!1},dn=(e,t,n=!1)=>{const s=wa.exec(e);return s?s[1]?t(s[1]):n:!1},Ea=e=>e==="position"||e==="percentage",Aa=e=>e==="image"||e==="url",Ca=e=>e==="length"||e==="size"||e==="bg-size",ka=e=>e==="length",jp=e=>e==="number",Ra=e=>e==="family-name",Ta=e=>e==="number"||e==="weight",Pa=e=>e==="shadow",Bp=()=>{const e=Ce("color"),t=Ce("font"),n=Ce("text"),s=Ce("font-weight"),r=Ce("tracking"),o=Ce("leading"),i=Ce("breakpoint"),l=Ce("container"),a=Ce("spacing"),c=Ce("radius"),u=Ce("shadow"),f=Ce("inset-shadow"),h=Ce("text-shadow"),m=Ce("drop-shadow"),E=Ce("blur"),x=Ce("perspective"),k=Ce("aspect"),I=Ce("ease"),_=Ce("animate"),M=()=>["auto","avoid","all","avoid-page","page","left","right","column"],T=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],J=()=>[...T(),F,V],Y=()=>["auto","hidden","clip","visible","scroll"],j=()=>["auto","contain","none"],C=()=>[F,V,a],N=()=>[Gt,"full","auto",...C()],Z=()=>[mt,"none","subgrid",F,V],ne=()=>["auto",{span:["full",mt,F,V]},mt,F,V],L=()=>[mt,"auto",F,V],te=()=>["auto","min","max","fr",F,V],be=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],Se=()=>["start","end","center","stretch","center-safe","end-safe"],re=()=>["auto",...C()],ee=()=>[Gt,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...C()],se=()=>[Gt,"screen","full","dvw","lvw","svw","min","max","fit",...C()],Ke=()=>[Gt,"screen","full","lh","dvh","lvh","svh","min","max","fit",...C()],G=()=>[e,F,V],qe=()=>[...T(),Ii,Oi,{position:[F,V]}],Ie=()=>["no-repeat",{repeat:["","x","y","space","round"]}],St=()=>["auto","cover","contain",zp,Ip,{size:[F,V]}],ut=()=>[vr,Ln,tn],_e=()=>["","none","full",c,F,V],pe=()=>["",X,Ln,tn],v=()=>["solid","dashed","dotted","double"],z=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],A=()=>[X,vr,Ii,Oi],H=()=>["","none",E,F,V],Q=()=>["none",X,F,V],d=()=>["none",X,F,V],p=()=>[X,F,V],g=()=>[Gt,"full",...C()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Ct],breakpoint:[Ct],color:[Sa],container:[Ct],"drop-shadow":[Ct],ease:["in","out","in-out"],font:[Pp],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Ct],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Ct],shadow:[Ct],spacing:["px",X],text:[Ct],"text-shadow":[Ct],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",Gt,V,F,k]}],container:["container"],"container-type":[{"@container":["","normal","size",F,V]}],"container-named":[Op],columns:[{columns:[X,V,F,l]}],"break-after":[{"break-after":M()}],"break-before":[{"break-before":M()}],"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:J()}],overflow:[{overflow:Y()}],"overflow-x":[{"overflow-x":Y()}],"overflow-y":[{"overflow-y":Y()}],overscroll:[{overscroll:j()}],"overscroll-x":[{"overscroll-x":j()}],"overscroll-y":[{"overscroll-y":j()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:N()}],"inset-x":[{"inset-x":N()}],"inset-y":[{"inset-y":N()}],start:[{"inset-s":N(),start:N()}],end:[{"inset-e":N(),end:N()}],"inset-bs":[{"inset-bs":N()}],"inset-be":[{"inset-be":N()}],top:[{top:N()}],right:[{right:N()}],bottom:[{bottom:N()}],left:[{left:N()}],visibility:["visible","invisible","collapse"],z:[{z:[mt,"auto",F,V]}],basis:[{basis:[Gt,"full","auto",l,...C()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[X,Gt,"auto","initial","none",V]}],grow:[{grow:["",X,F,V]}],shrink:[{shrink:["",X,F,V]}],order:[{order:[mt,"first","last","none",F,V]}],"grid-cols":[{"grid-cols":Z()}],"col-start-end":[{col:ne()}],"col-start":[{"col-start":L()}],"col-end":[{"col-end":L()}],"grid-rows":[{"grid-rows":Z()}],"row-start-end":[{row:ne()}],"row-start":[{"row-start":L()}],"row-end":[{"row-end":L()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":te()}],"auto-rows":[{"auto-rows":te()}],gap:[{gap:C()}],"gap-x":[{"gap-x":C()}],"gap-y":[{"gap-y":C()}],"justify-content":[{justify:[...be(),"normal"]}],"justify-items":[{"justify-items":[...Se(),"normal"]}],"justify-self":[{"justify-self":["auto",...Se()]}],"align-content":[{content:["normal",...be()]}],"align-items":[{items:[...Se(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...Se(),{baseline:["","last"]}]}],"place-content":[{"place-content":be()}],"place-items":[{"place-items":[...Se(),"baseline"]}],"place-self":[{"place-self":["auto",...Se()]}],p:[{p:C()}],px:[{px:C()}],py:[{py:C()}],ps:[{ps:C()}],pe:[{pe:C()}],pbs:[{pbs:C()}],pbe:[{pbe:C()}],pt:[{pt:C()}],pr:[{pr:C()}],pb:[{pb:C()}],pl:[{pl:C()}],m:[{m:re()}],mx:[{mx:re()}],my:[{my:re()}],ms:[{ms:re()}],me:[{me:re()}],mbs:[{mbs:re()}],mbe:[{mbe:re()}],mt:[{mt:re()}],mr:[{mr:re()}],mb:[{mb:re()}],ml:[{ml:re()}],"space-x":[{"space-x":C()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":C()}],"space-y-reverse":["space-y-reverse"],size:[{size:ee()}],"inline-size":[{inline:["auto",...se()]}],"min-inline-size":[{"min-inline":["auto",...se()]}],"max-inline-size":[{"max-inline":["none",...se()]}],"block-size":[{block:["auto",...Ke()]}],"min-block-size":[{"min-block":["auto",...Ke()]}],"max-block-size":[{"max-block":["none",...Ke()]}],w:[{w:[l,"screen",...ee()]}],"min-w":[{"min-w":[l,"screen","none",...ee()]}],"max-w":[{"max-w":[l,"screen","none","prose",{screen:[i]},...ee()]}],h:[{h:["screen","lh",...ee()]}],"min-h":[{"min-h":["screen","lh","none",...ee()]}],"max-h":[{"max-h":["screen","lh",...ee()]}],"font-size":[{text:["base",n,Ln,tn]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[s,Fp,Np]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",vr,V]}],"font-family":[{font:[Dp,Mp,t]}],"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:[r,F,V]}],"line-clamp":[{"line-clamp":[X,"none",F,Pi]}],leading:[{leading:[o,...C()]}],"list-image":[{"list-image":["none",F,V]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",F,V]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:G()}],"text-color":[{text:G()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...v(),"wavy"]}],"text-decoration-thickness":[{decoration:[X,"from-font","auto",F,tn]}],"text-decoration-color":[{decoration:G()}],"underline-offset":[{"underline-offset":[X,"auto",F,V]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:C()}],"tab-size":[{tab:[mt,F,V]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",F,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",F,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:qe()}],"bg-repeat":[{bg:Ie()}],"bg-size":[{bg:St()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},mt,F,V],radial:["",F,V],conic:[mt,F,V]},Vp,Lp]}],"bg-color":[{bg:G()}],"gradient-from-pos":[{from:ut()}],"gradient-via-pos":[{via:ut()}],"gradient-to-pos":[{to:ut()}],"gradient-from":[{from:G()}],"gradient-via":[{via:G()}],"gradient-to":[{to:G()}],rounded:[{rounded:_e()}],"rounded-s":[{"rounded-s":_e()}],"rounded-e":[{"rounded-e":_e()}],"rounded-t":[{"rounded-t":_e()}],"rounded-r":[{"rounded-r":_e()}],"rounded-b":[{"rounded-b":_e()}],"rounded-l":[{"rounded-l":_e()}],"rounded-ss":[{"rounded-ss":_e()}],"rounded-se":[{"rounded-se":_e()}],"rounded-ee":[{"rounded-ee":_e()}],"rounded-es":[{"rounded-es":_e()}],"rounded-tl":[{"rounded-tl":_e()}],"rounded-tr":[{"rounded-tr":_e()}],"rounded-br":[{"rounded-br":_e()}],"rounded-bl":[{"rounded-bl":_e()}],"border-w":[{border:pe()}],"border-w-x":[{"border-x":pe()}],"border-w-y":[{"border-y":pe()}],"border-w-s":[{"border-s":pe()}],"border-w-e":[{"border-e":pe()}],"border-w-bs":[{"border-bs":pe()}],"border-w-be":[{"border-be":pe()}],"border-w-t":[{"border-t":pe()}],"border-w-r":[{"border-r":pe()}],"border-w-b":[{"border-b":pe()}],"border-w-l":[{"border-l":pe()}],"divide-x":[{"divide-x":pe()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":pe()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...v(),"hidden","none"]}],"divide-style":[{divide:[...v(),"hidden","none"]}],"border-color":[{border:G()}],"border-color-x":[{"border-x":G()}],"border-color-y":[{"border-y":G()}],"border-color-s":[{"border-s":G()}],"border-color-e":[{"border-e":G()}],"border-color-bs":[{"border-bs":G()}],"border-color-be":[{"border-be":G()}],"border-color-t":[{"border-t":G()}],"border-color-r":[{"border-r":G()}],"border-color-b":[{"border-b":G()}],"border-color-l":[{"border-l":G()}],"divide-color":[{divide:G()}],"outline-style":[{outline:[...v(),"none","hidden"]}],"outline-offset":[{"outline-offset":[X,F,V]}],"outline-w":[{outline:["",X,Ln,tn]}],"outline-color":[{outline:G()}],shadow:[{shadow:["","none",u,us,cs]}],"shadow-color":[{shadow:G()}],"inset-shadow":[{"inset-shadow":["none",f,us,cs]}],"inset-shadow-color":[{"inset-shadow":G()}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:G()}],"ring-offset-w":[{"ring-offset":[X,tn]}],"ring-offset-color":[{"ring-offset":G()}],"inset-ring-w":[{"inset-ring":pe()}],"inset-ring-color":[{"inset-ring":G()}],"text-shadow":[{"text-shadow":["none",h,us,cs]}],"text-shadow-color":[{"text-shadow":G()}],opacity:[{opacity:[X,F,V]}],"mix-blend":[{"mix-blend":[...z(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":z()}],"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":[X]}],"mask-image-linear-from-pos":[{"mask-linear-from":A()}],"mask-image-linear-to-pos":[{"mask-linear-to":A()}],"mask-image-linear-from-color":[{"mask-linear-from":G()}],"mask-image-linear-to-color":[{"mask-linear-to":G()}],"mask-image-t-from-pos":[{"mask-t-from":A()}],"mask-image-t-to-pos":[{"mask-t-to":A()}],"mask-image-t-from-color":[{"mask-t-from":G()}],"mask-image-t-to-color":[{"mask-t-to":G()}],"mask-image-r-from-pos":[{"mask-r-from":A()}],"mask-image-r-to-pos":[{"mask-r-to":A()}],"mask-image-r-from-color":[{"mask-r-from":G()}],"mask-image-r-to-color":[{"mask-r-to":G()}],"mask-image-b-from-pos":[{"mask-b-from":A()}],"mask-image-b-to-pos":[{"mask-b-to":A()}],"mask-image-b-from-color":[{"mask-b-from":G()}],"mask-image-b-to-color":[{"mask-b-to":G()}],"mask-image-l-from-pos":[{"mask-l-from":A()}],"mask-image-l-to-pos":[{"mask-l-to":A()}],"mask-image-l-from-color":[{"mask-l-from":G()}],"mask-image-l-to-color":[{"mask-l-to":G()}],"mask-image-x-from-pos":[{"mask-x-from":A()}],"mask-image-x-to-pos":[{"mask-x-to":A()}],"mask-image-x-from-color":[{"mask-x-from":G()}],"mask-image-x-to-color":[{"mask-x-to":G()}],"mask-image-y-from-pos":[{"mask-y-from":A()}],"mask-image-y-to-pos":[{"mask-y-to":A()}],"mask-image-y-from-color":[{"mask-y-from":G()}],"mask-image-y-to-color":[{"mask-y-to":G()}],"mask-image-radial":[{"mask-radial":[F,V]}],"mask-image-radial-from-pos":[{"mask-radial-from":A()}],"mask-image-radial-to-pos":[{"mask-radial-to":A()}],"mask-image-radial-from-color":[{"mask-radial-from":G()}],"mask-image-radial-to-color":[{"mask-radial-to":G()}],"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":T()}],"mask-image-conic-pos":[{"mask-conic":[X]}],"mask-image-conic-from-pos":[{"mask-conic-from":A()}],"mask-image-conic-to-pos":[{"mask-conic-to":A()}],"mask-image-conic-from-color":[{"mask-conic-from":G()}],"mask-image-conic-to-color":[{"mask-conic-to":G()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:qe()}],"mask-repeat":[{mask:Ie()}],"mask-size":[{mask:St()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",F,V]}],filter:[{filter:["","none",F,V]}],blur:[{blur:H()}],brightness:[{brightness:[X,F,V]}],contrast:[{contrast:[X,F,V]}],"drop-shadow":[{"drop-shadow":["","none",m,us,cs]}],"drop-shadow-color":[{"drop-shadow":G()}],grayscale:[{grayscale:["",X,F,V]}],"hue-rotate":[{"hue-rotate":[X,F,V]}],invert:[{invert:["",X,F,V]}],saturate:[{saturate:[X,F,V]}],sepia:[{sepia:["",X,F,V]}],"backdrop-filter":[{"backdrop-filter":["","none",F,V]}],"backdrop-blur":[{"backdrop-blur":H()}],"backdrop-brightness":[{"backdrop-brightness":[X,F,V]}],"backdrop-contrast":[{"backdrop-contrast":[X,F,V]}],"backdrop-grayscale":[{"backdrop-grayscale":["",X,F,V]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[X,F,V]}],"backdrop-invert":[{"backdrop-invert":["",X,F,V]}],"backdrop-opacity":[{"backdrop-opacity":[X,F,V]}],"backdrop-saturate":[{"backdrop-saturate":[X,F,V]}],"backdrop-sepia":[{"backdrop-sepia":["",X,F,V]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":C()}],"border-spacing-x":[{"border-spacing-x":C()}],"border-spacing-y":[{"border-spacing-y":C()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",F,V]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[X,"initial",F,V]}],ease:[{ease:["linear","initial",I,F,V]}],delay:[{delay:[X,F,V]}],animate:[{animate:["none",_,F,V]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[x,F,V]}],"perspective-origin":[{"perspective-origin":J()}],rotate:[{rotate:Q()}],"rotate-x":[{"rotate-x":Q()}],"rotate-y":[{"rotate-y":Q()}],"rotate-z":[{"rotate-z":Q()}],scale:[{scale:d()}],"scale-x":[{"scale-x":d()}],"scale-y":[{"scale-y":d()}],"scale-z":[{"scale-z":d()}],"scale-3d":["scale-3d"],skew:[{skew:p()}],"skew-x":[{"skew-x":p()}],"skew-y":[{"skew-y":p()}],transform:[{transform:[F,V,"","none","gpu","cpu"]}],"transform-origin":[{origin:J()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:g()}],"translate-x":[{"translate-x":g()}],"translate-y":[{"translate-y":g()}],"translate-z":[{"translate-z":g()}],"translate-none":["translate-none"],zoom:[{zoom:[mt,F,V]}],accent:[{accent:G()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:G()}],"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",F,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":G()}],"scrollbar-track-color":[{"scrollbar-track":G()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":C()}],"scroll-mx":[{"scroll-mx":C()}],"scroll-my":[{"scroll-my":C()}],"scroll-ms":[{"scroll-ms":C()}],"scroll-me":[{"scroll-me":C()}],"scroll-mbs":[{"scroll-mbs":C()}],"scroll-mbe":[{"scroll-mbe":C()}],"scroll-mt":[{"scroll-mt":C()}],"scroll-mr":[{"scroll-mr":C()}],"scroll-mb":[{"scroll-mb":C()}],"scroll-ml":[{"scroll-ml":C()}],"scroll-p":[{"scroll-p":C()}],"scroll-px":[{"scroll-px":C()}],"scroll-py":[{"scroll-py":C()}],"scroll-ps":[{"scroll-ps":C()}],"scroll-pe":[{"scroll-pe":C()}],"scroll-pbs":[{"scroll-pbs":C()}],"scroll-pbe":[{"scroll-pbe":C()}],"scroll-pt":[{"scroll-pt":C()}],"scroll-pr":[{"scroll-pr":C()}],"scroll-pb":[{"scroll-pb":C()}],"scroll-pl":[{"scroll-pl":C()}],"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",F,V]}],fill:[{fill:["none",...G()]}],"stroke-w":[{stroke:[X,Ln,tn,Pi]}],stroke:[{stroke:["none",...G()]}],"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"]}},Gp=yp(Bp);function wt(...e){return Gp(ga(e))}const Hp={class:"pointer-events-none fixed inset-x-0 top-0 z-100 flex flex-col items-center gap-2 p-3 sm:top-auto sm:right-0 sm:bottom-0 sm:left-auto sm:items-end sm:p-4"},$p={class:"min-w-0 flex-1"},Up={class:"text-sm font-medium"},Wp={key:0,class:"text-muted-foreground mt-0.5 text-xs break-words"},Kp=["onClick"],qp=We({__name:"Toaster",setup(e){const{toasts:t}=Qd();return(n,s)=>(fe(),Qe("div",Hp,[de(gf,{"enter-active-class":"transition duration-200 ease-out","enter-from-class":"opacity-0 -translate-y-2 sm:translate-y-2","leave-active-class":"transition duration-150 ease-in absolute","leave-to-class":"opacity-0 scale-95"},{default:Ye(()=>[(fe(!0),Qe(Pe,null,Tr(B(t),r=>(fe(),Qe("div",{key:r.id,class:Ue(B(wt)("bg-popover text-popover-foreground pointer-events-auto flex w-full max-w-sm items-start gap-2.5 rounded-lg border p-3 shadow-lg",r.variant==="error"&&"border-block/40",r.variant==="success"&&"border-allow/40"))},[r.variant==="success"?(fe(),ze(B(Vd),{key:0,class:"text-allow mt-0.5 size-4 shrink-0"})):r.variant==="error"?(fe(),ze(B(Kd),{key:1,class:"text-block mt-0.5 size-4 shrink-0"})):ws("",!0),le("div",$p,[le("p",Up,Le(r.title),1),r.description?(fe(),Qe("p",Wp,Le(r.description),1)):ws("",!0)]),le("button",{type:"button",class:"text-muted-foreground hover:text-foreground -m-1 p-1",onClick:o=>B(bo)(r.id)},[de(B(qd),{class:"size-3.5"})],8,Kp)],2))),128))]),_:1})]))}}),Jp=We({__name:"App",setup(e){return(t,n)=>(fe(),Qe(Pe,null,[de(B(go)),de(qp)],64))}}),Oa="/api/v1",$r="opengfw.token";class hs extends Error{constructor(n,s){super(s);To(this,"status");this.status=n}}let bn=localStorage.getItem($r)??"";const Ur=new Set,Vt={get token(){return bn},get authenticated(){return bn!==""},set(e){bn=e,localStorage.setItem($r,e)},clear(){bn="",localStorage.removeItem($r)},onUnauthorized(e){return Ur.add(e),()=>Ur.delete(e)}};async function kt(e,t={}){const n=new Headers(t.headers);bn&&n.set("Authorization",`Bearer ${bn}`),t.body&&n.set("Content-Type","application/json");let s;try{s=await fetch(Oa+e,{...t,headers:n,credentials:"same-origin"})}catch{throw new hs(0,"network error")}if(s.status===401)throw Vt.clear(),Ur.forEach(i=>i()),new hs(401,"unauthorized");const r=await s.text(),o=r?JSON.parse(r):null;if(!s.ok){const i=o&&typeof o=="object"&&"error"in o?String(o.error):`request failed (${s.status})`;throw new hs(s.status,i)}return o}const Wr={async login(e){const t=await kt("/login",{method:"POST",body:JSON.stringify({password:e})});Vt.set(t.token)},async logout(){try{await kt("/logout",{method:"POST"})}finally{Vt.clear()}},info:()=>kt("/info"),meta:()=>kt("/meta"),metrics:()=>kt("/metrics"),events:(e=200)=>kt(`/events?limit=${e}`),rules:()=>kt("/rules"),saveRules:e=>kt("/rules",{method:"PUT",body:JSON.stringify(e)}),validateRules:e=>kt("/rules/validate",{method:"POST",body:JSON.stringify(e)})},Yp=`${Oa}/live`,Kr=500,Xs=Ze(null),un=to([]),on=Ze("closed");let Kt=null,qr,fs=1e3;function Qp(e){const t=[e,...un.value];t.length>Kr&&(t.length=Kr),un.value=t}async function Ia(){try{const[e,t]=await Promise.all([Wr.metrics(),Wr.events(Kr)]);Xs.value=e,un.value.length===0&&(un.value=t.events??[])}catch{}}function Na(){if(Kt||!Vt.authenticated)return;on.value="connecting";const e=new EventSource(Yp);Kt=e,e.addEventListener("open",()=>{on.value="open",fs=1e3}),e.addEventListener("metrics",t=>{try{Xs.value=JSON.parse(t.data),on.value="open"}catch{}}),e.addEventListener("event",t=>{try{Qp(JSON.parse(t.data))}catch{}}),e.addEventListener("error",()=>{e.close(),Kt===e&&(Kt=null),on.value="closed",window.clearTimeout(qr),qr=window.setTimeout(()=>{Vt.authenticated&&Na()},fs),fs=Math.min(fs*2,15e3)})}function Ma(){Vt.authenticated&&(Ia(),Na())}function _o(){window.clearTimeout(qr),Kt==null||Kt.close(),Kt=null,on.value="closed",Xs.value=null,un.value=[]}function Xp(){un.value=[]}function Zp(){return{metrics:Xs,events:un,status:on,connected:we(()=>on.value==="open"),startLive:Ma,stopLive:_o,clearEvents:Xp,refresh:Ia}}const eh="modulepreload",th=function(e){return"/"+e},Ni={},Dn=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let i=function(c){return Promise.all(c.map(u=>Promise.resolve(u).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),a=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));r=i(n.map(c=>{if(c=th(c),c in Ni)return;Ni[c]=!0;const u=c.endsWith(".css"),f=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${f}`))return;const h=document.createElement("link");if(h.rel=u?"stylesheet":eh,u||(h.as="script"),h.crossOrigin="",h.href=c,a&&h.setAttribute("nonce",a),document.head.appendChild(h),u)return new Promise((m,E)=>{h.addEventListener("load",m),h.addEventListener("error",()=>E(new Error(`Unable to preload CSS for ${c}`)))})}))}function o(i){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=i,window.dispatchEvent(l),!l.defaultPrevented)throw i}return r.then(i=>{for(const l of i||[])l.status==="rejected"&&o(l.reason);return t().catch(o)})},nh={app:{name:"OpenGFW",tagline:"Network filtering and analysis"},nav:{dashboard:"Dashboard",events:"Events",rules:"Rules",analyzers:"Analyzers",settings:"Settings"},common:{save:"Save",saving:"Saving…",cancel:"Cancel",close:"Close",refresh:"Refresh",search:"Search",loading:"Loading…",empty:"Nothing here yet",error:"Error",retry:"Retry",delete:"Delete",edit:"Edit",add:"Add",apply:"Apply",copy:"Copy",copied:"Copied",enabled:"Enabled",disabled:"Disabled",all:"All",unknown:"Unknown",total:"Total",live:"Live",offline:"Disconnected",connecting:"Connecting…",back:"Back",more:"More"},login:{title:"Sign in",subtitle:"Enter the web UI password from your config file",password:"Password",submit:"Sign in",failed:"Sign in failed",hint:"Set it with web.secret in config.yaml"},dashboard:{title:"Dashboard",subtitle:"Live overview of the engine",uptime:"Uptime",workers:"Workers",streams:"Streams",blocked:"Blocked",allowed:"Allowed",modified:"Modified",errors:"Errors",traffic:"Traffic",trafficDesc:"New streams and verdicts over time",range10m:"10 min",range1h:"1 hour",protocols:"Protocols",verdicts:"Verdicts",topHosts:"Top hosts",topHostsDesc:"Seen in TLS SNI, HTTP Host and DNS queries",topBlocked:"Blocked destinations",topRules:"Triggered rules",recent:"Recent events",viewAll:"View all",noTraffic:"No traffic seen yet",tcp:"TCP",udp:"UDP"},events:{title:"Events",subtitle:"Live feed of verdicts, rule logs and errors",pause:"Pause",resume:"Resume",paused:"Paused",clear:"Clear",filterAction:"Verdict",filterProto:"Protocol",filterKind:"Type",searchPlaceholder:"Search IP, host or rule…",empty:"Waiting for events…",emptyFiltered:"No event matches the filter",detail:"Event detail",stream:"Stream",source:"Source",destination:"Destination",host:"Host",rule:"Rule",props:"Analyzer properties",noProps:"No analyzer properties",copyJson:"Copy JSON",buffered:"{n} new"},rules:{title:"Rules",subtitle:"Rules are matched top to bottom; the first match wins",count:"{n} rules",file:"Rule file",add:"New rule",editTitle:"Edit rule",addTitle:"New rule",name:"Name",namePlaceholder:"block-google-dns",action:"Action",actionNone:"None (log only)",log:"Log matches",expr:"Expression",exprPlaceholder:'dns != nil && dns.qr && any(dns.questions, {.name endsWith "example.com"})',modifier:"Modifier",modifierArgs:"Modifier arguments (JSON)",visual:"Visual",yaml:"YAML",validate:"Validate",valid:"Rules are valid",invalid:"Invalid rules",save:"Save & apply",saved:"Rules applied to the running engine",unsaved:"Unsaved changes",discard:"Discard",deleteConfirm:'Delete rule "{name}"?',moveUp:"Move up",moveDown:"Move down",empty:"No rules yet. Everything is accepted.",nameRequired:"A name is required",exprRequired:"An expression is required",hint:"Saving writes the rule file and hot reloads the engine."},analyzers:{title:"Analyzers",subtitle:"Protocol analyzers compiled into this build",hits:"Streams analyzed",modifiers:"Modifiers",modifiersDesc:"Available for rules with the modify action",functions:"Rule functions",functionsDesc:"Built-in functions usable in expressions",used:"In use",idle:"Idle"},settings:{title:"Settings",subtitle:"Appearance and instance information",appearance:"Appearance",theme:"Theme",themeLight:"Light",themeDark:"Dark",themeSystem:"System",language:"Language",instance:"Instance",version:"Version",platform:"Platform",goVersion:"Go version",hostname:"Hostname",ruleFile:"Rule file",engineConfig:"Engine configuration",ioQueueSize:"NFQueue size",ioLocal:"Local mode",ioRST:"Send RST",workers:"Workers",workerQueueSize:"Worker queue size",udpMaxStreams:"Max UDP streams",geoip:"GeoIP database",geosite:"GeoSite database",auto:"Auto",session:"Session",logout:"Sign out",docs:"Documentation"},action:{allow:"Allow",block:"Block",drop:"Drop",modify:"Modify",maybe:"Maybe",log:"Log",error:"Error"}},sh={app:{name:"OpenGFW",tagline:"网络过滤与分析"},nav:{dashboard:"概览",events:"事件",rules:"规则",analyzers:"解析器",settings:"设置"},common:{save:"保存",saving:"保存中…",cancel:"取消",close:"关闭",refresh:"刷新",search:"搜索",loading:"加载中…",empty:"暂无数据",error:"错误",retry:"重试",delete:"删除",edit:"编辑",add:"添加",apply:"应用",copy:"复制",copied:"已复制",enabled:"已启用",disabled:"已禁用",all:"全部",unknown:"未知",total:"总计",live:"实时",offline:"连接断开",connecting:"连接中…",back:"返回",more:"更多"},login:{title:"登录",subtitle:"请输入配置文件中设置的 Web UI 密码",password:"密码",submit:"登录",failed:"登录失败",hint:"在 config.yaml 的 web.secret 中设置"},dashboard:{title:"概览",subtitle:"引擎实时运行状态",uptime:"运行时长",workers:"工作线程",streams:"连接数",blocked:"已拦截",allowed:"已放行",modified:"已修改",errors:"错误",traffic:"流量趋势",trafficDesc:"新建连接与判定结果随时间变化",range10m:"10 分钟",range1h:"1 小时",protocols:"协议分布",verdicts:"判定分布",topHosts:"热门域名",topHostsDesc:"来自 TLS SNI、HTTP Host 与 DNS 查询",topBlocked:"被拦截的目标",topRules:"命中的规则",recent:"最近事件",viewAll:"查看全部",noTraffic:"暂未捕获到流量",tcp:"TCP",udp:"UDP"},events:{title:"事件",subtitle:"判定结果、规则日志与错误的实时推送",pause:"暂停",resume:"继续",paused:"已暂停",clear:"清空",filterAction:"判定",filterProto:"协议",filterKind:"类型",searchPlaceholder:"搜索 IP、域名或规则…",empty:"等待事件中…",emptyFiltered:"没有符合筛选条件的事件",detail:"事件详情",stream:"连接",source:"来源",destination:"目标",host:"域名",rule:"规则",props:"解析器属性",noProps:"无解析器属性",copyJson:"复制 JSON",buffered:"{n} 条新事件"},rules:{title:"规则",subtitle:"规则自上而下匹配,命中第一条即生效",count:"{n} 条规则",file:"规则文件",add:"新建规则",editTitle:"编辑规则",addTitle:"新建规则",name:"名称",namePlaceholder:"block-google-dns",action:"动作",actionNone:"无(仅记录日志)",log:"记录日志",expr:"表达式",exprPlaceholder:'dns != nil && dns.qr && any(dns.questions, {.name endsWith "example.com"})',modifier:"修改器",modifierArgs:"修改器参数(JSON)",visual:"可视化",yaml:"YAML",validate:"校验",valid:"规则校验通过",invalid:"规则不合法",save:"保存并应用",saved:"规则已热加载到运行中的引擎",unsaved:"有未保存的修改",discard:"放弃修改",deleteConfirm:"确定删除规则「{name}」?",moveUp:"上移",moveDown:"下移",empty:"暂无规则,所有流量都会放行。",nameRequired:"请填写名称",exprRequired:"请填写表达式",hint:"保存后将写入规则文件并热加载引擎。"},analyzers:{title:"解析器",subtitle:"当前版本内置的协议解析器",hits:"已解析连接",modifiers:"修改器",modifiersDesc:"可用于 modify 动作的规则",functions:"规则函数",functionsDesc:"表达式中可用的内置函数",used:"使用中",idle:"空闲"},settings:{title:"设置",subtitle:"外观与实例信息",appearance:"外观",theme:"主题",themeLight:"浅色",themeDark:"深色",themeSystem:"跟随系统",language:"语言",instance:"实例信息",version:"版本",platform:"平台",goVersion:"Go 版本",hostname:"主机名",ruleFile:"规则文件",engineConfig:"引擎配置",ioQueueSize:"NFQueue 队列大小",ioLocal:"本机模式",ioRST:"发送 RST",workers:"工作线程数",workerQueueSize:"工作线程队列大小",udpMaxStreams:"UDP 最大连接数",geoip:"GeoIP 数据库",geosite:"GeoSite 数据库",auto:"自动",session:"会话",logout:"退出登录",docs:"文档"},action:{allow:"放行",block:"拦截",drop:"丢弃",modify:"修改",maybe:"待定",log:"日志",error:"错误"}},La="opengfw.lang",Mi={en:nh,zh:sh};function rh(){const e=localStorage.getItem(La);return e==="en"||e==="zh"?e:navigator.language.toLowerCase().startsWith("zh")?"zh":"en"}const Zs=Ze(rh());function Li(e,t){const n=t.split(".").reduce((s,r)=>{if(s&&typeof s=="object")return s[r]},e);return typeof n=="string"?n:void 0}function Te(e,t){const n=Li(Mi[Zs.value],e)??Li(Mi.en,e)??e;return t?n.replace(/\{(\w+)\}/g,(s,r)=>t[r]===void 0?`{${r}}`:String(t[r])):n}function oh(e){Zs.value=e,localStorage.setItem(La,e),document.documentElement.lang=e==="zh"?"zh-CN":"en"}function ih(){return{t:Te,lang:we(()=>Zs.value),setLang:oh}}document.documentElement.lang=Zs.value==="zh"?"zh-CN":"en";const Di=We({__name:"StatusPill",setup(e){const{status:t}=Zp(),n=we(()=>{switch(t.value){case"open":return Te("common.live");case"connecting":return Te("common.connecting");default:return Te("common.offline")}});return(s,r)=>(fe(),Qe("span",{class:Ue(B(wt)("inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[11px] font-medium",B(t)==="open"?"border-allow/30 bg-allow/10 text-allow":B(t)==="connecting"?"border-drop/30 bg-drop/10 text-drop":"border-block/30 bg-block/10 text-block"))},[le("span",{class:Ue(B(wt)("size-1.5 rounded-full",B(t)==="open"?"bg-allow animate-pulse-dot":B(t)==="connecting"?"bg-drop animate-pulse-dot":"bg-block"))},null,2),Sn(" "+Le(n.value),1)],2))}}),Da="opengfw.theme",yr=localStorage.getItem(Da),cn=Ze(yr==="light"||yr==="dark"?yr:"system"),za=window.matchMedia("(prefers-color-scheme: dark)");function Va(e){return e==="dark"||e==="system"&&za.matches}const Wn=Ze(Va(cn.value));function xo(){var e;Wn.value=Va(cn.value),document.documentElement.classList.toggle("dark",Wn.value),(e=document.querySelector('meta[name="theme-color"]'))==null||e.setAttribute("content",Wn.value?"#09090b":"#ffffff")}Nt(cn,e=>{localStorage.setItem(Da,e),xo()});za.addEventListener("change",()=>{cn.value==="system"&&xo()});xo();function lh(){return{theme:cn,isDark:we(()=>Wn.value),setTheme:e=>{cn.value=e},toggle:()=>{cn.value=Wn.value?"light":"dark"}}}const ah={class:"bg-background min-h-dvh"},ch={class:"bg-card/40 fixed inset-y-0 left-0 z-40 hidden w-56 flex-col border-r px-3 py-4 md:flex lg:w-60"},uh={class:"flex items-center gap-2 px-2 pb-4"},fh={class:"min-w-0"},dh={class:"truncate text-sm font-semibold"},ph={class:"text-muted-foreground truncate text-[11px]"},hh={class:"flex flex-1 flex-col gap-0.5"},mh={class:"px-2 pt-3"},gh={class:"flex min-h-dvh flex-col md:pl-56 lg:pl-60"},bh={class:"bg-background/85 safe-top sticky top-0 z-30 border-b backdrop-blur-md md:hidden"},vh={class:"flex h-12 items-center justify-between gap-3 px-4"},yh={class:"truncate text-sm font-semibold"},_h={class:"flex-1 px-4 pt-4 pb-24 sm:px-6 sm:pt-6 md:pb-8"},xh={class:"bg-background/90 safe-bottom fixed inset-x-0 bottom-0 z-40 border-t backdrop-blur-md md:hidden"},wh={class:"grid grid-cols-5"},Sh={class:"truncate"},Eh=We({__name:"AppShell",setup(e){const t=ha(),n=we(()=>[{to:"/",label:Te("nav.dashboard"),icon:Fd},{to:"/events",label:Te("nav.events"),icon:$d},{to:"/rules",label:Te("nav.rules"),icon:jd},{to:"/analyzers",label:Te("nav.analyzers"),icon:zd},{to:"/settings",label:Te("nav.settings"),icon:Ud}]),s=we(()=>{const r=n.value.find(o=>o.to===t.path);return(r==null?void 0:r.label)??Te("app.name")});return Us(Ma),io(_o),(r,o)=>(fe(),Qe("div",ah,[le("aside",ch,[le("div",uh,[o[0]||(o[0]=le("div",{class:"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg font-bold"}," G ",-1)),le("div",fh,[le("p",dh,Le(B(Te)("app.name")),1),le("p",ph,Le(B(Te)("app.tagline")),1)])]),le("nav",hh,[(fe(!0),Qe(Pe,null,Tr(n.value,i=>(fe(),ze(B(Gr),{key:i.to,to:i.to,class:Ue(B(wt)("flex items-center gap-2.5 rounded-lg px-2.5 py-2 text-sm font-medium transition-colors",B(t).path===i.to?"bg-accent text-accent-foreground":"text-muted-foreground hover:bg-accent/50 hover:text-foreground"))},{default:Ye(()=>[(fe(),ze(ir(i.icon),{class:"size-4 shrink-0"})),Sn(" "+Le(i.label),1)]),_:2},1032,["to","class"]))),128))]),le("div",mh,[de(Di)])]),le("div",gh,[le("header",bh,[le("div",vh,[le("span",yh,Le(s.value),1),de(Di)])]),le("main",_h,[de(B(go),null,{default:Ye(({Component:i})=>[(fe(),ze(ir(i),{class:"animate-fade-in"}))]),_:1})])]),le("nav",xh,[le("div",wh,[(fe(!0),Qe(Pe,null,Tr(n.value,i=>(fe(),ze(B(Gr),{key:i.to,to:i.to,class:Ue(B(wt)("flex flex-col items-center gap-0.5 py-2 text-[10px] font-medium transition-colors",B(t).path===i.to?"text-foreground":"text-muted-foreground"))},{default:Ye(()=>[(fe(),ze(ir(i.icon),{class:Ue(B(wt)("size-5",B(t).path===i.to&&"text-primary"))},null,8,["class"])),le("span",Sh,Le(i.label),1)]),_:2},1032,["to","class"]))),128))])])]))}}),zi=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Vi=ga,Ah=(e,t)=>n=>{var s;if((t==null?void 0:t.variants)==null)return Vi(e,n==null?void 0:n.class,n==null?void 0:n.className);const{variants:r,defaultVariants:o}=t,i=Object.keys(r).map(c=>{const u=n==null?void 0:n[c],f=o==null?void 0:o[c];if(u===null)return null;const h=zi(u)||zi(f);return r[c][h]}),l=n&&Object.entries(n).reduce((c,u)=>{let[f,h]=u;return h===void 0||(c[f]=h),c},{}),a=t==null||(s=t.compoundVariants)===null||s===void 0?void 0:s.reduce((c,u)=>{let{class:f,className:h,...m}=u;return Object.entries(m).every(E=>{let[x,k]=E;return Array.isArray(k)?k.includes({...o,...l}[x]):{...o,...l}[x]===k})?[...c,f,h]:c},[]);return Vi(e,i,a,n==null?void 0:n.class,n==null?void 0:n.className)};function wo(e,t){return Yi()?(nc(e,t),!0):!1}function vm(e){let t=!1,n;const s=Ji(!0);return((...r)=>(t||(n=s.run(()=>e(...r)),t=!0),n))}const So=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ch=e=>typeof e<"u",kh=Object.prototype.toString,Rh=e=>kh.call(e)==="[object Object]",ym=Th();function Th(){var e,t,n;return So&&!!(!((e=window)===null||e===void 0||(e=e.navigator)===null||e===void 0)&&e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window)===null||t===void 0||(t=t.navigator)===null||t===void 0?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test((n=window)===null||n===void 0?void 0:n.navigator.userAgent))}function _r(e){return Array.isArray(e)?e:[e]}function Ph(e){return fn()}function _m(e){if(!So)return e;let t=0,n,s;const r=()=>{t-=1,s&&t<=0&&(s.stop(),n=void 0,s=void 0)};return((...o)=>(t+=1,s||(s=Ji(!0),n=s.run(()=>e(...o))),wo(r),n))}function xm(e,t=1e4){return Cc((n,s)=>{let r=It(e),o;const i=()=>setTimeout(()=>{r=It(e),s()},It(t));return wo(()=>{clearTimeout(o)}),{get(){return n(),r},set(l){r=l,s(),clearTimeout(o),o=i()}}})}function wm(e,t){Ph()&&oo(e,t)}function Oh(e,t,n){return Nt(e,t,{...n,immediate:!0})}const Eo=So?window:void 0;function Rs(e){var t;const n=It(e);return(t=n==null?void 0:n.$el)!==null&&t!==void 0?t:n}function Ih(...e){const t=(s,r,o,i)=>(s.addEventListener(r,o,i),()=>s.removeEventListener(r,o,i)),n=we(()=>{const s=_r(It(e[0])).filter(r=>r!=null);return s.every(r=>typeof r!="string")?s:void 0});return Oh(()=>{var s,r;return[(s=(r=n.value)===null||r===void 0?void 0:r.map(o=>Rs(o)))!==null&&s!==void 0?s:[Eo].filter(o=>o!=null),_r(It(n.value?e[1]:e[0])),_r(B(n.value?e[2]:e[1])),It(n.value?e[3]:e[2])]},([s,r,o,i],l,a)=>{if(!(s!=null&&s.length)||!(r!=null&&r.length)||!(o!=null&&o.length))return;const c=Rh(i)?{...i}:i,u=s.flatMap(f=>r.flatMap(h=>o.map(m=>t(f,h,m,c))));a(()=>{u.forEach(f=>f())})},{flush:"post"})}function Nh(){const e=to(!1),t=fn();return t&&Us(()=>{e.value=!0},t),e}function Mh(e){const t=Nh();return we(()=>(t.value,!!e()))}function Lh(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Sm(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Eo,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=s,a=Lh(t);return Ih(r,o,u=>{u.repeat&&It(l)||a(u)&&n(u)},i)}function Dh(e){return JSON.parse(JSON.stringify(e))}function Em(e,t,n={}){const{window:s=Eo,...r}=n;let o;const i=Mh(()=>s&&"ResizeObserver"in s),l=()=>{o&&(o.disconnect(),o=void 0)},a=Nt(we(()=>{const u=It(e);return Array.isArray(u)?u.map(f=>Rs(f)):[Rs(u)]}),u=>{if(l(),i.value&&s){o=new ResizeObserver(t);for(const f of u)f&&o.observe(f,r)}},{immediate:!0,flush:"post"}),c=()=>{l(),a()};return wo(c),{isSupported:i,stop:c}}function Am(e,t,n,s={}){var r,o;const{clone:i=!1,passive:l=!1,eventName:a,deep:c=!1,defaultValue:u,shouldEmit:f}=s,h=fn(),m=n||(h==null?void 0:h.emit)||(h==null||(r=h.$emit)===null||r===void 0?void 0:r.bind(h))||(h==null||(o=h.proxy)===null||o===void 0||(o=o.$emit)===null||o===void 0?void 0:o.bind(h==null?void 0:h.proxy));let E=a;t||(t="modelValue"),E=E||`update:${t.toString()}`;const x=_=>i?typeof i=="function"?i(_):Dh(_):_,k=()=>Ch(e[t])?x(e[t]):u,I=_=>{f?f(_)&&m(E,_):m(E,_)};if(l){const _=Ze(k());let M=!1;return Nt(()=>e[t],T=>{M||(M=!0,_.value=x(T),no(()=>M=!1))}),Nt(_,T=>{!M&&(T!==e[t]||c)&&I(T)},{deep:c}),_}else return we({get(){return k()},set(_){I(_)}})}function Fa(e){return e?e.flatMap(t=>t.type===Pe?Fa(t.children):[t]):[]}function zh(){const e=fn(),t=Ze(),n=we(()=>s());ro(()=>{n.value!==s()&&Sc(t)});function s(){return t.value&&"$el"in t.value&&["#text","#comment"].includes(t.value.$el.nodeName)?t.value.$el.nextElementSibling:Rs(t)}const r=Object.assign({},e.exposed),o={};for(const l in e.props)Object.defineProperty(o,l,{enumerable:!0,configurable:!0,get:()=>e.props[l]});if(Object.keys(r).length>0)for(const l in r)Object.defineProperty(o,l,{enumerable:!0,configurable:!0,get:()=>r[l]});Object.defineProperty(o,"$el",{enumerable:!0,configurable:!0,get:()=>e.vnode.el}),e.exposed=o;function i(l){if(t.value=l,!!l&&(Object.defineProperty(o,"$el",{enumerable:!0,configurable:!0,get:()=>l instanceof Element?l:l.$el}),!(l instanceof Element)&&!Object.hasOwn(l,"$el"))){const a=l.$.exposed,c=Object.assign({},o);for(const u in a)Object.defineProperty(c,u,{enumerable:!0,configurable:!0,get:()=>a[u]});e.exposed=c}}return{forwardRef:i,currentRef:t,currentElement:n}}const Vh=We({name:"PrimitiveSlot",inheritAttrs:!1,setup(e,{attrs:t,slots:n}){return()=>{var a;if(!n.default)return null;const s=Fa(n.default()),r=s.findIndex(c=>c.type!==at);if(r===-1)return s;const o=s[r];(a=o.props)==null||delete a.ref;const i=o.props?fo(t,o.props):t,l=Jt({...o,props:{}},i);return s.length===1?l:(s[r]=l,s)}}}),Fh=["area","img","input"],ja=We({name:"Primitive",inheritAttrs:!1,props:{asChild:{type:Boolean,default:!1},as:{type:[String,Object],default:"div"}},setup(e,{attrs:t,slots:n}){const s=e.asChild?"template":e.as;return typeof s=="string"&&Fh.includes(s)?()=>qt(s,t):s!=="template"?()=>qt(e.as,t,{default:n.default}):()=>qt(Vh,t,{default:n.default})}});var jh=We({__name:"Label",props:{for:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"label"}},setup(e){const t=e;return zh(),(n,s)=>(fe(),ze(B(ja),fo(t,{onMousedown:s[0]||(s[0]=r=>{!r.defaultPrevented&&r.detail>1&&r.preventDefault()})}),{default:Ye(()=>[Ws(n.$slots,"default")]),_:3},16))}}),Bh=jh;const Gh=Ah("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow,background-color] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/40 focus-visible:border-ring active:scale-[0.98] select-none",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/30",outline:"border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",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 text-[13px]",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8 rounded-md"}},defaultVariants:{variant:"default",size:"default"}}),xr=We({__name:"Button",props:{asChild:{type:Boolean},as:{default:"button"},variant:{},size:{},class:{}},setup(e){const t=e;return(n,s)=>(fe(),ze(B(ja),{as:t.as,"as-child":t.asChild,class:Ue(B(wt)(B(Gh)({variant:t.variant,size:t.size}),t.class))},{default:Ye(()=>[Ws(n.$slots,"default")]),_:3},8,["as","as-child","class"]))}}),Hh=We({__name:"Card",props:{class:{}},setup(e){const t=e;return(n,s)=>(fe(),Qe("div",{class:Ue(B(wt)("bg-card text-card-foreground rounded-xl border shadow-sm transition-colors",t.class))},[Ws(n.$slots,"default")],2))}}),$h=["value"],Uh=We({__name:"Input",props:{class:{},modelValue:{}},emits:["update:modelValue"],setup(e,{emit:t}){const n=e,s=t;return(r,o)=>(fe(),Qe("input",{value:n.modelValue,class:Ue(B(wt)("border-input bg-background flex h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none sm:text-sm","placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground","focus-visible:border-ring focus-visible:ring-ring/40 focus-visible:ring-[3px]","disabled:cursor-not-allowed disabled:opacity-50",n.class)),onInput:o[0]||(o[0]=i=>s("update:modelValue",i.target.value))},null,42,$h))}}),Wh=We({__name:"Label",props:{class:{},for:{}},setup(e){const t=e;return(n,s)=>(fe(),ze(B(Bh),{for:t.for,class:Ue(B(wt)("flex items-center gap-2 text-sm leading-none font-medium select-none",t.class))},{default:Ye(()=>[Ws(n.$slots,"default")]),_:3},8,["for","class"]))}}),Kh={class:"bg-background flex min-h-dvh flex-col"},qh={class:"flex items-center justify-end gap-1 p-3"},Jh={class:"flex flex-1 items-center justify-center px-4 pb-16"},Yh={class:"mb-6 flex flex-col items-center text-center"},Qh={class:"bg-primary text-primary-foreground mb-3 flex size-11 items-center justify-center rounded-xl"},Xh={class:"text-lg font-semibold tracking-tight"},Zh={class:"text-muted-foreground mt-1 text-sm"},em={class:"flex flex-col gap-2"},tm={key:0,class:"text-destructive text-sm"},nm={class:"text-muted-foreground mt-4 text-center text-xs"},sm=We({__name:"LoginView",setup(e){const t=Md(),n=ha(),{lang:s,setLang:r}=ih(),{isDark:o,toggle:i}=lh(),l=Ze(""),a=Ze(!1),c=Ze("");async function u(){if(!a.value){a.value=!0,c.value="";try{await Wr.login(l.value);const f=n.query.redirect;await t.replace(typeof f=="string"?f:"/")}catch(f){c.value=f instanceof hs?f.message:Te("login.failed")}finally{a.value=!1}}}return(f,h)=>(fe(),Qe("div",Kh,[le("div",qh,[de(B(xr),{variant:"ghost",size:"sm",onClick:h[0]||(h[0]=m=>B(r)(B(s)==="zh"?"en":"zh"))},{default:Ye(()=>[Sn(Le(B(s)==="zh"?"EN":"中文"),1)]),_:1}),de(B(xr),{variant:"ghost",size:"icon-sm","aria-label":B(Te)("settings.theme"),onClick:B(i)},{default:Ye(()=>[B(o)?(fe(),ze(B(Hd),{key:0,class:"size-4"})):(fe(),ze(B(Wd),{key:1,class:"size-4"}))]),_:1},8,["aria-label","onClick"])]),le("div",Jh,[de(B(Hh),{class:"animate-slide-up w-full max-w-sm p-6"},{default:Ye(()=>[le("div",Yh,[le("div",Qh,[de(B(Gd),{class:"size-5"})]),le("h1",Xh,Le(B(Te)("app.name")),1),le("p",Zh,Le(B(Te)("login.subtitle")),1)]),le("form",{class:"flex flex-col gap-3",onSubmit:Sf(u,["prevent"])},[le("div",em,[de(B(Wh),{for:"password"},{default:Ye(()=>[Sn(Le(B(Te)("login.password")),1)]),_:1}),de(B(Uh),{id:"password",modelValue:l.value,"onUpdate:modelValue":h[1]||(h[1]=m=>l.value=m),type:"password",autocomplete:"current-password",autofocus:"",disabled:a.value},null,8,["modelValue","disabled"])]),c.value?(fe(),Qe("p",tm,Le(c.value),1)):ws("",!0),de(B(xr),{type:"submit",class:"mt-1 w-full",disabled:a.value||!l.value},{default:Ye(()=>[a.value?(fe(),ze(B(Bd),{key:0,class:"size-4 animate-spin"})):ws("",!0),Sn(" "+Le(B(Te)("login.submit")),1)]),_:1},8,["disabled"])],32),le("p",nm,Le(B(Te)("login.hint")),1)]),_:1})])]))}}),Ao=Nd({history:pd(),routes:[{path:"/login",name:"login",component:sm,meta:{public:!0}},{path:"/",component:Eh,children:[{path:"",name:"dashboard",component:()=>Dn(()=>import("./DashboardView-BnrlcswN.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]))},{path:"events",name:"events",component:()=>Dn(()=>import("./EventsView-DvVZcEec.js"),__vite__mapDeps([9,2,3,1,4,10,8,11]))},{path:"rules",name:"rules",component:()=>Dn(()=>import("./RulesView-SxOStRNP.js"),__vite__mapDeps([12,4,3,10,8,11,7]))},{path:"analyzers",name:"analyzers",component:()=>Dn(()=>import("./AnalyzersView-CHLlPReV.js"),__vite__mapDeps([13,4,3,5,6,1]))},{path:"settings",name:"settings",component:()=>Dn(()=>import("./SettingsView-CQy8Fv4M.js"),__vite__mapDeps([14,4,5,11,8]))}]},{path:"/:pathMatch(.*)*",redirect:"/"}]});Ao.beforeEach(e=>!e.meta.public&&!Vt.authenticated?{name:"login",query:e.fullPath==="/"?void 0:{redirect:e.fullPath}}:e.name==="login"&&Vt.authenticated?{name:"dashboard"}:!0);Vt.onUnauthorized(()=>{_o(),Ao.replace({name:"login"})});kf(Jp).use(Ao).mount("#app");export{qd as $,Xp as A,fn as B,fo as C,lm as D,Am as E,Pe as F,zh as G,Ws as H,bm as I,Sf as J,Us as K,oo as L,Wr as M,hs as N,Vd as O,ja as P,Bd as Q,Wh as R,io as S,Kd as T,no as U,to as V,cm as W,gm as X,om as Y,Pu as Z,Hh as _,Qe as a,Ah as a0,lh as a1,ih as a2,_o as a3,Wd as a4,Hd as a5,wm as a6,_m as a7,So as a8,ym as a9,Vh as aA,xc as aB,Ih as aa,er as ab,$e as ac,um as ad,It as ae,Rs as af,am as ag,xm as ah,Eo as ai,Fa as aj,qt as ak,Sm as al,Fs as am,vm as an,dm as ao,Nh as ap,fm as aq,im as ar,Yi as as,nc as at,mm as au,hm as av,Em as aw,it as ax,ds as ay,pm as az,le as b,st as c,We as d,Ue as e,wt as f,we as g,ze as h,ir as i,ws as j,Sn as k,Te as l,Ze as m,Ls as n,fe as o,de as p,Zp as q,Tr as r,xr as s,Le as t,B as u,Md as v,Ye as w,Nt as x,Uh as y,Yd as z}; diff --git a/web/dist/favicon.svg b/web/dist/favicon.svg new file mode 100644 index 0000000..7de04d0 --- /dev/null +++ b/web/dist/favicon.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/web/dist/index.html b/web/dist/index.html new file mode 100644 index 0000000..5d36502 --- /dev/null +++ b/web/dist/index.html @@ -0,0 +1,33 @@ + + + + + + + + + + + OpenGFW + + + + + +
+ + diff --git a/web/embed.go b/web/embed.go new file mode 100644 index 0000000..309c22d --- /dev/null +++ b/web/embed.go @@ -0,0 +1,10 @@ +package web + +import "embed" + +// distFS holds the compiled web UI. Run `make web` (or `npm run build` inside +// web/frontend) to refresh it; the checked-in placeholder simply tells the user +// that the UI has not been built yet. +// +//go:embed all:dist +var distFS embed.FS diff --git a/web/frontend/index.html b/web/frontend/index.html new file mode 100644 index 0000000..50dc787 --- /dev/null +++ b/web/frontend/index.html @@ -0,0 +1,32 @@ + + + + + + + + + + + OpenGFW + + + +
+ + + diff --git a/web/frontend/package-lock.json b/web/frontend/package-lock.json new file mode 100644 index 0000000..eaeff99 --- /dev/null +++ b/web/frontend/package-lock.json @@ -0,0 +1,2501 @@ +{ + "name": "opengfw-web", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "opengfw-web", + "version": "1.0.0", + "dependencies": { + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-vue-next": "^0.469.0", + "reka-ui": "^2.5.0", + "tailwind-merge": "^3.3.1", + "vue": "^3.5.13", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.11", + "@types/node": "^22.10.5", + "@vitejs/plugin-vue": "^5.2.1", + "tailwindcss": "^4.1.11", + "typescript": "~5.7.3", + "vite": "^6.0.7", + "vue-tsc": "^2.2.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@floating-ui/vue": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.11.tgz", + "integrity": "sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@floating-ui/utils": "^0.2.11", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@internationalized/date": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz", + "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz", + "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.3.tgz", + "integrity": "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.3.tgz", + "integrity": "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.3.tgz", + "integrity": "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.3.tgz", + "integrity": "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.3.tgz", + "integrity": "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.3.tgz", + "integrity": "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.3.tgz", + "integrity": "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.3.tgz", + "integrity": "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.3.tgz", + "integrity": "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.3.tgz", + "integrity": "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.3.tgz", + "integrity": "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.3.tgz", + "integrity": "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.3.tgz", + "integrity": "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.3.tgz", + "integrity": "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.3.tgz", + "integrity": "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.3.tgz", + "integrity": "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.3.tgz", + "integrity": "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.3.tgz", + "integrity": "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.3.tgz", + "integrity": "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.3.tgz", + "integrity": "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.3.tgz", + "integrity": "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.3.tgz", + "integrity": "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.3.tgz", + "integrity": "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.3.tgz", + "integrity": "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.3.tgz", + "integrity": "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.17.6", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.6.tgz", + "integrity": "sha512-h0/Ebo18CkOrChlQIhNtQkM5ySUnh/GumQ/D1st3hG2HWUPEF+ILUc2k29UtivCi/9G7w7G3/f7Xyd5cCFbKBw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.34", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.34.tgz", + "integrity": "sha512-CBqbCcnVsKpl9IJ7frPnbBmAqmc7JttSySg04kgLYJ4yYuC8JsAbtUHP0yLtWGLyByjihN3SwaDCgHQ+Z4iPoA==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.17.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz", + "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.40", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz", + "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz", + "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.40", + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-ssr": "3.5.40", + "@vue/shared": "3.5.40", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz", + "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz", + "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz", + "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz", + "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/runtime-core": "3.5.40", + "@vue/shared": "3.5.40", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz", + "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz", + "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", + "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.3.0", + "@vueuse/shared": "14.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz", + "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz", + "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", + "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-vue-next": { + "version": "0.469.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.469.0.tgz", + "integrity": "sha512-EjOap+vY3xEzCMrnaccDHO4BH3k3Lr+sOyvzRQCaayYxkxKla0w6Jr4h3cHAzA4vMSp63Dcy7vDiGeCPcCY+Gg==", + "deprecated": "Package deprecated. Please use @lucide/vue instead.", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/reka-ui": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.10.1.tgz", + "integrity": "sha512-drcOQ4rQtDYAcGCsyQBqQg8QQ+H3B+zDaMJU0h8KPEPMa7g9BHu3zcOi4OB39XJSWizceFoNO0Z9tctSGLOXqg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@floating-ui/vue": "^1.1.6", + "@internationalized/date": "^3.5.0", + "@internationalized/number": "^3.5.0", + "@tanstack/vue-virtual": "^3.12.0", + "@vueuse/core": "^14.1.0", + "@vueuse/shared": "^14.1.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.5", + "ohash": "^2.0.11" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/zernonia" + }, + "peerDependencies": { + "vue": ">= 3.4.0" + } + }, + "node_modules/rollup": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.3.tgz", + "integrity": "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.3", + "@rollup/rollup-android-arm64": "4.62.3", + "@rollup/rollup-darwin-arm64": "4.62.3", + "@rollup/rollup-darwin-x64": "4.62.3", + "@rollup/rollup-freebsd-arm64": "4.62.3", + "@rollup/rollup-freebsd-x64": "4.62.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", + "@rollup/rollup-linux-arm-musleabihf": "4.62.3", + "@rollup/rollup-linux-arm64-gnu": "4.62.3", + "@rollup/rollup-linux-arm64-musl": "4.62.3", + "@rollup/rollup-linux-loong64-gnu": "4.62.3", + "@rollup/rollup-linux-loong64-musl": "4.62.3", + "@rollup/rollup-linux-ppc64-gnu": "4.62.3", + "@rollup/rollup-linux-ppc64-musl": "4.62.3", + "@rollup/rollup-linux-riscv64-gnu": "4.62.3", + "@rollup/rollup-linux-riscv64-musl": "4.62.3", + "@rollup/rollup-linux-s390x-gnu": "4.62.3", + "@rollup/rollup-linux-x64-gnu": "4.62.3", + "@rollup/rollup-linux-x64-musl": "4.62.3", + "@rollup/rollup-openbsd-x64": "4.62.3", + "@rollup/rollup-openharmony-arm64": "4.62.3", + "@rollup/rollup-win32-arm64-msvc": "4.62.3", + "@rollup/rollup-win32-ia32-msvc": "4.62.3", + "@rollup/rollup-win32-x64-gnu": "4.62.3", + "@rollup/rollup-win32-x64-msvc": "4.62.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz", + "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-sfc": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/server-renderer": "3.5.40", + "@vue/shared": "3.5.40" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/web/frontend/package.json b/web/frontend/package.json new file mode 100644 index 0000000..f29d8eb --- /dev/null +++ b/web/frontend/package.json @@ -0,0 +1,31 @@ +{ + "name": "opengfw-web", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "Web UI for OpenGFW", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview", + "typecheck": "vue-tsc -b --noEmit" + }, + "dependencies": { + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-vue-next": "^0.469.0", + "reka-ui": "^2.5.0", + "tailwind-merge": "^3.3.1", + "vue": "^3.5.13", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.11", + "@types/node": "^22.10.5", + "@vitejs/plugin-vue": "^5.2.1", + "tailwindcss": "^4.1.11", + "typescript": "~5.7.3", + "vite": "^6.0.7", + "vue-tsc": "^2.2.0" + } +} diff --git a/web/frontend/public/favicon.svg b/web/frontend/public/favicon.svg new file mode 100644 index 0000000..7de04d0 --- /dev/null +++ b/web/frontend/public/favicon.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/web/frontend/src/App.vue b/web/frontend/src/App.vue new file mode 100644 index 0000000..a85e1a3 --- /dev/null +++ b/web/frontend/src/App.vue @@ -0,0 +1,10 @@ + + + diff --git a/web/frontend/src/assets/style.css b/web/frontend/src/assets/style.css new file mode 100644 index 0000000..6f249ea --- /dev/null +++ b/web/frontend/src/assets/style.css @@ -0,0 +1,208 @@ +@import 'tailwindcss'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --radius: 0.65rem; + + --background: oklch(1 0 0); + --foreground: oklch(0.141 0.005 285.823); + --card: oklch(1 0 0); + --card-foreground: oklch(0.141 0.005 285.823); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.141 0.005 285.823); + --primary: oklch(0.21 0.006 285.885); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.967 0.001 286.375); + --muted-foreground: oklch(0.552 0.016 285.938); + --accent: oklch(0.967 0.001 286.375); + --accent-foreground: oklch(0.21 0.006 285.885); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.985 0 0); + --border: oklch(0.92 0.004 286.32); + --input: oklch(0.92 0.004 286.32); + --ring: oklch(0.705 0.015 286.067); + + /* Verdict colors, shared by badges, charts and the live feed. */ + --allow: oklch(0.63 0.14 155); + --block: oklch(0.58 0.22 27); + --drop: oklch(0.72 0.16 70); + --modify: oklch(0.6 0.16 255); + --log: oklch(0.62 0.11 215); + --tcp: oklch(0.62 0.15 265); + --udp: oklch(0.68 0.13 190); +} + +.dark { + --background: oklch(0.141 0.005 285.823); + --foreground: oklch(0.985 0 0); + --card: oklch(0.19 0.006 285.885); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.21 0.006 285.885); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.92 0.004 286.32); + --primary-foreground: oklch(0.21 0.006 285.885); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.274 0.006 286.033); + --muted-foreground: oklch(0.705 0.015 286.067); + --accent: oklch(0.274 0.006 286.033); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --destructive-foreground: oklch(0.985 0 0); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.552 0.016 285.938); + + --allow: oklch(0.72 0.16 155); + --block: oklch(0.68 0.2 22); + --drop: oklch(0.79 0.15 75); + --modify: oklch(0.7 0.15 255); + --log: oklch(0.72 0.11 215); + --tcp: oklch(0.7 0.15 265); + --udp: oklch(0.76 0.12 190); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + + --color-allow: var(--allow); + --color-block: var(--block); + --color-drop: var(--drop); + --color-modify: var(--modify); + --color-log: var(--log); + --color-tcp: var(--tcp); + --color-udp: var(--udp); + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + + --font-mono: + ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace; + + --animate-fade-in: fade-in 0.18s ease-out; + --animate-slide-up: slide-up 0.22s cubic-bezier(0.32, 0.72, 0, 1); + --animate-slide-in-right: slide-in-right 0.24s cubic-bezier(0.32, 0.72, 0, 1); + --animate-slide-in-left: slide-in-left 0.24s cubic-bezier(0.32, 0.72, 0, 1); + --animate-pulse-dot: pulse-dot 1.8s ease-in-out infinite; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes slide-up { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slide-in-right { + from { + transform: translateX(100%); + } + to { + transform: translateX(0); + } +} + +@keyframes slide-in-left { + from { + transform: translateX(-100%); + } + to { + transform: translateX(0); + } +} + +@keyframes pulse-dot { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.35; + } +} + +@layer base { + * { + border-color: var(--color-border); + } + + html { + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; + } + + body { + background-color: var(--color-background); + color: var(--color-foreground); + font-family: + ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', + 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; + font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11'; + overscroll-behavior-y: none; + } + + ::-webkit-scrollbar { + width: 10px; + height: 10px; + } + + ::-webkit-scrollbar-track { + background: transparent; + } + + ::-webkit-scrollbar-thumb { + background: color-mix(in oklab, var(--color-muted-foreground) 35%, transparent); + border: 3px solid transparent; + background-clip: content-box; + border-radius: 999px; + } + + ::-webkit-scrollbar-thumb:hover { + background: color-mix(in oklab, var(--color-muted-foreground) 55%, transparent); + background-clip: content-box; + } +} + +@utility safe-bottom { + padding-bottom: max(env(safe-area-inset-bottom), 0px); +} + +@utility safe-top { + padding-top: max(env(safe-area-inset-top), 0px); +} diff --git a/web/frontend/src/components/ActionBadge.vue b/web/frontend/src/components/ActionBadge.vue new file mode 100644 index 0000000..776d034 --- /dev/null +++ b/web/frontend/src/components/ActionBadge.vue @@ -0,0 +1,36 @@ + + + diff --git a/web/frontend/src/components/AppShell.vue b/web/frontend/src/components/AppShell.vue new file mode 100644 index 0000000..2276ffe --- /dev/null +++ b/web/frontend/src/components/AppShell.vue @@ -0,0 +1,117 @@ + + + diff --git a/web/frontend/src/components/BarList.vue b/web/frontend/src/components/BarList.vue new file mode 100644 index 0000000..e80affc --- /dev/null +++ b/web/frontend/src/components/BarList.vue @@ -0,0 +1,42 @@ + + + diff --git a/web/frontend/src/components/EventItem.vue b/web/frontend/src/components/EventItem.vue new file mode 100644 index 0000000..3f48550 --- /dev/null +++ b/web/frontend/src/components/EventItem.vue @@ -0,0 +1,46 @@ + + + diff --git a/web/frontend/src/components/PageHeader.vue b/web/frontend/src/components/PageHeader.vue new file mode 100644 index 0000000..afe3191 --- /dev/null +++ b/web/frontend/src/components/PageHeader.vue @@ -0,0 +1,17 @@ + + + diff --git a/web/frontend/src/components/StatCard.vue b/web/frontend/src/components/StatCard.vue new file mode 100644 index 0000000..649d162 --- /dev/null +++ b/web/frontend/src/components/StatCard.vue @@ -0,0 +1,49 @@ + + + diff --git a/web/frontend/src/components/StatusPill.vue b/web/frontend/src/components/StatusPill.vue new file mode 100644 index 0000000..a16ef37 --- /dev/null +++ b/web/frontend/src/components/StatusPill.vue @@ -0,0 +1,49 @@ + + + diff --git a/web/frontend/src/components/Toaster.vue b/web/frontend/src/components/Toaster.vue new file mode 100644 index 0000000..c258768 --- /dev/null +++ b/web/frontend/src/components/Toaster.vue @@ -0,0 +1,52 @@ + + + diff --git a/web/frontend/src/components/TrafficChart.vue b/web/frontend/src/components/TrafficChart.vue new file mode 100644 index 0000000..ab48159 --- /dev/null +++ b/web/frontend/src/components/TrafficChart.vue @@ -0,0 +1,168 @@ + + + diff --git a/web/frontend/src/components/ui/Badge.vue b/web/frontend/src/components/ui/Badge.vue new file mode 100644 index 0000000..c204771 --- /dev/null +++ b/web/frontend/src/components/ui/Badge.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/web/frontend/src/components/ui/Button.vue b/web/frontend/src/components/ui/Button.vue new file mode 100644 index 0000000..0253239 --- /dev/null +++ b/web/frontend/src/components/ui/Button.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/web/frontend/src/components/ui/Card.vue b/web/frontend/src/components/ui/Card.vue new file mode 100644 index 0000000..097e7cb --- /dev/null +++ b/web/frontend/src/components/ui/Card.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/frontend/src/components/ui/CardContent.vue b/web/frontend/src/components/ui/CardContent.vue new file mode 100644 index 0000000..c92c867 --- /dev/null +++ b/web/frontend/src/components/ui/CardContent.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/CardDescription.vue b/web/frontend/src/components/ui/CardDescription.vue new file mode 100644 index 0000000..39bd24e --- /dev/null +++ b/web/frontend/src/components/ui/CardDescription.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/CardHeader.vue b/web/frontend/src/components/ui/CardHeader.vue new file mode 100644 index 0000000..bd75910 --- /dev/null +++ b/web/frontend/src/components/ui/CardHeader.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/CardTitle.vue b/web/frontend/src/components/ui/CardTitle.vue new file mode 100644 index 0000000..2a79e82 --- /dev/null +++ b/web/frontend/src/components/ui/CardTitle.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/frontend/src/components/ui/Input.vue b/web/frontend/src/components/ui/Input.vue new file mode 100644 index 0000000..aca5744 --- /dev/null +++ b/web/frontend/src/components/ui/Input.vue @@ -0,0 +1,22 @@ + + + diff --git a/web/frontend/src/components/ui/Label.vue b/web/frontend/src/components/ui/Label.vue new file mode 100644 index 0000000..d2c948a --- /dev/null +++ b/web/frontend/src/components/ui/Label.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/Modal.vue b/web/frontend/src/components/ui/Modal.vue new file mode 100644 index 0000000..329573c --- /dev/null +++ b/web/frontend/src/components/ui/Modal.vue @@ -0,0 +1,71 @@ + + + diff --git a/web/frontend/src/components/ui/Select.vue b/web/frontend/src/components/ui/Select.vue new file mode 100644 index 0000000..aba04ce --- /dev/null +++ b/web/frontend/src/components/ui/Select.vue @@ -0,0 +1,69 @@ + + + diff --git a/web/frontend/src/components/ui/Separator.vue b/web/frontend/src/components/ui/Separator.vue new file mode 100644 index 0000000..e55cfcc --- /dev/null +++ b/web/frontend/src/components/ui/Separator.vue @@ -0,0 +1,21 @@ + + + diff --git a/web/frontend/src/components/ui/Skeleton.vue b/web/frontend/src/components/ui/Skeleton.vue new file mode 100644 index 0000000..daf17c5 --- /dev/null +++ b/web/frontend/src/components/ui/Skeleton.vue @@ -0,0 +1,9 @@ + + + diff --git a/web/frontend/src/components/ui/Switch.vue b/web/frontend/src/components/ui/Switch.vue new file mode 100644 index 0000000..296c43f --- /dev/null +++ b/web/frontend/src/components/ui/Switch.vue @@ -0,0 +1,26 @@ + + + diff --git a/web/frontend/src/components/ui/Tabs.vue b/web/frontend/src/components/ui/Tabs.vue new file mode 100644 index 0000000..af94483 --- /dev/null +++ b/web/frontend/src/components/ui/Tabs.vue @@ -0,0 +1,18 @@ + + + diff --git a/web/frontend/src/components/ui/TabsContent.vue b/web/frontend/src/components/ui/TabsContent.vue new file mode 100644 index 0000000..cbd49ac --- /dev/null +++ b/web/frontend/src/components/ui/TabsContent.vue @@ -0,0 +1,13 @@ + + + diff --git a/web/frontend/src/components/ui/TabsList.vue b/web/frontend/src/components/ui/TabsList.vue new file mode 100644 index 0000000..ce1cf47 --- /dev/null +++ b/web/frontend/src/components/ui/TabsList.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/frontend/src/components/ui/TabsTrigger.vue b/web/frontend/src/components/ui/TabsTrigger.vue new file mode 100644 index 0000000..2d6ed73 --- /dev/null +++ b/web/frontend/src/components/ui/TabsTrigger.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/frontend/src/components/ui/Textarea.vue b/web/frontend/src/components/ui/Textarea.vue new file mode 100644 index 0000000..59d4ce2 --- /dev/null +++ b/web/frontend/src/components/ui/Textarea.vue @@ -0,0 +1,22 @@ + + +