home-hosted 0.7.0 → 0.7.2

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.
@@ -17,23 +17,25 @@ opt-in, and the bot token never leaves the secrets file.
17
17
 
18
18
  ```bash
19
19
  TOKEN='123456:ABC...'
20
+ WS='?workspace=default' # every notifications route is workspace-scoped; omit for the default one
20
21
 
21
- curl -X POST http://127.0.0.1:3999/api/notifications/token \
22
+ curl -X POST "http://127.0.0.1:3999/api/notifications/token$WS" \
22
23
  -H 'content-type: application/json' -H "Authorization: Bearer $HH_TOKEN" \
23
24
  -d "{\"botToken\":\"$TOKEN\"}"
24
25
 
25
26
  # which chats can this bot see (after you message it once)?
26
- curl -X POST http://127.0.0.1:3999/api/notifications/detect-chats \
27
+ curl -X POST "http://127.0.0.1:3999/api/notifications/detect-chats$WS" \
27
28
  -H 'content-type: application/json' -H "Authorization: Bearer $HH_TOKEN" \
28
29
  -d "{\"botToken\":\"$TOKEN\"}"
29
30
 
30
- curl -X POST http://127.0.0.1:3999/api/notifications/test \
31
+ curl -X POST "http://127.0.0.1:3999/api/notifications/test$WS" \
31
32
  -H 'content-type: application/json' -H "Authorization: Bearer $HH_TOKEN" \
32
33
  -d '{"chatId":"123456789"}'
33
34
  ```
34
35
 
35
36
  `detect-chats` and `test` accept an override, so a token can be tried before it is saved.
36
- `DELETE /api/notifications/token` removes it.
37
+ `DELETE /api/notifications/token` removes it. Each workspace keeps its own token and target; the
38
+ panel-wide host alerts use every workspace's own settings.
37
39
 
38
40
  </details>
39
41
 
