whose-turn 1.0.0-alpha.4 → 1.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,33 @@
2
2
 
3
3
  All notable changes to whose-turn are recorded here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow [Semantic Versioning](https://semver.org/).
4
4
 
5
+ ## [1.0.0-alpha.6] - 2026-11-04
6
+
7
+ ### Fixed
8
+ - A secret with a line break in its value, service or account is refused instead of reaching the macOS keychain command. RMA-251.
9
+ - A panel size is saved per workspace and panel without the panel reaching into the store; sizes saved by alpha.5 are dropped once. RMA-251.
10
+ - After a self-update the window says so and asks for a reload: the chip spins while the server installs and restarts, then reads "Updated to <version> · Reload"; before, the old page kept running and its clicks did nothing. RMA-255.
11
+
12
+ ## [1.0.0-alpha.5] - 2026-11-04
13
+
14
+ ### Fixed
15
+ - The workspace header keeps its copy label and quick links on whole lines, and a connector no longer adds a second link to a site the workspace already links. RMA-249, RMA-250.
16
+ - In a feed group with unread items only the unread rows are lit. RMA-201.
17
+ - `install.sh` writes WHOSE_TURN_DATA and WHOSE_TURN_PORT into the launch agent when they are set. RMA-219.
18
+ - The launch agent and the systemd unit start `launch.sh`, which resolves node at every start (login shell, PATH, then the install-time path), so removing a version-manager Node no longer breaks them. RMA-215.
19
+
20
+ ### Changed
21
+ - The rules in Settings read in plain words, and the next-step fields are named after the situation they cover. RMA-173.
22
+ - The user reads as "you" everywhere, never as their full name. RMA-174.
23
+ - A rules table that hides every ticket, or a catch-all row before other rows, now shows a warning. RMA-171.
24
+ - Many small fixes to the window from the two heuristic reviews. RMA-148, RMA-175.
25
+ - The docs check is Node (`scripts/docs-check.mjs`). RMA-209.
26
+
27
+ ### Added
28
+ - Panels are resizable: Your move, To do and Waiting on others by their bottom edge, What changed by its left edge, Recently done by its top edge. The size is remembered per workspace, never goes below the header and one full row (the column scrolls when the minimums do not fit), double click gives it back to the layout, and `scripts/panel-matrix.mjs` checks the layout matrix with Playwright. RMA-246.
29
+ - To-do: a pencil or a double click edits the text in place (Enter saves through `edit`, Escape cancels), and a deleted to-do offers Undo. RMA-172.
30
+ - A presentation film in the README (docs/media/whose-turn-film.mp4, 80 s). RMA-233.
31
+
5
32
  ## [1.0.0-alpha.4] - 2026-11-03
6
33
 
7
34
  ### Changed
package/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  A local monitor that answers "what is waiting on me right now" across the places your work arrives: GitHub pull requests, Jira and Linear tickets, and your own to-dos. It polls each source about once a minute, decides once, on the server, whose turn every ticket is, shows the result in a window that updates live, sends a desktop notification when something becomes your move, and hands any item to an AI assistant as Markdown with its context. Its Claude Code plugin, `whose-turn@bladeforge`, makes a session start with "N your move · M unread · K to-do" already in context.
4
4
 
5
+ [![Whose Turn in 80 seconds: the noise of many trackers, then one queue of your moves](docs/media/whose-turn-film.png)](docs/media/whose-turn-film.mp4)
6
+
7
+ The film, 80 seconds with sound: [docs/media/whose-turn-film.mp4](docs/media/whose-turn-film.mp4). Its first act is staged; the window in the second act shows the maintainer's real workspaces on 3 November 2026.
8
+
5
9
  ![The window with invented data: Your move, To do, Waiting on others, and the feed](docs/window.png)
6
10
 
7
11
  Everything runs on your machine: a Node 22 server on `127.0.0.1`, a window built with Vue, and no account anywhere but the sources you already use. Nothing that names an employer, an account or a team process lives in this repository; it all sits in one config file on the machine that owns it.
@@ -18,7 +22,7 @@ npm ci && npm run build
18
22
 
19
23
  `install.sh` makes the monitor start at login and restart if it stops (a launch agent on macOS, a systemd user unit on Linux; on Windows it prints the one `schtasks` line to run). `open.sh` opens the window as its own app window, or in a browser tab with `--browser`. The window listens on port 8765; `WHOSE_TURN_PORT` changes that. A clone updates with `git pull` and a rebuild; it is never offered the in-app update.
20
24
 
21
- With Claude Code, the plugin installs and starts all of this for you, with no clone and no build (see [Claude Code](#claude-code)). That install updates itself: the server checks npm every ten minutes, tells you about a new version with a desktop notification and a chip in the status bar, and installs it and restarts on one click (`POST /api/update`).
25
+ With Claude Code, the plugin installs and starts all of this for you, with no clone and no build (see [Claude Code](#claude-code)). That install updates itself: the server checks npm every ten minutes, tells you about a new version with a desktop notification and a chip in the status bar, and installs it and restarts on one click (`POST /api/update`). While it works the chip spins ("Installing…", then "Restarting…") and the window stays usable; when the server runs the new version the chip turns into "Updated to <version> · Reload", because the open window still runs the old page until you reload it.
22
26
 
23
27
  ```sh
24
28
  claude plugin marketplace add aquivalabs/BladeForge
@@ -64,7 +68,7 @@ Nothing that names an employer, an account or a team process lives in this repos
64
68
  | `…jira.email` | the account the API token belongs to |
65
69
  | `…jira.token_service` | the secret-store entry holding the token, default `whose-turn-jira` |
66
70
  | `…jira.jql` | which tickets to watch |
67
- | `workspaces[].links` | quick links shown in the header, as `"Label https://…"` strings or `{label, url}`; the repository, the Jira site and the Linear team come from the connectors by themselves |
71
+ | `workspaces[].links` | quick links shown in the header, as `"Label https://…"` strings or `{label, url}`; the repository, the Jira site and the Linear team come from the connectors by themselves, unless one of these links already points at the same site |
68
72
  | `workspaces[].rules` | the team's process, see Rules below; `statuses` groups, `automation_authors` and `question_words` must be lists of strings (statuses non-empty) or the save is refused |
69
73
  | `…connectors.linear.workspace`, `team`, `project` | the Linear workspace slug (the part after linear.app/), and optionally one team key or one project name; the personal API key goes to the secret store under the workspace slug |
70
74
  | `workspaces[].theme.seed` | optional hex colour, `#rrggbb`; the window derives its light and dark Material 3 scheme from it (`lib/palette.mjs`); without it the stylesheet's blue stays |
@@ -100,7 +104,7 @@ On Windows, run `schtasks /Create /SC ONLOGON /TN whose-turn /TR "\"<path to nod
100
104
  | `lib/http-client.mjs`, `lib/secrets.mjs` (with `lib/platform/credential.ps1`), `lib/notify.mjs`, `lib/store.mjs`, `lib/errors.mjs`, `lib/text.mjs` | ETag fetch, secret lookup, desktop notification, files on disk, the error envelope, text helpers |
101
105
  | `connectors/` | one module per source type |
102
106
  | `web/` | the window: a Vue 3 app in TypeScript built with Vite (`web/src/App.vue`, primitives in `web/src/ui/`, one folder per island in `web/src/features/` with its components, composables and tests, shared composables in `web/src/composables/` (ADR 0006), each component's styles in a scoped BEM block (layout and shared primitives in `web/src/styles/base.css`, ADR 0005), pure logic in `web/src/lib/`, the dot-drawn animal in `web/src/backdrop.ts`, Tippy.js 6.3.7 and Popper 2.11.8 pinned in `web/public/vendor/`); `npm run build` writes `dist/`, which the server serves and git ignores (ADR 0001) |
103
- | `install.sh` | bash installer that picks by `uname`: on macOS the launch agent `local.whose-turn` (log in `~/Library/Logs/whose-turn.log`); on Linux the user unit `~/.config/systemd/user/whose-turn.service` (log in `journalctl --user -u whose-turn`); both start at login and restart on a crash; on other systems it prints the Windows `schtasks` line. The node path is read with `command -v node` at install time |
107
+ | `install.sh` | bash installer that picks by `uname`: on macOS the launch agent `local.whose-turn` (log in `~/Library/Logs/whose-turn.log`); on Linux the user unit `~/.config/systemd/user/whose-turn.service` (log in `journalctl --user -u whose-turn`); both start at login and restart on a crash; on other systems it prints the Windows `schtasks` line. The agent runs `launch.sh`, which resolves node at every start (login shell, then PATH, then the path `command -v node` found at install time, kept as `WHOSE_TURN_NODE`), so removing a version-manager Node does not break it; `WHOSE_TURN_DATA` and `WHOSE_TURN_PORT`, when set in the shell that runs it, are written into the plist or the unit and named in the "Installed" line |
104
108
  | `open.sh` | opens the window as its own app window (Chrome on macOS; Chrome, Chromium or Edge on Linux) at the size it last had, or in a browser tab with `--browser` or when none of those is installed; bash, not zsh, so it runs on Linux too; Windows: open the URL yourself |
105
109
  | `test/` | `node:test` suite: rules, config, ADF conversion |
106
110
 
@@ -175,13 +179,13 @@ The monitor also alerts on its own polling: stale data, or a source that keeps f
175
179
 
176
180
  Requests must carry the local `Host`; a POST must be `application/json`. An error is a `google.rpc.Status` envelope: `{"error":{"code","status","message","details":[{"@type":"ErrorInfo","reason"}]}}`; branch on `reason`. The reasons: `NOT_FOUND` (unknown path, 404), `METHOD_NOT_ALLOWED` (405 with an `Allow: GET, POST` header, a method other than GET or POST), `NO_SUCH_WORKSPACE`, `NO_SUCH_TODO` (404), `NO_WORKSPACE` (412, a request that needs a workspace while none is configured; `/api/state` still answers 200 with an empty snapshot carrying `problems`, which the first-run card reads), `NOT_CONFIGURED` (412, feedback is not set up), `UPSTREAM_FAILED` (502, Linear failed or answered an error; the HTTP status is in the `ErrorInfo` metadata `upstream_status`), `RATE_LIMITED` (429), `UNKNOWN_ACTION`, `INVALID_BODY`, `INVALID_ARGUMENT` (an empty to-do or remark names the field `text` in a `BadRequest` detail), `INVALID_CONFIG` (400), `UPDATE_IN_PROGRESS` (409, an update is already installing), `UPDATE_UNAVAILABLE` (412, nothing to update: a checkout, or already the latest version), `FORBIDDEN_ORIGIN` (403) and `INTERNAL` (500, a fixed message; the raw exception text appears only in a `DebugInfo` detail when the server runs with `WHOSE_TURN_DEBUG=1`, and always in the server log).
177
181
 
178
- - `GET /api/workspaces`: `[{id, name, key_pattern, connectors:[{id, type, label}], open_moves, theme}]`; `theme` is `{light, dark}`, each a map of CSS variable to value, or `null` without a seed. `/api/summary` leaves `theme` out.
179
- - `GET /api/state?ws=<id>`: one workspace, default the first: `turn` (the rows, each with `group`, `rank`, `next`, `why`, `url`, `ticket_url`, `source`, `status_group` (`backlog`, `passed`, `code_review`, `qa`, `on_hold` or empty) and `handled`), `counts` (`mine`, `others`, `failing`, `done`: the four header tiles), `feed`, `marks`, `todos` (each with `ticket_url`), `errors`, `health`, `polled_at`, `me` (your name per source), `workspace`, plus `workspaces` and `problems`. With `&full=1` the merged raw collections come too: `tickets`, `comments`, `prs`, `activity`, `asks`, `events`.
182
+ - `GET /api/workspaces`: `[{id, name, key_pattern, links, connectors:[{id, type, label}], open_moves, theme, theme_seed, failing_sources}]`; `links` are the quick links, `theme` is `{light, dark}`, each a map of CSS variable to value, or `null` without a seed, `theme_seed` is the seed it grows from and `failing_sources` counts the sources with an error. `/api/summary` leaves `theme` out.
183
+ - `GET /api/state?ws=<id>`: one workspace, default the first: `turn` (the rows, each with `group` (`you`, `others`, `done`, or `gone` for a row the workspace's rules hide, which is never your move), `rank`, `next`, `why`, `url`, `ticket_url`, `source`, `status_group` (`backlog`, `passed`, `code_review`, `qa`, `on_hold` or empty) and `handled`), `counts` (`mine`, `others`, `failing`, `done`: the four header tiles), `feed`, `marks`, `todos` (each with `ticket_url`), `errors`, `health`, `polled_at`, `me` (your name per source), `workspace`, plus `workspaces` and `problems`. With `&full=1` the merged raw collections come too: `tickets`, `comments`, `prs`, `activity`, `asks`, `events`.
180
184
  - `GET /api/summary`: across all workspaces: `moves` (each with `ws`), `new_events`, `todos`, `polled_at`, `errors`, `health` (`{ok, alerts}`, alerts as text prefixed with the workspace name when there are several), and `workspaces` with the same per workspace, where `health` is `{ok, stale, fresh_at, failing:[{source, polls}], alerts:[{id, text}]}`.
181
185
  - `GET /api/stream`: SSE. One `data:` event per poll per workspace, `{ws, version, polled_at, open_moves}`. The window reloads state when its workspace's `version` changes. The update status arrives as `{update}`, once on connect and on every change.
182
186
  - `/api/summary` and `/api/state` carry `update: {current, latest, available, state, reason?}`. The server checks `https://registry.npmjs.org/-/package/whose-turn/dist-tags` every ten minutes (ETag-cached) and follows the `latest` dist-tag, which every publish moves (prereleases included during the alpha); `available` is true when that tag names another version and the server runs from the plugin's install, `<data>/app/node_modules/whose-turn`. `state` is `idle`, `installing`, `restarting` or `failed` (with npm's last lines in `reason`). A new version raises one desktop notification. `POST /api/update` runs `npm install --prefix <data>/app --no-audit --no-fund --no-save whose-turn@<version>` and restarts: under the launch agent it exits and the agent starts the new copy; without one it frees the port, starts the new `server.mjs` detached (output to `<data>/server.log`) and exits. A failed install leaves the running copy as it was. A second `POST` while one runs is refused with `UPDATE_IN_PROGRESS`; one with nothing to update with `UPDATE_UNAVAILABLE`. This is the expected, announced way an install stays current, not a silent update.
183
187
  - A read without `ws` answers for the first workspace; a write (`/api/marks`, `/api/todos`, an inbox hand-off) without `ws` is refused with `INVALID_ARGUMENT`, because it would land silently in the wrong workspace (RMA-115).
184
- - `POST /api/marks` takes `{ws, seen:[ids], base:ms, handled:{row_id: iso|null}, notified:[ids]}`; `seen` must be strings, `base` a number not in the future, `handled` values ISO dates or null, else `INVALID_ARGUMENT` names the field. It answers `{marks, turn, counts}`, recomputed, so the window updates without a reload.
188
+ - `POST /api/marks` takes `{ws, seen:[ids], unseen:[ids], base:ms, handled:{row_id: iso|null}, notified:[ids]}`; `seen` and `unseen` must be strings (`unseen` takes ids back out of `seen`, which is how Undo restores Mark all read), `base` a number not in the future, `handled` values ISO dates or null, else `INVALID_ARGUMENT` names the field. It answers `{marks, turn, counts}`, recomputed, so the window updates without a reload.
185
189
  - `POST /api/todos` takes `{ws, action, …}`: `add {text, key?, by?}`; `done`, `undo`, `delete` with `{id}`; `edit {id, text}`.
186
190
  - `POST /api/refresh` polls now.
187
191
  - `GET /api/window` is the size the app window last reported, `{width, height}`, or `{}` before the first report; `POST /api/window` with `{width, height}` (whole pixels, 300 to 10000) stores it in `<data>/window.json`. `open.sh` reads it for `--window-size`.
@@ -189,27 +193,31 @@ Requests must carry the local `Host`; a POST must be `application/json`. An erro
189
193
  - `GET /api/feedback` says whether feedback is configured and lists the issues filed from this machine (`<data>/reports.json`, the last hundred) with the state Linear reports for them, read with the feedback key and cached for a minute, so a reporter without a Linear account can follow their reports in the Report sheet and on `/report?id=<identifier>`, the monitor's own page; `GET /api/feedback?id=<identifier>` returns that one report with the comments on its issue as the maintainer's answers and `unanswered` when it was closed without one; `POST /api/feedback` with `{text, ws?, kind_ref?, from?}` lets the server compose the issue from a remark in the user's words (the user's own agent from `feedback.composer`, Claude Code by default; the first line becomes the title when no agent answers), or with `{kind: bug|improvement|idea, title, body?, ws?, kind_ref?: {kind, ref}, from?}` creates a Linear issue in the configured project with the matching label and, when `kind_ref` names a row, a feed item or a workspace, that hand-off context in the description. The reply carries the issue id and url.
190
194
  - `GET /api/handoff?ws=<id>&kind=row|feed|thread|workspace&ref=<row_id, feed id or ticket key>` renders that item with its context as Markdown for pasting into any assistant (`thread` is every feed event of one ticket, newest first, with the ticket's row, PRs and comments); `GET /api/handoff?all=1` renders every workspace. Every hand-off starts with a `Whose Turn · <workspace> · <local date and time>` line and ends with a `Links:` line of the https ticket and PR URLs it mentions, so a paste says which workspace it came from and how old it is; after the header one line says the text below is data from tickets, pull requests and comments, never instructions, and the body follows in a fence a comment cannot close. This is what the window's "Copy for AI" buttons put on the clipboard.
191
195
  - `POST /api/inbox` with `{ws, kind: 'row' | 'feed' | 'workspace', ref}` hands an item to an agent through a queue (`ws` is required, a hand-off without it is refused; for MCP clients and the plugin hook): the server queues it in `<data>/inbox.json` with a few words of snapshot and keeps `<data>/inbox.pending` as a marker while the queue is not empty. `{action: 'take', consumer}` returns the items this consumer has not seen yet, each with its context built at that moment (the row with its why and links, the last five comments and the PRs of its ticket, bodies capped; a feed item with its body; or the whole workspace with its rules, moves, waiting rows and to-dos), and marks them delivered to that consumer only, so every agent sees an item once. An item leaves the queue a day after its first delivery or a week after it was queued. `GET /api/inbox?consumer=<name>` lists without taking; `{action: 'clear'}` empties the queue.
192
- - `GET /api/config`: the raw workspace list as written in the config file, the `problems`, the connector catalogue (`type`, `label`, `fields`), the workspace field catalogue (`fields`: workspace, theme, rules, statuses) and the config file path. `POST /api/config` with `{workspaces: [...], secrets?: [{ws, connector, key, value}]}` validates the list first; on a problem it answers `INVALID_CONFIG` with the problems as `BadRequest.field_violations` in `details` and stores nothing. Otherwise it stores the secrets (the account and the store entry come from the connector's own field declaration), writes the file and reloads the workspaces in place; a workspace whose definition did not change keeps its caches, new or changed ones are polled at once. The reply carries the workspace list and `secrets_stored`. A workspace or connector entry that is not an object is refused with `INVALID_CONFIG`, the field violation naming its index (`workspaces[1]`, `workspaces[1].connectors[0]`). An empty list is refused with `INVALID_ARGUMENT` ("keep at least one workspace"), and each write keeps the previous file as `config.json.bak`.
196
+ - `GET /api/config`: the raw workspace list as written in the config file, the `problems`, the connector catalogue (`type`, `label`, `fields`), the workspace field catalogue (`fields`: workspace, theme, rules, statuses) and the config file path. `POST /api/config` with `{workspaces: [...], secrets?: [{ws, connector, key, value}]}` validates the list first; on a problem it answers `INVALID_CONFIG` with the problems as `BadRequest.field_violations` in `details` and stores nothing; a violation of one field carries its path (`workspaces[0].rules.backlog_rows`), which the settings form shows under that field. Field specs with `choices` draw as selects. Otherwise it stores the secrets (the account and the store entry come from the connector's own field declaration), writes the file and reloads the workspaces in place; a workspace whose definition did not change keeps its caches, new or changed ones are polled at once. The reply carries the workspace list and `secrets_stored`. A workspace or connector entry that is not an object is refused with `INVALID_CONFIG`, the field violation naming its index (`workspaces[1]`, `workspaces[1].connectors[0]`). An empty list is refused with `INVALID_ARGUMENT` ("keep at least one workspace"), and each write keeps the previous file as `config.json.bak`.
193
197
  - `POST /api/secrets` with `{service, account, value}` stores a token on its own (Keychain on macOS, a 600-mode file `<data>/secrets/<service>@<account>` elsewhere); it never touches the config.
194
198
  - Both write endpoints are reachable by any local process. A stored token is bound to its service, account and endpoint: a save that would point an existing token at a new endpoint, account or store entry is refused with `INVALID_CONFIG` unless the same request carries the token again, so a process without the token cannot redirect it. See AGENTS.md.
195
199
 
196
200
  ## The window
197
201
 
198
- - Material 3 plus glass: tonal surfaces seeded from the workspace's `theme.seed`, or from a seed derived from its id without one, so every workspace has its own colour; translucent blurred islands with 12 px corners, dark and light schemes, a gradient header with stat tiles.
199
- - Under the glass, an animal drawn in dots (`web/src/backdrop.ts`): one species out of the JSON files in `web/src/species/`, built from shapes whose proportions come from a seeded random, in one of its poses (sitting, walking, sleeping, facing the camera). Each workspace gets its own seed for the session, so switching tabs changes the animal; `window.whoseTurnBackdrop.show({ workspace, seed, species, pose })` picks one and `.species` lists the names (the hook for pinning an animal per workspace, RMA-94). A new animal is a new JSON file, see [`docs/mechanisms/species-dsl.md`](docs/mechanisms/species-dsl.md); `/sheet` draws every species over several seeds without the glass.
200
- - First run: while the open workspace has no sources, one card replaces the islands. It says what the window does, offers "Add a source" (the settings sheet on this workspace, at its connectors) and says Claude can set it up too.
201
- - Two columns. Left: Your move, To do, Waiting on others. Right: the feed. The page never scrolls; each island scrolls inside, with sticky table headers. A PR cell shows the checks or state pill under the PR number.
202
- - Every header is one line, truncated with an ellipsis. Anything that hides more text gets a "?" icon at the end. Tooltips are Tippy: instant, also on click, interactive, keep line breaks.
203
- - Your move: one row per thing to do, with a "?" for why it is there, an age chip (amber after 24 h) and a Handled button. Handled rows leave this list; the Handled view in the head lists them, dimmed, with Undo.
204
- - Waiting on others: who holds the ticket and for how long, from the changelog (amber after 3 days). For On Hold, the one-line reason with a tooltip. The table keeps fixed column widths and fits its island down to a 1280 px window, with no sideways scroll; the Waiting for column takes the width left over.
205
- - Every panel folds with the chevron in its head, the header, too, down to one line with the counts; the choice is remembered in the browser.
206
- - The AI button, a small sparkle on every row, on a feed group head (the whole thread of that ticket), on an expanded feed item, under the title and in the top bar, copies that item, the thread, the workspace or everything as Markdown with its context, ready to paste into any assistant.
207
- - Feed: grouped by ticket by default, the ticket with the newest event on top; a group head is two short lines, the key with its summary, then the event count or "N new", the first two kinds of event plus "+n" and the time on the right, and a ticket that is your move carries an amber bar on its left edge; a group opens into its events. The source filter and the By ticket / Flat switch share one row, the unread total sits beside the title. A search box filters by any words across key, author, kind and text, and opens the matching groups. "Flat" shows the plain newest-first list. One filter button per connector entry, named by its `label`, else by its `id` when two entries share a type, else by the type; each item's round badge shows the initials of that name (GH for a GitHub entry under its own name). A pull request always reads `repo#number` with its title, with or without a ticket key. Unread items highlighted until clicked plus "Mark all read". Only written things expand. "Open formatted" renders the Markdown safely from DOM nodes, never innerHTML. A "@you" tag marks mentions.
208
- - To do: an input with an Add button, checkboxes, an Open/Done switch in the head; ticket keys become links. Claude adds items through the API.
209
- - Status line: live dot, "last check Xs ago" ("Stale · last data X ago" with a red dot when the data is old; "No data: <sources> failing" with a red dot when every source fails, an amber dot when only some do), Refresh now, the update chip when the install has a newer version waiting ("1.0.0-alpha.3 is out · Update", then "Updating…" and "Updated to …" once the stream reconnects to the restarted server; "Update failed · Retry" with npm's message as its tooltip), "Open as app" in a browser tab or "Open in browser" in the app window, and a banner for source, config and health alerts. `open.sh` opens the app window on `/?mode=app`, which is how the page knows it is one; a reloaded app window keeps that, a tab stays a tab. The app window reports its size after a resize and the next one opens at it.
210
- - A rail down the left edge lists the workspaces, like a browser's side tabs: icons only, names on hover. Each icon is generated from the workspace id and tinted by its palette, with the open "your move" count as a badge. The choice is remembered in the browser and `?ws=<id>` opens one directly. Drag an icon up or down to reorder the workspaces; the order is saved to the config file.
211
- - "Report" in the top bar opens the backlog sheet: one text field, write the problem or the wish in your own words; an assistant composes the title, the kind and the description, the current workspace's summary is attached; Send or Cmd+Enter files it into the monitor's own Linear project and shows the issue link.
212
- - The gear at the bottom of the rail opens the settings sheet: the workspace list on the left, one workspace's form on the right (id, name, key pattern, theme colours, connector entries with the fields each connector declares (a boolean field is a checkbox showing its default when unset), rule texts and status words). Save writes the config file through `/api/config`; a token typed into a secret field goes to `/api/secrets` first and never into the file.
202
+ Open it at `http://127.0.0.1:<port>/` (or with `open.sh` as an app window). One tab per workspace sits in the rail down the left edge; hover an icon for its name, the badge counts what is waiting on you there.
203
+
204
+ **What is on me.** The Your move panel lists one row per thing to do: the ticket, the next step, the PR and the last comment that matter. A small "why" next to the step says how the rule reached it, and a chip says how long it has waited (amber once it is more than a day). Columns that are empty in every row are left out. A PR without a ticket shows the PR once, as the link in the first column.
205
+
206
+ **Mark it handled.** "Handled" moves a row out of the list; the Handled view lists them, dimmed, with Undo. A handled row comes back after seven days if it is still open, or sooner when something new happens on it. Recently done, folded under the list, shows the tickets that left your move lately.
207
+
208
+ **What I wait for.** Waiting on others lists tickets you touched where someone else holds the next step, with who and for how long. To do holds your own notes; Claude can add to it too.
209
+
210
+ **What changed.** The feed on the right is newest first, grouped by ticket. A ticket that is your move has an amber bar. Unread items are lit until you click them, and "Mark all read" clears them (with Undo). Search filters by any words and opens the matching groups; the source buttons narrow it to one source, "Flat" drops the grouping. Only written things expand, and "Open formatted" shows the comment as it was written.
211
+
212
+ **Fold, resize, copy, ask.** Every panel folds with the chevron before its title and stays folded. Drag a panel's edge to resize it (arrow keys work on the focused handle, double click resets); the size is kept per workspace and never goes below the header and one full row. The AI button on a row, a ticket thread, a workspace or the top bar copies that context as Markdown for any assistant.
213
+
214
+ **Add a source.** First run shows one card with "Add a source". Later, the gear at the bottom of the rail opens Settings: the workspaces on the left, one workspace on the right with its sources, rule texts and colours. Save writes the config; a token goes to the secret store and never into the file. A failing source gets one line in the red banner above the panels, which opens Settings.
215
+
216
+ **Report a problem or a wish.** "Report" in the top bar takes one text field; Send files it in the monitor's own backlog and shows the link, and `/report?id=<issue>` shows the answer.
217
+
218
+ **Keys.** `/` focuses the feed search, `t` the to-do field, Escape closes a sheet, Alt+Up and Alt+Down move a focused rail icon, drag also reorders. The window follows the system's light or dark scheme, and its tab icon is the open workspace's rail icon.
219
+
220
+ Under the glass an animal drawn in dots follows the workspace; how to add one is in [`docs/mechanisms/species-dsl.md`](docs/mechanisms/species-dsl.md), and `/sheet` draws them all.
213
221
 
214
222
  ## Claude Code
215
223
 
@@ -233,11 +241,11 @@ The queue is for agents that pull on their own: `POST /api/inbox` hands an item
233
241
 
234
242
  - `npm install` once: it points `core.hooksPath` at `.githooks/`.
235
243
  - The plugin's own code (skill, command, hooks, MCP server) is in BladeForge, `plugins/whose-turn`; a change to what Claude can do lands here as an API change first (ADR 0007).
236
- - Releasing: bump `version` in `package.json`, add the changelog entry, commit, tag `v<version>` and push the tag; `.github/workflows/release.yml` checks, builds, publishes to npm under `latest` on every tag, prereleases included, plus the channel tag such as `alpha` for a prerelease (npm trusts the workflow through OIDC, no token) and attaches the tarball to a GitHub Release.
244
+ - Releasing: `main` collects changes and releases nothing. To ship, bump `version` in `package.json`, add the changelog entry, push `main`, then move the `release` branch to it (`git push origin main:release`); nobody pushes a tag. `.github/workflows/release.yml` runs on `release`, sees the new version, checks, builds, publishes to npm under `latest` on every release, prereleases included, plus the channel tag such as `alpha` for a prerelease (npm trusts the workflow through OIDC, no token) then creates the tag `v<version>` and a GitHub Release with the tarball. A push that leaves the version as released does nothing.
237
245
  - A checkout never offers the in-app update. To exercise it, lay out a packed copy as `<scratch>/app/node_modules/whose-turn`, start it with `WHOSE_TURN_DATA=<scratch>` and a free `WHOSE_TURN_PORT`, and point two test hooks at stubs: `WHOSE_TURN_REGISTRY` replaces `https://registry.npmjs.org` and `WHOSE_TURN_NPM` names the npm executable `POST /api/update` runs.
238
246
  - `npm run dev` starts the server on port 8766 with data and config in `.users-files/dev/` (gitignored), so nothing touches the real config. It serves the last `npm run build`; for live reloading of the window run `npm run dev:web` next to it and open port 5173, which proxies the API to 8766.
239
247
  - A fresh checkout has no window until `npm run build`; the server then says so on `/` while the API keeps working. A released package ships `dist/` built (RMA-126).
240
- - `npm test` runs the suite (Node strips the types of the `web/src/lib/*.ts` modules it imports). `npm run test:web` runs the window's store and component tests on Vitest. `npm run check` runs `vue-tsc` and `tsc` over the server, ESLint over the window and the server, Stylelint and both suites (CI runs it on every pull request and push to `main`), `npm run format` runs Prettier over `web/src`; with `python3 scripts/docs-check.py` (the docs gate) and `/review` (the review gate) it runs on push.
248
+ - `npm test` runs the suite (Node strips the types of the `web/src/lib/*.ts` modules it imports). `npm run test:web` runs the window's store and component tests on Vitest. `npm run check` runs `vue-tsc` and `tsc` over the server, ESLint over the window and the server, Stylelint and both suites (CI runs it on every pull request and push to `main`), `npm run format` runs Prettier over `web/src`; with `node scripts/docs-check.mjs` (the docs gate) and `/review` (the review gate) it runs on push.
241
249
  - Restart after a code change: `kill $(lsof -tnP -iTCP:8765 -sTCP:LISTEN)` kills whatever listens on the port; the launch agent brings the monitor back.
242
250
  - The first poll after a restart takes about a minute while the PR cache is rebuilt.
243
251
  - macOS gotcha: `security add-generic-password … -w` run through a non-interactive shell silently stores an empty password; the server passes the value as an argument, which is why it works from a launch agent.
@@ -0,0 +1,18 @@
1
+ (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 i of r)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();/**
2
+ * @vue/shared v3.5.44
3
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
+ * @license MIT
5
+ **/function kn(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const N={},tt=[],Ae=()=>{},Zs=()=>!1,sn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),rn=e=>e.startsWith("onUpdate:"),Z=Object.assign,es=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ai=Object.prototype.hasOwnProperty,V=(e,t)=>ai.call(e,t),E=Array.isArray,Be=e=>Pt(e)==="[object Map]",it=e=>Pt(e)==="[object Set]",xs=e=>Pt(e)==="[object Date]",R=e=>typeof e=="function",J=e=>typeof e=="string",he=e=>typeof e=="symbol",H=e=>e!==null&&typeof e=="object",ks=e=>(H(e)||R(e))&&R(e.then)&&R(e.catch),er=Object.prototype.toString,Pt=e=>er.call(e),di=e=>Pt(e).slice(8,-1),tr=e=>Pt(e)==="[object Object]",on=e=>J(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,yt=kn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ln=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},hi=/-\w/g,re=ln(e=>e.replace(hi,t=>t.slice(1).toUpperCase())),pi=/\B([A-Z])/g,Le=ln(e=>e.replace(pi,"-$1").toLowerCase()),fn=ln(e=>e.charAt(0).toUpperCase()+e.slice(1)),On=ln(e=>e?`on${fn(e)}`:""),ee=(e,t)=>!Object.is(e,t),Ut=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},nr=(e,t,n,s=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},cn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let vs;const un=()=>vs||(vs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ts(e){if(E(e)){const t={};for(let n=0;n<e.length;n++){const s=e[n],r=J(s)?yi(s):ts(s);if(r)for(const i in r)t[i]=r[i]}return t}else if(J(e)||H(e))return e}const gi=/;(?![^(]*\))/g,_i=/:([^]+)/,mi=/"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;function yi(e){const t={};return e.replace(mi,n=>n.startsWith("/*")?"":n).split(gi).forEach(n=>{if(n){const s=n.split(_i);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ns(e){let t="";if(J(e))t=e;else if(E(e))for(let n=0;n<e.length;n++){const s=ns(e[n]);s&&(t+=s+" ")}else if(H(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const bi="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,playsinline,readonly",xi=kn(bi);function sr(e){return!!e||e===""}function vi(e,t,n){if(e.length!==t.length)return!1;let s=!0;for(let r=0;s&&r<e.length;r++)s=Ge(e[r],t[r],n);return s}function Ss(e,t,n){if(e.size!==t.size)return!1;const s=Array.from(t),r=new Uint8Array(s.length);for(const i of e){let o=-1;for(let l=0;l<s.length;l++)if(!r[l]&&Ge(i,s[l],n)){o=l;break}if(o<0)return!1;r[o]=1}return!0}function Si(e,t,n){let s=Be(e),r=Be(t);if(s||r||(s=it(e),r=it(t),s||r))return s&&r?Ss(e,t,n):!1;const i=Object.keys(e).length,o=Object.keys(t).length;if(i!==o)return!1;for(const l in e){const c=e.hasOwnProperty(l),d=t.hasOwnProperty(l);if(c&&!d||!c&&d||!Ge(e[l],t[l],n))return!1}return String(e)===String(t)}function ws(e,t,n,s){n||(n=[new Map,new Map]);const[r,i]=n;if(r.has(e)||i.has(t))return r.get(e)===t&&i.get(t)===e;r.set(e,t),i.set(t,e);const o=s(e,t,n);return r.delete(e),i.delete(t),o}function Ge(e,t,n){if(e===t)return!0;let s=xs(e),r=xs(t);return s||r?s&&r?e.getTime()===t.getTime():!1:(s=he(e),r=he(t),s||r?e===t:(s=E(e),r=E(t),s||r?s&&r?ws(e,t,n,vi):!1:(s=H(e),r=H(t),s||r?!s||!r?!1:ws(e,t,n,Si):String(e)===String(t))))}function wi(e,t){return e.findIndex(n=>Ge(n,t))}const rr=e=>!!(e&&e.__v_isRef===!0),Ci=e=>J(e)?e:e==null?"":E(e)||H(e)&&(e.toString===er||!R(e.toString))?rr(e)?Ci(e.value):JSON.stringify(e,ir,2):String(e),ir=(e,t)=>rr(t)?ir(e,t.value):Be(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[En(s,i)+" =>"]=r,n),{})}:it(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>En(n))}:he(t)?En(t):H(t)&&!E(t)&&!tr(t)?String(t):t,En=(e,t="")=>{var n;return he(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
6
+ * @vue/reactivity v3.5.44
7
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
8
+ * @license MIT
9
+ **/let X;class Ti{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&&X&&(X.active?(this.parent=X,this.index=(X.scopes||(X.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;t<n;t++)s[t].pause()}for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes){const r=this.scopes.slice();for(t=0,n=r.length;t<n;t++)r[t].resume()}const s=this.effects.slice();for(t=0,n=s.length;t<n;t++)s[t].resume()}}run(t){if(this._active){const n=X;try{return X=this,t()}finally{X=n}}}on(){++this._on===1&&(this.prevScope=X,X=this)}off(){if(this._on>0&&--this._on===0){if(X===this)X=this.prevScope;else{let t=X;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;n<s;n++)this.effects[n].stop();for(this.effects.length=0,n=0,s=this.cleanups.length;n<s;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){const r=this.scopes.slice();for(n=0,s=r.length;n<s;n++)r[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0}}}function Oi(){return X}function Xl(e,t=!1){X&&X.cleanups.push(e)}let W;const An=new WeakSet;class or{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,X&&(X.active?X.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,An.has(this)&&(An.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||fr(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Cs(this),cr(this);const t=W,n=ye;W=this,ye=!0;try{return this.fn()}finally{ur(this),W=t,ye=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)is(t);this.deps=this.depsTail=void 0,Cs(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?An.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){$n(this)&&this.run()}get dirty(){return $n(this)}}let lr=0,bt,xt;function fr(e,t=!1){if(e.flags|=8,t){e.next=xt,xt=e;return}e.next=bt,bt=e}function ss(){lr++}function rs(){if(--lr>0)return;if(xt){let t=xt;for(xt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;bt;){let t=bt;for(bt=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 cr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function ur(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),is(s),Ei(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function $n(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(ar(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function ar(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===wt)||(e.globalVersion=wt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!$n(e))))return;e.flags|=2;const t=e.dep,n=W,s=ye;W=e,ye=!0;try{cr(e);const r=e.fn(e._value);(t.version===0||ee(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{W=n,ye=s,ur(e),e.flags&=-3}}function is(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 i=n.computed.deps;i;i=i.nextDep)is(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ei(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let ye=!0;const dr=[];function Me(){dr.push(ye),ye=!1}function Re(){const e=dr.pop();ye=e===void 0?!0:e}function Cs(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=W;W=void 0;try{t()}finally{W=n}}}let wt=0;class Ai{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 an{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(!W||!ye||W===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==W)n=this.activeLink=new Ai(W,this),W.deps?(n.prevDep=W.depsTail,W.depsTail.nextDep=n,W.depsTail=n):W.deps=W.depsTail=n,hr(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=W.depsTail,n.nextDep=void 0,W.depsTail.nextDep=n,W.depsTail=n,W.deps===n&&(W.deps=s)}return n}trigger(t){this.version++,wt++,this.notify(t)}notify(t){ss();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{rs()}}}function hr(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)hr(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const qt=new WeakMap,st=Symbol(""),Kn=Symbol(""),Ct=Symbol("");function ne(e,t,n){if(ye&&W){let s=qt.get(e);s||qt.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new an),r.map=s,r.key=n),r.track()}}function je(e,t,n,s,r,i){const o=qt.get(e);if(!o){wt++;return}const l=c=>{c&&c.trigger()};if(ss(),t==="clear")o.forEach(l);else{const c=E(e),d=c&&on(n);if(c&&n==="length"){const a=Number(s);o.forEach((p,C)=>{(C==="length"||C===Ct||!he(C)&&C>=a)&&l(p)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),d&&l(o.get(Ct)),t){case"add":c?d&&l(o.get("length")):(l(o.get(st)),Be(e)&&l(o.get(Kn)));break;case"delete":c||(l(o.get(st)),Be(e)&&l(o.get(Kn)));break;case"set":Be(e)&&l(o.get(st));break}}rs()}function Pi(e,t){const n=qt.get(e);return n&&n.get(t)}function ot(e){const t=j(e);return t===e||(ne(t,"iterate",Ct),de(e))?t:Ie(e)?qe(e)?t.map(n=>Je(pe(n))):t.map(Je):t.map(pe)}function dn(e){return ne(e=j(e),"iterate",Ct),e}function Te(e,t){return Ie(e)?Je(qe(e)?pe(t):t):pe(t)}const Mi={__proto__:null,[Symbol.iterator](){return Pn(this,Symbol.iterator,e=>Te(this,e))},concat(...e){return ot(this).concat(...e.map(t=>E(t)?ot(t):t))},entries(){return Pn(this,"entries",e=>(e[1]=Te(this,e[1]),e))},every(e,t){return Fe(this,"every",e,t,void 0,arguments)},filter(e,t){return Fe(this,"filter",e,t,n=>n.map(s=>Te(this,s)),arguments)},find(e,t){return Fe(this,"find",e,t,n=>Te(this,n),arguments)},findIndex(e,t){return Fe(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Fe(this,"findLast",e,t,n=>Te(this,n),arguments)},findLastIndex(e,t){return Fe(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Fe(this,"forEach",e,t,void 0,arguments)},includes(...e){return Mn(this,"includes",e)},indexOf(...e){return Mn(this,"indexOf",e)},join(e){return ot(this).join(e)},lastIndexOf(...e){return Mn(this,"lastIndexOf",e)},map(e,t){return Fe(this,"map",e,t,void 0,arguments)},pop(){return pt(this,"pop")},push(...e){return pt(this,"push",e)},reduce(e,...t){return Os(this,"reduce",e,t)},reduceRight(e,...t){return Os(this,"reduceRight",e,t)},shift(){return pt(this,"shift")},some(e,t){return Fe(this,"some",e,t,void 0,arguments)},splice(...e){return pt(this,"splice",e)},toReversed(){return ot(this).toReversed()},toSorted(e){return ot(this).toSorted(e)},toSpliced(...e){return ot(this).toSpliced(...e)},unshift(...e){return pt(this,"unshift",e)},values(){return Pn(this,"values",e=>Te(this,e))}};function Pn(e,t,n){const s=dn(e),r=s[t],i=r.call(s);if(s!==e&&!de(e)){if(i[Symbol.toStringTag]==="Array Iterator"){const o=Object.create(Object.getPrototypeOf(i));return o.next=()=>Ts(i.next(),n),r!==pr[t]&&Object.defineProperties(o,{return:{get(){const l=i.return;return typeof l=="function"?l.bind(i):l}},throw:{get(){const l=i.throw;return typeof l=="function"?l.bind(i):l}}}),o}i._next=i.next,i.next=()=>Ts(i._next(),n)}return i}function Ts(e,t){return e.done||(e.value=t(e.value)),e}const pr=Array.prototype;function Fe(e,t,n,s,r,i){const o=dn(e),l=o!==e&&!de(e),c=o[t];if(c!==pr[t]){const p=c.apply(e,i);return l?pe(p):p}let d=n;o!==e&&(l?d=function(p,C){return n.call(this,Te(e,p),C,e)}:n.length>2&&(d=function(p,C){return n.call(this,p,C,e)}));const a=c.call(o,d,s);return l&&r?r(a):a}function Os(e,t,n,s){const r=dn(e),i=r!==e&&!de(e);let o=n,l=!1;r!==e&&(i?(l=s.length===0,o=function(d,a,p){return l&&(l=!1,d=Te(e,d)),n.call(this,d,Te(e,a),p,e)}):n.length>3&&(o=function(d,a,p){return n.call(this,d,a,p,e)}));const c=r[t](o,...s);return l?Te(e,c):c}function Mn(e,t,n){const s=j(e);ne(s,"iterate",Ct);const r=s[t](...n);return(r===-1||r===!1)&&gn(n[0])?(n[0]=j(n[0]),s[t](...n)):r}function pt(e,t,n=[]){Me(),ss();const s=j(e)[t].apply(e,n);return rs(),Re(),s}const Ri=kn("__proto__,__v_isRef,__isVue"),gr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(he));function Ii(e){he(e)||(e=String(e));const t=j(this);return ne(t,"has",e),t.hasOwnProperty(e)}class _r{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,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Sr:vr:i?xr:br).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=E(t);if(!r){let c;if(o&&(c=Mi[n]))return c;if(n==="hasOwnProperty")return Ii}const l=Reflect.get(t,n,Q(t)?t:s);if((he(n)?gr.has(n):Ri(n))||(r||ne(t,"get",n),i))return l;if(Q(l)){const c=o&&on(n)?l:l.value;return r&&H(c)?Wn(c):c}return H(l)?r?Wn(l):os(l):l}}class mr extends _r{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=E(t)&&on(n);if(!this._isShallow){const d=Ie(i);if(!de(s)&&!Ie(s)&&(i=j(i),s=j(s)),!o&&Q(i)&&!Q(s))return d||(i.value=s),!0}const l=o?Number(n)<t.length:V(t,n),c=Reflect.set(t,n,s,Q(t)?t:r);return t===j(r)&&c&&(l?ee(s,i)&&je(t,"set",n,s):je(t,"add",n,s)),c}deleteProperty(t,n){const s=V(t,n);t[n];const r=Reflect.deleteProperty(t,n);return r&&s&&je(t,"delete",n,void 0),r}has(t,n){const s=Reflect.has(t,n);return(!he(n)||!gr.has(n))&&ne(t,"has",n),s}ownKeys(t){return ne(t,"iterate",E(t)?"length":st),Reflect.ownKeys(t)}}class yr extends _r{constructor(t=!1){super(!0,t)}set(t,n){return!0}deleteProperty(t,n){return!0}}const Fi=new mr,Ni=new yr,Di=new mr(!0),ji=new yr(!0),Un=e=>e,Vt=e=>Reflect.getPrototypeOf(e);function Vi(e,t,n){return function(...s){const r=this.__v_raw,i=j(r),o=Be(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,d=r[e](...s),a=n?Un:t?Je:pe;return!t&&ne(i,"iterate",c?Kn:st),Z(Object.create(d),{next(){const{value:p,done:C}=d.next();return C?{value:p,done:C}:{value:l?[a(p[0]),a(p[1])]:a(p),done:C}}})}}function Ht(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Hi(e,t){const n={get(r){const i=this.__v_raw,o=j(i),l=j(r);e||(ee(r,l)&&ne(o,"get",r),ne(o,"get",l));const{has:c}=Vt(o),d=t?Un:e?Je:pe;if(c.call(o,r))return d(i.get(r));if(c.call(o,l))return d(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&ne(j(r),"iterate",st),r.size},has(r){const i=this.__v_raw,o=j(i),l=j(r);return e||(ee(r,l)&&ne(o,"has",r),ne(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=j(l),d=t?Un:e?Je:pe;return!e&&ne(c,"iterate",st),l.forEach((a,p)=>r.call(i,d(a),d(p),o))}};return Z(n,e?{add:Ht("add"),set:Ht("set"),delete:Ht("delete"),clear:Ht("clear")}:{add(r){const i=j(this),o=Vt(i),l=j(r),c=!t&&!de(r)&&!Ie(r)?l:r;return o.has.call(i,c)||ee(r,c)&&o.has.call(i,r)||ee(l,c)&&o.has.call(i,l)||(i.add(c),je(i,"add",c,c)),this},set(r,i){!t&&!de(i)&&!Ie(i)&&(i=j(i));const o=j(this),{has:l,get:c}=Vt(o);let d=l.call(o,r);d||(r=j(r),d=l.call(o,r));const a=c.call(o,r);return o.set(r,i),d?ee(i,a)&&je(o,"set",r,i):je(o,"add",r,i),this},delete(r){const i=j(this),{has:o,get:l}=Vt(i);let c=o.call(i,r);c||(r=j(r),c=o.call(i,r)),l&&l.call(i,r);const d=i.delete(r);return c&&je(i,"delete",r,void 0),d},clear(){const r=j(this),i=r.size!==0,o=r.clear();return i&&je(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Vi(r,e,t)}),n}function hn(e,t){const n=Hi(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_isShallow"?t:r==="__v_raw"?s:Reflect.get(V(n,r)&&r in s?n:s,r,i)}const Li={get:hn(!1,!1)},$i={get:hn(!1,!0)},Ki={get:hn(!0,!1)},Ui={get:hn(!0,!0)},br=new WeakMap,xr=new WeakMap,vr=new WeakMap,Sr=new WeakMap;function Wi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function os(e){return Ie(e)?e:pn(e,!1,Fi,Li,br)}function Bi(e){return pn(e,!1,Di,$i,xr)}function Wn(e){return pn(e,!0,Ni,Ki,vr)}function Ql(e){return pn(e,!0,ji,Ui,Sr)}function pn(e,t,n,s,r){if(!H(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const i=r.get(e);if(i)return i;const o=Wi(di(e));if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function qe(e){return Ie(e)?qe(e.__v_raw):!!(e&&e.__v_isReactive)}function Ie(e){return!!(e&&e.__v_isReadonly)}function de(e){return!!(e&&e.__v_isShallow)}function gn(e){return e?!!e.__v_raw:!1}function j(e){const t=e&&e.__v_raw;return t?j(t):e}function qi(e){return!V(e,"__v_skip")&&Object.isExtensible(e)&&nr(e,"__v_skip",!0),e}const pe=e=>H(e)?os(e):e,Je=e=>H(e)?Wn(e):e;function Q(e){return e?e.__v_isRef===!0:!1}function Gi(e){return wr(e,!1)}function Ji(e){return wr(e,!0)}function wr(e,t){return Q(e)?e:new zi(e,t)}class zi{constructor(t,n){this.dep=new an,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:j(t),this._value=n?t:pe(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||de(t)||Ie(t);t=s?t:j(t),ee(t,n)&&(this._rawValue=t,this._value=s?t:pe(t),this.dep.trigger())}}function ls(e){return Q(e)?e.value:e}function Zl(e){return R(e)?e():ls(e)}const Yi={get:(e,t,n)=>t==="__v_raw"?e:ls(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return Q(r)&&!Q(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Cr(e){return qe(e)?e:new Proxy(e,Yi)}class Xi{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new an,{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 Qi(e){return new Xi(e)}class Zi{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=he(n)?n:String(n),this._raw=j(t);let r=!0,i=t;if(!E(t)||he(this._key)||!on(this._key))do r=!gn(i)||de(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=ls(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Q(this._raw[this._key])){const n=this._object[this._key];if(Q(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return Pi(this._raw,this._key)}}class ki{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 kl(e,t,n){return Q(e)?e:R(e)?new ki(e):H(e)&&arguments.length>1?eo(e,t,n):Gi(e)}function eo(e,t,n){return new Zi(e,t,n)}class to{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new an(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=wt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&W!==this)return fr(this,!0),!0}get value(){const t=this.dep.track();return ar(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function no(e,t,n=!1){let s,r;return R(e)?s=e:(s=e.get,r=e.set),new to(s,r,n)}const Lt={},Gt=new WeakMap;let ke;function so(e,t=!1,n=ke){if(n){let s=Gt.get(n);s||Gt.set(n,s=[]),s.push(e)}}function ro(e,t,n=N){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,d=P=>r?P:de(P)||r===!1||r===0?Ve(P,1):Ve(P);let a,p,C,w,I=!1,A=!1;if(Q(e)?(p=()=>e.value,I=de(e)):qe(e)?(p=()=>d(e),I=!0):E(e)?(A=!0,I=e.some(P=>qe(P)||de(P)),p=()=>e.map(P=>{if(Q(P))return P.value;if(qe(P))return d(P);if(R(P))return c?c(P,2):P()})):R(e)?t?p=c?()=>c(e,2):e:p=()=>{if(C){Me();try{C()}finally{Re()}}const P=ke;ke=a;try{return c?c(e,3,[w]):e(w)}finally{ke=P}}:p=Ae,t&&r){const P=p,Y=r===!0?1/0:r;p=()=>Ve(P(),Y)}const q=Oi(),B=()=>{a.stop(),q&&q.active&&es(q.effects,a)};if(i&&t){const P=t;t=(...Y)=>{try{return P(...Y)}finally{B()}}}let D=A?new Array(e.length).fill(Lt):Lt;const L=P=>{if(!(!(a.flags&1)||!a.dirty&&!P))if(t){const Y=a.run();if(P||r||I||(A?Y.some((Ke,xe)=>ee(Ke,D[xe])):ee(Y,D))){const Ke=ke;Me();try{C&&C(),ke=a;const xe=[Y,D===Lt?void 0:A&&D[0]===Lt?[]:D,w];D=Y,c?c(t,3,xe):t(...xe)}finally{ke=Ke,Re()}}}else a.run()};return l&&l(L),a=new or(p),a.scheduler=o?()=>o(L,!1):L,w=P=>so(P,!1,a),C=a.onStop=()=>{const P=Gt.get(a);if(P){if(c)c(P,4);else for(const Y of P)Y();Gt.delete(a)}},t?s?L(!0):D=a.run():o?o(L.bind(null,!0),!0):a.run(),B.pause=a.pause.bind(a),B.resume=a.resume.bind(a),B.stop=B,B}function Ve(e,t=1/0,n){if(t<=0||!H(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Q(e))Ve(e.value,t,n);else if(E(e))for(let s=0;s<e.length;s++)Ve(e[s],t,n);else if(it(e)||Be(e))e.forEach(s=>{Ve(s,t,n)});else if(tr(e)){for(const s in e)Ve(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Ve(e[s],t,n)}return e}/**
10
+ * @vue/runtime-core v3.5.44
11
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
12
+ * @license MIT
13
+ **/function Mt(e,t,n,s){try{return s?e(...s):e()}catch(r){_n(r,t,n)}}function be(e,t,n,s){if(R(e)){const r=Mt(e,t,n,s);return r&&ks(r)&&r.catch(i=>{_n(i,t,n)}),r}if(E(e)){const r=[];for(let i=0;i<e.length;i++)r.push(be(e[i],t,n,s));return r}}function _n(e,t,n,s=!0){const r=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:o}=t&&t.appContext.config||N;if(t){let l=t.parent;const c=t.proxy,d=`https://vuejs.org/error-reference/#runtime-${n}`;for(;l;){const a=l.ec;if(a){for(let p=0;p<a.length;p++)if(a[p](e,c,d)===!1)return}l=l.parent}if(i){Me(),Mt(i,null,10,[e,c,d]),Re();return}}io(e,n,r,s,o)}function io(e,t,n,s=!0,r=!1){if(r)throw e;console.error(e)}const le=[];let me=-1;const Oe=[];let We=null,lt=0;const Tr=Promise.resolve();let Jt=null;function Or(e){const t=Jt||Tr;return e?t.then(this?e.bind(this):e):t}function oo(e){let t=me+1,n=le.length;for(;t<n;){const s=t+n>>>1,r=le[s],i=Tt(r);i<e||i===e&&r.flags&2?t=s+1:n=s}return t}function fs(e){if(!(e.flags&1)){const t=Tt(e),n=le[le.length-1];!n||!(e.flags&2)&&t>=Tt(n)?le.push(e):le.splice(oo(t),0,e),e.flags|=1,Er()}}function Er(){Jt||(Jt=Tr.then(Mr))}function lo(e){if(!E(e))We&&e.id===-1?We.splice(lt+1,0,e):e.flags&1||(Oe.push(e),e.flags|=1);else for(let t=0;t<e.length;t++)Oe.push(e[t]);Er()}function Ar(e,t,n,s=me+1){for(;s<le.length;s++){const r=le[s];if(r&&r.flags&2){if(e&&r.id!==e.uid||t!==void 0&&!(r.id>=t))continue;le.splice(s,1),s=e?s-1:me,r.flags&4&&(r.flags&=-2),r(),r.flags&4||(r.flags&=-2)}}}function Pr(e,t,n=0){if(Oe.length){let s=Oe,r=0;if(t){s=[];for(let o=0;o<Oe.length;o++){const l=Oe[o];(l.i!==void 0?!l.i||l.i.uid<n:t.has(l))?Oe[r++]=l:s.push(l)}}const i=[...new Set(s)].sort((o,l)=>Tt(o)-Tt(l));if(Oe.length=r,We){for(let o=0;o<i.length;o++)We.push(i[o]);return}for(We=i,lt=0;lt<We.length;lt++){const o=We[lt];o.flags&4&&(o.flags&=-2),o.flags&8||o(),o.flags&=-2}We=null,lt=0}}let Rn=!1;function fo(e,t){if(Rn){e();return}const n=t===void 0?void 0:new Set(Oe);e(),Rn=!0;try{Ar(void 0,t),Pr(void 0,n,t)}finally{Rn=!1}}const Tt=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Mr(e){try{for(me=0;me<le.length;me++){const t=le[me];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Mt(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;me<le.length;me++){const t=le[me];t&&(t.flags&=-2)}me=-1,le.length=0,Pr(),Jt=null,(le.length||Oe.length)&&Mr()}}let te=null,Rr=null;function zt(e){const t=te;return te=e,Rr=e&&e.type.__scopeId||null,t}function co(e,t=te,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Vs(-1);const i=zt(t),o=He.length;let l;try{l=e(...r)}finally{for(let c=He.length;c>o;c--)ds();zt(i),s._d&&Vs(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function ef(e,t){if(te===null)return e;const n=Cn(te),s=e.dirs||(e.dirs=[]);for(let r=0;r<t.length;r++){let[i,o,l,c=N]=t[r];i&&(R(i)&&(i={mounted:i,updated:i}),i.deep&&Ve(o),s.push({dir:i,instance:n,value:o,oldValue:void 0,arg:l,modifiers:c}))}return e}function Qe(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;o<r.length;o++){const l=r[o];i&&(l.oldValue=i[o].value);let c=l.dir[s];c&&(Me(),be(c,n,8,[e.el,l,e,t]),Re())}}function uo(e,t){if(se){let n=se.provides;const s=se.parent&&se.parent.provides;s===n&&(n=se.provides=Object.create(s)),n[e]=t}}function Wt(e,t,n=!1){const s=wn();if(s||rt){let r=rt?rt._context.provides:s?s.parent==null||s.ce?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:void 0;if(r&&e in r)return r[e];if(arguments.length>1)return n&&R(t)?t.call(s&&s.proxy):t}}function tf(){return!!(wn()||rt)}const ao=Symbol.for("v-scx"),ho=()=>Wt(ao);function nf(e,t){return mn(e,null,t)}function po(e,t){return mn(e,null,{flush:"sync"})}function In(e,t,n){return mn(e,t,n)}function mn(e,t,n=N){const{immediate:s,deep:r,flush:i,once:o}=n,l=Z({},n),c=t&&s||!t&&i!=="post";let d;if(At){if(i==="sync"){const w=ho();d=w.__watcherHandles||(w.__watcherHandles=[])}else if(!c){const w=()=>{};return w.stop=Ae,w.resume=Ae,w.pause=Ae,w}}const a=se;l.call=(w,I,A)=>be(w,a,I,A);let p=!1;i==="post"?l.scheduler=w=>{w.i=a,fe(w,a&&a.suspense)}:i!=="sync"&&(p=!0,l.scheduler=(w,I)=>{I?w():fs(w)}),l.augmentJob=w=>{t&&(w.flags|=4),p&&(w.flags|=2,a&&(w.id=a.uid,w.i=a))};const C=ro(e,t,l);return At&&(d?d.push(C):c&&C()),C}function go(e,t,n){const s=this.proxy,r=J(e)?e.includes(".")?Ir(s,e):()=>s[e]:e.bind(s,s);let i;R(t)?i=t:(i=t.handler,n=t);const o=Rt(this),l=mn(r,i.bind(s),n);return o(),l}function Ir(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r<n.length&&s;r++)s=s[n[r]];return s}}const _o=Symbol("_vte"),yn=e=>e.__isTeleport,Fn=Symbol("_leaveCb");function mo(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ge){t=n;break}}return t}function Fr(e){if(!cs(e))return yn(e.type)&&e.children?mo(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&R(n.default))return n.default()}}function Yt(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const n=e.component.subTree;Yt(yn(n.type)&&Fr(n)||n,t)}else if(e.shapeFlag&128)e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback);else if(e.transition=t,e.type===ce&&E(e.children)){const n=Br(e.children,!1);n&&Yt(n,t)}}function Bn(e){if(e.component)return Bn(e.component.subTree);if(e.type===ce){const t=E(e.children)&&Br(e.children,!1);return t?Bn(t):void 0}if(e.type!==ge)return e}function sf(e,t){return R(e)?Z({name:e.name},t,{setup:e}):e}function Nr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function rf(e){const t=wn(),n=Ji(null);if(t){const r=t.refs===N?t.refs={}:t.refs;Object.defineProperty(r,e,{enumerable:!0,get:()=>n.value,set:i=>n.value=i})}return n}function Es(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const Xt=new WeakMap;function vt(e,t,n,s,r=!1){if(E(e)){e.forEach((A,q)=>vt(A,t&&(E(t)?t[q]:t),n,s,r));return}if(ft(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&vt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Cn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,d=t&&t.r,a=l.refs===N?l.refs={}:l.refs,p=l.setupState,C=j(p),w=p===N?Zs:A=>Es(a,A)?!1:V(C,A),I=(A,q)=>!(q&&Es(a,q));if(d!=null&&d!==c){if(As(t),J(d))a[d]=null,w(d)&&(p[d]=null);else if(Q(d)){const A=t;I(d,A.k)&&(d.value=null),A.k&&(a[A.k]=null)}}if(R(c))Mt(c,l,12,[o,a]);else{const A=J(c),q=Q(c);if(A||q){const B=()=>{if(e.f){const D=A?w(c)?p[c]:a[c]:I()||!e.k?c.value:a[e.k];if(r)E(D)&&es(D,i);else if(E(D))D.includes(i)||D.push(i);else if(A)a[c]=[i],w(c)&&(p[c]=a[c]);else{const L=[i];I(c,e.k)&&(c.value=L),e.k&&(a[e.k]=L)}}else A?(a[c]=o,w(c)&&(p[c]=o)):q&&(I(c,e.k)&&(c.value=o),e.k&&(a[e.k]=o))};if(o){const D=()=>{B(),Xt.delete(e)};D.id=-1,Xt.set(e,D),fe(D,n)}else As(e),B()}}}function As(e){const t=Xt.get(e);t&&(t.flags|=8,Xt.delete(e))}un().requestIdleCallback;un().cancelIdleCallback;const ft=e=>!!e.type.__asyncLoader,cs=e=>e.type.__isKeepAlive;function yo(e,t){Dr(e,"a",t)}function bo(e,t){Dr(e,"da",t)}function Dr(e,t,n=se){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(bn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)cs(r.parent.vnode)&&xo(s,t,n,r),r=r.parent}}function xo(e,t,n,s){const r=bn(t,e,s,!0);jr(()=>{es(s[t],r)},n)}function bn(e,t,n=se,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Me();const l=Rt(n),c=be(t,n,e,o);return l(),Re(),c});return s?r.unshift(i):r.push(i),i}}const $e=e=>(t,n=se)=>{(!At||e==="sp")&&bn(e,(...s)=>t(...s),n)},vo=$e("bm"),So=$e("m"),wo=$e("bu"),Co=$e("u"),To=$e("bum"),jr=$e("um"),Oo=$e("sp"),Eo=$e("rtg"),Ao=$e("rtc");function Po(e,t=se){bn("ec",e,t)}const Mo="components",Vr=Symbol.for("v-ndc");function of(e){return J(e)?Ro(Mo,e,!1)||e:e||Vr}function Ro(e,t,n=!0,s=!1){const r=te||se;if(r){const i=r.type;{const l=pl(i,!1);if(l&&(l===t||l===re(t)||l===fn(re(t))))return i}const o=Ps(r[e]||i[e],t)||Ps(r.appContext[e],t);return!o&&s?i:o}}function Ps(e,t){return e&&(e[t]||e[re(t)]||e[fn(re(t))])}function lf(e,t,n,s){let r;const i=n,o=E(e);if(o||J(e)){const l=o&&qe(e);let c=!1,d=!1;l&&(c=!de(e),d=Ie(e),e=dn(e)),r=new Array(e.length);for(let a=0,p=e.length;a<p;a++)r[a]=t(c?d?Je(pe(e[a])):pe(e[a]):e[a],a,void 0,i)}else if(typeof e=="number")if(!Number.isInteger(e)||e<0)r=[];else{r=new Array(e);for(let l=0;l<e;l++)r[l]=t(l+1,l,void 0,i)}else if(H(e))if(e[Symbol.iterator])r=Array.from(e,(l,c)=>t(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,d=l.length;c<d;c++){const a=l[c];r[c]=t(e[a],a,c,i)}}else r=[];return r}function ff(e,t,n,s,r,i){if(n==null&&(n={}),te.ce||te.parent&&ft(te.parent)&&te.parent.ce){const d=n,a=Object.keys(d).length>0;return t!=="default"&&(d.name=t),Xn(),Qn(ce,null,[Pe("slot",d,s)],a?-2:64)}let o=e[t];o&&o._c&&(o._d=!1);const l=He.length;Xn();let c;try{const d=o&&Hr(o(n)),a=n.key||i||d&&d.key;c=Qn(ce,{key:(a&&!he(a)?a:`_${t}`)+(!d&&s?"_fb":"")},d||(s?s():[]),d&&e._===1?64:-2)}catch(d){for(let a=He.length;a>l;a--)ds();throw d}finally{o&&o._c&&(o._d=!0)}return c}function Hr(e){return e.some(t=>Sn(t)?!(t.type===ge||t.type===ce&&!Hr(t.children)):!0)?e:null}const qn=e=>e?li(e)?Cn(e):qn(e.parent):null,St=Z(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=>qn(e.parent),$root:e=>qn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>$r(e),$forceUpdate:e=>e.f||(e.f=()=>{fs(e.update)}),$nextTick:e=>e.n||(e.n=Or.bind(e.proxy)),$watch:e=>go.bind(e)}),Nn=(e,t)=>e!==N&&!e.__isScriptSetup&&V(e,t),Io={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;if(t[0]!=="$"){const C=o[t];if(C!==void 0)switch(C){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Nn(s,t))return o[t]=1,s[t];if(r!==N&&V(r,t))return o[t]=2,r[t];if(V(i,t))return o[t]=3,i[t];if(n!==N&&V(n,t))return o[t]=4,n[t];Gn&&(o[t]=0)}}const d=St[t];let a,p;if(d)return t==="$attrs"&&ne(e.attrs,"get",""),d(e);if((a=l.__cssModules)&&(a=a[t]))return a;if(n!==N&&V(n,t))return o[t]=4,n[t];if(p=c.config.globalProperties,V(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Nn(r,t)?(r[t]=n,!0):s!==N&&V(s,t)?(s[t]=n,!0):V(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let c;return!!(n[l]||e!==N&&l[0]!=="$"&&V(e,l)||Nn(t,l)||V(i,l)||V(s,l)||V(St,l)||V(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:V(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Qt(e){return E(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function cf(e,t){return!e||!t?e||t:E(e)&&E(t)?e.concat(t):Z({},Qt(e),Qt(t))}let Gn=!0;function Fo(e){const t=$r(e),n=e.proxy,s=e.ctx;Gn=!1,t.beforeCreate&&Ms(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:d,created:a,beforeMount:p,mounted:C,beforeUpdate:w,updated:I,activated:A,deactivated:q,beforeDestroy:B,beforeUnmount:D,destroyed:L,unmounted:P,render:Y,renderTracked:Ke,renderTriggered:xe,errorCaptured:Ue,serverPrefetch:It,expose:ze,inheritAttrs:ut,components:Ft,directives:Nt,filters:Tn}=t;if(d&&No(d,s,null),o)for(const G in o){const U=o[G];R(U)&&(s[G]=U.bind(n))}if(r){const G=r.call(n,n);H(G)&&(e.data=os(G))}if(Gn=!0,i)for(const G in i){const U=i[G],Ye=R(U)?U.bind(n,n):R(U.get)?U.get.bind(n,n):Ae,Dt=!R(U)&&R(U.set)?U.set.bind(n):Ae,Xe=_l({get:Ye,set:Dt});Object.defineProperty(s,G,{enumerable:!0,configurable:!0,get:()=>Xe.value,set:_e=>Xe.value=_e})}if(l)for(const G in l)Lr(l[G],s,n,G);if(c){const G=R(c)?c.call(n):c;Reflect.ownKeys(G).forEach(U=>{uo(U,G[U])})}a&&Ms(a,e,"c");function ie(G,U){E(U)?U.forEach(Ye=>G(Ye.bind(n))):U&&G(U.bind(n))}if(ie(vo,p),ie(So,C),ie(wo,w),ie(Co,I),ie(yo,A),ie(bo,q),ie(Po,Ue),ie(Ao,Ke),ie(Eo,xe),ie(To,D),ie(jr,P),ie(Oo,It),E(ze))if(ze.length){const G=e.exposed||(e.exposed={});ze.forEach(U=>{Object.defineProperty(G,U,{get:()=>n[U],set:Ye=>n[U]=Ye,enumerable:!0})})}else e.exposed||(e.exposed={});Y&&e.render===Ae&&(e.render=Y),ut!=null&&(e.inheritAttrs=ut),Ft&&(e.components=Ft),Nt&&(e.directives=Nt),It&&Nr(e)}function No(e,t,n=Ae){E(e)&&(e=Jn(e));for(const s in e){const r=e[s];let i;H(r)?"default"in r?i=Wt(r.from||s,r.default,!0):i=Wt(r.from||s):i=Wt(r),Q(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ms(e,t,n){be(E(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Lr(e,t,n,s){let r=s.includes(".")?Ir(n,s):()=>n[s];if(J(e)){const i=t[e];R(i)&&In(r,i)}else if(R(e))In(r,e.bind(n));else if(H(e))if(E(e))e.forEach(i=>Lr(i,t,n,s));else{const i=R(e.handler)?e.handler.bind(n):t[e.handler];R(i)&&In(r,i,e)}}function $r(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(d=>Zt(c,d,o,!0)),Zt(c,t,o)),H(t)&&i.set(t,c),c}function Zt(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Zt(e,i,n,!0),r&&r.forEach(o=>Zt(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Do[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Do={data:Rs,props:Is,emits:Is,methods:_t,computed:_t,beforeCreate:oe,created:oe,beforeMount:oe,mounted:oe,beforeUpdate:oe,updated:oe,beforeDestroy:oe,beforeUnmount:oe,destroyed:oe,unmounted:oe,activated:oe,deactivated:oe,errorCaptured:oe,serverPrefetch:oe,components:_t,directives:_t,watch:Vo,provide:Rs,inject:jo};function Rs(e,t){return t?e?function(){return Z(R(e)?e.call(this,this):e,R(t)?t.call(this,this):t)}:t:e}function jo(e,t){return _t(Jn(e),Jn(t))}function Jn(e){if(E(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function oe(e,t){return e?[...new Set([].concat(e,t))]:t}function _t(e,t){return e?Z(Object.create(null),e,t):t}function Is(e,t){return e?E(e)&&E(t)?[...new Set([...e,...t])]:Z(Object.create(null),Qt(e),Qt(t??{})):t}function Vo(e,t){if(!e)return t;if(!t)return e;const n=Z(Object.create(null),e);for(const s in t)n[s]=oe(e[s],t[s]);return n}function Kr(){return{app:null,config:{isNativeTag:Zs,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Ho=0;function Lo(e,t){return function(s,r=null){R(s)||(s=Z({},s)),r!=null&&!H(r)&&(r=null);const i=Kr(),o=new WeakSet,l=[];let c=!1;const d=i.app={_uid:Ho++,_component:s,_props:r,_container:null,_context:i,_instance:null,version:ml,get config(){return i.config},set config(a){},use(a,...p){return o.has(a)||(a&&R(a.install)?(o.add(a),a.install(d,...p)):R(a)&&(o.add(a),a(d,...p))),d},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),d},component(a,p){return p?(i.components[a]=p,d):i.components[a]},directive(a,p){return p?(i.directives[a]=p,d):i.directives[a]},mount(a,p,C){if(!c){const w=d._ceVNode||Pe(s,r);return w.appContext=i,C===!0?C="svg":C===!1&&(C=void 0),e(w,a,C),c=!0,d._container=a,a.__vue_app__=d,Cn(w.component)}},onUnmount(a){l.push(a)},unmount(){c&&(be(l,d._instance,16),e(null,d._container),delete d._container.__vue_app__)},provide(a,p){return i.provides[a]=p,d},runWithContext(a){const p=rt;rt=d;try{return a()}finally{rt=p}}};return d}}let rt=null;function uf(e,t,n=N){const s=wn(),r=re(t),i=Le(t),o=Ur(e,r),l=Qi((c,d)=>{let a,p=N,C;return po(()=>{const w=e[r];ee(a,w)&&(a=w,d())}),{get(){return c(),n.get?n.get(a):a},set(w){const I=n.set?n.set(w):w;if(!ee(I,a)&&!(p!==N&&ee(w,p)))return;const A=s.vnode.props,q=!!(A&&(t in A||r in A||i in A)&&(`onUpdate:${t}`in A||`onUpdate:${r}`in A||`onUpdate:${i}`in A));q||(a=w,d()),s.emit(`update:${t}`,I),ee(w,p)&&(ee(w,I)&&!ee(I,C)||q&&p!==N&&!ee(I,a))&&d(),p=w,C=I}}});return l[Symbol.iterator]=()=>{let c=0;return{next(){return c<2?{value:c++?o||N:l,done:!1}:{done:!0}}}},l}const Ur=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${re(t)}Modifiers`]||e[`${Le(t)}Modifiers`];function $o(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||N;let r=n;const i=t.startsWith("update:"),o=i&&Ur(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>J(a)?a.trim():a)),o.number&&(r=r.map(cn)));let l,c=s[l=On(t)]||s[l=On(re(t))];!c&&i&&(c=s[l=On(Le(t))]),c&&be(c,e,6,r);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,be(d,e,6,r)}}const Ko=new WeakMap;function Wr(e,t,n=!1){const s=n?Ko:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!R(e)){const c=d=>{const a=Wr(d,t,!0);a&&(l=!0,Z(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(H(e)&&s.set(e,null),null):(E(i)?i.forEach(c=>o[c]=null):Z(o,i),H(e)&&s.set(e,o),o)}function xn(e,t){return!e||!sn(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),V(e,t[0].toLowerCase()+t.slice(1))||V(e,Le(t))||V(e,t))}function Fs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:d,renderCache:a,props:p,data:C,setupState:w,ctx:I,inheritAttrs:A}=e,q=zt(e);let B,D;try{if(n.shapeFlag&4){const P=r||s,Y=P;B=Ee(d.call(Y,P,a,p,w,C,I)),D=l}else{const P=t;B=Ee(P.length>1?P(p,{attrs:l,slots:o,emit:c}):P(p,null)),D=t.props?l:Uo(l)}}catch(P){He.length=0,_n(P,e,1),B=Pe(ge)}let L=B;if(D&&A!==!1){const P=Object.keys(D),{shapeFlag:Y}=L;P.length&&Y&7&&(i&&P.some(rn)&&(D=Wo(D,i)),L=ct(L,D,!1,!0))}if(n.dirs&&(L=ct(L,null,!1,!0),L.dirs=L.dirs?L.dirs.concat(n.dirs):n.dirs),n.transition){const P=yn(L.type)&&Fr(L)||L;Yt(P,n.transition)}return B=L,zt(q),B}function Br(e,t=!0){let n;for(let s=0;s<e.length;s++){const r=e[s];if(Sn(r)){if(r.type!==ge||r.children==="v-if"){if(n)return;n=r}}else return}return n}const Uo=e=>{let t;for(const n in e)(n==="class"||n==="style"||sn(n))&&((t||(t={}))[n]=e[n]);return t},Wo=(e,t)=>{const n={};for(const s in e)(!rn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Bo(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,d=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Ns(s,o,d):!!o;if(c&8){const a=t.dynamicProps;for(let p=0;p<a.length;p++){const C=a[p];if(qr(o,s,C)&&!xn(d,C))return!0}}}else return(r||l)&&(!l||!l.$stable)?!0:s===o?!1:s?o?Ns(s,o,d):!0:!!o;return!1}function Ns(e,t,n){const s=Object.keys(t);if(s.length!==Object.keys(e).length)return!0;for(let r=0;r<s.length;r++){const i=s[r];if(!V(e,i)||qr(t,e,i)&&!xn(n,i))return!0}return!1}function qr(e,t,n){const s=e[n],r=t[n];return n==="style"&&H(s)&&H(r)?!Ge(s,r):s!==r}function qo({vnode:e,parent:t,suspense:n},s){for(;t;){const r=t.subTree;if(r.suspense&&r.suspense.activeBranch===e&&(r.suspense.vnode.el=r.el=s,e=r),r===e)(e=t.vnode).el=s,t=t.parent;else break}n&&n.activeBranch===e&&(n.vnode.el=s)}const Gr={},Jr=()=>Object.create(Gr),zr=e=>Object.getPrototypeOf(e)===Gr;function Go(e,t,n,s=!1){const r={},i=Jr();e.propsDefaults=Object.create(null),Yr(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Bi(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Jo(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=j(r),[c]=e.propsOptions;let d=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let p=0;p<a.length;p++){let C=a[p];if(xn(e.emitsOptions,C))continue;const w=t[C];if(c)if(V(i,C))w!==i[C]&&(i[C]=w,d=!0);else{const I=re(C);r[I]=zn(c,l,I,w,e,!1)}else w!==i[C]&&(i[C]=w,d=!0)}}}else{Yr(e,t,r,i)&&(d=!0);let a;for(const p in l)(!t||!V(t,p)&&((a=Le(p))===p||!V(t,a)))&&(c?n&&(n[p]!==void 0||n[a]!==void 0)&&(r[p]=zn(c,l,p,void 0,e,!0)):delete r[p]);if(i!==l)for(const p in i)(!t||!V(t,p))&&(delete i[p],d=!0)}d&&je(e.attrs,"set","")}function Yr(e,t,n,s){const[r,i]=e.propsOptions;let o=!1,l;if(t)for(let c in t){if(yt(c))continue;const d=t[c];let a;r&&V(r,a=re(c))?!i||!i.includes(a)?n[a]=d:(l||(l={}))[a]=d:xn(e.emitsOptions,c)||(!(c in s)||d!==s[c])&&(s[c]=d,o=!0)}if(i){const c=j(n),d=l||N;for(let a=0;a<i.length;a++){const p=i[a];n[p]=zn(r,c,p,d[p],e,!V(d,p))}}return o}function zn(e,t,n,s,r,i){const o=e[n];if(o!=null){const l=V(o,"default");if(l&&s===void 0){const c=o.default;if(o.type!==Function&&!o.skipFactory&&R(c)){const{propsDefaults:d}=r;if(n in d)s=d[n];else{const a=Rt(r);s=d[n]=c.call(null,t),a()}}else s=c;r.ce&&r.ce._setProp(n,s)}o[0]&&(i&&!l?s=!1:o[1]&&(s===""||s===Le(n))&&(s=!0))}return s}const zo=new WeakMap;function Xr(e,t,n=!1){const s=n?zo:t.propsCache,r=s.get(e);if(r)return r;const i=e.props,o={},l=[];let c=!1;if(!R(e)){const a=p=>{c=!0;const[C,w]=Xr(p,t,!0);Z(o,C),w&&l.push(...w)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return H(e)&&s.set(e,tt),tt;if(E(i))for(let a=0;a<i.length;a++){const p=re(i[a]);Ds(p)&&(o[p]=N)}else if(i)for(const a in i){const p=re(a);if(Ds(p)){const C=i[a],w=o[p]=E(C)||R(C)?{type:C}:Z({},C),I=w.type;let A=!1,q=!0;if(E(I))for(let B=0;B<I.length;++B){const D=I[B],L=R(D)&&D.name;if(L==="Boolean"){A=!0;break}else L==="String"&&(q=!1)}else A=R(I)&&I.name==="Boolean";w[0]=A,w[1]=q,(A||V(w,"default"))&&l.push(p)}}const d=[o,l];return H(e)&&s.set(e,d),d}function Ds(e){return e[0]!=="$"&&!yt(e)}const us=e=>e==="_"||e==="_ctx"||e==="$stable",as=e=>E(e)?e.map(Ee):[Ee(e)],Yo=(e,t,n)=>{if(t._n)return t;const s=co((...r)=>as(t(...r)),n);return s._c=!1,s},Qr=(e,t,n)=>{const s=e._ctx;for(const r in e){if(us(r))continue;const i=e[r];if(R(i))t[r]=Yo(r,i,s);else if(i!=null){const o=as(i);t[r]=()=>o}}},Zr=(e,t)=>{const n=as(t);e.slots.default=()=>n},kr=(e,t,n)=>{for(const s in t)(n||!us(s))&&(e[s]=t[s])},Xo=(e,t,n)=>{const s=e.slots=Jr();if(e.vnode.shapeFlag&32){const r=t._;r?(kr(s,t,n),n&&nr(s,"_",r,!0)):Qr(t,s)}else t&&Zr(e,t)},Qo=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=N;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:kr(r,t,n):(i=!t.$stable,Qr(t,r)),o=t}else t&&(Zr(e,t),o={default:1});if(i)for(const l in r)!us(l)&&o[l]==null&&delete r[l]},fe=nl;function Zo(e){return ko(e)}function ko(e,t){const n=un();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:d,setElementText:a,parentNode:p,nextSibling:C,setScopeId:w=Ae,insertStaticContent:I}=e,A=(f,u,h,y=null,_=null,m=null,v=void 0,x=null,b=!!u.dynamicChildren)=>{if(f===u)return;f&&!gt(f,u)&&(y=jt(f),_e(f,_,m,!0),f=null),u.patchFlag===-2&&(b=!1,u.dynamicChildren=null),u.dynamicChildren&&f&&f.dynamicChildren&&f.dynamicChildren.hasOnce&&(u.dynamicChildren===tt&&(u.dynamicChildren=[]),u.dynamicChildren.hasOnce=!0);const{type:g,ref:T,shapeFlag:S}=u;switch(g){case vn:q(f,u,h,y);break;case ge:B(f,u,h,y);break;case jn:f==null&&D(u,h,y,v);break;case ce:Ft(f,u,h,y,_,m,v,x,b);break;default:S&1?Y(f,u,h,y,_,m,v,x,b):S&6?Nt(f,u,h,y,_,m,v,x,b):(S&64||S&128)&&g.process(f,u,h,y,_,m,v,x,b,dt)}T!=null&&_?vt(T,f&&f.ref,m,u||f,!u):T==null&&f&&f.ref!=null&&vt(f.ref,null,m,f,!0)},q=(f,u,h,y)=>{if(f==null)s(u.el=l(u.children),h,y);else{const _=u.el=f.el;u.children!==f.children&&d(_,u.children)}},B=(f,u,h,y)=>{f==null?s(u.el=c(u.children||""),h,y):u.el=f.el},D=(f,u,h,y)=>{[f.el,f.anchor]=I(f.children,u,h,y,f.el,f.anchor)},L=({el:f,anchor:u},h,y)=>{let _;for(;f&&f!==u;)_=C(f),s(f,h,y),f=_;s(u,h,y)},P=({el:f,anchor:u})=>{let h;for(;f&&f!==u;)h=C(f),r(f),f=h;r(u)},Y=(f,u,h,y,_,m,v,x,b)=>{if(u.type==="svg"?v="svg":u.type==="math"&&(v="mathml"),f==null)Ke(u,h,y,_,m,v,x,b);else{const g=f.el&&f.el._isVueCE?f.el:null;try{g&&g._beginPatch(),It(f,u,_,m,v,x,b)}finally{g&&g._endPatch()}}},Ke=(f,u,h,y,_,m,v,x)=>{let b,g;const{props:T,shapeFlag:S,transition:O,dirs:M}=f;if(b=f.el=o(f.type,m,T&&T.is,T),S&8?a(b,f.children):S&16&&Ue(f.children,b,null,y,_,Dn(f,m),v,x),M&&Qe(f,null,y,"created"),xe(b,f,f.scopeId,v,y),T){for(const K in T)K!=="value"&&!yt(K)&&i(b,K,null,T[K],m,y);"value"in T&&i(b,"value",null,T.value,m),(g=T.onVnodeBeforeMount)&&Ce(g,y,f)}M&&Qe(f,null,y,"beforeMount");const F=el(_,O);F&&O.beforeEnter(b),s(b,u,h),((g=T&&T.onVnodeMounted)||F||M)&&fe(()=>{try{g&&Ce(g,y,f),F&&O.enter(b),M&&Qe(f,null,y,"mounted")}finally{}},_)},xe=(f,u,h,y,_)=>{if(h&&w(f,h),y)for(let m=0;m<y.length;m++)w(f,y[m]);if(_){let m=_.subTree;if(u===m||ni(m.type)&&(m.ssContent===u||m.ssFallback===u)){const v=_.vnode;xe(f,v,v.scopeId,v.slotScopeIds,_.parent)}}},Ue=(f,u,h,y,_,m,v,x,b=0)=>{for(let g=b;g<f.length;g++){const T=f[g]=x?De(f[g]):Ee(f[g]);A(null,T,u,h,y,_,m,v,x)}},It=(f,u,h,y,_,m,v)=>{const x=u.el=f.el;let{patchFlag:b,dynamicChildren:g,dirs:T}=u;b|=f.patchFlag&16;const S=f.props||N,O=u.props||N;let M;if(h&&Ze(h,!1),(M=O.onVnodeBeforeUpdate)&&Ce(M,h,u,f),T&&Qe(u,f,h,"beforeUpdate"),h&&Ze(h,!0),g&&(!f.dynamicChildren||f.dynamicChildren.length!==g.length)&&(b=0,v=!1,g=null),(S.innerHTML&&O.innerHTML==null||S.textContent&&O.textContent==null)&&a(x,""),g?ze(f.dynamicChildren,g,x,h,y,Dn(u,_),m):v||U(f,u,x,null,h,y,Dn(u,_),m,!1),b>0){if(b&16)ut(x,S,O,h,_);else if(b&2&&S.class!==O.class&&i(x,"class",null,O.class,_),b&4&&i(x,"style",S.style,O.style,_),b&8){const F=u.dynamicProps;for(let K=0;K<F.length;K++){const $=F[K],z=S[$],k=O[$];(k!==z||$==="value")&&i(x,$,z,k,_,h)}}b&1&&f.children!==u.children&&a(x,u.children)}else!v&&g==null&&ut(x,S,O,h,_);((M=O.onVnodeUpdated)||T)&&fe(()=>{M&&Ce(M,h,u,f),T&&Qe(u,f,h,"updated")},y)},ze=(f,u,h,y,_,m,v)=>{for(let x=0;x<u.length;x++){const b=f[x],g=u[x],T=b.el||Yn(b),S=T&&(b.type===ce||!gt(b,g)||b.shapeFlag&198)?p(T):h;A(b,g,S,null,y,_,m,v,!0)}},ut=(f,u,h,y,_)=>{if(u!==h){if(u!==N)for(const m in u)!yt(m)&&!(m in h)&&i(f,m,u[m],null,_,y);for(const m in h){if(yt(m))continue;const v=h[m],x=u[m];v!==x&&m!=="value"&&i(f,m,x,v,_,y)}"value"in h&&i(f,"value",u.value,h.value,_)}},Ft=(f,u,h,y,_,m,v,x,b)=>{const g=u.el=f?f.el:l(""),T=u.anchor=f?f.anchor:l("");let{patchFlag:S,dynamicChildren:O,slotScopeIds:M}=u;M&&(x=x?x.concat(M):M),f==null?(s(g,h,y),s(T,h,y),Ue(u.children||[],h,T,_,m,v,x,b)):S>0&&S&64&&O&&f.dynamicChildren&&f.dynamicChildren.length===O.length?(ze(f.dynamicChildren,O,h,_,m,v,x),(u.key!=null||_&&u===_.subTree)&&ei(f,u,!0)):U(f,u,h,T,_,m,v,x,b)},Nt=(f,u,h,y,_,m,v,x,b)=>{u.slotScopeIds=x,f==null?u.shapeFlag&512?_.ctx.activate(u,h,y,v,b):Tn(u,h,y,_,m,v,b):hs(f,u,b)},Tn=(f,u,h,y,_,m,v)=>{const x=f.component=cl(f,y,_);if(cs(f)&&(x.ctx.renderer=dt),ul(x,!1,v),x.asyncDep){if(_&&_.registerDep(x,ie,v,m),!f.el){const b=x.subTree=Pe(ge);B(null,b,u,h),f.placeholder=b.el}}else ie(x,f,u,h,_,m,v)},hs=(f,u,h)=>{const y=u.component=f.component;if(Bo(f,u,h))if(y.asyncDep&&!y.asyncResolved){u.el=f.el,u.placeholder=f.placeholder,G(y,u,h);return}else y.next=u,y.update();else u.el=f.el,u.placeholder=f.placeholder,y.vnode=u},ie=(f,u,h,y,_,m,v)=>{const x=()=>{if(f.isMounted){let{next:S,bu:O,u:M,parent:F,vnode:K}=f;{const Se=ti(f);if(Se){S&&(S.el=K.el,G(f,S,v)),Se.asyncDep.then(()=>{fe(()=>{f.isUnmounted||g()},_)});return}}let $=S,z;Ze(f,!1),S?(S.el=K.el,G(f,S,v)):S=K,O&&Ut(O),(z=S.props&&S.props.onVnodeBeforeUpdate)&&Ce(z,F,S,K),Ze(f,!0);const k=Fs(f),ve=f.subTree;f.subTree=k,A(ve,k,p(ve.el),jt(ve),f,_,m),S.el=k.el,$===null&&qo(f,k.el),M&&fe(M,_),(z=S.props&&S.props.onVnodeUpdated)&&fe(()=>Ce(z,F,S,K),_)}else{let S;const{el:O,props:M}=u,{bm:F,m:K,parent:$,root:z,type:k}=f,ve=ft(u);Ze(f,!1),F&&Ut(F),!ve&&(S=M&&M.onVnodeBeforeMount)&&Ce(S,$,u),Ze(f,!0);{z.ce&&z.ce._hasShadowRoot()&&z.ce._injectChildStyle(k,f.parent?f.parent.type:void 0);const Se=f.subTree=Fs(f);A(null,Se,h,y,f,_,m),u.el=Se.el}if(K&&fe(K,_),!ve&&(S=M&&M.onVnodeMounted)){const Se=u;fe(()=>Ce(S,$,Se),_)}(u.shapeFlag&256||$&&ft($.vnode)&&$.vnode.shapeFlag&256)&&f.a&&fe(f.a,_),f.isMounted=!0,u=h=y=null}};f.scope.on();const b=f.effect=new or(x);f.scope.off();const g=f.update=b.run.bind(b),T=f.job=b.runIfDirty.bind(b);T.i=f,T.id=f.uid,b.scheduler=()=>fs(T),Ze(f,!0),g()},G=(f,u,h)=>{u.component=f;const y=f.vnode.props;f.vnode=u,f.next=null,Jo(f,u.props,y,h),Qo(f,u.children,h),Me(),Ar(f),Re()},U=(f,u,h,y,_,m,v,x,b=!1)=>{const g=f&&f.children,T=f?f.shapeFlag:0,S=u.children,{patchFlag:O,shapeFlag:M}=u;if(O>0){if(O&128){Dt(g,S,h,y,_,m,v,x,b);return}else if(O&256){Ye(g,S,h,y,_,m,v,x,b);return}}M&8?(T&16&&at(g,_,m),S!==g&&a(h,S)):T&16?M&16?Dt(g,S,h,y,_,m,v,x,b):at(g,_,m,!0):(T&8&&a(h,""),M&16&&Ue(S,h,y,_,m,v,x,b))},Ye=(f,u,h,y,_,m,v,x,b)=>{f=f||tt,u=u||tt;const g=f.length,T=u.length,S=Math.min(g,T);let O;for(O=0;O<S;O++){const M=u[O]=b?De(u[O]):Ee(u[O]);A(f[O],M,h,null,_,m,v,x,b)}g>T?at(f,_,m,!0,!1,S):Ue(u,h,y,_,m,v,x,b,S)},Dt=(f,u,h,y,_,m,v,x,b)=>{let g=0;const T=u.length;let S=f.length-1,O=T-1;for(;g<=S&&g<=O;){const M=f[g],F=u[g]=b?De(u[g]):Ee(u[g]);if(gt(M,F))A(M,F,h,null,_,m,v,x,b);else break;g++}for(;g<=S&&g<=O;){const M=f[S],F=u[O]=b?De(u[O]):Ee(u[O]);if(gt(M,F))A(M,F,h,null,_,m,v,x,b);else break;S--,O--}if(g>S){if(g<=O){const M=O+1,F=M<T?u[M].el:y;for(;g<=O;)A(null,u[g]=b?De(u[g]):Ee(u[g]),h,F,_,m,v,x,b),g++}}else if(g>O)for(;g<=S;)_e(f[g],_,m,!0),g++;else{const M=g,F=g,K=new Map;for(g=F;g<=O;g++){const ue=u[g]=b?De(u[g]):Ee(u[g]);ue.key!=null&&K.set(ue.key,g)}let $,z=0;const k=O-F+1;let ve=!1,Se=0;const ht=new Array(k);for(g=0;g<k;g++)ht[g]=0;for(g=M;g<=S;g++){const ue=f[g];if(z>=k){_e(ue,_,m,!0);continue}let we;if(ue.key!=null)we=K.get(ue.key);else for($=F;$<=O;$++)if(ht[$-F]===0&&gt(ue,u[$])){we=$;break}we===void 0?_e(ue,_,m,!0):(ht[we-F]=g+1,we>=Se?Se=we:ve=!0,A(ue,u[we],h,null,_,m,v,x,b),z++)}const ms=ve?tl(ht):tt;for($=ms.length-1,g=k-1;g>=0;g--){const ue=F+g,we=u[ue],ys=u[ue+1],bs=ue+1<T?ys.el||Yn(ys):y;ht[g]===0?A(null,we,h,bs,_,m,v,x,b):ve&&($<0||g!==ms[$]?Xe(we,h,bs,2):$--)}}},Xe=(f,u,h,y,_=null)=>{const{el:m,type:v,transition:x,children:b,shapeFlag:g}=f;if(g&6){Xe(f.component.subTree,u,h,y);return}if(g&128){f.suspense.move(u,h,y);return}if(g&64){v.move(f,u,h,dt);return}if(v===ce){s(m,u,h);for(let S=0;S<b.length;S++)Xe(b[S],u,h,y);s(f.anchor,u,h);return}if(v===jn){L(f,u,h);return}if(y!==2&&g&1&&x)if(y===0)x.persisted&&!m[Fn]?s(m,u,h):(x.beforeEnter(m),s(m,u,h),fe(()=>x.enter(m),_));else{const{leave:S,delayLeave:O,afterLeave:M}=x,F=()=>{f.ctx.isUnmounted?r(m):s(m,u,h)},K=()=>{const $=m._isLeaving||!!m[Fn];m._isLeaving&&m[Fn](!0),x.persisted&&!$?F():S(m,()=>{F(),M&&M()})};O?O(m,F,K):K()}else s(m,u,h)},_e=(f,u,h,y=!1,_=!1)=>{const{type:m,props:v,ref:x,children:b,dynamicChildren:g,shapeFlag:T,patchFlag:S,dirs:O,cacheIndex:M,memo:F}=f;if((S===-2||g&&g.hasOnce)&&(_=!1),x!=null&&(Me(),vt(x,null,h,f,!0),Re()),M!=null&&(!f.ctx||f.ctx===u)&&(u.renderCache[M]=void 0),T&256){u.ctx.deactivate(f);return}const K=T&1&&O,$=!ft(f);let z;if($&&(z=v&&v.onVnodeBeforeUnmount)&&Ce(z,u,f),T&6)ui(f.component,h,y);else{if(T&128){f.suspense.unmount(h,y);return}K&&Qe(f,null,u,"beforeUnmount"),T&64?f.type.remove(f,u,h,dt,y):g&&!g.hasOnce&&(m!==ce||S>0&&S&64)?at(g,u,h,!1,!0):(m===ce&&S&384||!_&&T&16)&&at(b,u,h),y&&ps(f)}const k=F!=null&&M==null;($&&(z=v&&v.onVnodeUnmounted)||K||k)&&fe(()=>{z&&Ce(z,u,f),K&&Qe(f,null,u,"unmounted"),k&&(f.el=null)},h)},ps=f=>{const{type:u,el:h,anchor:y,transition:_}=f,m=u===ce;if(m&&!_){gs(h,y);return}if(u===jn){P(f),_&&!_.persisted&&_.afterLeave&&_.afterLeave();return}const v=m?Bn(f):f,x=()=>{m?p(h)&&gs(h,y):r(h),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(v&&v.shapeFlag&1&&_&&!_.persisted){const{leave:b,delayLeave:g}=_,T=v.el,S=()=>b(T,x);g?g(T,x,S):S()}else x()},gs=(f,u)=>{let h;for(;f!==u;)h=C(f),r(f),f=h;r(u)},ui=(f,u,h)=>{const{bum:y,scope:_,job:m,subTree:v,um:x,m:b,a:g}=f;js(b),js(g),y&&Ut(y),_.stop(),m?(m.flags|=8,_e(v,f,u,h)):f.vnode.el&&v&&(v.transition=f.vnode.transition,_e(v,f,u,h)),x&&fe(x,u),fe(()=>{f.isUnmounted=!0},u)},at=(f,u,h,y=!1,_=!1,m=0)=>{for(let v=m;v<f.length;v++)_e(f[v],u,h,y,_)},jt=f=>{if(f.shapeFlag&6)return jt(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const u=C(f.anchor||f.el),h=u&&u[_o];return h?C(h):u},_s=(f,u,h)=>{const y=f&&u._vnode?void 0:f&&f.component?f.component.uid:fl();fo(()=>{f==null?u._vnode&&_e(u._vnode,null,null,!0):A(u._vnode||null,f,u,null,null,null,h),u._vnode=f},y)},dt={p:A,um:_e,m:Xe,r:ps,mt:Tn,mc:Ue,pc:U,pbc:ze,n:jt,o:e};return{render:_s,hydrate:void 0,createApp:Lo(_s)}}function Dn({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 Ze({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function el(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ei(e,t,n=!1){const s=e.children,r=t.children;if(E(s)&&E(r))for(let i=0;i<s.length;i++){const o=s[i];let l=r[i];l.shapeFlag&1&&!l.dynamicChildren&&((l.patchFlag<=0||l.patchFlag===32)&&(l=r[i]=De(r[i]),l.el=o.el),!n&&l.patchFlag!==-2&&ei(o,l)),l.type===vn&&(l.patchFlag===-1&&(l=r[i]=De(l)),l.el=o.el),l.type===ge&&!l.el&&(l.el=o.el)}}function tl(e){const t=e.slice(),n=[0];let s,r,i,o,l;const c=e.length;for(s=0;s<c;s++){const d=e[s];if(d!==0){if(r=n[n.length-1],e[r]<d){t[s]=r,n.push(s);continue}for(i=0,o=n.length-1;i<o;)l=i+o>>1,e[n[l]]<d?i=l+1:o=l;d<e[n[i]]&&(i>0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function ti(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ti(t)}function js(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Yn(e){if(e.placeholder)return e.placeholder;const t=e.component;return t?Yn(t.subTree):null}const ni=e=>e.__isSuspense;function nl(e,t){t&&t.pendingBranch?E(e)?t.effects.push(...e):t.effects.push(e):lo(e)}const ce=Symbol.for("v-fgt"),vn=Symbol.for("v-txt"),ge=Symbol.for("v-cmt"),jn=Symbol.for("v-stc"),He=[];let ae=null;function Xn(e=!1){He.push(ae=e?null:[])}function ds(){He.pop(),ae=He[He.length-1]||null}let Ot=1;function Vs(e,t=!1){Ot+=e,e<0&&ae&&t&&(ae.hasOnce=!0)}function si(e){return e.dynamicChildren=Ot>0?ae||tt:null,ds(),Ot>0&&ae&&ae.push(e),e}function af(e,t,n,s,r,i){return si(ii(e,t,n,s,r,i,!0))}function Qn(e,t,n,s,r){return si(Pe(e,t,n,s,r,!0))}function Sn(e){return e?e.__v_isVNode===!0:!1}function gt(e,t){return e.type===t.type&&e.key===t.key}const ri=({key:e})=>e??null,Bt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?J(e)||Q(e)||R(e)?{i:te,r:e,k:t,f:!!n}:e:null);function ii(e,t=null,n=null,s=0,r=null,i=e===ce?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ri(t),ref:t&&Bt(t),scopeId:Rr,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:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:te};return l?(kt(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=J(n)?8:16),Ot>0&&!o&&ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&ae.push(c),c}const Pe=sl;function sl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Vr)&&(e=ge),Sn(e)){const l=ct(e,t,!0);return n&&kt(l,n),Ot>0&&!i&&ae&&(l.shapeFlag&6?ae[ae.indexOf(e)]=l:ae.push(l)),l.patchFlag=-2,l}if(gl(e)&&(e=e.__vccOpts),t){t=rl(t);let{class:l,style:c}=t;l&&!J(l)&&(t.class=ns(l)),H(c)&&(gn(c)&&!E(c)&&(c=Z({},c)),t.style=ts(c))}const o=J(e)?1:ni(e)?128:yn(e)?64:H(e)?4:R(e)?2:0;return ii(e,t,n,s,r,o,i,!0)}function rl(e){return e?gn(e)||zr(e)?Z({},e):e:null}function ct(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,d=t?ol(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&ri(d),ref:t&&t.ref?n&&i?E(i)?i.concat(Bt(t)):[i,Bt(t)]:Bt(t):i,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!==ce?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ct(e.ssContent),ssFallback:e.ssFallback&&ct(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&s&&Yt(a,c.clone(a)),a}function il(e=" ",t=0){return Pe(vn,null,e,t)}function df(e="",t=!1){return t?(Xn(),Qn(ge,null,e)):Pe(ge,null,e)}function Ee(e){return e==null||typeof e=="boolean"?Pe(ge):E(e)?Pe(ce,null,e.slice()):Sn(e)?De(e):Pe(vn,null,String(e))}function De(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ct(e)}function kt(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(E(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),kt(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!zr(t)?t._ctx=te:r===3&&te&&(te.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(R(t)){if(s&65){kt(e,{default:t});return}t={default:t,_ctx:te},n=32}else t=String(t),s&64?(n=16,t=[il(t)]):n=8;e.children=t,e.shapeFlag|=n}function ol(...e){const t={};for(let n=0;n<e.length;n++){const s=e[n];for(const r in s)if(r==="class")t.class!==s.class&&(t.class=ns([t.class,s.class]));else if(r==="style")t.style=ts([t.style,s.style]);else if(sn(r)){const i=t[r],o=s[r];o&&i!==o&&!(E(i)&&i.includes(o))?t[r]=i?[].concat(i,o):o:o==null&&i==null&&!rn(r)&&(t[r]=o)}else r!==""&&(t[r]=s[r])}return t}function Ce(e,t,n,s=null){be(e,t,7,[n,s])}const ll=Kr();let oi=0;function fl(){return oi}function cl(e,t,n){const s=e.type,r=(t?t.appContext:e.appContext)||ll,i={uid:oi++,vnode:e,type:s,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Ti(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Xr(s,r),emitsOptions:Wr(s,r),emit:null,emitted:null,propsDefaults:N,inheritAttrs:s.inheritAttrs,ctx:N,data:N,props:N,attrs:N,slots:N,refs:N,setupState:N,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=$o.bind(null,i),e.ce&&e.ce(i),i}let se=null;const wn=()=>se||te;let en,Et;{const e=un(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};en=t("__VUE_INSTANCE_SETTERS__",n=>se=n),Et=t("__VUE_SSR_SETTERS__",n=>At=n)}const Rt=e=>{const t=se;return en(e),e.scope.on(),()=>{e.scope.off(),en(t)}},Hs=()=>{se&&se.scope.off(),en(null)};function li(e){return e.vnode.shapeFlag&4}let At=!1;function ul(e,t=!1,n=!1){t&&Et(t);const{props:s,children:r}=e.vnode,i=li(e);Go(e,s,i,t),Xo(e,r,n||t);const o=i?al(e,t):void 0;return t&&Et(!1),o}function al(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Io);const{setup:s}=n;if(s){Me();const r=e.setupContext=s.length>1?hl(e):null,i=Rt(e),o=Mt(s,e,0,[e.props,r]),l=ks(o);if(Re(),i(),(l||e.sp)&&!ft(e)&&Nr(e),l){if(o.then(Hs,Hs),t)return o.then(c=>{Et(!0);try{Ls(e,c,t)}finally{Et(!1)}}).catch(c=>{_n(c,e,0)});e.asyncDep=o}else Ls(e,o)}else fi(e)}function Ls(e,t,n){R(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:H(t)&&(e.setupState=Cr(t)),fi(e)}function fi(e,t,n){const s=e.type;e.render||(e.render=s.render||Ae);{const r=Rt(e);Me();try{Fo(e)}finally{Re(),r()}}}const dl={get(e,t){return ne(e,"get",""),e[t]}};function hl(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,dl),slots:e.slots,emit:e.emit,expose:t}}function Cn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Cr(qi(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in St)return St[n](e)},has(t,n){return n in t||n in St}})):e.proxy}function pl(e,t=!0){return R(e)?e.displayName||e.name:e.name||t&&e.__name}function gl(e){return R(e)&&"__vccOpts"in e}const _l=(e,t)=>no(e,t,At),ml="3.5.44";/**
14
+ * @vue/runtime-dom v3.5.44
15
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
16
+ * @license MIT
17
+ **/let Zn;const $s=typeof window<"u"&&window.trustedTypes;if($s)try{Zn=$s.createPolicy("vue",{createHTML:e=>e})}catch{}const ci=Zn?e=>Zn.createHTML(e):e=>e,yl="http://www.w3.org/2000/svg",bl="http://www.w3.org/1998/Math/MathML",Ne=typeof document<"u"?document:null,Ks=Ne&&Ne.createElement("template"),xl={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"?Ne.createElementNS(yl,e):t==="mathml"?Ne.createElementNS(bl,e):n?Ne.createElement(e,{is:n}):Ne.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ne.createTextNode(e),createComment:e=>Ne.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ne.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Ks.innerHTML=ci(s==="svg"?`<svg>${e}</svg>`:s==="mathml"?`<math>${e}</math>`:e);const l=Ks.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},vl=Symbol("_vtc");function Sl(e,t,n){const s=e[vl];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Us=Symbol("_vod"),wl=Symbol("_vsh"),Cl=Symbol(""),Tl=/(?:^|;)\s*display\s*:/;function Ol(e,t,n){const s=e.style,r=J(n);let i=!1;if(n&&!r){if(t)if(J(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&mt(s,l,"")}else for(const o in t)n[o]==null&&mt(s,o,"");for(const o in n){o==="display"&&(i=!0);const l=n[o];l!=null?Al(e,o,!J(t)&&t?t[o]:void 0,l)||mt(s,o,l):mt(s,o,"")}}else if(r){if(t!==n){const o=s[Cl];o&&(n+=";"+o),s.cssText=n,i=Tl.test(n)}}else t&&e.removeAttribute("style");Us in e&&((!r||t!==n)&&(e[Us]=i?s.display:""),e[wl]&&(s.display="none"))}const $t=/\s*!important$/;function mt(e,t,n){if(E(n))n.forEach(s=>mt(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))$t.test(n)?e.setProperty(t,n.replace($t,""),"important"):e.setProperty(t,n);else{const s=El(e,t);$t.test(n)?e.setProperty(Le(s),n.replace($t,""),"important"):e[s]=n}}const Ws=["Webkit","Moz","ms"],Vn={};function El(e,t){const n=Vn[t];if(n)return n;let s=re(t);if(s!=="filter"&&s in e)return Vn[t]=s;s=fn(s);for(let r=0;r<Ws.length;r++){const i=Ws[r]+s;if(i in e)return Vn[t]=i}return t}function Al(e,t,n,s){return e.tagName==="TEXTAREA"&&(t==="width"||t==="height")&&J(s)&&n===s}const Bs="http://www.w3.org/1999/xlink";function qs(e,t,n,s,r,i=xi(t)){s&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(Bs,t.slice(6,t.length)):e.setAttributeNS(Bs,t,n):n==null||i&&!sr(n)?e.removeAttribute(t):e.setAttribute(t,i?"":he(n)?String(n):n)}function Gs(e,t,n,s,r){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?ci(n):n);return}const i=e.tagName;if(t==="value"&&i!=="PROGRESS"&&!i.includes("-")){const l=i==="OPTION"?e.getAttribute("value")||"":e.value,c=n==null?e.type==="checkbox"?"on":"":String(n);(l!==c||!("_value"in e))&&(e.value=c),n==null&&e.removeAttribute(t),e._value=n;return}let o=!1;if(n===""||n==null){const l=typeof e[t];l==="boolean"?n=sr(n):n==null&&l==="string"?(n="",o=!0):l==="number"&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(r||t)}function et(e,t,n,s){e.addEventListener(t,n,s)}function Pl(e,t,n,s){e.removeEventListener(t,n,s)}const Js=Symbol("_vei");function Ml(e,t,n,s,r=null){const i=e[Js]||(e[Js]={}),o=i[t];if(s&&o)o.value=s;else{const[l,c]=Fl(t);if(s){const d=i[t]=jl(s,r);et(e,l,d,c)}else o&&(Pl(e,l,o,c),i[t]=void 0)}}const Rl=/(Once|Passive|Capture)$/,Il=/^on:?(?:Once|Passive|Capture)$/;function Fl(e){let t,n;for(;(n=e.match(Rl))&&!Il.test(e);)t||(t={}),e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===":"?e.slice(3):Le(e.slice(2)),t]}let Hn=0;const Nl=Promise.resolve(),Dl=()=>Hn||(Nl.then(()=>Hn=0),Hn=Date.now());function jl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const r=n.value;if(E(r)){const i=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{i.call(s),s._stopped=!0};const o=r.slice(),l=[s];for(let c=0;c<o.length&&!s._stopped;c++){const d=o[c];d&&be(d,t,5,l)}}else be(r,t,5,[s])};return n.value=e,n.attached=Dl(),n}const zs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Vl=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?Sl(e,s,o):t==="style"?Ol(e,n,s):sn(t)?rn(t)||Ml(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Hl(e,t,s,o))?(Gs(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&qs(e,t,s,o,i,t!=="value")):e._isVueCE&&(Ll(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!J(s)))?Gs(e,re(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),qs(e,t,s,o))};function Hl(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&zs(t)&&R(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 zs(t)&&J(n)?!1:t in e}function Ll(e,t){const n=e._def.props;if(!n)return!1;const s=re(t);return Array.isArray(n)?n.some(r=>re(r)===s):Object.keys(n).some(r=>re(r)===s)}const tn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return E(t)?n=>Ut(t,n):t};function $l(e){e.target.composing=!0}function Ys(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const nt=Symbol("_assign"),Kt=Symbol("_initialValue");function Ln(e,t,n){return t&&(e=e.trim()),n&&(e=cn(e)),e}const hf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e.parentNode&&(e.type==="text"?e[Kt]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[Kt]=e.defaultValue.replace(/\r\n?/g,`
18
+ `))),e[nt]=tn(r);const i=s||r.props&&r.props.type==="number";et(e,t?"change":"input",o=>{o.target.composing||e[nt](Ln(e.value,n,i))}),(n||i)&&et(e,"change",()=>{e.value=Ln(e.value,n,i)}),t||(et(e,"compositionstart",$l),et(e,"compositionend",Ys),et(e,"change",Ys))},mounted(e,{value:t,modifiers:{trim:n,number:s}}){const r=t??"",i=e[Kt];delete e[Kt],i!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==i?e[nt](Ln(e.value,n,s)):e.value=r},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[nt]=tn(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?cn(e.value):e.value,c=t??"";if(l===c)return;const d=e.getRootNode();(d instanceof Document||d instanceof ShadowRoot)&&d.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c)}},pf={deep:!0,created(e,{value:t,modifiers:{number:n}},s){e._modelValue=t,et(e,"change",()=>{const r=Array.prototype.filter.call(e.options,c=>c.selected).map(c=>n?cn(nn(c)):nn(c)),i=e.multiple,o=i?it(e._modelValue)?new Set(r):r:r[0],l=e._pendingValue=[i,i?E(o)?r.slice():r:o];try{e[nt](o)}finally{Or(()=>{e._pendingValue===l&&(e._pendingValue=void 0)})}}),e[nt]=tn(s)},mounted(e,{value:t}){Xs(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[nt]=tn(n)},updated(e,{value:t}){const n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Kl(t,n[1],n[0]))&&Xs(e,t)}};function Kl(e,t,n){if(!n||E(e))return Ge(e,t);if(it(e)){if(e.size!==t.length)return!1;for(const s of t)if(!e.has(s))return!1;return!0}return!1}function Xs(e,t){const n=e.multiple,s=E(t);if(!(n&&!s&&!it(t))){for(let r=0,i=e.options.length;r<i;r++){const o=e.options[r],l=nn(o);if(n)if(s){const c=typeof l;c==="string"||c==="number"?o.selected=t.some(d=>String(d)===String(l)):o.selected=wi(t,l)>-1}else o.selected=t.has(l);else if(Ge(nn(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function nn(e){return"_value"in e?e._value:e.value}const Ul=["ctrl","shift","alt","meta"],Wl={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)=>Ul.some(n=>e[`${n}Key`]&&!t.includes(n))},gf=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((r,...i)=>{for(let o=0;o<t.length;o++){const l=Wl[t[o]];if(l&&l(r,t))return}return e(r,...i)}))},Bl={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},_f=(e,t)=>{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(r=>{if(!("key"in r))return;const i=Le(r.key);if(t.some(o=>o===i||Bl[o]===i))return e(r)}))},ql=Z({patchProp:Vl},xl);let Qs;function Gl(){return Qs||(Qs=Zo(ql))}const mf=((...e)=>{const t=Gl().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=zl(s);if(!r)return;const i=t._component;!R(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Jl(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t});function Jl(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function zl(e){return J(e)?document.querySelector(e):e}const yf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n};export{uf as A,cf as B,co as C,Q as D,ef as E,ce as F,_f as G,hf as H,nf as I,mf as J,pf as K,Ql as L,Ji as M,Qi as N,kl as O,Wn as P,wn as Q,tf as R,Wt as S,Oi as T,Xl as U,yf as _,Zl as a,af as b,_l as c,sf as d,lf as e,gf as f,ns as g,ii as h,Ci as i,df as j,Gi as k,So as l,il as m,Or as n,Xn as o,Pe as p,Qn as q,os as r,Bi as s,j as t,ls as u,of as v,In as w,rf as x,ts as y,ff as z};
@@ -0,0 +1 @@
1
+ :root{--page-bg: #f3f4f8;--tip-bg: #1f2433;--tip-ink: #e8ecf5;--tip-edge: rgb(255 255 255 / 12%);--tip-shadow: rgb(0 0 0 / 45%)}@media(prefers-color-scheme:dark){:root{--page-bg: #0d0f13}}@media(prefers-color-scheme:light){:root{--tip-bg: #fff;--tip-ink: #1d2023;--tip-edge: #d3d6de;--tip-shadow: rgb(0 0 0 / 18%)}}.app{--md-primary: #2c5697;--md-on-primary: #fff;--md-primary-container: #d8e2ff;--md-on-primary-container: #001a41;--md-secondary-container: #dae2f9;--md-on-secondary-container: #131c2b;--md-tertiary-container: #c8f0ec;--md-on-tertiary-container: #00201e;--md-warn-container: #ffdea6;--md-on-warn-container: #271900;--md-error: #ba1a1a;--md-error-container: #ffdad6;--md-on-error-container: #410002;--md-surface: #f9f9ff;--md-s-low: #fff;--md-s: #f1f3f9;--md-s-high: #e7e9f0;--md-s-highest: #e0e2ea;--md-on-surface: #191c20;--md-on-surface-variant: #44474e;--md-outline: #74777f;--md-outline-variant: #d3d6de;--md-state: 25, 28, 32;--state-hover: rgb(var(--md-state), .08);--focus-ring: 2px solid var(--md-primary);--glass: 255, 255, 255;--glass-a: .52;--glass-edge: rgb(255 255 255 / 70%);--glass-hi: rgb(255 255 255 / 90%);--blob-1: rgb(44 86 151 / 30%);--blob-2: rgb(0 169 224 / 22%);--blob-3: rgb(23 223 220 / 16%);--md-font: roboto, inter, -apple-system, blinkmacsystemfont, "Segoe UI", system-ui, sans-serif;--md-r-card: 12px;--md-r-chip: 8px;--new: #5cc8f0;--new-bg: rgb(92 200 240 / 17%);--new-ink: #04222e;--new-edge: rgb(92 200 240 / 28%);--new-glow: rgb(92 200 240 / 45%);--move: #e0a030;--live-on: #2bb673;--live-off: #d6455d;--live-warn: #e0a030;--live-pulse-from: rgb(43 182 115 / 50%);--live-pulse-to: rgb(43 182 115 / 0%);--live-pulse-rest: rgb(43 182 115 / 60%)}@media(prefers-color-scheme:dark){.app{--md-primary: #adc6ff;--md-on-primary: #0f2f60;--md-primary-container: #2b4678;--md-on-primary-container: #d8e2ff;--md-secondary-container: #3e4759;--md-on-secondary-container: #dae2f9;--md-tertiary-container: #1f504c;--md-on-tertiary-container: #b4efe9;--md-warn-container: #5c4300;--md-on-warn-container: #ffdea6;--md-error: #ffb4ab;--md-error-container: #93000a;--md-on-error-container: #ffdad6;--md-surface: #111318;--md-s-low: #1b1e23;--md-s: #1f2227;--md-s-high: #292c32;--md-s-highest: #34373d;--md-on-surface: #e2e2e9;--md-on-surface-variant: #c4c6d0;--md-outline: #8e9099;--md-outline-variant: #3a3d44;--md-state: 226, 226, 233;--glass: 30, 34, 42;--glass-a: .74;--glass-edge: rgb(255 255 255 / 9%);--glass-hi: rgb(255 255 255 / 6%);--blob-1: rgb(44 86 151 / 55%);--blob-2: rgb(0 169 224 / 28%);--blob-3: rgb(23 223 220 / 14%)}}:root,.page,.page__mount,.app{height:100%;margin:0}:where(.page) button{box-sizing:content-box;margin:0;padding:0;border:0;background:none;color:inherit;font:inherit;letter-spacing:inherit;word-spacing:inherit;text-align:inherit;text-transform:inherit;text-indent:inherit;text-shadow:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.page{background:var(--page-bg);overflow:hidden}.page--scroll{overflow:auto}.dashboard{position:relative;isolation:isolate;box-sizing:border-box;display:grid;gap:12px;padding:14px;border-radius:20px;font-family:var(--md-font);color:var(--md-on-surface);font-size:14px;line-height:1.43;letter-spacing:.01em}.dashboard:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:20px;pointer-events:none;background:radial-gradient(60% 55% at 12% 8%,var(--blob-1),transparent 70%),radial-gradient(45% 50% at 92% 30%,var(--blob-2),transparent 70%),radial-gradient(55% 60% at 55% 105%,var(--blob-3),transparent 70%)}.dashboard__backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;width:100%;height:100%;border-radius:20px;pointer-events:none}.dashboard a{color:var(--md-primary);text-decoration:none}.dashboard a:hover{text-decoration:underline;text-underline-offset:3px}.dashboard a:focus-visible{outline:var(--focus-ring);outline-offset:2px;border-radius:4px}.dashboard a.btn{text-decoration:none}.dashboard__layout{display:grid;gap:12px;grid-template-columns:minmax(0,1fr) var(--feed-width, 31%);align-items:start}.dashboard__main{display:grid;gap:12px;min-width:0}.dashboard__feed{position:sticky;top:12px;max-height:calc(100vh - 24px);display:flex;flex-direction:column}@media(min-width:901px){.dashboard.dashboard--fit{height:var(--dashboard-height, calc(100vh - 120px) );grid-template-rows:auto minmax(0,1fr);overflow:hidden}.dashboard--fit .dashboard__layout{min-height:0;height:100%;align-items:stretch}.dashboard--fit .dashboard__main{display:flex;flex-direction:column;gap:12px;min-height:0;overflow-y:auto;scrollbar-width:thin}.dashboard--fit .dashboard__main>.island{display:flex;flex-direction:column;min-height:0}.dashboard--fit .dashboard__move{flex:0 1 auto;max-height:60%}.dashboard--fit .dashboard__todo{flex:0 0 auto;max-height:30%}.dashboard--fit .dashboard__waiting{flex:1 1 0}.dashboard--fit .dashboard__main>.island:not(.island--collapsed){min-height:var(--island-floor, 5rem)}.dashboard--fit .dashboard__main>.island--sized:not(.island--collapsed){flex:0 0 var(--island-height);max-height:none}.dashboard--fit .dashboard__main>.dashboard__waiting.island--sized:not(.island--collapsed){flex-grow:1}.dashboard--fit .dashboard__feed{position:static;max-height:none;height:100%;min-height:0}}.dashboard--fit .dashboard__main:has(.dashboard__waiting.island--collapsed) .dashboard__move:not(.island--collapsed,.island--sized){max-height:none;flex:1 1 0}.dashboard--fit .dashboard__main:has(.dashboard__waiting.island--collapsed):has(.dashboard__move.island--collapsed) .dashboard__todo:not(.island--collapsed,.island--sized){max-height:none;flex:1 1 0}.dashboard--fit .dashboard__main>.island--collapsed{flex:0 0 auto;max-height:none}.dashboard--fit .dashboard__feed.island--collapsed{height:auto;align-self:start}@media(max-width:900px){.page{overflow:auto}.dashboard__layout{grid-template-columns:1fr}.dashboard__feed{position:static;max-height:none}}.island{position:relative;min-width:0;overflow:hidden;border:1px solid var(--glass-edge);border-radius:var(--md-r-card);background:rgb(var(--glass),var(--glass-a));-webkit-backdrop-filter:blur(8px) saturate(150%);backdrop-filter:blur(8px) saturate(150%);box-shadow:inset 0 1px 0 var(--glass-hi),0 8px 24px #0000002e}.fold-toggle{flex:none;display:inline-grid;place-items:center;width:24px;height:24px;margin-left:6px;border-radius:50%;cursor:pointer;color:var(--md-on-surface-variant);font-size:18px;line-height:1;transition:transform .15s ease}.fold-toggle:hover{background:var(--state-hover)}.fold-toggle--folded{transform:rotate(-90deg)}.count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;margin-left:6px;padding:0 6px;border-radius:10px;background:var(--md-s-high);color:var(--md-on-surface-variant);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums}.table{width:100%;border-collapse:collapse;font-size:14px}.table th{text-align:left;font-weight:500;color:var(--md-on-surface-variant);background:var(--md-s-low);font-size:12px;line-height:16px;letter-spacing:.03em;padding:8px 12px;border-bottom:1px solid var(--glass-edge);white-space:nowrap}.table td{padding:12px;border-bottom:1px solid var(--md-outline-variant);vertical-align:top}.table th:first-child,.table td:first-child{padding-left:20px}.table th:last-child,.table td:last-child{padding-right:20px}.table tbody tr:last-child td{border-bottom:0}.table tbody tr:hover td{background:var(--state-hover)}.table__actions-col{width:1%}.table__actions{white-space:nowrap}.table__actions>*{vertical-align:middle}.table__ai{margin-right:6px}@media(min-width:901px){.dashboard--fit .table thead th{position:sticky;top:0;z-index:1}}@media(prefers-reduced-transparency:reduce){.island,.table th{background:var(--md-s-low);-webkit-backdrop-filter:none;backdrop-filter:none}}.pill{display:inline-block;max-width:100%;height:24px;padding:0 10px;overflow:hidden;line-height:24px;text-overflow:ellipsis;border-radius:var(--md-r-chip);font-size:12px;font-weight:500;letter-spacing:.03em;white-space:nowrap;background:var(--md-s-high);color:var(--md-on-surface-variant)}.pill--bad{background:var(--md-error-container);color:var(--md-on-error-container)}.pill--warn{background:var(--md-warn-container);color:var(--md-on-warn-container)}.pill--hold{background:var(--md-s-highest);color:var(--md-on-surface-variant);box-shadow:inset 0 0 0 1px var(--md-outline)}.pill--ok{background:var(--md-tertiary-container);color:var(--md-on-tertiary-container)}.pill--info{background:var(--md-secondary-container);color:var(--md-on-secondary-container)}.age{display:inline-flex;align-items:center;height:18px;padding:0 6px;border-radius:6px;font-size:11px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--md-on-surface-variant);background:var(--md-s-high);cursor:help;white-space:nowrap}.age--old{color:var(--md-on-warn-container);background:var(--md-warn-container)}.handled-chip{display:inline-flex;align-items:center;height:18px;padding:0 7px;margin-left:6px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;background:var(--md-s-highest);color:var(--md-on-surface-variant);vertical-align:middle}.at-you{display:inline-block;padding:1px 7px;border-radius:4px;font-size:11px;font-weight:800;letter-spacing:.03em;background:var(--md-warn-container);color:var(--md-on-warn-container)}.ticket-key{white-space:nowrap;font-variant-numeric:tabular-nums;font-weight:500}.timestamp{color:var(--md-on-surface-variant);white-space:nowrap;font-size:12px;font-variant-numeric:tabular-nums}.ai-hint{font-size:12px;opacity:.8}.hint-icon{display:inline-flex;align-items:center;justify-content:center;flex:none;box-sizing:border-box;width:16px;height:16px;padding:0;border:1px solid var(--md-outline);border-radius:50%;font-size:10px;font-weight:700;line-height:1;text-align:center;color:var(--md-on-surface-variant);cursor:pointer;-webkit-user-select:none;user-select:none}.hint-icon:hover,.hint-icon[aria-expanded=true]{color:var(--md-primary);border-color:var(--md-primary)}.hint-icon:focus-visible{outline:var(--focus-ring);outline-offset:2px}.hint-label{flex:none;padding:0 2px;color:var(--md-on-surface-variant);font-size:12px;text-decoration:underline dotted;text-underline-offset:3px;cursor:help}.hint-label:hover,.hint-label[aria-expanded=true]{color:var(--md-primary)}.hint-label:focus-visible{outline:var(--focus-ring);outline-offset:2px}.hint-row{display:flex;align-items:center;gap:6px;min-width:0}.empty{color:var(--md-on-surface-variant);font-size:14px;margin:12px 0 0;padding-bottom:14px}.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}@media(max-width:640px){.hide-narrow{display:none}}.btn{display:inline-flex;align-items:center;height:32px;padding:0 14px;border:1px solid var(--md-outline);border-radius:999px;font-size:13px;font-weight:500;color:var(--md-primary);background:transparent;cursor:pointer;-webkit-user-select:none;user-select:none}.btn--tonal{background:var(--md-secondary-container);color:var(--md-on-secondary-container);border-color:transparent}.btn[aria-disabled=true]{opacity:.38;cursor:default;pointer-events:none}.btn:hover{box-shadow:inset 0 0 0 100px rgb(var(--md-state),.08)}.btn:focus-visible{outline:var(--focus-ring);outline-offset:2px}.btn--danger{color:var(--md-error);border-color:var(--md-error)}.input{font:inherit;font-size:13px;padding:7px 10px;border:1px solid var(--md-outline-variant);border-radius:8px;background:var(--md-s-low);color:var(--md-on-surface)}.input:focus{outline:var(--focus-ring);outline-offset:-1px;border-color:transparent}.input[aria-invalid=true]{border-color:var(--md-error)}.alert{margin:0 4px 8px;padding:8px 12px;border-radius:10px;font-size:13px;font-family:var(--md-font);background:var(--md-error-container);color:var(--md-on-error-container)}.alert__action{margin-left:8px;color:inherit;font-weight:600;text-decoration:underline;cursor:pointer}.alert--inline{margin:0 0 8px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;padding:24px;background:#00000073;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.modal__card{width:min(760px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--glass-edge);border-radius:16px;background:rgb(var(--glass),.9);-webkit-backdrop-filter:blur(24px) saturate(150%);backdrop-filter:blur(24px) saturate(150%);box-shadow:0 24px 64px #00000073}.modal__head{display:flex;align-items:center;gap:12px;padding:16px 20px;border-bottom:1px solid var(--md-outline-variant)}.modal__title{flex:1;min-width:0;margin:0;font-size:18px;font-weight:500}.modal__meta{color:var(--md-on-surface-variant);font-size:12px}.sheet-form{display:flex;flex-direction:column;gap:14px;padding:16px 20px 24px;overflow:auto;font-size:14px}.sheet-form__heading{margin:10px 0 0;font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--md-on-surface-variant)}.tippy-box[data-theme~=wt]{border:1px solid var(--tip-edge);border-radius:10px;background:var(--tip-bg);color:var(--tip-ink);box-shadow:0 12px 32px var(--tip-shadow);font:13px/1.5 Roboto,Inter,-apple-system,system-ui,sans-serif}.tippy-box[data-theme~=wt] .tippy-content{padding:10px 12px;white-space:pre-wrap;overflow-wrap:anywhere;max-height:50vh;overflow:auto}.tippy-box[data-theme~=wt]>.tippy-arrow{color:var(--tip-bg)}
@@ -0,0 +1 @@
1
+ const w=e=>fetch(e).then(t=>t.json(),()=>Promise.reject(new Error("unreachable"))),S=(e,t)=>fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})}).then(n=>n.json(),()=>Promise.reject(new Error("unreachable"))),r=(e,t)=>(e.details||[]).find(n=>n["@type"]===t),O=e=>{var t;return((t=r(e,"BadRequest"))==null?void 0:t.field_violations)||[]},_=e=>{var o,a;const t=r(e,"BadRequest");if(t&&t.field_violations)return t.field_violations.map(i=>i.description);const n=(a=(o=r(e,"ErrorInfo"))==null?void 0:o.metadata)==null?void 0:a.detail;return[n?String(n):e.message]},h=e=>{var t;return((t=r(e,"ErrorInfo"))==null?void 0:t.reason)||""},A=e=>fetch("/api/handoff?"+new URLSearchParams(e)).then(t=>t.ok?t.text():Promise.reject(new Error(String(t.status)))),y=e=>typeof e=="string"&&/^https:\/\//.test(e)?e:"",f="No workspace configured. Open Settings.",N=e=>e!=="",P=(e,t,n)=>e.some(o=>o.id===t&&o.open_moves!==n)?e.map(o=>o.id===t?{...o,open_moves:n}:o):e,R=(e,t)=>{const n=e.filter(s=>s.group==="you").map(s=>({row:s,handled:!!s.handled})).sort((s,d)=>s.row.rank-d.row.rank||String(s.row.updated).localeCompare(String(d.row.updated))),o=n.filter(s=>!s.handled).length,a=t==="handled";return{rows:n.filter(s=>s.handled===a),open:o,handled:n.length-o}},c=e=>String(e.status_since||e.updated),v=e=>e.filter(t=>t.group==="done").sort((t,n)=>c(n).localeCompare(c(t))).slice(0,15),D=e=>e.filter(t=>t.group==="others").sort((t,n)=>String(n.updated).localeCompare(String(t.updated))),g=e=>!e.ticket_url&&!!e.pr&&e.pr===e.key,b=e=>e.some(t=>t.pr&&!g(t)),k=e=>e==="failing"?"bad":e==="running"?"warn":e==="passing"?"ok":"",u={code_review:"info",qa:"info",on_hold:"hold"},U=e=>u[e||""]||"",C=e=>({open:"info",done:"ok",dropped:"warn"})[e||""]||"info",L=(e,t,n=1)=>e.filter(o=>o>t+n).length,p="unreachable",l="The local server is not answering",m=l+"; try again once it is back.",I=l+"; your text is kept.",E={NO_WORKSPACE:f,NOT_CONFIGURED:"The maintainer's tracker is not connected on this machine, so nothing can be sent from here.",UPSTREAM_FAILED:"The tracker did not answer; try again in a minute.",RATE_LIMITED:"The source is rate-limited; the monitor backs off.",OPEN_TOO_SOON:"The app window is already opening; give it a few seconds.",UPDATE_IN_PROGRESS:"An update is already installing; the monitor restarts when it is done.",UPDATE_UNAVAILABLE:"There is no update to install right now.",INTERNAL:"The local server failed; see its log."},T=(e,t="Not saved")=>E[h(e)]||t+": "+(e.message||"the server refused the change."),j=(e,{refused:t="Not saved",unreachable:n=m}={})=>{if(e instanceof Error)return e.message===p?n:t+": "+e.message;if(!e||typeof e!="object"||Array.isArray(e))return"";const o=e.error;return o?T(o,t):""},B=e=>{const t=Math.round((Date.now()-new Date(e).getTime())/6e4);return isFinite(t)?t<1?"now":t<60?t+"m ago":t<2880?Math.round(t/60)+"h ago":new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric"}):""},M=e=>{const t=(Date.now()-new Date(e??"").getTime())/36e5;return!isFinite(t)||t<0?{text:"",old:!1,hours:0}:{text:t<1?"<1h":t<48?Math.floor(t)+"h":Math.floor(t/24)+"d",old:t>=24,hours:t}},x=e=>e?new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"",W=(e,t)=>t?`${e}--${t}`:"";export{l as S,I as T,N as a,j as b,B as c,k as d,T as e,U as f,w as g,A as h,g as i,x as j,v as k,M as l,W as m,L as n,b as o,S as p,D as q,h as r,y as s,C as t,_ as u,O as v,P as w,R as y};
@@ -0,0 +1 @@
1
+ .rail[data-v-58c52f35]{position:fixed;inset:0 auto 0 0;z-index:30;box-sizing:border-box;display:flex;flex-direction:column;gap:4px;width:60px;padding:12px 8px;overflow:hidden;border-right:1px solid var(--glass-edge);background:rgb(var(--glass),.72);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);font-family:var(--md-font);color:var(--md-on-surface);transition:width .18s ease,box-shadow .18s ease}.rail[data-v-58c52f35]:hover,.rail[data-v-58c52f35]:has(:focus-visible){width:232px;box-shadow:12px 0 32px #0000001f}.app:has(.modal) .rail[data-v-58c52f35]{z-index:0}.rail__item[data-v-58c52f35]{position:relative;display:flex;align-items:center;gap:12px;height:44px;padding:0 4px;border-radius:12px;color:inherit;text-decoration:none;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none}.rail__item[data-v-58c52f35]:focus-visible{outline:var(--focus-ring);outline-offset:-2px}.rail__item--dragging[data-v-58c52f35]{opacity:.4}.rail__item[data-drop=before][data-v-58c52f35]{box-shadow:0 -2px 0 0 var(--md-primary)}.rail__item[data-drop=after][data-v-58c52f35]{box-shadow:0 2px 0 0 var(--md-primary)}.rail__item[data-v-58c52f35]:hover{background:var(--state-hover)}.rail__item[aria-selected=true][data-v-58c52f35]{background:var(--md-secondary-container);color:var(--md-on-secondary-container)}.rail__icon[data-v-58c52f35]{flex:none;display:block;width:36px;height:36px;border-radius:10px}.rail__gear[data-v-58c52f35]{flex:none;display:grid;place-items:center;width:36px;height:36px;color:var(--md-on-surface-variant)}.rail__label[data-v-58c52f35]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-weight:500;opacity:0;transition:opacity .12s ease}.rail:hover .rail__label[data-v-58c52f35],.rail:has(:focus-visible) .rail__label[data-v-58c52f35]{opacity:1}.rail__badge[data-v-58c52f35]{position:absolute;top:2px;left:30px;box-sizing:border-box;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--md-primary);color:var(--md-on-primary);font-size:10px;font-weight:700;line-height:18px;text-align:center}.rail:hover .rail__badge[data-v-58c52f35],.rail:has(:focus-visible) .rail__badge[data-v-58c52f35]{position:static;flex:none}.rail__warn[data-v-58c52f35]{position:absolute;left:26px;top:26px;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;background:var(--md-error);color:var(--md-on-error);font-size:10px;font-weight:800;line-height:1}.rail__spacer[data-v-58c52f35]{flex:1}.ai-button[data-v-46197bdc]{position:relative;display:inline-grid;place-items:center;width:26px;height:26px;border-radius:50%;cursor:pointer;color:var(--md-primary);background:rgb(var(--md-state),.06);vertical-align:middle;transition:background .12s ease,transform .12s ease}.ai-button__icon[data-v-46197bdc]{width:15px;height:15px}.ai-button__badge[data-v-46197bdc]{position:absolute;right:-3px;top:-3px;width:12px;height:12px}.ai-button[data-v-46197bdc]:hover{background:var(--md-secondary-container);transform:scale(1.08)}.ai-button[data-v-46197bdc]:focus-visible{outline:var(--focus-ring);outline-offset:1px}.ai-button.ai-button--sent[data-v-46197bdc]{background:var(--md-tertiary-container);color:var(--md-on-tertiary-container)}.ai-button.ai-button--failed[data-v-46197bdc]{background:var(--md-error-container);color:var(--md-on-error-container)}.ai-button--big[data-v-46197bdc]{width:32px;height:32px;background:rgb(var(--glass),.7)}.ai-button--big .ai-button__icon[data-v-46197bdc]{width:18px;height:18px}.update-chip[data-v-c36ae07d]{display:inline-flex;gap:8px;align-items:center;height:26px;padding:0 12px;font:inherit;color:var(--md-on-primary-container);white-space:nowrap;cursor:pointer;background:var(--md-primary-container);border:0;border-radius:var(--md-r-chip)}.update-chip--busy[data-v-c36ae07d],.update-chip--done[data-v-c36ae07d]{cursor:default}.update-chip--ready[data-v-c36ae07d]{color:var(--md-on-primary);background:var(--md-primary)}.update-chip--failed[data-v-c36ae07d]{color:var(--md-on-error-container);background:var(--md-error-container)}.update-chip__spinner[data-v-c36ae07d]{width:12px;height:12px;border:2px solid currentcolor;border-top-color:transparent;border-radius:50%;animation:update-chip-spin-c36ae07d .9s linear infinite}@media(prefers-reduced-motion:reduce){.update-chip__spinner[data-v-c36ae07d]{animation:none}}.update-chip__link[data-v-c36ae07d]{padding:0;font:inherit;color:inherit;text-decoration:underline;cursor:pointer;background:none;border:0}@keyframes update-chip-spin-c36ae07d{to{transform:rotate(360deg)}}.status-bar[data-v-1a4ce564]{display:flex;align-items:center;gap:10px;margin:0 4px 8px;font-family:var(--md-font);font-size:12px;color:var(--md-on-surface-variant)}.status-bar__btn[data-v-1a4ce564]{height:26px;padding:0 12px;font-size:12px;text-decoration:none}.status-bar__btn--busy[data-v-1a4ce564]{opacity:.6;pointer-events:none}.status-bar__report[data-v-1a4ce564]{gap:6px}.status-bar__icon[data-v-1a4ce564]{width:16px;height:16px}.status-bar__live[data-v-1a4ce564]{width:8px;height:8px;border-radius:50%;background:var(--live-on);box-shadow:0 0 0 0 var(--live-pulse-rest);animation:status-bar-pulse-1a4ce564 2s infinite}.status-bar__live--off[data-v-1a4ce564]{background:var(--live-off);animation:none}.status-bar__live--warn[data-v-1a4ce564]{background:var(--live-warn);animation:none}.status-bar__notice[data-v-1a4ce564]{color:var(--live-off)}.status-bar__ai-hint[data-v-1a4ce564]{margin-left:-4px}@keyframes status-bar-pulse-1a4ce564{0%{box-shadow:0 0 0 0 var(--live-pulse-from)}70%{box-shadow:0 0 0 8px var(--live-pulse-to)}to{box-shadow:0 0 0 0 var(--live-pulse-to)}}@media(prefers-reduced-motion:reduce){.status-bar__live[data-v-1a4ce564]{animation:none}}.workspace-header[data-v-3421a7f0]{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,2fr) 32px;gap:8px;padding:8px;background:linear-gradient(135deg,var(--blob-1),var(--blob-2));color:var(--header-ink, var(--md-on-primary-container))}@media(prefers-reduced-transparency:reduce){.workspace-header[data-v-3421a7f0]{background:var(--md-s-low)}}.workspace-header__title[data-v-3421a7f0]{display:grid;align-content:center;gap:4px;padding:12px 16px}.workspace-header__name[data-v-3421a7f0]{margin:0;font-size:28px;font-weight:400;line-height:36px;color:var(--md-on-primary-container)}.workspace-header__line[data-v-3421a7f0]{margin:0;font-size:14px;opacity:.85}.workspace-header__count[data-v-3421a7f0]{font-weight:700;font-variant-numeric:tabular-nums}.workspace-header__give[data-v-3421a7f0]{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin-top:8px;white-space:nowrap}.workspace-header__links[data-v-3421a7f0]{display:inline-flex;gap:6px}.workspace-header__links a[data-v-3421a7f0]{display:inline-flex;align-items:center;height:24px;padding:0 10px;border:1px solid var(--glass-edge);border-radius:999px;background:rgb(var(--glass),.55);color:inherit;font-size:12px;font-weight:500}.workspace-header__links a[data-v-3421a7f0]:hover{background:rgb(var(--glass),.85)}.workspace-header__fold[data-v-3421a7f0]{grid-row:1;grid-column:3;place-self:center center;margin:0;color:inherit}.workspace-header__tiles[data-v-3421a7f0]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.workspace-header__tile[data-v-3421a7f0]{display:grid;align-content:start;gap:4px;padding:12px 16px;border:1px solid var(--glass-edge);border-radius:var(--md-r-card);background:rgb(var(--glass),calc(var(--glass-a) + .1));-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:var(--md-on-surface)}@media(prefers-reduced-transparency:reduce){.workspace-header__tile[data-v-3421a7f0]{background:var(--md-s-low);-webkit-backdrop-filter:none;backdrop-filter:none}}.workspace-header__tile-label[data-v-3421a7f0]{color:var(--md-on-surface-variant);font-size:12px;font-weight:500;line-height:16px;letter-spacing:.03em}.workspace-header__tile-value[data-v-3421a7f0]{min-height:40px;font-size:32px;font-weight:400;line-height:40px;font-variant-numeric:tabular-nums}.workspace-header__tile--you[data-v-3421a7f0]{border-color:transparent;background:var(--md-primary);color:var(--md-on-primary)}.workspace-header__tile--you .workspace-header__tile-label[data-v-3421a7f0]{color:var(--md-on-primary);opacity:.85}.workspace-header__tile--fail .workspace-header__tile-value[data-v-3421a7f0]{color:var(--md-error)}.workspace-header--collapsed[data-v-3421a7f0]{grid-template-columns:minmax(0,1fr) 32px;padding:4px 8px}.workspace-header--collapsed .workspace-header__title[data-v-3421a7f0]{display:flex;flex-wrap:wrap;align-items:baseline;gap:14px;padding:4px 8px}.workspace-header--collapsed .workspace-header__name[data-v-3421a7f0]{font-size:18px;line-height:28px}.workspace-header--collapsed .workspace-header__tiles[data-v-3421a7f0],.workspace-header--collapsed .workspace-header__give[data-v-3421a7f0]{display:none}.workspace-header--collapsed .workspace-header__fold[data-v-3421a7f0]{grid-column:2}.workspace-header--collapsed .workspace-header__strip[data-v-3421a7f0]{font-size:13px}@media(max-width:900px){.workspace-header[data-v-3421a7f0],.workspace-header--collapsed[data-v-3421a7f0]{grid-template-columns:minmax(0,1fr) 32px}.workspace-header__fold[data-v-3421a7f0]{grid-column:2}.workspace-header__tiles[data-v-3421a7f0]{grid-column:1 / -1}}@media(max-width:640px){.workspace-header__tiles[data-v-3421a7f0]{grid-template-columns:repeat(2,minmax(0,1fr))}}.chevron[data-v-a14fa9ba]{flex:none;display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;color:var(--md-on-surface-variant);cursor:pointer;-webkit-user-select:none;user-select:none}.chevron[data-v-a14fa9ba]:before{content:"";width:7px;height:7px;border-right:2px solid currentcolor;border-bottom:2px solid currentcolor;transform:translate(-1px) rotate(-45deg);transition:transform .15s ease}.chevron--open[data-v-a14fa9ba]:before{transform:translateY(-2px) rotate(45deg)}.chevron[data-v-a14fa9ba]:hover{background:var(--state-hover)}.chevron[data-v-a14fa9ba]:focus-visible{outline:var(--focus-ring)}.resize-handle[data-v-8e637688]{position:absolute;z-index:2;touch-action:none;border-radius:4px}.resize-handle[data-v-8e637688]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;border-radius:2px;background:var(--md-outline-variant);opacity:0;transition:opacity .15s ease}.resize-handle[data-v-8e637688]:hover:after,.resize-handle[data-v-8e637688]:focus-visible:after{opacity:1}.resize-handle[data-v-8e637688]:focus-visible{outline:var(--focus-ring)}.resize-handle--y[data-v-8e637688]{right:0;bottom:0;left:0;height:10px;cursor:row-resize}.resize-handle--y.resize-handle--top[data-v-8e637688]{top:0;bottom:auto}.resize-handle--y[data-v-8e637688]:after{width:40px;height:4px}.resize-handle--x[data-v-8e637688]{top:0;bottom:0;left:0;width:10px;cursor:col-resize}.resize-handle--x[data-v-8e637688]:after{width:4px;height:40px}@media(max-width:900px){.resize-handle[data-v-8e637688]{display:none}}.island__head[data-v-3605428a]{display:flex;flex-wrap:nowrap;align-items:center;justify-content:space-between;gap:8px;padding:12px 20px 12px 12px}.island__title[data-v-3605428a]{flex:none;margin:0;font-size:16px;line-height:24px;font-weight:500;letter-spacing:.01em;white-space:nowrap}.island__note[data-v-3605428a]{display:flex;flex:1 1 auto;align-items:center;justify-content:flex-end;gap:6px;min-width:0;margin:0;overflow:visible;color:var(--md-on-surface-variant);font-size:12px;line-height:16px;letter-spacing:.03em;text-align:right;white-space:nowrap;text-overflow:ellipsis}.island__note-text[data-v-3605428a]{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.island__body[data-v-3605428a]{padding:0 20px 12px}.island--column .island__head[data-v-3605428a]{gap:4px}.island--column .island__body[data-v-3605428a]{display:flex;flex-direction:column;min-height:0;padding-top:4px}.island.island--collapsed .island__body[data-v-3605428a]{display:none}@media(min-width:901px){.dashboard--fit .dashboard__main .island__body[data-v-3605428a]{display:flex;flex:1 1 auto;flex-direction:column;min-height:0;padding-bottom:0}.dashboard--fit .dashboard__main .island.island--collapsed .island__body[data-v-3605428a]{display:none}}.segmented[data-v-201d5e2f]{display:inline-flex;overflow:hidden;border:1px solid var(--md-outline);border-radius:999px;vertical-align:middle}.segmented--chips[data-v-201d5e2f]{flex:none;align-self:flex-start;background:rgb(var(--glass),.4)}.segmented__option[data-v-201d5e2f]{display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 11px;border-left:1px solid var(--md-outline);font-size:12px;font-weight:500;color:var(--md-on-surface);cursor:pointer;-webkit-user-select:none;user-select:none}.segmented__option[data-v-201d5e2f]:first-child{border-left:0}.segmented__option[aria-pressed=true][data-v-201d5e2f]{background:var(--md-secondary-container);color:var(--md-on-secondary-container)}.segmented__option[data-v-201d5e2f]:focus-visible{outline:var(--focus-ring);outline-offset:-2px}.segmented--chips .segmented__option[data-v-201d5e2f]{gap:normal;height:32px;padding:0 14px;font-family:var(--md-font);font-size:14px;letter-spacing:.01em}.segmented--chips .segmented__option[data-v-201d5e2f]:hover{background:var(--state-hover)}.segmented--chips .segmented__option[aria-pressed=true][data-v-201d5e2f]{background:var(--md-secondary-container);color:var(--md-on-secondary-container)}.ticket-cell__summary[data-v-e2d11a0b]{display:block;max-width:44ch;margin-top:2px;color:var(--md-on-surface-variant);font-size:12px;line-height:16px;letter-spacing:.03em}.pr-cell[data-v-6078ccbd]{display:flex;flex-direction:column;align-items:flex-start;gap:4px}.pr-cell__link[data-v-6078ccbd]{max-width:100%;overflow-wrap:anywhere}.recently-done[data-v-68a4b78e]{position:relative;display:flex;flex:0 1 auto;flex-direction:column;min-height:33px;margin:0 -20px;padding:0 20px;overflow:hidden;border-top:1px solid var(--md-outline-variant)}.recently-done[open][data-v-68a4b78e]{min-height:128px}.recently-done__summary[data-v-68a4b78e]{display:flex;flex:none;align-items:center;gap:4px;min-height:40px;list-style:none;color:var(--md-on-surface-variant);font-size:14px;font-weight:500;cursor:pointer}.recently-done__summary[data-v-68a4b78e]::-webkit-details-marker{display:none}.recently-done__list[data-v-68a4b78e]{flex:1 1 auto;min-height:0;max-height:min(30vh,240px);margin:0 -20px;padding-bottom:8px;overflow:auto}.row-scroll[data-v-263b2407]{overflow-x:auto;margin:0 -20px}@media(min-width:901px){.dashboard--fit .dashboard__main .row-scroll[data-v-263b2407]{flex:1 1 auto;min-height:0;overflow:auto}.dashboard--fit .row-scroll[data-v-263b2407]::-webkit-scrollbar{width:8px;height:8px}.dashboard--fit .row-scroll[data-v-263b2407]::-webkit-scrollbar-thumb{border-radius:4px;background:var(--md-outline-variant)}}.dashboard--fit .dashboard__main .row-scroll--floor[data-v-263b2407]{min-height:5rem}.row-scroll__more[data-v-263b2407]{flex:none;display:block;margin:0 -20px;padding:4px 20px 6px;border-top:1px solid var(--md-outline-variant);color:var(--md-primary);font-size:13px;font-weight:500;cursor:pointer}.row-scroll__more[data-v-263b2407]:hover{background:rgb(var(--md-state),.06)}.row-scroll__more[data-v-263b2407]:focus-visible{outline:var(--focus-ring);outline-offset:-2px}.your-move__undo[data-v-a331a3e6]{margin:0;padding:4px 0;color:var(--md-on-surface-variant);font-size:13px}.your-move__undo-btn[data-v-a331a3e6]{color:var(--md-primary);font-weight:500;cursor:pointer}.your-move__view[data-v-a331a3e6]{margin-left:10px}.your-move__next[data-v-a331a3e6]{font-weight:500}.your-move__quote[data-v-a331a3e6]{max-width:48ch;color:var(--md-on-surface-variant);font-size:12px;line-height:16px}.your-move__quote a[data-v-a331a3e6]{color:var(--md-on-surface-variant)}.your-move__problem[data-v-a331a3e6]{margin:4px 0 0;padding:4px 10px;font-size:12px}.your-move__mark[data-v-a331a3e6]{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 12px;border:1px solid var(--md-outline);border-radius:999px;color:var(--md-on-surface);font-size:12px;font-weight:600;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none}.your-move__mark[data-v-a331a3e6]:hover{background:var(--state-hover)}.your-move__mark[data-v-a331a3e6]:before{content:"";width:9px;height:5px;border-bottom:2px solid currentcolor;border-left:2px solid currentcolor;transform:translateY(-2px) rotate(-45deg)}.your-move__mark--undo[data-v-a331a3e6]:before{display:none}.your-move__mark[data-v-a331a3e6]:focus-visible{outline:var(--focus-ring);outline-offset:2px}.your-move__row--handled td[data-v-a331a3e6]{opacity:.55}.your-move__row--handled .your-move__next[data-v-a331a3e6]{text-decoration:line-through;text-decoration-color:var(--md-outline)}.your-move__row--handled .table__actions[data-v-a331a3e6]{opacity:1}.todos__view[data-v-6dbdbb66]{margin-left:10px}.todos__add[data-v-6dbdbb66]{display:flex;align-items:center;gap:8px;padding:8px 0}.todos__input[data-v-6dbdbb66]{flex:1;min-width:0;height:32px;padding:0 12px;background:rgb(var(--md-state),.04);font-size:14px}.todos__list[data-v-6dbdbb66]{margin:0 -20px;padding:0;overflow-y:auto;list-style:none}.todos__item[data-v-6dbdbb66]{display:grid;grid-template-columns:20px minmax(0,1fr) auto 20px 20px;align-items:center;gap:10px;padding:7px 20px;border-top:1px solid var(--md-outline-variant)}.todos__item[data-v-6dbdbb66]:first-child{border-top:0}.todos__item[data-v-6dbdbb66]:hover{background:rgb(var(--md-state),.06)}.todos__text[data-v-6dbdbb66]{overflow-wrap:anywhere}.todos__item--done .todos__text[data-v-6dbdbb66]{color:var(--md-on-surface-variant);text-decoration:line-through}.todos__empty[data-v-6dbdbb66]{display:block;padding:6px 20px 10px}.todos__check[data-v-6dbdbb66]{box-sizing:border-box;display:grid;place-items:center;width:18px;height:18px;border:2px solid var(--md-outline);border-radius:5px;cursor:pointer}.todos__check--on[data-v-6dbdbb66]{border-color:var(--md-primary);background:var(--md-primary)}.todos__check--on[data-v-6dbdbb66]:after{content:"";width:8px;height:4px;border-bottom:2px solid var(--md-on-primary);border-left:2px solid var(--md-on-primary);transform:translateY(-1px) rotate(-45deg)}.todos__meta[data-v-6dbdbb66]{color:var(--md-on-surface-variant);font-size:11px;white-space:nowrap}.todos__edit[data-v-6dbdbb66]{min-width:0;height:28px;padding:0 8px;font-size:14px}.todos__undo[data-v-6dbdbb66]{margin:0;padding:4px 0;color:var(--md-on-surface-variant);font-size:13px}.todos__undo-btn[data-v-6dbdbb66]{color:var(--md-primary);font-weight:500;cursor:pointer}.todos__pencil[data-v-6dbdbb66],.todos__delete[data-v-6dbdbb66]{color:var(--md-on-surface-variant);font-size:16px;line-height:1;text-align:center;cursor:pointer;opacity:0}.todos__pencil[data-v-6dbdbb66]:focus-visible,.todos__delete[data-v-6dbdbb66]:focus-visible{opacity:1}.todos__item:hover .todos__pencil[data-v-6dbdbb66],.todos__item:hover .todos__delete[data-v-6dbdbb66]{opacity:1}@media(min-width:901px){.dashboard--fit .dashboard__todo .todos__list[data-v-6dbdbb66]{flex:1 1 auto;min-height:0}.dashboard--fit .dashboard__todo .todos__list[data-v-6dbdbb66]:not(:has(.todos__item)){display:none}}.waiting__table[data-v-90e8bf77]{table-layout:fixed}.waiting__col--ticket[data-v-90e8bf77]{width:22%}.waiting__col--status[data-v-90e8bf77],.waiting__col--with[data-v-90e8bf77]{width:6.5rem}.waiting__col--pr[data-v-90e8bf77]{width:4.5rem}.waiting__col--actions[data-v-90e8bf77]{width:2rem}.waiting__reason[data-v-90e8bf77]{display:block;min-width:0;max-width:44ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-item[data-v-03f50e9f]{display:grid;grid-template-columns:32px minmax(0,1fr);align-items:start;gap:12px;padding:10px 20px;cursor:default}.feed-item[data-v-03f50e9f]:hover{background:var(--state-hover)}.feed-item.feed-item--open[data-v-03f50e9f]{background:rgb(var(--md-state),.05)}.feed-item.feed-item--new[data-v-03f50e9f]{background:var(--new-bg);box-shadow:inset 4px 0 0 var(--new),inset 0 0 0 1px var(--new-edge)}.feed-item__icon[data-v-03f50e9f]{flex:none;display:grid;place-items:center;width:32px;height:32px;border-radius:50%;background:var(--md-s-highest);color:var(--md-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.02em}.feed-item__icon--jira[data-v-03f50e9f]{background:var(--md-primary-container);color:var(--md-on-primary-container)}.feed-item__icon--bad[data-v-03f50e9f]{background:var(--md-error-container);color:var(--md-on-error-container)}.feed-item__icon--ok[data-v-03f50e9f]{background:var(--md-tertiary-container);color:var(--md-on-tertiary-container)}.feed-item__body[data-v-03f50e9f]{display:grid;gap:2px;min-width:0}.feed-item__top[data-v-03f50e9f]{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px;font-size:14px}.feed-item__right[data-v-03f50e9f]{flex:none;display:inline-flex;align-items:center;gap:4px;margin-left:auto}.feed-item__kind[data-v-03f50e9f]{font-weight:500}.feed-item__kind--bad[data-v-03f50e9f]{color:var(--md-error)}.feed-item__who[data-v-03f50e9f]{color:var(--md-on-surface-variant)}.feed-item__text[data-v-03f50e9f]{display:-webkit-box;overflow:hidden;color:var(--md-on-surface-variant);font-size:12px;line-height:16px;letter-spacing:.03em;overflow-wrap:anywhere;-webkit-line-clamp:2;-webkit-box-orient:vertical}.feed-item__full[data-v-03f50e9f]{max-height:16rem;margin-top:6px;padding:10px 12px;overflow:auto;border:1px solid var(--glass-edge);border-radius:var(--md-r-chip);background:rgb(var(--glass),.55);color:var(--md-on-surface);font-size:13px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.feed-item__actions[data-v-03f50e9f]{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.feed-item--new .feed-item__kind[data-v-03f50e9f]{color:var(--md-on-surface);font-weight:700}.feed-item--new .feed-item__text[data-v-03f50e9f]{color:var(--md-on-surface)}.feed-item--new .feed-item__icon[data-v-03f50e9f]{box-shadow:0 0 0 2px var(--new)}.feed-item--new .feed-item__when[data-v-03f50e9f]:before{content:"NEW";display:inline-block;margin-right:6px;padding:1px 6px;border-radius:4px;background:var(--new);color:var(--new-ink);font-size:10px;font-weight:800;letter-spacing:.06em;vertical-align:1px}.feed-item:not(.feed-item--new) .feed-item__body[data-v-03f50e9f]{opacity:.78}@media(max-width:1500px){.feed[data-v-ce5c36bb] .island__note-text{display:none}}.feed__undo[data-v-ce5c36bb]{margin:0 0 4px;color:var(--md-on-surface-variant);font-size:13px}.feed__undo-btn[data-v-ce5c36bb]{color:var(--md-primary);font-weight:500;cursor:pointer}.feed__bar[data-v-ce5c36bb]{display:flex;flex:none;flex-wrap:nowrap;align-items:center;justify-content:space-between;gap:8px;margin:0 0 8px}.feed__new-count[data-v-ce5c36bb]{display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:999px;background:var(--new);color:var(--new-ink);box-shadow:0 0 12px var(--new-glow);font-size:12px;font-weight:800}.feed__mark-read[data-v-ce5c36bb]{flex:none;padding:4px 8px;border-radius:999px;color:var(--md-primary);font-size:13px;font-weight:500;cursor:pointer;-webkit-user-select:none;user-select:none}.feed__mark-read[data-v-ce5c36bb]:hover{background:var(--state-hover)}.feed__mark-read[data-v-ce5c36bb]:focus-visible{outline:var(--focus-ring)}.feed__search[data-v-ce5c36bb]{display:flex;flex:none;align-items:center;gap:8px;margin:0 0 8px}.feed__search-input[data-v-ce5c36bb]{flex:1;min-width:0;height:30px;padding:0 10px;font-size:13px}.feed__search-count[data-v-ce5c36bb]{flex:none;color:var(--md-on-surface-variant);font-size:12px}.feed__list[data-v-ce5c36bb]{flex:1 1 auto;min-height:12rem;margin:0 -20px;padding:0 0 4px;overflow-y:auto;list-style:none}.feed__group[data-v-ce5c36bb]{display:grid;grid-template-columns:minmax(0,1fr);align-items:start;gap:0;padding:0;cursor:default}.feed__group[data-v-ce5c36bb]:hover{background:var(--state-hover)}.feed__group.feed__group--open[data-v-ce5c36bb]{background:rgb(var(--md-state),.05)}.feed__group.feed__group--new[data-v-ce5c36bb]{background:var(--new-bg);box-shadow:inset 4px 0 0 var(--new),inset 0 0 0 1px var(--new-edge)}.feed__group-head[data-v-ce5c36bb]{display:grid;grid-template-columns:24px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px 20px;cursor:pointer}.feed__group-copy[data-v-ce5c36bb]{opacity:.55}.feed__group-head:hover .feed__group-copy[data-v-ce5c36bb]{opacity:1}.feed__group-head[data-v-ce5c36bb]:hover{background:var(--state-hover)}.feed__group--new>.feed__group-head[data-v-ce5c36bb]{background:var(--new-bg);box-shadow:inset 4px 0 0 var(--new)}.feed__group--move[data-v-ce5c36bb],.feed__group--move>.feed__group-head[data-v-ce5c36bb]{box-shadow:inset 4px 0 0 var(--move)}.feed__group.feed__group--new.feed__group--move[data-v-ce5c36bb]{box-shadow:inset 4px 0 0 var(--move),inset 0 0 0 1px var(--new-edge)}.feed__group-text[data-v-ce5c36bb]{min-width:0}.feed__group-key[data-v-ce5c36bb]{display:flex;align-items:baseline;gap:8px;font-size:14px}.feed__group-ticket[data-v-ce5c36bb]{flex:none;font-weight:600}.feed__group-sum[data-v-ce5c36bb]{overflow:hidden;color:var(--md-on-surface-variant);font-size:13px;text-overflow:ellipsis;white-space:nowrap}.feed__group-meta[data-v-ce5c36bb]{display:flex;align-items:center;gap:8px;margin-top:2px;color:var(--md-on-surface-variant);font-size:12px}.feed__group-kinds[data-v-ce5c36bb]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed__group-when[data-v-ce5c36bb]{margin-left:auto}.feed__group-count[data-v-ce5c36bb]{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:var(--md-s-highest);color:var(--md-on-surface-variant);font-size:11px;font-weight:700}.feed__group-count--new[data-v-ce5c36bb]{background:var(--new);color:var(--new-ink)}.feed__children[data-v-ce5c36bb]{margin:0 0 0 31px;padding:0 0 4px;border-left:2px solid var(--md-outline-variant);list-style:none}.feed__children .feed-item[data-v-ce5c36bb]{padding-left:14px}@media(min-width:901px){.dashboard--fit .feed__list[data-v-ce5c36bb]::-webkit-scrollbar{width:8px;height:8px}.dashboard--fit .feed__list[data-v-ce5c36bb]::-webkit-scrollbar-thumb{border-radius:4px;background:var(--md-outline-variant)}}@media(max-width:900px){.feed__list[data-v-ce5c36bb]{max-height:28rem}}.first-run[data-v-84359c2d]{display:grid;place-self:start center;gap:14px;width:min(640px,100%);padding:28px 32px}.first-run__title[data-v-84359c2d]{margin:0;font-size:22px;font-weight:400;line-height:28px}.first-run__text[data-v-84359c2d]{margin:0;color:var(--md-on-surface-variant)}.first-run__actions[data-v-84359c2d]{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}.first-run__ai[data-v-84359c2d]{font-size:13px}.markdown-view[data-v-dcf42e95]{padding:16px 20px 20px;overflow:auto;overflow-wrap:anywhere;font-size:14px;line-height:1.6}.markdown-view[data-v-dcf42e95] h4,.markdown-view[data-v-dcf42e95] h5{margin:16px 0 6px;font-weight:600}.markdown-view[data-v-dcf42e95] h4{font-size:16px}.markdown-view[data-v-dcf42e95] h5{font-size:14px}.markdown-view[data-v-dcf42e95] p{margin:0 0 10px}.markdown-view[data-v-dcf42e95] ul,.markdown-view[data-v-dcf42e95] ol{margin:0 0 10px;padding-left:22px}.markdown-view[data-v-dcf42e95] li{margin:2px 0}.markdown-view[data-v-dcf42e95] code{padding:1px 5px;border-radius:4px;background:rgb(var(--md-state),.1);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em}.markdown-view[data-v-dcf42e95] pre{margin:0 0 12px;padding:12px 14px;overflow:auto;border-radius:8px;background:#00000047}.markdown-view[data-v-dcf42e95] pre code{padding:0;background:none;font-size:12.5px;line-height:1.5;white-space:pre}.markdown-view[data-v-dcf42e95] blockquote{margin:0 0 10px;padding:4px 12px;border-left:3px solid var(--md-primary);color:var(--md-on-surface-variant)}.markdown-view[data-v-dcf42e95] strong{font-weight:600}.markdown-view[data-v-dcf42e95] .markdown-view__mention{color:var(--md-primary);font-weight:500}.feedback-sheet__card[data-v-8e2792d9]{width:min(640px,100%)}.feedback-sheet__text[data-v-8e2792d9]{min-height:7rem;resize:vertical}.feedback-sheet__note[data-v-8e2792d9]{margin:0;color:var(--md-on-surface-variant);font-size:12px}.feedback-sheet__report[data-v-8e2792d9]{display:flex;align-items:baseline;gap:8px;padding:4px 0;border-top:1px solid var(--md-outline-variant);font-size:13px}.feedback-sheet__report-title[data-v-8e2792d9]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field-row[data-v-33714840]{display:grid;grid-template-columns:170px minmax(0,1fr);align-items:center;gap:4px 14px}.field-row__label[data-v-33714840]{color:var(--md-on-surface);font-size:13px}.field-row__hint[data-v-33714840]{grid-column:2;color:var(--md-on-surface-variant);font-size:11px}.field-row__error[data-v-33714840]{grid-column:2;color:var(--md-error);font-size:12px}.field-row__check[data-v-33714840]{display:flex;align-items:center;gap:8px;color:var(--md-on-surface-variant);font-size:11px}.field-row__colour[data-v-33714840]{width:44px;height:30px;padding:2px}.field-row__inline[data-v-33714840]{display:flex;align-items:center;gap:8px}.settings-sheet__card[data-v-649d0735]{width:min(1040px,100%);height:min(760px,100%)}.settings-sheet__dirty[data-v-649d0735]{color:var(--md-error);font-size:12px;font-weight:600}.settings-sheet__confirm[data-v-649d0735]{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:12px 20px 0;padding:8px 12px;border-radius:10px;background:var(--md-warn-container);color:var(--md-on-warn-container);font-size:13px}.settings-sheet__confirm-text[data-v-649d0735]{flex:1}.settings-sheet__alert[data-v-649d0735]{margin:12px 20px 0}.settings-sheet__body[data-v-649d0735]{display:grid;flex:1;grid-template-columns:220px minmax(0,1fr);gap:0;min-height:0}.settings-sheet__list[data-v-649d0735]{display:flex;flex-direction:column;gap:4px;margin:0;padding:12px;overflow:auto;border-right:1px solid var(--md-outline-variant);list-style:none}.settings-sheet__workspace[data-v-649d0735]{box-sizing:border-box;display:block;width:100%;padding:8px 12px;overflow:hidden;border-radius:10px;font-size:14px;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.settings-sheet__workspace[data-v-649d0735]:hover{background:var(--state-hover)}.settings-sheet__workspace[aria-current=true][data-v-649d0735]{background:var(--md-secondary-container);color:var(--md-on-secondary-container)}.settings-sheet__workspace[data-v-649d0735]:focus-visible{outline:var(--focus-ring);outline-offset:-2px}.settings-sheet__workspace--add[data-v-649d0735]{color:var(--md-primary);font-weight:500}.settings-sheet__connector[data-v-649d0735]{display:flex;flex-direction:column;gap:10px;padding:12px 14px;border:1px solid var(--md-outline-variant);border-radius:12px;background:rgb(var(--glass),.35)}.settings-sheet__connector-head[data-v-649d0735]{display:flex;align-items:center;gap:10px}.settings-sheet__connector-name[data-v-649d0735]{flex:1;font-weight:600}.settings-sheet__actions[data-v-649d0735]{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.settings-sheet__rules[data-v-649d0735]{display:flex;flex-direction:column;gap:6px;margin:0;padding:0 0 0 28px;font-size:13px}.settings-sheet__rule[data-v-649d0735]{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,2fr);gap:12px;padding:4px 0;border-bottom:1px solid var(--md-outline-variant)}.settings-sheet__rule-when[data-v-649d0735]{color:var(--md-on-surface-variant);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;overflow-wrap:anywhere}.settings-sheet__rule-then[data-v-649d0735]{overflow-wrap:anywhere}.settings-sheet__rules-note[data-v-649d0735]{margin:0;color:var(--md-on-surface-variant)}.settings-sheet__rules-warning[data-v-649d0735]{margin:0;padding:6px 10px;border-radius:8px;background:var(--md-warn-container);color:var(--md-on-warn-container)}.app__shell[data-v-6bc064de]{box-sizing:border-box;display:flex;flex-direction:column;height:100%;padding:12px 12px 12px 72px}.app__shell>.dashboard[data-v-6bc064de]{flex:1 1 auto;min-height:0}@media(min-width:901px){.app__shell>.dashboard.dashboard--fit[data-v-6bc064de]{height:auto}}@media(max-width:900px){.app__shell[data-v-6bc064de]{height:auto}}