@agentxjs/portagent 1.2.0 → 1.4.0

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/README.md CHANGED
@@ -15,14 +15,27 @@ Portagent is a multi-user AI Agent gateway powered by [AgentX](https://github.co
15
15
 
16
16
  ## Quick Start
17
17
 
18
- ### Using Docker (Recommended)
18
+ ### Using npx (Quick Try)
19
+
20
+ One-liner to start, requires Node.js 20+:
21
+
22
+ ```bash
23
+ LLM_PROVIDER_KEY=sk-ant-xxxxx \
24
+ LLM_PROVIDER_URL=https://api.anthropic.com \
25
+ npx @agentxjs/portagent
26
+ ```
27
+
28
+ Then open <http://localhost:5200> in your browser.
29
+
30
+ ### Using Docker (Recommended for Production)
19
31
 
20
32
  ```bash
21
33
  docker run -d \
22
34
  --name portagent \
23
35
  -p 5200:5200 \
24
36
  -e LLM_PROVIDER_KEY=sk-ant-xxxxx \
25
- -v ./data:/home/agentx/.agentx \
37
+ -e LLM_PROVIDER_URL=https://api.anthropic.com \
38
+ -v ./data:/home/node/.agentx \
26
39
  deepracticexs/portagent:latest
27
40
  ```
28
41
 
@@ -55,7 +68,7 @@ services:
55
68
  - INVITE_CODE_REQUIRED=${INVITE_CODE_REQUIRED:-false}
56
69
  - LOG_LEVEL=${LOG_LEVEL:-info}
57
70
  volumes:
58
- - ./data:/home/agentx/.agentx
71
+ - ./data:/home/node/.agentx
59
72
  healthcheck:
60
73
  test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5200/health"]
61
74
  interval: 30s
@@ -76,8 +89,9 @@ docker compose up -d
76
89
  # Install globally
77
90
  npm install -g @agentxjs/portagent
78
91
 
79
- # Run with required API key
92
+ # Run with required environment variables
80
93
  export LLM_PROVIDER_KEY=sk-ant-xxxxx
94
+ export LLM_PROVIDER_URL=https://api.anthropic.com
81
95
  portagent
82
96
  ```
83
97
 
@@ -259,7 +273,7 @@ services:
259
273
  - INVITE_CODE_REQUIRED=true # Enable for production
260
274
  - LOG_LEVEL=info
261
275
  volumes:
262
- - ./data:/home/agentx/.agentx # Persist data
276
+ - ./data:/home/node/.agentx # Persist data
263
277
  ports:
264
278
  - "5200:5200"
265
279
  ```
@@ -270,7 +284,7 @@ services:
270
284
  2. **JWT Secret**: Use a strong, random secret and keep it consistent across restarts
271
285
  3. **Invite Codes**: Enable invite codes in production to control access
272
286
  4. **HTTPS**: Use a reverse proxy (nginx, Caddy) with TLS in production
273
- 5. **Volume Permissions**: The container runs as non-root user (uid 1001)
287
+ 5. **Volume Permissions**: The container runs as non-root user `node`
274
288
 
275
289
  ### Reverse Proxy (nginx example)
276
290
 
@@ -309,11 +323,11 @@ server {
309
323
 
310
324
  ### Permission denied errors
311
325
 
312
- - Docker container runs as user `agentx` (uid 1001)
326
+ - Docker container runs as user `node`
313
327
  - Ensure mounted volumes have correct permissions:
314
328
 
315
329
  ```bash
316
- sudo chown -R 1001:1001 ./data
330
+ sudo chown -R $(id -u):$(id -g) ./data
317
331
  ```
318
332
 
319
333
  ### WebSocket connection fails
@@ -331,7 +345,7 @@ docker logs portagent
331
345
  docker logs -f portagent
332
346
 
333
347
  # Log files inside container
334
- docker exec portagent cat /home/agentx/.agentx/logs/portagent.log
348
+ docker exec portagent cat /home/node/.agentx/logs/portagent.log
335
349
  ```
336
350
 
337
351
  ## Development
@@ -1,2 +1,2 @@
1
- import{_ as d,c as h}from"./index-BD6d8dsF.js";var f=Object.defineProperty,u=(e,r,n)=>r in e?f(e,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[r]=n,t=(e,r,n)=>u(e,typeof r!="symbol"?r+"":r,n),c=h("network/WebSocketClient"),l=typeof globalThis<"u"&&typeof globalThis.window<"u"&&typeof globalThis.window.WebSocket<"u",S=class{constructor(e){if(t(this,"ws",null),t(this,"serverUrl"),t(this,"messageHandlers",new Set),t(this,"openHandlers",new Set),t(this,"closeHandlers",new Set),t(this,"errorHandlers",new Set),l)throw new Error("Use createBrowserWebSocketClient() in browser environment for auto-reconnect support");this.serverUrl=e.serverUrl}get readyState(){if(!this.ws)return"closed";const e=this.ws.readyState;return e===0?"connecting":e===1?"open":e===2?"closing":"closed"}async connect(){if(this.ws)throw new Error("Already connected or connecting");const{WebSocket:e}=await d(async()=>{const{WebSocket:r}=await import("./browser-C0DG1J1h.js").then(n=>n.b);return{WebSocket:r}},[]);return this.ws=new e(this.serverUrl),new Promise((r,n)=>{const a=()=>{c.info("WebSocket connected",{serverUrl:this.serverUrl});for(const s of this.openHandlers)s();r()},o=s=>{c.error("WebSocket connection failed",{serverUrl:this.serverUrl,error:s==null?void 0:s.message}),n(s||new Error("WebSocket connection failed"))};this.ws.once("open",a),this.ws.once("error",o),this.ws.on("message",s=>{const i=s.toString();for(const w of this.messageHandlers)w(i)}),this.ws.on("close",()=>{c.warn("WebSocket closed");for(const s of this.closeHandlers)s()}),this.ws.on("error",s=>{c.error("WebSocket error",{error:s.message});for(const i of this.errorHandlers)i(s)})})}send(e){if(!this.ws||this.ws.readyState!==1)throw new Error("WebSocket is not open");this.ws.send(e)}onMessage(e){return this.messageHandlers.add(e),()=>{this.messageHandlers.delete(e)}}onOpen(e){return this.openHandlers.add(e),()=>{this.openHandlers.delete(e)}}onClose(e){return this.closeHandlers.add(e),()=>{this.closeHandlers.delete(e)}}onError(e){return this.errorHandlers.add(e),()=>{this.errorHandlers.delete(e)}}close(){this.ws&&(this.ws.close(),this.ws=null)}dispose(){this.close(),this.messageHandlers.clear(),this.openHandlers.clear(),this.closeHandlers.clear(),this.errorHandlers.clear()}},b=class{constructor(e){if(t(this,"ws",null),t(this,"serverUrl"),t(this,"options"),t(this,"messageHandlers",new Set),t(this,"openHandlers",new Set),t(this,"closeHandlers",new Set),t(this,"errorHandlers",new Set),t(this,"hasConnectedBefore",!1),!l)throw new Error("BrowserWebSocketClient can only be used in browser environment");this.serverUrl=e.serverUrl,this.options={autoReconnect:!0,minReconnectionDelay:1e3,maxReconnectionDelay:1e4,maxRetries:1/0,connectionTimeout:4e3,debug:!1,...e}}get readyState(){if(!this.ws)return"closed";const e=this.ws.readyState;return e===0?"connecting":e===1?"open":e===2?"closing":"closed"}async connect(){if(this.ws)throw new Error("Already connected or connecting");if(this.options.autoReconnect){const e=(await d(async()=>{const{default:r}=await import("./reconnecting-websocket-mjs-Dd04wD44.js");return{default:r}},[])).default;this.ws=new e(this.serverUrl,[],{maxReconnectionDelay:this.options.maxReconnectionDelay,minReconnectionDelay:this.options.minReconnectionDelay,reconnectionDelayGrowFactor:1.3,connectionTimeout:this.options.connectionTimeout,maxRetries:this.options.maxRetries,debug:this.options.debug})}else this.ws=new WebSocket(this.serverUrl);return new Promise((e,r)=>{const n=()=>{this.hasConnectedBefore?c.info("WebSocket reconnected successfully",{serverUrl:this.serverUrl}):(c.info("WebSocket connected",{serverUrl:this.serverUrl}),this.hasConnectedBefore=!0);for(const o of this.openHandlers)o();e()},a=o=>{c.error("WebSocket connection failed",{serverUrl:this.serverUrl});const s=new Error("WebSocket connection failed");for(const i of this.errorHandlers)i(s);r(s)};this.ws.addEventListener("open",n,{once:!0}),this.ws.addEventListener("error",a,{once:!0}),this.ws.addEventListener("message",(o=>{const s=o.data;for(const i of this.messageHandlers)i(s)})),this.ws.addEventListener("close",(()=>{c.info("WebSocket closed, attempting to reconnect...");for(const o of this.closeHandlers)o()})),this.ws.addEventListener("error",(o=>{c.error("WebSocket error");const s=new Error("WebSocket error");for(const i of this.errorHandlers)i(s)}))})}send(e){if(!this.ws||this.ws.readyState!==1)throw new Error("WebSocket is not open");this.ws.send(e)}onMessage(e){return this.messageHandlers.add(e),()=>{this.messageHandlers.delete(e)}}onOpen(e){return this.openHandlers.add(e),()=>{this.openHandlers.delete(e)}}onClose(e){return this.closeHandlers.add(e),()=>{this.closeHandlers.delete(e)}}onError(e){return this.errorHandlers.add(e),()=>{this.errorHandlers.delete(e)}}close(){this.ws&&(this.ws.close(),this.ws=null)}dispose(){this.close(),this.messageHandlers.clear(),this.openHandlers.clear(),this.closeHandlers.clear(),this.errorHandlers.clear()}};async function H(e){if(l){const r=new b(e);return await r.connect(),r}else{const r=new S(e);return await r.connect(),r}}h("network/WebSocketServer");export{S as WebSocketClient,H as createWebSocketClient};
2
- //# sourceMappingURL=index-CEWlnSjJ.js.map
1
+ import{_ as d,c as h}from"./index-CoZVC9Vc.js";var f=Object.defineProperty,u=(e,r,n)=>r in e?f(e,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[r]=n,t=(e,r,n)=>u(e,typeof r!="symbol"?r+"":r,n),c=h("network/WebSocketClient"),l=typeof globalThis<"u"&&typeof globalThis.window<"u"&&typeof globalThis.window.WebSocket<"u",S=class{constructor(e){if(t(this,"ws",null),t(this,"serverUrl"),t(this,"messageHandlers",new Set),t(this,"openHandlers",new Set),t(this,"closeHandlers",new Set),t(this,"errorHandlers",new Set),l)throw new Error("Use createBrowserWebSocketClient() in browser environment for auto-reconnect support");this.serverUrl=e.serverUrl}get readyState(){if(!this.ws)return"closed";const e=this.ws.readyState;return e===0?"connecting":e===1?"open":e===2?"closing":"closed"}async connect(){if(this.ws)throw new Error("Already connected or connecting");const{WebSocket:e}=await d(async()=>{const{WebSocket:r}=await import("./browser-C0DG1J1h.js").then(n=>n.b);return{WebSocket:r}},[]);return this.ws=new e(this.serverUrl),new Promise((r,n)=>{const a=()=>{c.info("WebSocket connected",{serverUrl:this.serverUrl});for(const s of this.openHandlers)s();r()},o=s=>{c.error("WebSocket connection failed",{serverUrl:this.serverUrl,error:s==null?void 0:s.message}),n(s||new Error("WebSocket connection failed"))};this.ws.once("open",a),this.ws.once("error",o),this.ws.on("message",s=>{const i=s.toString();for(const w of this.messageHandlers)w(i)}),this.ws.on("close",()=>{c.warn("WebSocket closed");for(const s of this.closeHandlers)s()}),this.ws.on("error",s=>{c.error("WebSocket error",{error:s.message});for(const i of this.errorHandlers)i(s)})})}send(e){if(!this.ws||this.ws.readyState!==1)throw new Error("WebSocket is not open");this.ws.send(e)}onMessage(e){return this.messageHandlers.add(e),()=>{this.messageHandlers.delete(e)}}onOpen(e){return this.openHandlers.add(e),()=>{this.openHandlers.delete(e)}}onClose(e){return this.closeHandlers.add(e),()=>{this.closeHandlers.delete(e)}}onError(e){return this.errorHandlers.add(e),()=>{this.errorHandlers.delete(e)}}close(){this.ws&&(this.ws.close(),this.ws=null)}dispose(){this.close(),this.messageHandlers.clear(),this.openHandlers.clear(),this.closeHandlers.clear(),this.errorHandlers.clear()}},b=class{constructor(e){if(t(this,"ws",null),t(this,"serverUrl"),t(this,"options"),t(this,"messageHandlers",new Set),t(this,"openHandlers",new Set),t(this,"closeHandlers",new Set),t(this,"errorHandlers",new Set),t(this,"hasConnectedBefore",!1),!l)throw new Error("BrowserWebSocketClient can only be used in browser environment");this.serverUrl=e.serverUrl,this.options={autoReconnect:!0,minReconnectionDelay:1e3,maxReconnectionDelay:1e4,maxRetries:1/0,connectionTimeout:4e3,debug:!1,...e}}get readyState(){if(!this.ws)return"closed";const e=this.ws.readyState;return e===0?"connecting":e===1?"open":e===2?"closing":"closed"}async connect(){if(this.ws)throw new Error("Already connected or connecting");if(this.options.autoReconnect){const e=(await d(async()=>{const{default:r}=await import("./reconnecting-websocket-mjs-Dd04wD44.js");return{default:r}},[])).default;this.ws=new e(this.serverUrl,[],{maxReconnectionDelay:this.options.maxReconnectionDelay,minReconnectionDelay:this.options.minReconnectionDelay,reconnectionDelayGrowFactor:1.3,connectionTimeout:this.options.connectionTimeout,maxRetries:this.options.maxRetries,debug:this.options.debug})}else this.ws=new WebSocket(this.serverUrl);return new Promise((e,r)=>{const n=()=>{this.hasConnectedBefore?c.info("WebSocket reconnected successfully",{serverUrl:this.serverUrl}):(c.info("WebSocket connected",{serverUrl:this.serverUrl}),this.hasConnectedBefore=!0);for(const o of this.openHandlers)o();e()},a=o=>{c.error("WebSocket connection failed",{serverUrl:this.serverUrl});const s=new Error("WebSocket connection failed");for(const i of this.errorHandlers)i(s);r(s)};this.ws.addEventListener("open",n,{once:!0}),this.ws.addEventListener("error",a,{once:!0}),this.ws.addEventListener("message",(o=>{const s=o.data;for(const i of this.messageHandlers)i(s)})),this.ws.addEventListener("close",(()=>{c.info("WebSocket closed, attempting to reconnect...");for(const o of this.closeHandlers)o()})),this.ws.addEventListener("error",(o=>{c.error("WebSocket error");const s=new Error("WebSocket error");for(const i of this.errorHandlers)i(s)}))})}send(e){if(!this.ws||this.ws.readyState!==1)throw new Error("WebSocket is not open");this.ws.send(e)}onMessage(e){return this.messageHandlers.add(e),()=>{this.messageHandlers.delete(e)}}onOpen(e){return this.openHandlers.add(e),()=>{this.openHandlers.delete(e)}}onClose(e){return this.closeHandlers.add(e),()=>{this.closeHandlers.delete(e)}}onError(e){return this.errorHandlers.add(e),()=>{this.errorHandlers.delete(e)}}close(){this.ws&&(this.ws.close(),this.ws=null)}dispose(){this.close(),this.messageHandlers.clear(),this.openHandlers.clear(),this.closeHandlers.clear(),this.errorHandlers.clear()}};async function H(e){if(l){const r=new b(e);return await r.connect(),r}else{const r=new S(e);return await r.connect(),r}}h("network/WebSocketServer");export{S as WebSocketClient,H as createWebSocketClient};
2
+ //# sourceMappingURL=index-B7DSJ1QL.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["__defProp","__defNormalProp","obj","key","value","__publicField","logger","createLogger","isBrowser","WebSocketClient","options","state","NodeWebSocket","__vitePreload","resolve","reject","onOpen","handler","onError","err","data","message","BrowserWebSocketClient","ReconnectingWebSocket","__vite_default__","_event","error","event","createWebSocketClient","client"],"ignoreList":[],"sources":["../../../../../packages/network/dist/chunk-63P5VUHB.js","../../../../../packages/network/dist/index.js"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/WebSocketClient.ts\nimport { createLogger } from \"@agentxjs/common\";\nvar logger = createLogger(\"network/WebSocketClient\");\nvar isBrowser = typeof globalThis !== \"undefined\" && typeof globalThis.window !== \"undefined\" && typeof globalThis.window.WebSocket !== \"undefined\";\nvar WebSocketClient = class {\n constructor(options) {\n __publicField(this, \"ws\", null);\n __publicField(this, \"serverUrl\");\n __publicField(this, \"messageHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"openHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"closeHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"errorHandlers\", /* @__PURE__ */ new Set());\n if (isBrowser) {\n throw new Error(\n \"Use createBrowserWebSocketClient() in browser environment for auto-reconnect support\"\n );\n }\n this.serverUrl = options.serverUrl;\n }\n get readyState() {\n if (!this.ws) return \"closed\";\n const state = this.ws.readyState;\n if (state === 0) return \"connecting\";\n if (state === 1) return \"open\";\n if (state === 2) return \"closing\";\n return \"closed\";\n }\n async connect() {\n if (this.ws) {\n throw new Error(\"Already connected or connecting\");\n }\n const { WebSocket: NodeWebSocket } = await import(\"ws\");\n this.ws = new NodeWebSocket(this.serverUrl);\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n logger.info(\"WebSocket connected\", { serverUrl: this.serverUrl });\n for (const handler of this.openHandlers) {\n handler();\n }\n resolve();\n };\n const onError = (err) => {\n logger.error(\"WebSocket connection failed\", {\n serverUrl: this.serverUrl,\n error: err?.message\n });\n reject(err || new Error(\"WebSocket connection failed\"));\n };\n this.ws.once(\"open\", onOpen);\n this.ws.once(\"error\", onError);\n this.ws.on(\"message\", (data) => {\n const message = data.toString();\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n });\n this.ws.on(\"close\", () => {\n logger.warn(\"WebSocket closed\");\n for (const handler of this.closeHandlers) {\n handler();\n }\n });\n this.ws.on(\"error\", (err) => {\n logger.error(\"WebSocket error\", { error: err.message });\n for (const handler of this.errorHandlers) {\n handler(err);\n }\n });\n });\n }\n send(message) {\n if (!this.ws || this.ws.readyState !== 1) {\n throw new Error(\"WebSocket is not open\");\n }\n this.ws.send(message);\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n onOpen(handler) {\n this.openHandlers.add(handler);\n return () => {\n this.openHandlers.delete(handler);\n };\n }\n onClose(handler) {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n onError(handler) {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n close() {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n dispose() {\n this.close();\n this.messageHandlers.clear();\n this.openHandlers.clear();\n this.closeHandlers.clear();\n this.errorHandlers.clear();\n }\n};\nvar BrowserWebSocketClient = class {\n // Track if this is a reconnection\n constructor(options) {\n __publicField(this, \"ws\", null);\n __publicField(this, \"serverUrl\");\n __publicField(this, \"options\");\n __publicField(this, \"messageHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"openHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"closeHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"errorHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"hasConnectedBefore\", false);\n if (!isBrowser) {\n throw new Error(\"BrowserWebSocketClient can only be used in browser environment\");\n }\n this.serverUrl = options.serverUrl;\n this.options = {\n autoReconnect: true,\n minReconnectionDelay: 1e3,\n maxReconnectionDelay: 1e4,\n maxRetries: Infinity,\n connectionTimeout: 4e3,\n debug: false,\n ...options\n };\n }\n get readyState() {\n if (!this.ws) return \"closed\";\n const state = this.ws.readyState;\n if (state === 0) return \"connecting\";\n if (state === 1) return \"open\";\n if (state === 2) return \"closing\";\n return \"closed\";\n }\n async connect() {\n if (this.ws) {\n throw new Error(\"Already connected or connecting\");\n }\n if (this.options.autoReconnect) {\n const ReconnectingWebSocket = (await import(\"reconnecting-websocket\")).default;\n this.ws = new ReconnectingWebSocket(this.serverUrl, [], {\n maxReconnectionDelay: this.options.maxReconnectionDelay,\n minReconnectionDelay: this.options.minReconnectionDelay,\n reconnectionDelayGrowFactor: 1.3,\n connectionTimeout: this.options.connectionTimeout,\n maxRetries: this.options.maxRetries,\n debug: this.options.debug\n });\n } else {\n this.ws = new WebSocket(this.serverUrl);\n }\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n if (this.hasConnectedBefore) {\n logger.info(\"WebSocket reconnected successfully\", { serverUrl: this.serverUrl });\n } else {\n logger.info(\"WebSocket connected\", { serverUrl: this.serverUrl });\n this.hasConnectedBefore = true;\n }\n for (const handler of this.openHandlers) {\n handler();\n }\n resolve();\n };\n const onError = (_event) => {\n logger.error(\"WebSocket connection failed\", { serverUrl: this.serverUrl });\n const error = new Error(\"WebSocket connection failed\");\n for (const handler of this.errorHandlers) {\n handler(error);\n }\n reject(error);\n };\n this.ws.addEventListener(\"open\", onOpen, { once: true });\n this.ws.addEventListener(\"error\", onError, { once: true });\n this.ws.addEventListener(\"message\", ((event) => {\n const message = event.data;\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n }));\n this.ws.addEventListener(\"close\", (() => {\n logger.info(\"WebSocket closed, attempting to reconnect...\");\n for (const handler of this.closeHandlers) {\n handler();\n }\n }));\n this.ws.addEventListener(\"error\", ((_event) => {\n logger.error(\"WebSocket error\");\n const error = new Error(\"WebSocket error\");\n for (const handler of this.errorHandlers) {\n handler(error);\n }\n }));\n });\n }\n send(message) {\n if (!this.ws || this.ws.readyState !== 1) {\n throw new Error(\"WebSocket is not open\");\n }\n this.ws.send(message);\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n onOpen(handler) {\n this.openHandlers.add(handler);\n return () => {\n this.openHandlers.delete(handler);\n };\n }\n onClose(handler) {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n onError(handler) {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n close() {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n dispose() {\n this.close();\n this.messageHandlers.clear();\n this.openHandlers.clear();\n this.closeHandlers.clear();\n this.errorHandlers.clear();\n }\n};\nasync function createWebSocketClient(options) {\n if (isBrowser) {\n const client = new BrowserWebSocketClient(options);\n await client.connect();\n return client;\n } else {\n const client = new WebSocketClient(options);\n await client.connect();\n return client;\n }\n}\n\nexport {\n __publicField,\n WebSocketClient,\n BrowserWebSocketClient,\n createWebSocketClient\n};\n//# sourceMappingURL=chunk-63P5VUHB.js.map","import {\n WebSocketClient,\n __publicField,\n createWebSocketClient\n} from \"./chunk-63P5VUHB.js\";\n\n// src/WebSocketServer.ts\nimport { createLogger } from \"@agentxjs/common\";\nvar logger = createLogger(\"network/WebSocketServer\");\nvar WebSocketConnection = class {\n constructor(ws, options) {\n __publicField(this, \"id\");\n __publicField(this, \"ws\");\n __publicField(this, \"messageHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"closeHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"errorHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"heartbeatInterval\");\n __publicField(this, \"isAlive\", true);\n this.ws = ws;\n this.id = `conn_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n if (options.heartbeat !== false) {\n const interval = options.heartbeatInterval || 3e4;\n ws.on(\"pong\", () => {\n this.isAlive = true;\n logger.debug(\"Heartbeat pong received\", { id: this.id });\n });\n this.heartbeatInterval = setInterval(() => {\n if (!this.isAlive) {\n logger.warn(\"Client heartbeat timeout, terminating connection\", { id: this.id });\n clearInterval(this.heartbeatInterval);\n ws.terminate();\n return;\n }\n this.isAlive = false;\n ws.ping();\n logger.debug(\"Heartbeat ping sent\", { id: this.id });\n }, interval);\n }\n ws.on(\"message\", (data) => {\n const message = data.toString();\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n });\n ws.on(\"close\", () => {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n for (const handler of this.closeHandlers) {\n handler();\n }\n });\n ws.on(\"error\", (err) => {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n for (const handler of this.errorHandlers) {\n handler(err);\n }\n });\n }\n send(message) {\n if (this.ws.readyState === 1) {\n this.ws.send(message);\n }\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n onClose(handler) {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n onError(handler) {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n close() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.ws.close();\n }\n};\nvar WebSocketServer = class {\n constructor(options = {}) {\n __publicField(this, \"wss\", null);\n __publicField(this, \"connections\", /* @__PURE__ */ new Set());\n __publicField(this, \"connectionHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"options\");\n __publicField(this, \"attachedToServer\", false);\n this.options = options;\n }\n async listen(port, host = \"0.0.0.0\") {\n if (this.wss) {\n throw new Error(\"Server already listening\");\n }\n if (this.attachedToServer) {\n throw new Error(\n \"Cannot listen when attached to existing server. The server should call listen() instead.\"\n );\n }\n const { WebSocketServer: WSS } = await import(\"ws\");\n this.wss = new WSS({ port, host });\n this.wss.on(\"connection\", (ws) => {\n this.handleConnection(ws);\n });\n logger.info(\"WebSocket server listening\", { port, host });\n }\n attach(server, path = \"/ws\") {\n if (this.wss) {\n throw new Error(\"Server already initialized\");\n }\n import(\"ws\").then(({ WebSocketServer: WSS }) => {\n this.wss = new WSS({ noServer: true });\n server.on(\"upgrade\", (request, socket, head) => {\n const url = new URL(request.url || \"\", `http://${request.headers.host}`);\n if (url.pathname === path) {\n this.wss.handleUpgrade(request, socket, head, (ws) => {\n this.wss.emit(\"connection\", ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n this.wss.on(\"connection\", (ws) => {\n this.handleConnection(ws);\n });\n this.attachedToServer = true;\n logger.info(\"WebSocket attached to existing HTTP server\", { path });\n });\n }\n handleConnection(ws) {\n const connection = new WebSocketConnection(ws, this.options);\n this.connections.add(connection);\n logger.info(\"Client connected\", {\n connectionId: connection.id,\n totalConnections: this.connections.size\n });\n connection.onClose(() => {\n this.connections.delete(connection);\n logger.info(\"Client disconnected\", {\n connectionId: connection.id,\n totalConnections: this.connections.size\n });\n });\n for (const handler of this.connectionHandlers) {\n handler(connection);\n }\n }\n onConnection(handler) {\n this.connectionHandlers.add(handler);\n return () => {\n this.connectionHandlers.delete(handler);\n };\n }\n broadcast(message) {\n for (const connection of this.connections) {\n connection.send(message);\n }\n }\n async close() {\n if (!this.wss) return;\n for (const connection of this.connections) {\n connection.close();\n }\n this.connections.clear();\n if (!this.attachedToServer) {\n await new Promise((resolve) => {\n this.wss.close(() => resolve());\n });\n }\n this.wss = null;\n }\n async dispose() {\n await this.close();\n this.connectionHandlers.clear();\n }\n};\nexport {\n WebSocketClient,\n WebSocketServer,\n createWebSocketClient\n};\n//# sourceMappingURL=index.js.map"],"file":"assets/index-CEWlnSjJ.js"}
1
+ {"version":3,"mappings":"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","names":["__defProp","__defNormalProp","obj","key","value","__publicField","logger","createLogger","isBrowser","WebSocketClient","options","state","NodeWebSocket","__vitePreload","resolve","reject","onOpen","handler","onError","err","data","message","BrowserWebSocketClient","ReconnectingWebSocket","__vite_default__","_event","error","event","createWebSocketClient","client"],"ignoreList":[],"sources":["../../../../../packages/network/dist/chunk-63P5VUHB.js","../../../../../packages/network/dist/index.js"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/WebSocketClient.ts\nimport { createLogger } from \"@agentxjs/common\";\nvar logger = createLogger(\"network/WebSocketClient\");\nvar isBrowser = typeof globalThis !== \"undefined\" && typeof globalThis.window !== \"undefined\" && typeof globalThis.window.WebSocket !== \"undefined\";\nvar WebSocketClient = class {\n constructor(options) {\n __publicField(this, \"ws\", null);\n __publicField(this, \"serverUrl\");\n __publicField(this, \"messageHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"openHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"closeHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"errorHandlers\", /* @__PURE__ */ new Set());\n if (isBrowser) {\n throw new Error(\n \"Use createBrowserWebSocketClient() in browser environment for auto-reconnect support\"\n );\n }\n this.serverUrl = options.serverUrl;\n }\n get readyState() {\n if (!this.ws) return \"closed\";\n const state = this.ws.readyState;\n if (state === 0) return \"connecting\";\n if (state === 1) return \"open\";\n if (state === 2) return \"closing\";\n return \"closed\";\n }\n async connect() {\n if (this.ws) {\n throw new Error(\"Already connected or connecting\");\n }\n const { WebSocket: NodeWebSocket } = await import(\"ws\");\n this.ws = new NodeWebSocket(this.serverUrl);\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n logger.info(\"WebSocket connected\", { serverUrl: this.serverUrl });\n for (const handler of this.openHandlers) {\n handler();\n }\n resolve();\n };\n const onError = (err) => {\n logger.error(\"WebSocket connection failed\", {\n serverUrl: this.serverUrl,\n error: err?.message\n });\n reject(err || new Error(\"WebSocket connection failed\"));\n };\n this.ws.once(\"open\", onOpen);\n this.ws.once(\"error\", onError);\n this.ws.on(\"message\", (data) => {\n const message = data.toString();\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n });\n this.ws.on(\"close\", () => {\n logger.warn(\"WebSocket closed\");\n for (const handler of this.closeHandlers) {\n handler();\n }\n });\n this.ws.on(\"error\", (err) => {\n logger.error(\"WebSocket error\", { error: err.message });\n for (const handler of this.errorHandlers) {\n handler(err);\n }\n });\n });\n }\n send(message) {\n if (!this.ws || this.ws.readyState !== 1) {\n throw new Error(\"WebSocket is not open\");\n }\n this.ws.send(message);\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n onOpen(handler) {\n this.openHandlers.add(handler);\n return () => {\n this.openHandlers.delete(handler);\n };\n }\n onClose(handler) {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n onError(handler) {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n close() {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n dispose() {\n this.close();\n this.messageHandlers.clear();\n this.openHandlers.clear();\n this.closeHandlers.clear();\n this.errorHandlers.clear();\n }\n};\nvar BrowserWebSocketClient = class {\n // Track if this is a reconnection\n constructor(options) {\n __publicField(this, \"ws\", null);\n __publicField(this, \"serverUrl\");\n __publicField(this, \"options\");\n __publicField(this, \"messageHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"openHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"closeHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"errorHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"hasConnectedBefore\", false);\n if (!isBrowser) {\n throw new Error(\"BrowserWebSocketClient can only be used in browser environment\");\n }\n this.serverUrl = options.serverUrl;\n this.options = {\n autoReconnect: true,\n minReconnectionDelay: 1e3,\n maxReconnectionDelay: 1e4,\n maxRetries: Infinity,\n connectionTimeout: 4e3,\n debug: false,\n ...options\n };\n }\n get readyState() {\n if (!this.ws) return \"closed\";\n const state = this.ws.readyState;\n if (state === 0) return \"connecting\";\n if (state === 1) return \"open\";\n if (state === 2) return \"closing\";\n return \"closed\";\n }\n async connect() {\n if (this.ws) {\n throw new Error(\"Already connected or connecting\");\n }\n if (this.options.autoReconnect) {\n const ReconnectingWebSocket = (await import(\"reconnecting-websocket\")).default;\n this.ws = new ReconnectingWebSocket(this.serverUrl, [], {\n maxReconnectionDelay: this.options.maxReconnectionDelay,\n minReconnectionDelay: this.options.minReconnectionDelay,\n reconnectionDelayGrowFactor: 1.3,\n connectionTimeout: this.options.connectionTimeout,\n maxRetries: this.options.maxRetries,\n debug: this.options.debug\n });\n } else {\n this.ws = new WebSocket(this.serverUrl);\n }\n return new Promise((resolve, reject) => {\n const onOpen = () => {\n if (this.hasConnectedBefore) {\n logger.info(\"WebSocket reconnected successfully\", { serverUrl: this.serverUrl });\n } else {\n logger.info(\"WebSocket connected\", { serverUrl: this.serverUrl });\n this.hasConnectedBefore = true;\n }\n for (const handler of this.openHandlers) {\n handler();\n }\n resolve();\n };\n const onError = (_event) => {\n logger.error(\"WebSocket connection failed\", { serverUrl: this.serverUrl });\n const error = new Error(\"WebSocket connection failed\");\n for (const handler of this.errorHandlers) {\n handler(error);\n }\n reject(error);\n };\n this.ws.addEventListener(\"open\", onOpen, { once: true });\n this.ws.addEventListener(\"error\", onError, { once: true });\n this.ws.addEventListener(\"message\", ((event) => {\n const message = event.data;\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n }));\n this.ws.addEventListener(\"close\", (() => {\n logger.info(\"WebSocket closed, attempting to reconnect...\");\n for (const handler of this.closeHandlers) {\n handler();\n }\n }));\n this.ws.addEventListener(\"error\", ((_event) => {\n logger.error(\"WebSocket error\");\n const error = new Error(\"WebSocket error\");\n for (const handler of this.errorHandlers) {\n handler(error);\n }\n }));\n });\n }\n send(message) {\n if (!this.ws || this.ws.readyState !== 1) {\n throw new Error(\"WebSocket is not open\");\n }\n this.ws.send(message);\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n onOpen(handler) {\n this.openHandlers.add(handler);\n return () => {\n this.openHandlers.delete(handler);\n };\n }\n onClose(handler) {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n onError(handler) {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n close() {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n dispose() {\n this.close();\n this.messageHandlers.clear();\n this.openHandlers.clear();\n this.closeHandlers.clear();\n this.errorHandlers.clear();\n }\n};\nasync function createWebSocketClient(options) {\n if (isBrowser) {\n const client = new BrowserWebSocketClient(options);\n await client.connect();\n return client;\n } else {\n const client = new WebSocketClient(options);\n await client.connect();\n return client;\n }\n}\n\nexport {\n __publicField,\n WebSocketClient,\n BrowserWebSocketClient,\n createWebSocketClient\n};\n//# sourceMappingURL=chunk-63P5VUHB.js.map","import {\n WebSocketClient,\n __publicField,\n createWebSocketClient\n} from \"./chunk-63P5VUHB.js\";\n\n// src/WebSocketServer.ts\nimport { createLogger } from \"@agentxjs/common\";\nvar logger = createLogger(\"network/WebSocketServer\");\nvar WebSocketConnection = class {\n constructor(ws, options) {\n __publicField(this, \"id\");\n __publicField(this, \"ws\");\n __publicField(this, \"messageHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"closeHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"errorHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"heartbeatInterval\");\n __publicField(this, \"isAlive\", true);\n this.ws = ws;\n this.id = `conn_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n if (options.heartbeat !== false) {\n const interval = options.heartbeatInterval || 3e4;\n ws.on(\"pong\", () => {\n this.isAlive = true;\n logger.debug(\"Heartbeat pong received\", { id: this.id });\n });\n this.heartbeatInterval = setInterval(() => {\n if (!this.isAlive) {\n logger.warn(\"Client heartbeat timeout, terminating connection\", { id: this.id });\n clearInterval(this.heartbeatInterval);\n ws.terminate();\n return;\n }\n this.isAlive = false;\n ws.ping();\n logger.debug(\"Heartbeat ping sent\", { id: this.id });\n }, interval);\n }\n ws.on(\"message\", (data) => {\n const message = data.toString();\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n });\n ws.on(\"close\", () => {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n for (const handler of this.closeHandlers) {\n handler();\n }\n });\n ws.on(\"error\", (err) => {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n for (const handler of this.errorHandlers) {\n handler(err);\n }\n });\n }\n send(message) {\n if (this.ws.readyState === 1) {\n this.ws.send(message);\n }\n }\n onMessage(handler) {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n onClose(handler) {\n this.closeHandlers.add(handler);\n return () => {\n this.closeHandlers.delete(handler);\n };\n }\n onError(handler) {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n close() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.ws.close();\n }\n};\nvar WebSocketServer = class {\n constructor(options = {}) {\n __publicField(this, \"wss\", null);\n __publicField(this, \"connections\", /* @__PURE__ */ new Set());\n __publicField(this, \"connectionHandlers\", /* @__PURE__ */ new Set());\n __publicField(this, \"options\");\n __publicField(this, \"attachedToServer\", false);\n this.options = options;\n }\n async listen(port, host = \"0.0.0.0\") {\n if (this.wss) {\n throw new Error(\"Server already listening\");\n }\n if (this.attachedToServer) {\n throw new Error(\n \"Cannot listen when attached to existing server. The server should call listen() instead.\"\n );\n }\n const { WebSocketServer: WSS } = await import(\"ws\");\n this.wss = new WSS({ port, host });\n this.wss.on(\"connection\", (ws) => {\n this.handleConnection(ws);\n });\n logger.info(\"WebSocket server listening\", { port, host });\n }\n attach(server, path = \"/ws\") {\n if (this.wss) {\n throw new Error(\"Server already initialized\");\n }\n import(\"ws\").then(({ WebSocketServer: WSS }) => {\n this.wss = new WSS({ noServer: true });\n server.on(\"upgrade\", (request, socket, head) => {\n const url = new URL(request.url || \"\", `http://${request.headers.host}`);\n if (url.pathname === path) {\n this.wss.handleUpgrade(request, socket, head, (ws) => {\n this.wss.emit(\"connection\", ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n this.wss.on(\"connection\", (ws) => {\n this.handleConnection(ws);\n });\n this.attachedToServer = true;\n logger.info(\"WebSocket attached to existing HTTP server\", { path });\n });\n }\n handleConnection(ws) {\n const connection = new WebSocketConnection(ws, this.options);\n this.connections.add(connection);\n logger.info(\"Client connected\", {\n connectionId: connection.id,\n totalConnections: this.connections.size\n });\n connection.onClose(() => {\n this.connections.delete(connection);\n logger.info(\"Client disconnected\", {\n connectionId: connection.id,\n totalConnections: this.connections.size\n });\n });\n for (const handler of this.connectionHandlers) {\n handler(connection);\n }\n }\n onConnection(handler) {\n this.connectionHandlers.add(handler);\n return () => {\n this.connectionHandlers.delete(handler);\n };\n }\n broadcast(message) {\n for (const connection of this.connections) {\n connection.send(message);\n }\n }\n async close() {\n if (!this.wss) return;\n for (const connection of this.connections) {\n connection.close();\n }\n this.connections.clear();\n if (!this.attachedToServer) {\n await new Promise((resolve) => {\n this.wss.close(() => resolve());\n });\n }\n this.wss = null;\n }\n async dispose() {\n await this.close();\n this.connectionHandlers.clear();\n }\n};\nexport {\n WebSocketClient,\n WebSocketServer,\n createWebSocketClient\n};\n//# sourceMappingURL=index.js.map"],"file":"assets/index-B7DSJ1QL.js"}
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-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-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-purple-500:oklch(62.7% .265 303.9);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{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}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:0 0% 100%;--foreground:222.2 47.4% 11.2%;--card:210 40% 98%;--card-foreground:222.2 47.4% 11.2%;--popover:0 0% 100%;--popover-foreground:222.2 47.4% 11.2%;--primary:199.1 88.7% 48.3%;--primary-foreground:0 0% 100%;--secondary:37.7 92.1% 50.2%;--secondary-foreground:222.2 47.4% 11.2%;--muted:210 40% 96.1%;--muted-foreground:215.4 16.3% 46.9%;--accent:24.6 95% 53.1%;--accent-foreground:222.2 47.4% 11.2%;--destructive:0 84.2% 60.2%;--destructive-foreground:210 40% 98%;--border:214.3 31.8% 91.4%;--input:214.3 31.8% 91.4%;--ring:199.1 88.7% 48.3%;--radius:.375rem;--success:142.1 76.2% 36.3%;--success-foreground:0 0% 100%;--warning:45.4 93.4% 47.5%;--warning-foreground:222.2 47.4% 11.2%;--info:199.1 88.7% 48.3%;--info-foreground:0 0% 100%}.dark{--background:222.2 47.4% 11.2%;--foreground:210 40% 98%;--card:217.2 32.6% 17.5%;--card-foreground:210 40% 98%;--popover:222.2 47.4% 11.2%;--popover-foreground:210 40% 98%;--primary:199.1 88.7% 58.3%;--primary-foreground:222.2 47.4% 11.2%;--secondary:37.7 92.1% 60.2%;--secondary-foreground:222.2 47.4% 11.2%;--muted:217.2 32.6% 17.5%;--muted-foreground:215 20.2% 65.1%;--accent:24.6 95% 63.1%;--accent-foreground:222.2 47.4% 11.2%;--destructive:0 72.2% 50.6%;--destructive-foreground:210 40% 98%;--border:217.2 32.6% 27.5%;--input:217.2 32.6% 27.5%;--ring:199.1 88.7% 58.3%;--success:142.1 70.6% 45.3%;--success-foreground:0 0% 100%;--warning:45.4 93.4% 57.5%;--warning-foreground:222.2 47.4% 11.2%;--info:199.1 88.7% 58.3%;--info-foreground:222.2 47.4% 11.2%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.-top-1{top:calc(var(--spacing)*-1)}.-top-2{top:calc(var(--spacing)*-2)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-full{top:100%}.-right-1{right:calc(var(--spacing)*-1)}.-right-2{right:calc(var(--spacing)*-2)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.right-full{right:100%}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-3{bottom:calc(var(--spacing)*3)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-full{left:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-11{margin-left:calc(var(--spacing)*11)}.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}.h-1{height:calc(var(--spacing)*1)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.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-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-32{height:calc(var(--spacing)*32)}.h-36{height:calc(var(--spacing)*36)}.h-40{height:calc(var(--spacing)*40)}.h-48{height:calc(var(--spacing)*48)}.h-64{height:calc(var(--spacing)*64)}.h-80{height:calc(var(--spacing)*80)}.h-96{height:calc(var(--spacing)*96)}.h-\[600px\]{height:600px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-32{min-height:calc(var(--spacing)*32)}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-32{width:calc(var(--spacing)*32)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[280px\]{width:280px}.w-full{width:100%}.w-px{width:1px}.w-screen{width:100vw}.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-32{max-width:calc(var(--spacing)*32)}.max-w-\[50\%\]{max-width:50%}.max-w-\[80\%\]{max-width:80%}.max-w-\[90vw\]{max-width:90vw}.max-w-\[500px\]{max-width:500px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[16px\]{min-width:16px}.min-w-\[300px\]{min-width:300px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.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}.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}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*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-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-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)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl-none{border-top-left-radius:0}.rounded-tr-none{border-top-right-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-500{border-color:var(--color-blue-500)}.border-current,.border-current\/10{border-color:currentColor}@supports (color:color-mix(in lab,red,red)){.border-current\/10{border-color:color-mix(in oklab,currentcolor 10%,transparent)}}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-700\/40{border-color:#36415366}@supports (color:color-mix(in lab,red,red)){.border-gray-700\/40{border-color:color-mix(in oklab,var(--color-gray-700)40%,transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.border-red-200{border-color:var(--color-red-200)}.border-red-700{border-color:var(--color-red-700)}.border-slate-200{border-color:var(--color-slate-200)}.border-transparent{border-color:#0000}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-transparent{border-top-color:#0000}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-black{background-color:var(--color-black)}.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\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-700\/80{background-color:#364153cc}@supports (color:color-mix(in lab,red,red)){.bg-gray-700\/80{background-color:color-mix(in oklab,var(--color-gray-700)80%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-50\/5{background-color:#f0fdf40d}@supports (color:color-mix(in lab,red,red)){.bg-green-50\/5{background-color:color-mix(in oklab,var(--color-green-50)5%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/60{background-color:#0f172b99}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/60{background-color:color-mix(in oklab,var(--color-slate-900)60%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.bg-white\/50{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-500\/10{--tw-gradient-to:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.to-purple-500\/10{--tw-gradient-to:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.to-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-0\.5{padding-top:calc(var(--spacing)*.5)}.pt-1{padding-top:calc(var(--spacing)*1)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-9{padding-right:calc(var(--spacing)*9)}.pr-14{padding-right:calc(var(--spacing)*14)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-9{padding-left:calc(var(--spacing)*9)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.9em\]{font-size:.9em}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-700{color:var(--color-amber-700)}.text-black{color:var(--color-black)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-900{color:var(--color-blue-900)}.text-current{color:currentColor}.text-gray-100{color:var(--color-gray-100)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-900{color:var(--color-red-900)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-900{color:var(--color-yellow-900)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.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)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-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,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-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.\[-ms-overflow-style\:none\]{-ms-overflow-style:none}.\[scrollbar-width\:none\]{scrollbar-width:none}@media(hover:hover){.group-hover\:rotate-180:is(:where(.group):hover *){rotate:180deg}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:bg-amber-200:hover{background-color:var(--color-amber-200)}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}}.focus\:opacity-100:focus{opacity:1}.focus\:ring-1:focus{--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)}.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-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--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)}.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-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\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.active\:scale-\[0\.98\]:active{scale:.98}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media(min-width:48rem){.md\:block{display:block}.md\:hidden{display:none}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(prefers-color-scheme:dark){.dark\:border-amber-800{border-color:var(--color-amber-800)}.dark\:border-blue-800{border-color:var(--color-blue-800)}.dark\:border-gray-600{border-color:var(--color-gray-600)}.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-green-800{border-color:var(--color-green-800)}.dark\:border-red-800{border-color:var(--color-red-800)}.dark\:border-slate-700{border-color:var(--color-slate-700)}.dark\:bg-amber-950\/30{background-color:#4619014d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/30{background-color:color-mix(in oklab,var(--color-amber-950)30%,transparent)}}.dark\:bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.dark\:bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}.dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark\:bg-blue-950{background-color:var(--color-blue-950)}.dark\:bg-blue-950\/30{background-color:#1624564d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-950\/30{background-color:color-mix(in oklab,var(--color-blue-950)30%,transparent)}}.dark\:bg-gray-800\/60{background-color:#1e293999}@supports (color:color-mix(in lab,red,red)){.dark\:bg-gray-800\/60{background-color:color-mix(in oklab,var(--color-gray-800)60%,transparent)}}.dark\:bg-green-900\/5{background-color:#0d542b0d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-900\/5{background-color:color-mix(in oklab,var(--color-green-900)5%,transparent)}}.dark\:bg-green-950{background-color:var(--color-green-950)}.dark\:bg-green-950\/30{background-color:#032e154d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-950\/30{background-color:color-mix(in oklab,var(--color-green-950)30%,transparent)}}.dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark\:bg-red-950{background-color:var(--color-red-950)}.dark\:bg-red-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-950\/30{background-color:color-mix(in oklab,var(--color-red-950)30%,transparent)}}.dark\:bg-slate-800{background-color:var(--color-slate-800)}.dark\:bg-slate-900{background-color:var(--color-slate-900)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-blue-300{color:var(--color-blue-300)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-gray-100{color:var(--color-gray-100)}.dark\:text-green-300{color:var(--color-green-300)}.dark\:text-red-300{color:var(--color-red-300)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-slate-100{color:var(--color-slate-100)}.dark\:text-slate-400{color:var(--color-slate-400)}.dark\:text-slate-600{color:var(--color-slate-600)}.dark\:text-white{color:var(--color-white)}@media(hover:hover){.dark\:hover\:bg-red-900\/40:hover{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/40:hover{background-color:color-mix(in oklab,var(--color-red-900)40%,transparent)}}.dark\:hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing)*3)}.\[\&\>svg\]\:h-3\.5>svg{height:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:h-4>svg{height:calc(var(--spacing)*4)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing)*3)}.\[\&\>svg\]\:w-3\.5>svg{width:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:w-4>svg{width:calc(var(--spacing)*4)}}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<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-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}