@@ -0,0 +1,161 @@
1
+ # Reverse proxy
2
+
3
+ Expose the whole stack through one engine with automatic HTTPS: `git.example.com` →
4
+ your Gitea entry, `media.example.com` → Jellyfin, `panel.example.com` → this panel.
5
+
6
+ The engine is **Caddy**, downloaded and supervised by the panel. You never edit its
7
+ configuration — the panel generates it from the route table and applies it through
8
+ Caddy's admin API, which is atomic: a configuration that does not load leaves the
9
+ running one in place.
10
+
11
+ Setup is **Others → Reverse Proxy** in the sidebar.
12
+
13
+ ## Quick start
14
+
15
+ 1. **Install the engine** — one button, a pinned Caddy release (~46 MB) into
16
+ `$HHOSTED_HOME/.hh/.proxy/bin/`. The version and its SHA-256 are shown afterwards.
17
+ 2. **Set the ports** — `80` and `443` by default, plus the ACME account e-mail.
18
+ 3. **Add a route** — a hostname and a target.
19
+ 4. Point the hostname's DNS at this machine (Dynamic DNS can do that) and switch the
20
+ proxy on.
21
+
22
+ ```json
23
+ {
24
+ "proxy": {
25
+ "enabled": true,
26
+ "engine": "caddy",
27
+ "httpPort": 80,
28
+ "httpsPort": 443,
29
+ "email": "me@example.com",
30
+ "staging": false,
31
+ "routes": [
32
+ { "id": "gitea", "host": "git.example.com", "target": "server", "workspace": "default", "server": "gitea" },
33
+ { "id": "panel", "host": "panel.example.com", "target": "panel" },
34
+ { "id": "nas", "host": "nas.example.com", "target": "external", "url": "http://10.0.0.5:8080", "tls": "off" }
35
+ ]
36
+ }
37
+ }
38
+ ```
39
+
40
+ That block lives in `$HHOSTED_HOME/.hh/settings.json` — the panel writes it for you.
41
+
42
+ ## Ports
43
+
44
+ `80` and `443` are what automatic HTTPS wants: a certificate is issued over an ACME
45
+ challenge on one of them, and anything else needs the router to forward them anyway.
46
+
47
+ Binding below 1024 needs a privilege. On Linux:
48
+
49
+ ```sh
50
+ sudo setcap 'cap_net_bind_service=+ep' "$HHOSTED_HOME/.hh/.proxy/bin/hh-caddy"
51
+ ```
52
+
53
+ Otherwise use **4480/4443** — one click in the page, or `httpPort`/`httpsPort` — and
54
+ forward `80 → 4480` and `443 → 4443` on your router. A port already in use is reported with
55
+ the pid that holds it, on a first start and on a later change alike, and no listener the
56
+ panel did not start is ever killed.
57
+
58
+ ## Routes
59
+
60
+ | Field | Notes |
61
+ | --- | --- |
62
+ | `id` | Stable name, `[a-z0-9_-]`. |
63
+ | `host` | The public hostname. A local-only name (`gitea.lan`, `box`, an IP) gets the engine's own CA instead of a public certificate. |
64
+ | `enabled` | A disabled route stays configured but is not served. |
65
+ | `target` | `server` (a supervised entry), `panel` (this control panel), `external` (any `host:port`). |
66
+ | `workspace` + `server` | For `target: "server"` — an id is only unique inside its workspace. The upstream address is resolved live; a stopped entry leaves the hostname dark and the page says so. |
67
+ | `url` | For `target: "external"`, e.g. `http://10.0.0.5:8080`. An `https://` upstream is dialled with TLS, and **its certificate is not verified** — a homelab upstream behind a self-signed certificate works, and so does an impostor. |
68
+ | `path` | Optional prefix, so one hostname can serve several apps. |
69
+ | `tls` | `auto` (default), `off`, `manual`. |
70
+
71
+ A route pointing at the panel is exposure, and answers to the same rule as binding the
72
+ listener beyond loopback: authentication on and a non-default password, or the save is
73
+ refused.
74
+
75
+ ## HTTPS
76
+
77
+ | `tls` | What it means |
78
+ | --- | --- |
79
+ | `auto` | The engine decides. A public name gets a Let's Encrypt certificate (HTTP-01 or TLS-ALPN-01, with ZeroSSL as fallback and renewal in the background). A local-only name gets the engine's own locally-trusted CA. |
80
+ | `off` | Plain HTTP on the http port, no certificate. |
81
+ | `manual` | One of the uploaded pairs, whichever covers the hostname (the engine picks by SNI). A route set to this with no pair covering it is refused, rather than quietly given a certificate from somewhere else. |
82
+
83
+ `email` is required as soon as a route uses a public hostname, and it is the contact
84
+ address the ACME account is registered with. `staging` points that account at the ACME
85
+ staging endpoint while you test: the certificates are untrusted, and it is the way to
86
+ avoid burning a rate limit. Both reach the engine as one automation policy covering the
87
+ **public** names only, so a local-only name keeps the engine's own CA. The engine page
88
+ shows the soonest expiry among the publicly-issued certificates. Issuance is Let's
89
+ Encrypt; ZeroSSL is not offered as a second issuer because it needs an EAB key the panel
90
+ does not collect.
91
+
92
+ The challenge is the part that catches people out: with the proxy on 4480/4443, **80 has
93
+ to reach 4480 and 443 has to reach 4443**, or the CA never sees the challenge and the name
94
+ never gets its certificate.
95
+
96
+ **A name with no certificate yet is still reachable.** The engine's own CA is the last
97
+ issuer in the policy, so the handshake completes with an untrusted certificate — the
98
+ browser offers to continue instead of failing with `ERR_SSL_PROTOCOL_ERROR` — and over
99
+ plain HTTP the same name answers with a page saying so, naming the ports to forward,
100
+ rather than redirecting into a handshake that cannot finish. The panel re-applies the
101
+ configuration when the certificate arrives, and the route table shows where each name
102
+ stands: *issued* · *pending* · *failed* (with the engine's own reason) · *local* (the
103
+ engine CA) · *uploaded*.
104
+
105
+ ## Uploaded certificates
106
+
107
+ *Manual certificate* takes as many PEM pairs as you have names: add one per hostname,
108
+ label it, and the engine serves each to the name it covers. A route set to `manual` is
109
+ refused while no uploaded pair covers its hostname, and a pair cannot be removed while a
110
+ route still serves it — so the two can never disagree.
111
+
112
+ Certificates are read, never edited: the panel reports each pair's subject, issuer,
113
+ expiry and the hostnames it covers (from its SANs, wildcards included), and marks a pair
114
+ no route would be served from. An expired pair is never served — the route that asks for
115
+ it is refused with the reason. An uploaded pair is re-read as soon as its file changes,
116
+ so editing or replacing one outside the panel is picked up on the next look; the engine's
117
+ own certificate store (the issued certificates) is read at most every 15 seconds.
118
+
119
+ Certificates are managed by the engine, inside `.hh/.proxy/engine/`, and nothing else on
120
+ the machine is touched: the generated configuration pins its storage root, and the
121
+ panel passes the engine no `$HOME` of its own to write into.
122
+
123
+ **Not yet: DNS-01.** Wildcard certificates, and issuing with no inbound port at all,
124
+ need a Caddy build with the registrar's plugin compiled in — every registrar is a
125
+ separate Go module, and the stock binary ships none. The engine download path already
126
+ takes a plugin list, so this is the next step, not a redesign.
127
+
128
+ ## The engine
129
+
130
+ | | |
131
+ | --- | --- |
132
+ | Comes from | Caddy's own build service (`caddyserver.com/api/download`), at a version the panel pins — never "latest" by accident. |
133
+ | Installed at | `.hh/.proxy/bin/hh-caddy` + `engine.json` (version, URL, SHA-256, size). |
134
+ | Runs as | A child of the panel's own nanny, exactly like a `persistent: true` entry. |
135
+ | Supervised by | The panel. The admin API is opened on the panel side only: a unix socket in a `0700` directory (loopback TCP plus Caddy's origin check on Windows). |
136
+ | Reloaded by | `POST /load` — atomic, and the revision that applied is kept on disk so a change can be reverted in one click (the first one has nothing to go back to). A reload onto a port something else holds is refused with that pid before the engine is touched, and the panel keeps reporting the ports the engine is really on. |
137
+ | Stops with | **Stop** in the page, switching the proxy off, or `POST /api/proxy/stop`. It never stops itself, and `down` leaves it serving — the socket facing the internet is not something a panel restart should drop. It is never restarted automatically either: a configuration the engine refuses needs a person, not a retry loop. |
138
+
139
+ Because it runs under a nanny, a panel restart does not drop the socket that faces the
140
+ internet: the engine keeps serving, and the panel reattaches to it on the next boot.
141
+
142
+ ## API
143
+
144
+ | Route | What it does |
145
+ | --- | --- |
146
+ | `GET /api/proxy` | Policy, engine, live state and every route with its resolved upstream. |
147
+ | `PATCH /api/proxy` | Change the settings or replace the route list, then apply. |
148
+ | `POST /api/proxy/engine` | Install or update the engine (`{ "version": "" }` = the pinned one). |
149
+ | `PUT` \| `DELETE /api/proxy/certificates/:id` | Store or remove one uploaded pair (`{ label, certificate, privateKey }`). |
150
+ | `POST /api/proxy/start` \| `stop` \| `apply` \| `revert` | Engine lifecycle and configuration. |
151
+
152
+
153
+ ## Files
154
+
155
+ | Path | What |
156
+ | --- | --- |
157
+ | `.hh/.proxy/bin/` | The engine binary and the record of what was installed. |
158
+ | `.hh/.proxy/engine/current.json` | The generated configuration; `previous.json` is the revision before it. |
159
+ | `.hh/.proxy/state/` | The nanny's spec and state, and `admin.json` (how to reach a running engine). |
160
+ | `.hh/.proxy/tls/<id>.crt.pem` \| `<id>.key.pem` | One uploaded pair per entry (the key is `0600`). |
161
+ | `.hh/.logs/proxy.log` | The engine's own JSON output, as the nanny captures it. |
@@ -124,6 +124,7 @@ naming one that does not exist is a `404 UNKNOWN_WORKSPACE`, never a silent fall
124
124
  | `GET` / `PATCH /api/settings/workspace` | one workspace's settings: server defaults, log retention, notifications |
125
125
  | `POST` / `DELETE /api/settings/ui` | install or revert a UI — what Global settings calls |
126
126
  | `POST` / `DELETE /api/settings/tls` | upload or clear a PEM pair |
127
+ | `GET` / `PATCH /api/proxy`, `POST /api/proxy/{engine,start,stop,apply,revert}`, `PUT` / `DELETE /api/proxy/tls` | the panel-wide reverse proxy: engine, route table, its own PEM pair. Its live view also rides in the state frame as an optional `proxy` — read it defensively |
127
128
  | `GET` / `POST /api/backups`, `/api/backups/restore`, `/api/backups/:name/download` | archives; entries are global (`global:settings`, `global:secrets`, `global:tls`) or per workspace, whose leaves are `workspace:<id>:settings`, `:servers`, `:secrets` plus `data:<path>`; a create/restore body `include` selects them |
128
129
  | `POST` / `DELETE /api/notifications/token`, `/api/notifications/test`, `/detect-chats` | Telegram, per workspace |
129
130
  | `POST /api/auth/login`, `GET /api/auth/session`, `POST /api/auth/logout` | the session |
@@ -235,8 +236,10 @@ cd dist && zip -r ../my-panel.zip . && cd ..
235
236
 
236
237
  Your client needs the session cookie, which the browser sends automatically once you log in on that
237
238
  origin (a non-browser client uses an API token instead, above). For local development `pnpm dev` runs
238
- the panel on 3999 and a Vite dev server on 3998 with `/api` proxied — point your own dev server at
239
- `http://127.0.0.1:3999` the same way.
239
+ the panel on `6000` and a Vite dev server on `6001` with `/api` proxied — point your own dev server at
240
+ `http://127.0.0.1:6000` the same way. Both stay in the 6xxx range so a dev instance never collides
241
+ with an installed panel on the default 3999; override with `--port`/`--ui-port` or
242
+ `HHOSTED_DEV_PANEL_PORT`/`HHOSTED_DEV_UI_PORT`.
240
243
 
241
244
  ## Checklist
242
245
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "home-hosted",
3
3
  "type": "module",
4
- "version": "0.7.0",
4
+ "version": "0.7.2",
5
5
  "packageManager": "pnpm@12.5.1",
6
6
  "description": "Self-hosted control panel that keeps your home-server processes alive: supervision, restarts, port conflicts, logs — and a UI you can replace.",
7
7
  "author": "NamesMT <dangquoctrung123@gmail.com>",
@@ -57,6 +57,7 @@
57
57
  "dist",
58
58
  "docs/DDNS.md",
59
59
  "docs/NOTIFICATIONS.md",
60
+ "docs/REVERSE_PROXY.md",
60
61
  "docs/SERVERS.md",
61
62
  "docs/UI_CREATION.md",
62
63
  "uis/stock/dist"
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:"IBM Plex Sans Variable", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono Variable", ui-monospace, SFMono-Regular, Menlo, monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--container-7xl:80rem;--text-base:.875rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-relaxed:1.625;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"IBM Plex Sans Variable", ui-sans-serif, system-ui, sans-serif;--default-mono-font-family:"JetBrains Mono Variable", ui-monospace, SFMono-Regular, Menlo, monospace;--shadow-card:var(--shadow-card);--shadow-float:var(--shadow-float);--ease-out-quick:cubic-bezier(.22, 1, .36, 1)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:before,:after{border-color:var(--line)}html{-webkit-text-size-adjust:100%}body{background:var(--page);min-height:100dvh;color:var(--ink);font-family:var(--font-sans);font-size:var(--text-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0;line-height:1.5}h1,h2,h3,h4{letter-spacing:-.011em;margin:0;font-weight:600}button,input,select,textarea{font:inherit;color:inherit}code,kbd,samp{font-family:var(--font-mono);font-feature-settings:"zero" 1;font-size:.92em}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}::selection{background:var(--accent-soft)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--line);background-clip:content-box;border:3px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--faint);background-clip:content-box}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-3{inset-block:calc(var(--spacing) * 3)}.top-0{top:0}.top-1\/2{top:50%}.top-6{top:calc(var(--spacing) * 6)}.top-\[10vh\]{top:10vh}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.-ml-px{margin-left:-1px}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-4\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-13{height:calc(var(--spacing) * 13)}.h-20{height:calc(var(--spacing) * 20)}.h-64{height:calc(var(--spacing) * 64)}.h-72{height:calc(var(--spacing) * 72)}.h-\[18px\]{height:18px}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[60dvh\]{max-height:60dvh}.max-h-\[88dvh\]{max-height:88dvh}.max-h-\[min\(60vh\,26rem\)\]{max-height:min(60vh,26rem)}.min-h-0{min-height:0}.min-h-dvh{min-height:100dvh}.min-h-full{min-height:100%}.w-0\.5{width:calc(var(--spacing) * .5)}.w-2\/3{width:66.6667%}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-44{width:calc(var(--spacing) * 44)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[min\(92vw\,22rem\)\]{width:min(92vw,22rem)}.w-\[min\(92vw\,26rem\)\]{width:min(92vw,26rem)}.w-\[min\(92vw\,32rem\)\]{width:min(92vw,32rem)}.w-\[min\(92vw\,34rem\)\]{width:min(92vw,34rem)}.w-\[min\(92vw\,38rem\)\]{width:min(92vw,38rem)}.w-\[min\(92vw\,40rem\)\]{width:min(92vw,40rem)}.w-\[min\(92vw\,42rem\)\]{width:min(92vw,42rem)}.w-\[min\(94vw\,38rem\)\]{width:min(94vw,38rem)}.w-\[min\(94vw\,40rem\)\]{width:min(94vw,40rem)}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-44{min-width:calc(var(--spacing) * 44)}.min-w-52{min-width:calc(var(--spacing) * 52)}.min-w-56{min-width:calc(var(--spacing) * 56)}.min-w-full{min-width:100%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-2{--tw-translate-x:calc(var(--spacing) * 2);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[3px\]{--tw-translate-x:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-0{rotate:0deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.scroll-mt-5{scroll-margin-top:calc(var(--spacing) * 5)}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line-soft>:not(:last-child)){border-color:var(--line-soft)}.self-center{align-self:center}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[9px\]{border-radius:9px}.rounded-control{border-radius:.4375rem}.rounded-full{border-radius:2147483647px}.rounded-panel{border-radius:.6875rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent,.border-accent\/25{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/25{border-color:color-mix(in oklab, var(--accent) 25%, transparent)}}.border-accent\/30{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/30{border-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.border-danger,.border-danger\/25{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/25{border-color:color-mix(in oklab, var(--danger) 25%, transparent)}}.border-danger\/30{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/30{border-color:color-mix(in oklab, var(--danger) 30%, transparent)}}.border-danger\/40{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/40{border-color:color-mix(in oklab, var(--danger) 40%, transparent)}}.border-info\/25{border-color:var(--info)}@supports (color:color-mix(in lab, red, red)){.border-info\/25{border-color:color-mix(in oklab, var(--info) 25%, transparent)}}.border-line{border-color:var(--line)}.border-line-soft{border-color:var(--line-soft)}.border-ok\/25{border-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.border-ok\/25{border-color:color-mix(in oklab, var(--ok) 25%, transparent)}}.border-transparent{border-color:#0000}.border-warn\/25{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/25{border-color:color-mix(in oklab, var(--warn) 25%, transparent)}}.bg-accent{background-color:var(--accent)}.bg-accent-soft{background-color:var(--accent-soft)}.bg-accent\/80{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/80{background-color:color-mix(in oklab, var(--accent) 80%, transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\/45{background-color:#00000073}@supports (color:color-mix(in lab, red, red)){.bg-black\/45{background-color:color-mix(in oklab, var(--color-black) 45%, transparent)}}.bg-current{background-color:currentColor}.bg-danger{background-color:var(--danger)}.bg-danger-soft{background-color:var(--danger-soft)}.bg-danger\/85{background-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.bg-danger\/85{background-color:color-mix(in oklab, var(--danger) 85%, transparent)}}.bg-faint,.bg-faint\/50{background-color:var(--faint)}@supports (color:color-mix(in lab, red, red)){.bg-faint\/50{background-color:color-mix(in oklab, var(--faint) 50%, transparent)}}.bg-faint\/60{background-color:var(--faint)}@supports (color:color-mix(in lab, red, red)){.bg-faint\/60{background-color:color-mix(in oklab, var(--faint) 60%, transparent)}}.bg-hover{background-color:var(--hover)}.bg-info{background-color:var(--info)}.bg-info-soft{background-color:var(--info-soft)}.bg-info\/80{background-color:var(--info)}@supports (color:color-mix(in lab, red, red)){.bg-info\/80{background-color:color-mix(in oklab, var(--info) 80%, transparent)}}.bg-line{background-color:var(--line)}.bg-line-soft{background-color:var(--line-soft)}.bg-ok{background-color:var(--ok)}.bg-ok-soft{background-color:var(--ok-soft)}.bg-ok\/80{background-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.bg-ok\/80{background-color:color-mix(in oklab, var(--ok) 80%, transparent)}}.bg-page,.bg-page\/40{background-color:var(--page)}@supports (color:color-mix(in lab, red, red)){.bg-page\/40{background-color:color-mix(in oklab, var(--page) 40%, transparent)}}.bg-page\/60{background-color:var(--page)}@supports (color:color-mix(in lab, red, red)){.bg-page\/60{background-color:color-mix(in oklab, var(--page) 60%, transparent)}}.bg-panel{background-color:var(--panel)}.bg-panel-2,.bg-panel-2\/30{background-color:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.bg-panel-2\/30{background-color:color-mix(in oklab, var(--panel-2) 30%, transparent)}}.bg-panel-2\/40{background-color:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.bg-panel-2\/40{background-color:color-mix(in oklab, var(--panel-2) 40%, transparent)}}.bg-panel-2\/60{background-color:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.bg-panel-2\/60{background-color:color-mix(in oklab, var(--panel-2) 60%, transparent)}}.bg-panel-2\/70{background-color:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.bg-panel-2\/70{background-color:color-mix(in oklab, var(--panel-2) 70%, transparent)}}.bg-panel\/40{background-color:var(--panel)}@supports (color:color-mix(in lab, red, red)){.bg-panel\/40{background-color:color-mix(in oklab, var(--panel) 40%, transparent)}}.bg-panel\/50{background-color:var(--panel)}@supports (color:color-mix(in lab, red, red)){.bg-panel\/50{background-color:color-mix(in oklab, var(--panel) 50%, transparent)}}.bg-panel\/60{background-color:var(--panel)}@supports (color:color-mix(in lab, red, red)){.bg-panel\/60{background-color:color-mix(in oklab, var(--panel) 60%, transparent)}}.bg-panel\/80{background-color:var(--panel)}@supports (color:color-mix(in lab, red, red)){.bg-panel\/80{background-color:color-mix(in oklab, var(--panel) 80%, transparent)}}.bg-panel\/95{background-color:var(--panel)}@supports (color:color-mix(in lab, red, red)){.bg-panel\/95{background-color:color-mix(in oklab, var(--panel) 95%, transparent)}}.bg-raise{background-color:var(--raise)}.bg-transparent{background-color:#0000}.bg-warn{background-color:var(--warn)}.bg-warn-soft{background-color:var(--warn-soft)}.bg-warn\/10{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.bg-warn\/10{background-color:color-mix(in oklab, var(--warn) 10%, transparent)}}.bg-warn\/85{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.bg-warn\/85{background-color:color-mix(in oklab, var(--warn) 85%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-\[radial-gradient\(ellipse_at_center\,transparent_15\%\,var\(--page\)_78\%\)\]{background-image:radial-gradient(ellipse at center,transparent 15%,var(--page) 78%)}.fill-accent{fill:var(--accent)}.stroke-accent{stroke:var(--accent)}.stroke-danger{stroke:var(--danger)}.stroke-faint{stroke:var(--faint)}.stroke-info{stroke:var(--info)}.stroke-line-soft{stroke:var(--line-soft)}.stroke-ok{stroke:var(--ok)}.stroke-warn{stroke:var(--warn)}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-px{padding-block:1px}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-7{padding-left:calc(var(--spacing) * 7)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono Variable,ui-monospace,SFMono-Regular,Menlo,monospace}.font-sans{font-family:IBM Plex Sans Variable,ui-sans-serif,system-ui,sans-serif}.text-2xl{font-size:1.375rem;line-height:var(--tw-leading,1.75rem)}.text-2xs{font-size:.6875rem;line-height:var(--tw-leading,1rem)}.text-base{font-size:.875rem;line-height:var(--tw-leading,1.375rem)}.text-lg{font-size:1rem;line-height:var(--tw-leading,1.5rem)}.text-sm{font-size:.8125rem;line-height:var(--tw-leading,1.25rem)}.text-xl{font-size:1.125rem;line-height:var(--tw-leading,1.6rem)}.text-xs{font-size:.75rem;line-height:var(--tw-leading,1.1rem)}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-accent{color:var(--accent)}.text-accent-ink{color:var(--accent-ink)}.text-cpu{color:var(--series-cpu)}.text-danger{color:var(--danger)}.text-faint{color:var(--faint)}.text-info{color:var(--info)}.text-ink,.text-ink\/85{color:var(--ink)}@supports (color:color-mix(in lab, red, red)){.text-ink\/85{color:color-mix(in oklab, var(--ink) 85%, transparent)}}.text-mem{color:var(--series-mem)}.text-muted{color:var(--muted)}.text-ok{color:var(--ok)}.text-probe{color:var(--series-probe)}.text-warn{color:var(--warn)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-accent\/40{-webkit-text-decoration-color:var(--accent);-webkit-text-decoration-color:var(--accent);-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab, var(--accent) 40%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--accent) 40%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--accent) 40%, transparent);text-decoration-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.decoration-danger\/40{-webkit-text-decoration-color:var(--danger);-webkit-text-decoration-color:var(--danger);-webkit-text-decoration-color:var(--danger);text-decoration-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.decoration-danger\/40{-webkit-text-decoration-color:color-mix(in oklab, var(--danger) 40%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--danger) 40%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--danger) 40%, transparent);text-decoration-color:color-mix(in oklab, var(--danger) 40%, transparent)}}.decoration-line{-webkit-text-decoration-color:var(--line);-webkit-text-decoration-color:var(--line);-webkit-text-decoration-color:var(--line);text-decoration-color:var(--line)}.decoration-warn\/40{-webkit-text-decoration-color:var(--warn);-webkit-text-decoration-color:var(--warn);-webkit-text-decoration-color:var(--warn);text-decoration-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.decoration-warn\/40{-webkit-text-decoration-color:color-mix(in oklab, var(--warn) 40%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--warn) 40%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--warn) 40%, transparent);text-decoration-color:color-mix(in oklab, var(--warn) 40%, transparent)}}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow-\[inset_0_1px_0_rgb\(255_255_255\/0\.14\)\]{--tw-shadow:inset 0 1px 0 var(--tw-shadow-color,#ffffff24);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-card{--tw-shadow:var(--shadow-card);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-float{--tw-shadow:var(--shadow-float);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,border-color\,color\,filter\,opacity\]{transition-property:background-color,border-color,color,filter,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[stroke-dasharray\]{transition-property:stroke-dasharray;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.file\:mr-2::file-selector-button{margin-right:calc(var(--spacing) * 2)}.file\:cursor-pointer::file-selector-button{cursor:pointer}.file\:rounded::file-selector-button{border-radius:.25rem}.file\:rounded-control::file-selector-button{border-radius:.4375rem}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-line::file-selector-button{background-color:var(--line)}.file\:bg-panel-2::file-selector-button{background-color:var(--panel-2)}.file\:px-2::file-selector-button{padding-inline:calc(var(--spacing) * 2)}.file\:py-1::file-selector-button{padding-block:var(--spacing)}.file\:text-xs::file-selector-button{font-size:.75rem;line-height:var(--tw-leading,1.1rem)}.file\:text-ink::file-selector-button{color:var(--ink)}.placeholder\:text-faint::placeholder{color:var(--faint)}.first\:pt-0:first-child{padding-top:0}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.last\:pb-0:last-child{padding-bottom:0}.checked\:border-accent:checked{border-color:var(--accent)}.checked\:bg-accent:checked{background-color:var(--accent)}.checked\:bg-\[length\:9px\]:checked{background-size:9px}.checked\:bg-center:checked{background-position:50%}.checked\:bg-no-repeat:checked{background-repeat:no-repeat}@media (hover:hover){.hover\:border-accent\/40:hover{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent\/40:hover{border-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.hover\:border-line:hover,.hover\:border-line\/80:hover{border-color:var(--line)}@supports (color:color-mix(in lab, red, red)){.hover\:border-line\/80:hover{border-color:color-mix(in oklab, var(--line) 80%, transparent)}}.hover\:border-line\/90:hover{border-color:var(--line)}@supports (color:color-mix(in lab, red, red)){.hover\:border-line\/90:hover{border-color:color-mix(in oklab, var(--line) 90%, transparent)}}.hover\:bg-danger-soft:hover{background-color:var(--danger-soft)}.hover\:bg-hover:hover{background-color:var(--hover)}.hover\:bg-page:hover{background-color:var(--page)}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-accent:hover{color:var(--accent)}.hover\:text-ink:hover{color:var(--ink)}.hover\:text-muted:hover{color:var(--muted)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--accent);-webkit-text-decoration-color:var(--accent);-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent)}.hover\:decoration-danger:hover{-webkit-text-decoration-color:var(--danger);-webkit-text-decoration-color:var(--danger);-webkit-text-decoration-color:var(--danger);text-decoration-color:var(--danger)}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\:border-accent:focus{border-color:var(--accent)}.focus\:bg-page:focus{background-color:var(--page)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-accent\/25:focus{--tw-ring-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-accent\/25:focus{--tw-ring-color:color-mix(in oklab, var(--accent) 25%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-accent\/50:focus-visible{--tw-ring-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-accent\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.focus-visible\:ring-accent\/60:focus-visible{--tw-ring-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-accent\/60:focus-visible{--tw-ring-color:color-mix(in oklab, var(--accent) 60%, transparent)}}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-page:focus-visible{--tw-ring-offset-color:var(--page)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.active\:brightness-95:active{--tw-brightness:brightness(95%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.aria-\[invalid\=true\]\:border-danger[aria-invalid=true]{border-color:var(--danger)}.aria-\[invalid\=true\]\:focus\:ring-danger\/25[aria-invalid=true]:focus{--tw-ring-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.aria-\[invalid\=true\]\:focus\:ring-danger\/25[aria-invalid=true]:focus{--tw-ring-color:color-mix(in oklab, var(--danger) 25%, transparent)}}.data-\[highlighted\]\:bg-danger-soft[data-highlighted]{background-color:var(--danger-soft)}.data-\[highlighted\]\:bg-hover[data-highlighted]{background-color:var(--hover)}.data-\[highlighted\]\:text-ink[data-highlighted]{color:var(--ink)}.data-\[state\=checked\]\:translate-x-\[16px\][data-state=checked]{--tw-translate-x:16px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:border-accent[data-state=checked]{border-color:var(--accent)}.data-\[state\=checked\]\:bg-accent[data-state=checked]{background-color:var(--accent)}.data-\[state\=closed\]\:animate-\[hh-fade-out_120ms_ease-in\][data-state=closed]{animation:.12s ease-in hh-fade-out}.data-\[state\=closed\]\:animate-\[hh-pop-out_120ms_ease-in\][data-state=closed]{animation:.12s ease-in hh-pop-out}.data-\[state\=delayed-open\]\:animate-\[hh-fade-in_120ms_ease-out\][data-state=delayed-open],.data-\[state\=open\]\:animate-\[hh-fade-in_120ms_ease-out\][data-state=open]{animation:.12s ease-out hh-fade-in}.data-\[state\=open\]\:animate-\[hh-fade-in_150ms_ease-out\][data-state=open]{animation:.15s ease-out hh-fade-in}.data-\[state\=open\]\:animate-\[hh-pop-in_150ms_var\(--ease-out-quick\)\][data-state=open]{animation:hh-pop-in .15s var(--ease-out-quick)}.data-\[state\=open\]\:animate-\[hh-pop-in_160ms_var\(--ease-out-quick\)\][data-state=open]{animation:hh-pop-in .16s var(--ease-out-quick)}.data-\[state\=unchecked\]\:border-line[data-state=unchecked]{border-color:var(--line)}.data-\[state\=unchecked\]\:bg-line-soft[data-state=unchecked]{background-color:var(--line-soft)}@media (width>=40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:w-64{width:calc(var(--spacing) * 64)}.sm\:max-w-52{max-width:calc(var(--spacing) * 52)}.sm\:max-w-72{max-width:calc(var(--spacing) * 72)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr_1fr_auto\]{grid-template-columns:1fr 1fr auto}.sm\:items-end{align-items:flex-end}:where(.sm\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media (width>=48rem){.md\:flex{display:flex}}@media (width>=64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:block{display:block}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-\[11rem_minmax\(0\,1fr\)\]{grid-template-columns:11rem minmax(0,1fr)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}}.dark\:bg-white\/10:where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/10:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.bg-instrument{background-image:linear-gradient(to right, var(--line-soft) 1px, transparent 1px), linear-gradient(to bottom, var(--line-soft) 1px, transparent 1px);background-size:28px 28px}.no-scrollbar::-webkit-scrollbar{display:none}}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-weight:100 700;font-display:swap;src:url(/assets/plex-sans-latin-IvpUvPa2.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-weight:100 700;font-display:swap;src:url(/assets/plex-sans-latin-ext-CIII54If.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-weight:100 800;font-display:swap;src:url(/assets/jetbrains-mono-latin-B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-weight:100 800;font-display:swap;src:url(/assets/jetbrains-mono-latin-ext-DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--page:#eceff4;--panel:#fff;--panel-2:#f7f9fc;--raise:#fff;--hover:#edf1f7;--line:#dde3ec;--line-soft:#e8edf4;--ink:#0f1722;--muted:#596a81;--faint:#64748b;--accent:#2f5fe0;--accent-ink:#fff;--accent-soft:#2f5fe01a;--ok:#157f3c;--warn:#a9610a;--danger:#cf2f22;--info:#0b6f89;--ok-soft:#157f3c1a;--warn-soft:#a9610a1c;--danger-soft:#cf2f221a;--info-soft:#0b6f891a;--series-cpu:#2f5fe0;--series-mem:#7c3aed;--series-probe:#0b6f89;--shadow-card:0 1px 2px #0f17220a, 0 2px 8px -2px #0f17220f;--shadow-float:0 10px 30px -12px #0f172247, 0 2px 6px #0f17220f}.dark{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--page:#0a0e14;--panel:#111722;--panel-2:#151d29;--raise:#1a2432;--hover:#1e2939;--line:#222d3d;--line-soft:#1a2431;--ink:#e8eef8;--muted:#93a2b8;--faint:#8494ab;--accent:#6d8dff;--accent-ink:#08101f;--accent-soft:#6d8dff26;--ok:#34d399;--warn:#fbbf24;--danger:#f87171;--info:#38bdf8;--ok-soft:#34d39921;--warn-soft:#fbbf2421;--danger-soft:#f8717121;--info-soft:#38bdf821;--series-cpu:#6d8dff;--series-mem:#a78bfa;--series-probe:#22d3ee;--shadow-card:0 1px 0 #ffffff05, 0 10px 26px -18px #000000e6;--shadow-float:0 24px 60px -20px #000000bf, 0 2px 10px #00000059}@keyframes hh-fade-in{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:none}}@keyframes hh-fade-out{0%{opacity:1}to{opacity:0}}@keyframes hh-pop-in{0%{opacity:0;transform:translate(-50%,-50%)scale(.975)}to{opacity:1;transform:translate(-50%,-50%)scale(1)}}@keyframes hh-pop-out{0%{opacity:1;transform:translate(-50%,-50%)scale(1)}to{opacity:0;transform:translate(-50%,-50%)scale(.98)}}@keyframes hh-slide-in{0%{opacity:0;transform:translate(6px)}to{opacity:1;transform:none}}@keyframes hh-pulse-ring{0%{opacity:.5;box-shadow:0 0}70%,to{opacity:0;box-shadow:0 0 0 5px}}@keyframes hh-shimmer{to{transform:translate(100%)}}.hh-enter{animation:hh-fade-in .16s var(--ease-out-quick) both}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}