@dhzh/foundry 1.1.0 → 1.2.1
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 +182 -40
- package/dist/app/index.html +1 -1
- package/dist/app/static/css/index.65504d078c.css +2 -0
- package/dist/app/static/js/549.5972d30ce0.js +2 -0
- package/dist/app/static/js/index.bea5fb0f2b.js +1 -0
- package/dist/app/static/js/{lib-router.1aa7ec2bfc.js → lib-router.c327fb621e.js} +3 -3
- package/dist/cli.mjs +10 -10
- package/dist/index.mjs +1 -1
- package/dist/package-CgHJEDYp.mjs +2 -0
- package/package.json +2 -1
- package/dist/app/static/css/index.3edd4261b5.css +0 -2
- package/dist/app/static/js/597.bca22a4ca5.js +0 -2
- package/dist/app/static/js/index.466395d8a3.js +0 -1
- package/dist/package-DoFH3Rau.mjs +0 -2
- /package/dist/app/static/js/{597.bca22a4ca5.js.LICENSE.txt → 549.5972d30ce0.js.LICENSE.txt} +0 -0
- /package/dist/app/static/js/{lib-router.1aa7ec2bfc.js.LICENSE.txt → lib-router.c327fb621e.js.LICENSE.txt} +0 -0
package/dist/cli.mjs
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{t as e}from"./package-DoFH3Rau.mjs";import{defineCommand as t,renderUsage as n,runMain as r}from"citty";import i from"node:process";import a from"open";import{serve as o}from"@hono/node-server";import{serveStatic as s}from"@hono/node-server/serve-static";import{zValidator as c}from"@hono/zod-validator";import{constants as l,existsSync as u}from"node:fs";import d from"node:path";import{Hono as f}from"hono";import{z as p}from"zod";import{Buffer as m}from"node:buffer";import{TextDecoder as ee,promisify as te}from"node:util";import ne from"better-sqlite3";import{drizzle as re}from"drizzle-orm/better-sqlite3";import{createHash as ie,randomUUID as ae,randomUUIDv7 as oe}from"node:crypto";import{access as se,chmod as ce,lstat as le,mkdir as h,readFile as ue,readdir as de,realpath as fe,rename as pe,rm as g,stat as me,writeFile as he}from"node:fs/promises";import{readMigrationFiles as ge}from"drizzle-orm/migrator";import _e from"env-paths";import{homedir as ve}from"node:os";import{and as _,desc as ye,eq as v,isNull as y,sql as b}from"drizzle-orm";import{blob as be,check as x,index as xe,integer as S,sqliteTable as C,text as w,uniqueIndex as Se}from"drizzle-orm/sqlite-core";import{parse as Ce,patch as we,stringify as Te}from"@decimalturn/toml-patch";import{execFile as Ee}from"node:child_process";var T=Object.defineProperty,De=(e,t)=>{let n={};for(var r in e)T(n,r,{get:e[r],enumerable:!0});return t||T(n,Symbol.toStringTag,{value:`Module`}),n};const E={providerNotFound:`PROVIDER_NOT_FOUND`,runtimeApplyFailed:`RUNTIME_APPLY_FAILED`,runtimeConfigurationChanged:`RUNTIME_CONFIGURATION_CHANGED`,runtimeConfigurationInvalid:`RUNTIME_CONFIGURATION_INVALID`,runtimeNotDetected:`RUNTIME_NOT_DETECTED`,success:`SUCCESS`},D=[`system`,`light`,`dark`],O=[`codex`,`claude-code`],Oe=[`image/png`,`image/jpeg`,`image/webp`,`image/svg+xml`],ke=[`authorization`,`x-api-key`],k=[`effort`,`xhigh_effort`,`max_effort`,`thinking`,`adaptive_thinking`,`interleaved_thinking`],Ae=/^[A-Za-z0-9+/]+={0,2}$/u;function A(e,t){for(let n of e){let e=n.codePointAt(0)??0,r=t&&[9,10,13].includes(e);if(e===127||!r&&e<32)return!0}return!1}function j(e){return p.string().trim().max(e).refine(e=>!A(e,!0),{message:`Control characters are not allowed.`})}function M(e){return j(e).nullable().transform(e=>e===``?null:e)}function N(e,t){try{let n=new URL(e);return[`http:`,`https:`].includes(n.protocol)&&n.username===``&&n.password===``&&(t||n.search===``&&n.hash===``)}catch{return!1}}const P=j(2048).min(1).refine(e=>N(e,!1),{message:`Provide an HTTP or HTTPS URL without credentials, a query, or a fragment.`}),je=M(2048).refine(e=>e===null||N(e,!0),{message:`Provide an HTTP or HTTPS URL without credentials.`}),Me=j(100).min(1),Ne=M(100),Pe=M(2e3),F=j(200).min(1),I=M(200),Fe=M(2e3),Ie=p.string().min(1).max(16384).refine(e=>!A(e,!1),{message:`Control characters are not allowed.`}),Le=p.union([Ie,p.literal(``),p.null()]).transform(e=>e===``?null:e);function Re(e,t){if(e===`image/png`)return[137,80,78,71,13,10,26,10].every((e,n)=>t[n]===e);if(e===`image/jpeg`)return t[0]===255&&t[1]===216&&t[2]===255;if(e===`image/svg+xml`)try{let e=new ee(`utf-8`,{fatal:!0}).decode(t);return/^\s*(?:(?:<\?xml[\s\S]*?\?>|<!--[\s\S]*?-->|<!DOCTYPE[\s\S]*?>)\s*)*<svg(?:\s|>)/u.test(e)}catch{return!1}return t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===87&&t[9]===69&&t[10]===66&&t[11]===80}const ze=p.strictObject({data:p.string().min(1).max(2796204),mimeType:p.enum(Oe)}).superRefine((e,t)=>{if(!Ae.test(e.data)){t.addIssue({code:`custom`,message:`Avatar data must be valid Base64.`});return}let n=m.from(e.data,`base64`);(n.byteLength===0||n.byteLength>2097152||n.toString(`base64`)!==e.data||!Re(e.mimeType,n))&&t.addIssue({code:`custom`,message:`Avatar data must be a valid PNG, JPEG, WebP, or SVG image no larger than 2 MB.`})}),Be=p.array(p.enum(k)).max(k.length).refine(e=>new Set(e).size===e.length,{message:`Model capabilities must be unique.`}),L=p.strictObject({description:Pe,displayName:Ne,model:F,supportedCapabilities:Be}),Ve=p.union([F,L.transform(e=>e.model)]),He=p.strictObject({apiKey:Le,baseUrl:P,defaultModel:F,protocol:p.literal(`responses`),reviewModel:I}),Ue=p.strictObject({apiKey:Ie,apiKeyHeader:p.enum(ke),baseUrl:P,fableModel:L.nullable(),haikuModel:L.nullable(),opusModel:L.nullable(),defaultModel:Ve,protocol:p.literal(`messages`),sonnetModel:L.nullable(),subagentModel:I,subagentModelForce:p.boolean().default(!1),hideAiAttribution:p.boolean().default(!1),teammatesMode:p.boolean().default(!1),enableToolSearch:p.boolean().default(!1),maxEffortThinking:p.boolean().default(!1),disableAutoUpdater:p.boolean().default(!1)}),We={avatar:ze.nullable(),name:Me,officialWebsite:je,remark:Fe},Ge=p.discriminatedUnion(`runtime`,[p.strictObject({...We,configuration:He,runtime:p.literal(`codex`)}),p.strictObject({...We,configuration:Ue,runtime:p.literal(`claude-code`)})]),Ke=p.strictObject({runtime:p.enum(O)});function qe(e){return Ge.parse(e)}function Je(e){return He.parse(e)}function Ye(e){return Ue.parse(e)}function Xe(e){return e===null?null:m.from(ze.parse(e).data,`base64`)}function Ze(e){return{avatar:e.avatar,baseUrl:e.configuration.baseUrl,id:e.id,name:e.name,officialWebsite:e.officialWebsite,remark:e.remark,runtime:e.runtime}}function Qe(e,t){e.get(`/api/providers`,c(`query`,Ke),e=>e.json({status:E.success,data:t.listProviders(e.req.valid(`query`).runtime).map(e=>Ze(e))})),e.post(`/api/providers`,c(`json`,Ge),e=>{let n=e.req.valid(`json`),r=Ze(t.createProvider(n));return e.json({status:E.success,data:r},201)})}var R=class extends Error{status;constructor(e,t){super(t),this.status=e}};const z=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`official-default`)}),p.strictObject({kind:p.literal(`provider`),providerId:p.string().min(1)})]),$e=p.strictObject({runtime:p.enum(O)}),et=p.strictObject({}),tt=p.strictObject({providerKey:p.string().min(1).max(200).optional(),target:z}),nt=p.strictObject({expectedFileHash:p.string().regex(/^[0-9a-f]{64}$/),providerKey:p.string().min(1).max(200).optional(),target:z});function rt(e,t){e.get(`/api/runtimes`,c(`query`,et),async e=>e.json({status:E.success,data:await t.listRuntimes()})),e.post(`/api/runtimes/:runtime/preview`,c(`param`,$e),c(`json`,tt),async e=>{try{return e.json({status:E.success,data:await t.previewConfiguration(e.req.valid(`param`).runtime,e.req.valid(`json`))})}catch(t){if(t instanceof R)return e.json({status:t.status,data:null,message:t.message});throw t}}),e.post(`/api/runtimes/:runtime/apply`,c(`param`,$e),c(`json`,nt),async e=>{try{return e.json({status:E.success,data:await t.applyConfiguration(e.req.valid(`param`).runtime,e.req.valid(`json`))})}catch(t){if(t instanceof R)return e.json({status:t.status,data:null,message:t.message});throw t}})}const it=p.strictObject({}),at=p.strictObject({colorMode:p.enum(D)});function ot(e,t){e.get(`/api/settings`,c(`query`,it),e=>e.json({status:E.success,data:t.getApplicationSettings()})),e.patch(`/api/settings`,c(`json`,at),e=>e.json({status:E.success,data:t.updateApplicationSettings(e.req.valid(`json`))}))}const st=p.strictObject({});function ct(){return[d.resolve(import.meta.dirname,`app`),d.resolve(import.meta.dirname,`../../dist/app`)].find(e=>u(e))}function lt(e){let t=new f;t.get(`/api/health`,c(`query`,st),e=>e.json({status:E.success,data:!0,message:`Service is healthy.`})),ot(t,e.settingsStore),Qe(t,e.providerStore),rt(t,e.runtimeService);let n=e.webRoot??ct();return n&&t.use(`*`,s({root:n})),t}const B=`__drizzle_migrations`;function ut(e){return!!e.prepare(`
|
|
2
|
+
import{t as e}from"./package-CgHJEDYp.mjs";import{defineCommand as t,renderUsage as n,runMain as r}from"citty";import i from"node:process";import a from"open";import{serve as o}from"@hono/node-server";import{serveStatic as s}from"@hono/node-server/serve-static";import{zValidator as c}from"@hono/zod-validator";import{constants as l,existsSync as u}from"node:fs";import d from"node:path";import{Hono as f}from"hono";import{z as p}from"zod";import{Uint8ArrayReader as m,Uint8ArrayWriter as h,ZipReader as ee,ZipWriter as te}from"@zip.js/zip.js";import{createHash as g,randomUUID as ne,randomUUIDv7 as re}from"node:crypto";import{bodyLimit as ie}from"hono/body-limit";import{TextDecoder as ae,promisify as oe}from"node:util";import{Buffer as se}from"node:buffer";import ce from"better-sqlite3";import{drizzle as le}from"drizzle-orm/better-sqlite3";import{access as ue,chmod as de,lstat as fe,mkdir as _,readFile as pe,readdir as me,realpath as he,rename as ge,rm as v,stat as _e,writeFile as ve}from"node:fs/promises";import{readMigrationFiles as ye}from"drizzle-orm/migrator";import be from"env-paths";import{homedir as xe}from"node:os";import{and as y,desc as Se,eq as b,isNull as x,sql as S}from"drizzle-orm";import{blob as Ce,check as C,index as we,integer as w,sqliteTable as T,text as E,uniqueIndex as Te}from"drizzle-orm/sqlite-core";import{parse as Ee,patch as De,stringify as Oe}from"@decimalturn/toml-patch";import{execFile as ke}from"node:child_process";var Ae=Object.defineProperty,je=(e,t)=>{let n={};for(var r in e)Ae(n,r,{get:e[r],enumerable:!0});return t||Ae(n,Symbol.toStringTag,{value:`Module`}),n};const D={providerConnectionFailed:`PROVIDER_CONNECTION_FAILED`,providerInUse:`PROVIDER_IN_USE`,providerNotFound:`PROVIDER_NOT_FOUND`,runtimeApplyFailed:`RUNTIME_APPLY_FAILED`,runtimeConfigurationChanged:`RUNTIME_CONFIGURATION_CHANGED`,runtimeConfigurationInvalid:`RUNTIME_CONFIGURATION_INVALID`,runtimeNotDetected:`RUNTIME_NOT_DETECTED`,success:`SUCCESS`},O=[`system`,`light`,`dark`],Me=`foundry-export-v1`,Ne=[`settings`,`providers`],k=[`codex`,`claude-code`],Pe=[`image/png`,`image/jpeg`,`image/webp`,`image/svg+xml`],Fe=[`authorization`,`x-api-key`],Ie=[`effort`,`xhigh_effort`,`max_effort`,`thinking`,`adaptive_thinking`,`interleaved_thinking`],Le=p.strictObject({});function Re(e,t){e.get(`/api/data/export`,c(`query`,Le),async()=>{let e=await t.createExport();return new Response(e.content,{headers:{"cache-control":`no-store`,"content-disposition":`attachment; filename="${e.filename}"`,"content-length":String(e.content.byteLength),"content-type":`application/octet-stream`,"x-content-type-options":`nosniff`}})})}const ze=new TextEncoder;function A(e){return String(e).padStart(2,`0`)}function Be(e){let t={avatar:e.avatar,name:e.name,officialWebsite:e.officialWebsite,remark:e.remark};return e.runtime,{...t,configuration:e.configuration,runtime:e.runtime}}function Ve(e,t,n,r){let i=ze.encode(JSON.stringify(r));return{content:i,manifest:{id:e,mediaType:`application/json`,overwrite:n,path:t,sha256:g(`sha256`).update(i).digest(`hex`),size:i.byteLength}}}function He(e){return`foundry-export-${[e.getFullYear(),`-`,A(e.getMonth()+1),`-`,A(e.getDate()),`T`,A(e.getHours()),A(e.getMinutes()),A(e.getSeconds())].join(``)}.foundry`}var Ue=class{providerStore;settingsStore;now;foundryVersion;constructor(t,n,r=()=>new Date,i=e){this.providerStore=t,this.settingsStore=n,this.now=r,this.foundryVersion=i}async createExport(){let e=this.now(),t=this.settingsStore.getApplicationSettings(),n=k.flatMap(e=>this.providerStore.listProviders(e).map(e=>Be(e))),r=[Ve(`settings`,`modules/settings.json`,!0,t),Ve(`providers`,`modules/providers.json`,!1,n)],i={createdAt:e.toISOString(),format:Me,foundryVersion:this.foundryVersion,modules:r.map(e=>e.manifest)},a=new te(new h),o=JSON.stringify(i),s=ze.encode(o);await a.add(`manifest.json`,new m(s));for(let e of r)await a.add(e.manifest.path,new m(e.content));return{content:await a.close(),filename:He(e),manifest:i}}};const We=/^[A-Za-z0-9+/]+={0,2}$/u;function Ge(e,t){for(let n of e){let e=n.codePointAt(0)??0,r=t&&[9,10,13].includes(e);if(e===127||!r&&e<32)return!0}return!1}function j(e){return p.string().trim().max(e).refine(e=>!Ge(e,!0),{message:`Control characters are not allowed.`})}function M(e){return j(e).nullable().transform(e=>e===``?null:e)}function Ke(e,t){try{let n=new URL(e);return[`http:`,`https:`].includes(n.protocol)&&n.username===``&&n.password===``&&(t||n.search===``&&n.hash===``)}catch{return!1}}const qe=j(2048).min(1).refine(e=>Ke(e,!1),{message:`Provide an HTTP or HTTPS URL without credentials, a query, or a fragment.`}),Je=M(2048).refine(e=>e===null||Ke(e,!0),{message:`Provide an HTTP or HTTPS URL without credentials.`}),Ye=j(100).min(1),Xe=M(100),Ze=M(2e3),N=j(200).min(1),Qe=M(200),$e=M(2e3),et=p.string().min(1).max(16384).refine(e=>!Ge(e,!1),{message:`Control characters are not allowed.`}),tt=p.union([et,p.literal(``),p.null()]).transform(e=>e===``?null:e);function nt(e,t){if(e===`image/png`)return[137,80,78,71,13,10,26,10].every((e,n)=>t[n]===e);if(e===`image/jpeg`)return t[0]===255&&t[1]===216&&t[2]===255;if(e===`image/svg+xml`)try{let e=new ae(`utf-8`,{fatal:!0}).decode(t);return/^\s*(?:(?:<\?xml[\s\S]*?\?>|<!--[\s\S]*?-->|<!DOCTYPE[\s\S]*?>)\s*)*<svg(?:\s|>)/u.test(e)}catch{return!1}return t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===87&&t[9]===69&&t[10]===66&&t[11]===80}const rt=p.strictObject({data:p.string().min(1).max(2796204),mimeType:p.enum(Pe)}).superRefine((e,t)=>{if(!We.test(e.data)){t.addIssue({code:`custom`,message:`Avatar data must be valid Base64.`});return}let n=se.from(e.data,`base64`);(n.byteLength===0||n.byteLength>2097152||n.toString(`base64`)!==e.data||!nt(e.mimeType,n))&&t.addIssue({code:`custom`,message:`Avatar data must be a valid PNG, JPEG, WebP, or SVG image no larger than 2 MB.`})}),it=p.array(p.enum(Ie)).max(Ie.length).refine(e=>new Set(e).size===e.length,{message:`Model capabilities must be unique.`}),P=p.strictObject({description:Ze,displayName:Xe,model:N,supportedCapabilities:it}),at=p.union([N,P.transform(e=>e.model)]),ot=p.strictObject({apiKey:tt,baseUrl:qe,defaultModel:N,protocol:p.literal(`responses`),reviewModel:Qe}),st=p.strictObject({apiKey:et,apiKeyHeader:p.enum(Fe),baseUrl:qe,fableModel:P.nullable(),haikuModel:P.nullable(),opusModel:P.nullable(),defaultModel:at,protocol:p.literal(`messages`),sonnetModel:P.nullable(),subagentModel:Qe,subagentModelForce:p.boolean().default(!1),hideAiAttribution:p.boolean().default(!1),teammatesMode:p.boolean().default(!1),enableToolSearch:p.boolean().default(!1),maxEffortThinking:p.boolean().default(!1),disableAutoUpdater:p.boolean().default(!1)}),ct={avatar:rt.nullable(),name:Ye,officialWebsite:Je,remark:$e},F=p.discriminatedUnion(`runtime`,[p.strictObject({...ct,configuration:ot,runtime:p.literal(`codex`)}),p.strictObject({...ct,configuration:st,runtime:p.literal(`claude-code`)})]),I=p.strictObject({providerId:p.string().min(1)}),lt=p.strictObject({runtime:p.enum(k)});function L(e){return F.parse(e)}function ut(e){return ot.parse(e)}function dt(e){return st.parse(e)}function ft(e){return e===null?null:se.from(rt.parse(e).data,`base64`)}const pt=new ae(`utf-8`,{fatal:!0}),mt=p.string().regex(/^[a-f0-9]{64}$/u),ht=p.strictObject({id:p.string().min(1).max(100).regex(/^[a-z][a-z0-9-]*$/u),mediaType:p.string().min(1).max(100),overwrite:p.boolean(),path:p.string().min(1).max(512),sha256:mt,size:p.number().int().nonnegative().max(2**53-1)}),gt=p.strictObject({createdAt:p.string().min(1).max(64).refine(e=>!Number.isNaN(Date.parse(e))),format:p.literal(Me),foundryVersion:p.string().min(1).max(100),modules:p.array(ht).max(256)}).superRefine((e,t)=>{let n=new Set,r=new Set;for(let[i,a]of e.modules.entries())n.has(a.id)&&t.addIssue({code:`custom`,message:`Export Module identifiers must be unique.`,path:[`modules`,i,`id`]}),r.has(a.path)&&t.addIssue({code:`custom`,message:`Export Module paths must be unique.`,path:[`modules`,i,`path`]}),n.add(a.id),r.add(a.path)}),_t=p.strictObject({colorMode:p.enum(O)}),vt=p.array(F);var R=class extends Error{constructor(e){super(`The selected file is not a valid Foundry Export.`,{cause:e}),this.name=`FoundryImportFileError`}};function yt(e){return Ne.includes(e)}function bt(e,t){let n=e.find(e=>e.filename===t);if(!n||n.directory||n.encrypted||n.symlink)throw Error(`The Export Module entry is unavailable.`);return n}async function xt(e,t){if(e.uncompressedSize>t)throw Error(`The archive entry is too large.`);let n=await e.getData(new h);if(n.byteLength>t)throw Error(`The archive entry is too large.`);return JSON.parse(pt.decode(n))}async function St(e){try{let t=gt.parse(await xt(bt(e,`manifest.json`),1048576)),n=new Set([`manifest.json`,...t.modules.map(e=>e.path)]),r=e.some(e=>!e.directory&&!n.has(e.filename)),i=new Set(t.modules.map(e=>e.id));if(r||Ne.some(e=>!i.has(e)))throw Error(`The Foundry Export package is incomplete.`);return t}catch(e){throw new R(e)}}async function Ct(e,t){if(e.mediaType!==`application/json`||e.size>268435456)throw Error(`The Export Module metadata is invalid.`);let n=bt(t,e.path);if(n.uncompressedSize!==e.size)throw Error(`The Export Module size does not match its manifest.`);let r=await n.getData(new h),i=g(`sha256`).update(r).digest(`hex`);if(r.byteLength!==e.size||i!==e.sha256)throw Error(`The Export Module does not match its manifest.`);return JSON.parse(pt.decode(r))}function wt(e){return{id:e,importedItems:0,message:`${e===`settings`?`Application Settings`:`Providers`} could not be imported.`,status:`failed`}}var Tt=class{providerStore;settingsStore;constructor(e,t){this.providerStore=e,this.settingsStore=t}async importData(e){if(e.byteLength===0)throw new R;let t=new ee(new m(e),{checkCrc32:!0,filenameValidation:`strict`,maxAppendedDataSize:0,strictness:`strict`});try{let e;try{e=await t.getEntries()}catch(e){throw new R(e)}if(e.length>256)throw new R;let n=await St(e),r=[];for(let t of n.modules){if(!yt(t.id)){r.push({id:t.id,importedItems:0,message:`This Export Module is not supported by this Foundry version.`,status:`unsupported`});continue}try{let n=await Ct(t,e);if(t.id===`settings`){if(!t.overwrite)throw Error(`Application Settings must use overwrite import behavior.`);this.settingsStore.updateApplicationSettings(_t.parse(n)),r.push({id:t.id,importedItems:1,status:`imported`})}else{if(t.overwrite)throw Error(`Providers must use append import behavior.`);let e=vt.parse(n);this.providerStore.createProviders(e),r.push({id:t.id,importedItems:e.length,status:`imported`})}}catch{r.push(wt(t.id))}}return{modules:r}}finally{await t.close()}}};const Et=p.strictObject({});function Dt(e,t){e.post(`/api/data/import`,c(`query`,Et),ie({maxSize:268435456}),async e=>{try{let n=await t.importData(new Uint8Array(await e.req.arrayBuffer()));return e.json({status:D.success,data:n})}catch(t){if(t instanceof R)return e.json({message:t.message},400);throw t}})}function z(e){return{avatar:e.avatar,baseUrl:e.configuration.baseUrl,id:e.id,name:e.name,officialWebsite:e.officialWebsite,remark:e.remark,runtime:e.runtime}}function Ot(e,t,n){e.get(`/api/providers`,c(`query`,lt),e=>e.json({status:D.success,data:t.listProviders(e.req.valid(`query`).runtime).map(e=>z(e))})),e.delete(`/api/providers/:providerId`,c(`param`,I),e=>{let n=t.deleteProvider(e.req.valid(`param`).providerId);return n===`in-use`?e.json({status:D.providerInUse,data:!1,message:`A Provider in use cannot be deleted.`}):n===`not-found`?e.json({status:D.providerNotFound,data:!1,message:`The selected Provider is unavailable.`}):e.json({status:D.success,data:!0})}),e.post(`/api/providers/:providerId/test-connection`,c(`param`,I),async e=>{let r=t.getProvider(e.req.valid(`param`).providerId);if(r===null)return e.json({status:D.providerNotFound,data:!1,message:`The selected Provider is unavailable.`});let i=await n.testProvider(r);return i.successful?e.json({status:D.success,data:!0}):e.json({status:D.providerConnectionFailed,data:!1,message:i.message})}),e.post(`/api/providers`,c(`json`,F),e=>{let n=e.req.valid(`json`),r=z(t.createProvider(n));return e.json({status:D.success,data:r},201)}),e.get(`/api/providers/:providerId`,c(`param`,I),e=>{let n=t.getProvider(e.req.valid(`param`).providerId);return n===null?e.json({status:D.providerNotFound,data:null,message:`The selected Provider is unavailable.`}):e.json({status:D.success,data:n})}),e.post(`/api/providers/:providerId/copy`,c(`param`,I),c(`json`,F),e=>{let n=e.req.valid(`param`).providerId,r=t.getProvider(n);if(r===null)return e.json({status:D.providerNotFound,data:null,message:`The selected Provider is unavailable.`});let i=e.req.valid(`json`);if(i.runtime!==r.runtime)return e.json({message:`A Provider Runtime cannot be changed.`},400);let a=t.copyProvider(n,i);return a===null?e.json({status:D.providerNotFound,data:null,message:`The selected Provider is unavailable.`}):e.json({status:D.success,data:z(a)},201)}),e.put(`/api/providers/:providerId`,c(`param`,I),c(`json`,F),e=>{let n=e.req.valid(`param`).providerId,r=t.getProvider(n);if(r===null)return e.json({status:D.providerNotFound,data:null,message:`The selected Provider is unavailable.`});let i=e.req.valid(`json`);if(i.runtime!==r.runtime)return e.json({message:`A Provider Runtime cannot be changed.`},400);let a=t.updateProvider(n,i);return e.json({status:D.success,data:a===null?null:z(a)})})}var B=class extends Error{status;constructor(e,t){super(t),this.status=e}};const kt=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`official-default`)}),p.strictObject({kind:p.literal(`provider`),providerId:p.string().min(1)})]),At=p.strictObject({runtime:p.enum(k)}),jt=p.strictObject({}),Mt=p.strictObject({providerKey:p.string().min(1).max(200).optional(),target:kt}),Nt=p.strictObject({expectedFileHash:p.string().regex(/^[0-9a-f]{64}$/),providerKey:p.string().min(1).max(200).optional(),target:kt});function Pt(e,t){e.get(`/api/runtimes`,c(`query`,jt),async e=>e.json({status:D.success,data:await t.listRuntimes()})),e.post(`/api/runtimes/:runtime/preview`,c(`param`,At),c(`json`,Mt),async e=>{try{return e.json({status:D.success,data:await t.previewConfiguration(e.req.valid(`param`).runtime,e.req.valid(`json`))})}catch(t){if(t instanceof B)return e.json({status:t.status,data:null,message:t.message});throw t}}),e.post(`/api/runtimes/:runtime/apply`,c(`param`,At),c(`json`,Nt),async e=>{try{return e.json({status:D.success,data:await t.applyConfiguration(e.req.valid(`param`).runtime,e.req.valid(`json`))})}catch(t){if(t instanceof B)return e.json({status:t.status,data:null,message:t.message});throw t}})}const Ft=p.strictObject({}),It=p.strictObject({colorMode:p.enum(O)});function Lt(e,t){e.get(`/api/settings`,c(`query`,Ft),e=>e.json({status:D.success,data:t.getApplicationSettings()})),e.patch(`/api/settings`,c(`json`,It),e=>e.json({status:D.success,data:t.updateApplicationSettings(e.req.valid(`json`))}))}const Rt=p.strictObject({});function zt(){return[d.resolve(import.meta.dirname,`app`),d.resolve(import.meta.dirname,`../../dist/app`)].find(e=>u(e))}function Bt(e){let t=new f;t.get(`/api/health`,c(`query`,Rt),e=>e.json({status:D.success,data:!0,message:`Service is healthy.`})),Re(t,new Ue(e.providerStore,e.settingsStore)),Dt(t,new Tt(e.providerStore,e.settingsStore)),Lt(t,e.settingsStore),Ot(t,e.providerStore,e.providerConnectionTester),Pt(t,e.runtimeService);let n=e.webRoot??zt();return n&&t.use(`*`,s({root:n})),t}const V=`__drizzle_migrations`;function Vt(e){return!!e.prepare(`
|
|
3
3
|
SELECT 1
|
|
4
4
|
FROM sqlite_master
|
|
5
5
|
WHERE type = 'table' AND name = ?
|
|
6
|
-
`).pluck().get(
|
|
6
|
+
`).pluck().get(V)}function Ht(e){return Vt(e)?e.prepare(`
|
|
7
7
|
SELECT hash, created_at
|
|
8
|
-
FROM ${
|
|
8
|
+
FROM ${V}
|
|
9
9
|
ORDER BY created_at ASC
|
|
10
|
-
`).all():[]}function
|
|
11
|
-
CREATE TABLE IF NOT EXISTS ${
|
|
10
|
+
`).all():[]}function Ut(e,t){if(e.length>t.length)throw Error(`The Foundry database was migrated by a newer CLI version.`);for(let[n,r]of e.entries()){let e=t[n];if(r.hash!==e.hash||r.created_at!==e.folderMillis)throw Error(`The Foundry database migration history is incompatible.`)}}async function Wt(e){let t=(await me(e)).filter(e=>e.startsWith(`foundry-before-`)&&e.endsWith(`.sqlite`)).toSorted((e,t)=>e.localeCompare(t)).slice(0,-1);await Promise.all(t.map(t=>v(d.join(e,t),{force:!0})))}async function Gt(e,t,n){let r=d.join(d.dirname(t),`backups`);await _(r,{recursive:!0});let a=new Date(n()).toISOString().replaceAll(`:`,`-`),o=d.join(r,`foundry-before-${a}-${i.pid}.sqlite`);await e.backup(o),await Wt(r)}function Kt(e,t){e.exec(`BEGIN IMMEDIATE`);try{e.exec(`
|
|
11
|
+
CREATE TABLE IF NOT EXISTS ${V} (
|
|
12
12
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
13
13
|
hash TEXT NOT NULL,
|
|
14
14
|
created_at INTEGER NOT NULL
|
|
15
15
|
)
|
|
16
|
-
`);let n=
|
|
17
|
-
INSERT INTO ${
|
|
16
|
+
`);let n=Ht(e);Ut(n,t);let r=e.prepare(`
|
|
17
|
+
INSERT INTO ${V} (hash, created_at)
|
|
18
18
|
VALUES (?, ?)
|
|
19
|
-
`);for(let i of t.slice(n.length)){for(let t of i.sql)e.exec(t);r.run(i.hash,i.folderMillis)}e.exec(`COMMIT`)}catch(t){throw e.exec(`ROLLBACK`),t}}async function gt(e,t){let n=ge({migrationsFolder:t.migrationsFolder}),r=dt(e);ft(r,n),r.length!==n.length&&(t.isExistingDatabase&&await mt(e,t.databasePath,t.now??Date.now),ht(e,n))}function _t(){return i.platform!==`darwin`&&i.platform!==`win32`&&i.env.XDG_DATA_HOME&&!d.isAbsolute(i.env.XDG_DATA_HOME)?d.join(ve(),`.local`,`share`,`foundry`):_e(`foundry`,{suffix:``}).data}function vt(){return d.join(_t(),`foundry.sqlite`)}var yt=De({providers:()=>H,runtimes:()=>U,settings:()=>V});const V=C(`settings`,{id:w(`id`).primaryKey(),key:w(`key`).notNull(),value:w(`value`,{mode:`json`}).$type().notNull(),createdAt:S(`created_at`).notNull(),updatedAt:S(`updated_at`).notNull(),deletedAt:S(`deleted_at`)},e=>[Se(`settings_key_unique`).on(e.key),x(`settings_id_not_empty`,b`length(${e.id}) > 0`),x(`settings_key_not_empty`,b`length(trim(${e.key})) > 0`),x(`settings_value_json`,b`json_valid(${e.value})`),x(`settings_created_at_nonnegative`,b`${e.createdAt} >= 0`),x(`settings_updated_at_valid`,b`${e.updatedAt} >= ${e.createdAt}`),x(`settings_deleted_at_valid`,b`${e.deletedAt} IS NULL OR ${e.deletedAt} >= ${e.createdAt}`)]),H=C(`providers`,{id:w(`id`).primaryKey(),runtime:w(`runtime`,{enum:[`codex`,`claude-code`]}).notNull(),name:w(`name`).notNull(),officialWebsite:w(`official_website`),remark:w(`remark`),avatarMimeType:w(`avatar_mime_type`,{enum:[`image/png`,`image/jpeg`,`image/webp`,`image/svg+xml`]}),avatarData:be(`avatar_data`,{mode:`buffer`}),configuration:w(`configuration`,{mode:`json`}).$type().notNull(),createdAt:S(`created_at`).notNull(),updatedAt:S(`updated_at`).notNull(),deletedAt:S(`deleted_at`)},e=>[xe(`providers_runtime_created_at_index`).on(e.runtime,e.createdAt),x(`providers_id_not_empty`,b`length(${e.id}) > 0`),x(`providers_runtime_valid`,b`${e.runtime} IN ('codex', 'claude-code')`),x(`providers_name_valid`,b`length(trim(${e.name})) BETWEEN 1 AND 100`),x(`providers_official_website_valid`,b`${e.officialWebsite} IS NULL OR length(${e.officialWebsite}) <= 2048`),x(`providers_remark_valid`,b`${e.remark} IS NULL OR length(${e.remark}) <= 2000`),x(`providers_avatar_valid`,b`(${e.avatarMimeType} IS NULL AND ${e.avatarData} IS NULL) OR (${e.avatarMimeType} IN ('image/png', 'image/jpeg', 'image/webp', 'image/svg+xml') AND ${e.avatarData} IS NOT NULL AND length(${e.avatarData}) BETWEEN 1 AND 2097152)`),x(`providers_configuration_json`,b`json_valid(${e.configuration})`),x(`providers_created_at_nonnegative`,b`${e.createdAt} >= 0`),x(`providers_updated_at_valid`,b`${e.updatedAt} >= ${e.createdAt}`),x(`providers_deleted_at_valid`,b`${e.deletedAt} IS NULL OR ${e.deletedAt} >= ${e.createdAt}`)]),U=C(`runtimes`,{runtime:w(`runtime`,{enum:[`codex`,`claude-code`]}).primaryKey(),managed:S(`managed`,{mode:`boolean`}).notNull().default(!1),providerId:w(`provider_id`).references(()=>H.id,{onDelete:`restrict`}),appliedAt:S(`applied_at`)},e=>[x(`runtimes_runtime_valid`,b`${e.runtime} IN ('codex', 'claude-code')`),x(`runtimes_state_valid`,b`(${e.managed} = 0 AND ${e.providerId} IS NULL AND ${e.appliedAt} IS NULL) OR (${e.managed} = 1 AND ${e.appliedAt} IS NOT NULL)`),x(`runtimes_applied_at_nonnegative`,b`${e.appliedAt} IS NULL OR ${e.appliedAt} >= 0`)]);function bt(){let e=[d.resolve(import.meta.dirname,`migrations`),d.resolve(import.meta.dirname,`../../../drizzle`)].find(e=>u(e));if(!e)throw Error(`Foundry database migrations could not be found.`);return e}async function xt(e={}){let t=e.databasePath??vt(),n=u(t);await h(d.dirname(t),{recursive:!0});let r=new ne(t,{timeout:5e3});try{return r.pragma(`foreign_keys = ON`),r.function(`uuid_v7`,()=>oe()),await gt(r,{isExistingDatabase:n,databasePath:t,migrationsFolder:e.migrationsFolder??bt(),now:e.now}),{client:r,db:re({client:r,schema:yt})}}catch(e){throw r.close(),e}}function St(e){if(e.avatarMimeType===null&&e.avatarData===null)return null;if(e.avatarMimeType===null||e.avatarData===null)throw Error(`Stored Provider avatar is invalid.`);return{data:e.avatarData.toString(`base64`),mimeType:e.avatarMimeType}}function W(e){let t={avatar:St(e),createdAt:e.createdAt,id:e.id,name:e.name,officialWebsite:e.officialWebsite,remark:e.remark,updatedAt:e.updatedAt};return e.runtime===`codex`?{...t,configuration:Je(e.configuration),runtime:e.runtime}:{...t,configuration:Ye(e.configuration),runtime:e.runtime}}var Ct=class{database;now;createId;constructor(e,t=Date.now,n=oe){this.database=e,this.now=t,this.createId=n}createProvider(e){let t=qe(e),n=Xe(t.avatar),r=this.now(),i=this.createId();return this.database.insert(H).values({avatarData:n,avatarMimeType:t.avatar?.mimeType??null,configuration:t.configuration,createdAt:r,deletedAt:null,id:i,name:t.name,officialWebsite:t.officialWebsite,remark:t.remark,runtime:t.runtime,updatedAt:r}).run(),W({avatarData:n,avatarMimeType:t.avatar?.mimeType??null,configuration:t.configuration,createdAt:r,deletedAt:null,id:i,name:t.name,officialWebsite:t.officialWebsite,remark:t.remark,runtime:t.runtime,updatedAt:r})}getProvider(e){let t=this.database.select().from(H).where(_(v(H.id,e),y(H.deletedAt))).get();return t?W(t):null}listProviders(e){return this.database.select().from(H).where(_(v(H.runtime,e),y(H.deletedAt))).orderBy(ye(H.createdAt),ye(H.id)).all().map(e=>W(e))}};function G(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function wt(e){if(typeof e==`string`)return e;if(typeof e==`bigint`)return e.toString();let t=JSON.stringify(e);return typeof t==`string`?t:String(e)}function Tt(e,t){return e===void 0?{kind:`absent`}:t?{kind:`secret`,value:wt(e)}:{kind:`plain`,value:wt(e)}}function K(e,t,n,r=!1){let i;return i=t===void 0&&n===void 0?`unchanged`:t===void 0?`add`:n===void 0?`remove`:t===n?`unchanged`:`update`,{current:Tt(t,r),key:e,operation:i,proposed:Tt(n,r)}}function q(e){return{changes:e.filter(e=>e.operation!==`unchanged`),unchanged:e.filter(e=>e.operation===`unchanged`)}}function Et(e){return ie(`sha256`).update(e===null?`absent\0`:`present\0${e}`).digest(`hex`)}function Dt(e,t){try{let n=e===`codex`?Ce(t):JSON.parse(t);if(!G(n))throw Error(`Configuration root must be an object.`);return n}catch{throw new R(`RUNTIME_CONFIGURATION_INVALID`,`The ${e===`codex`?`Codex`:`Claude Code`} configuration cannot be safely parsed.`)}}async function Ot(e,t){try{let n=await le(t);if(!n.isFile())throw new R(`RUNTIME_CONFIGURATION_INVALID`,`The Runtime configuration path is not a regular file.`);let r=await ue(t,`utf8`);return{content:r,exists:!0,hash:Et(r),mode:n.mode&511,values:Dt(e,r)}}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return{content:null,exists:!1,hash:Et(null),mode:384,values:{}};throw e instanceof R?e:new R(`RUNTIME_APPLY_FAILED`,`The Runtime configuration could not be read.`)}}function J(e){return structuredClone(e)}function Y(e,t,n){n===void 0?delete e[t]:e[t]=n}function kt(e,t){return e.content===null?Te(t):we(e.content,t)}function At(e){let t=/(?:\r\n|\n)([\t ]+)"/.exec(e)?.[1];if(t!==void 0)return t.includes(` `)?` `:t.length}function jt(e,t){if(e.content===null)return`${JSON.stringify(t,null,2)}\n`;let n=e.content.includes(`\r
|
|
19
|
+
`);for(let i of t.slice(n.length)){for(let t of i.sql)e.exec(t);r.run(i.hash,i.folderMillis)}e.exec(`COMMIT`)}catch(t){throw e.exec(`ROLLBACK`),t}}async function qt(e,t){let n=ye({migrationsFolder:t.migrationsFolder}),r=Ht(e);Ut(r,n),r.length!==n.length&&(t.isExistingDatabase&&await Gt(e,t.databasePath,t.now??Date.now),Kt(e,n))}function Jt(){return i.platform!==`darwin`&&i.platform!==`win32`&&i.env.XDG_DATA_HOME&&!d.isAbsolute(i.env.XDG_DATA_HOME)?d.join(xe(),`.local`,`share`,`foundry`):be(`foundry`,{suffix:``}).data}function Yt(){return d.join(Jt(),`foundry.sqlite`)}var Xt=je({providers:()=>U,runtimes:()=>W,settings:()=>H});const H=T(`settings`,{id:E(`id`).primaryKey(),key:E(`key`).notNull(),value:E(`value`,{mode:`json`}).$type().notNull(),createdAt:w(`created_at`).notNull(),updatedAt:w(`updated_at`).notNull(),deletedAt:w(`deleted_at`)},e=>[Te(`settings_key_unique`).on(e.key),C(`settings_id_not_empty`,S`length(${e.id}) > 0`),C(`settings_key_not_empty`,S`length(trim(${e.key})) > 0`),C(`settings_value_json`,S`json_valid(${e.value})`),C(`settings_created_at_nonnegative`,S`${e.createdAt} >= 0`),C(`settings_updated_at_valid`,S`${e.updatedAt} >= ${e.createdAt}`),C(`settings_deleted_at_valid`,S`${e.deletedAt} IS NULL OR ${e.deletedAt} >= ${e.createdAt}`)]),U=T(`providers`,{id:E(`id`).primaryKey(),runtime:E(`runtime`,{enum:[`codex`,`claude-code`]}).notNull(),name:E(`name`).notNull(),officialWebsite:E(`official_website`),remark:E(`remark`),avatarMimeType:E(`avatar_mime_type`,{enum:[`image/png`,`image/jpeg`,`image/webp`,`image/svg+xml`]}),avatarData:Ce(`avatar_data`,{mode:`buffer`}),configuration:E(`configuration`,{mode:`json`}).$type().notNull(),createdAt:w(`created_at`).notNull(),updatedAt:w(`updated_at`).notNull(),deletedAt:w(`deleted_at`)},e=>[we(`providers_runtime_created_at_index`).on(e.runtime,e.createdAt),C(`providers_id_not_empty`,S`length(${e.id}) > 0`),C(`providers_runtime_valid`,S`${e.runtime} IN ('codex', 'claude-code')`),C(`providers_name_valid`,S`length(trim(${e.name})) BETWEEN 1 AND 100`),C(`providers_official_website_valid`,S`${e.officialWebsite} IS NULL OR length(${e.officialWebsite}) <= 2048`),C(`providers_remark_valid`,S`${e.remark} IS NULL OR length(${e.remark}) <= 2000`),C(`providers_avatar_valid`,S`(${e.avatarMimeType} IS NULL AND ${e.avatarData} IS NULL) OR (${e.avatarMimeType} IN ('image/png', 'image/jpeg', 'image/webp', 'image/svg+xml') AND ${e.avatarData} IS NOT NULL AND length(${e.avatarData}) BETWEEN 1 AND 2097152)`),C(`providers_configuration_json`,S`json_valid(${e.configuration})`),C(`providers_created_at_nonnegative`,S`${e.createdAt} >= 0`),C(`providers_updated_at_valid`,S`${e.updatedAt} >= ${e.createdAt}`),C(`providers_deleted_at_valid`,S`${e.deletedAt} IS NULL OR ${e.deletedAt} >= ${e.createdAt}`)]),W=T(`runtimes`,{runtime:E(`runtime`,{enum:[`codex`,`claude-code`]}).primaryKey(),managed:w(`managed`,{mode:`boolean`}).notNull().default(!1),providerId:E(`provider_id`).references(()=>U.id,{onDelete:`restrict`}),appliedAt:w(`applied_at`)},e=>[C(`runtimes_runtime_valid`,S`${e.runtime} IN ('codex', 'claude-code')`),C(`runtimes_state_valid`,S`(${e.managed} = 0 AND ${e.providerId} IS NULL AND ${e.appliedAt} IS NULL) OR (${e.managed} = 1 AND ${e.appliedAt} IS NOT NULL)`),C(`runtimes_applied_at_nonnegative`,S`${e.appliedAt} IS NULL OR ${e.appliedAt} >= 0`)]);function Zt(){let e=[d.resolve(import.meta.dirname,`migrations`),d.resolve(import.meta.dirname,`../../../drizzle`)].find(e=>u(e));if(!e)throw Error(`Foundry database migrations could not be found.`);return e}async function Qt(e={}){let t=e.databasePath??Yt(),n=u(t);await _(d.dirname(t),{recursive:!0});let r=new ce(t,{timeout:5e3});try{return r.pragma(`foreign_keys = ON`),r.function(`uuid_v7`,()=>re()),await qt(r,{isExistingDatabase:n,databasePath:t,migrationsFolder:e.migrationsFolder??Zt(),now:e.now}),{client:r,db:le({client:r,schema:Xt})}}catch(e){throw r.close(),e}}function $t(e){if(e.avatarMimeType===null&&e.avatarData===null)return null;if(e.avatarMimeType===null||e.avatarData===null)throw Error(`Stored Provider avatar is invalid.`);return{data:e.avatarData.toString(`base64`),mimeType:e.avatarMimeType}}function G(e){let t={avatar:$t(e),createdAt:e.createdAt,id:e.id,name:e.name,officialWebsite:e.officialWebsite,remark:e.remark,updatedAt:e.updatedAt};return e.runtime===`codex`?{...t,configuration:ut(e.configuration),runtime:e.runtime}:{...t,configuration:dt(e.configuration),runtime:e.runtime}}var en=class{database;now;createId;constructor(e,t=Date.now,n=re){this.database=e,this.now=t,this.createId=n}createProvider(e){let t=L(e),n=ft(t.avatar),r=this.now(),i=this.createId();return this.database.insert(U).values({avatarData:n,avatarMimeType:t.avatar?.mimeType??null,configuration:t.configuration,createdAt:r,deletedAt:null,id:i,name:t.name,officialWebsite:t.officialWebsite,remark:t.remark,runtime:t.runtime,updatedAt:r}).run(),G({avatarData:n,avatarMimeType:t.avatar?.mimeType??null,configuration:t.configuration,createdAt:r,deletedAt:null,id:i,name:t.name,officialWebsite:t.officialWebsite,remark:t.remark,runtime:t.runtime,updatedAt:r})}createProviders(e){return this.database.transaction(()=>e.map(e=>this.createProvider(e)))}copyProvider(e,t){let n=this.getProvider(e);if(n===null)return null;let r=L(t);if(r.runtime!==n.runtime)throw Error(`A Provider Runtime cannot be changed.`);return this.createProvider(r)}deleteProvider(e){return this.database.transaction(()=>this.database.select({id:U.id}).from(U).where(y(b(U.id,e),x(U.deletedAt))).get()?this.database.select({providerId:W.providerId}).from(W).where(b(W.providerId,e)).get()?`in-use`:this.database.update(U).set({deletedAt:this.now()}).where(y(b(U.id,e),x(U.deletedAt))).run().changes===1?`deleted`:`not-found`:`not-found`)}getProvider(e){let t=this.database.select().from(U).where(y(b(U.id,e),x(U.deletedAt))).get();return t?G(t):null}listProviders(e){return this.database.select().from(U).where(y(b(U.runtime,e),x(U.deletedAt))).orderBy(Se(U.createdAt),Se(U.id)).all().map(e=>G(e))}updateProvider(e,t){let n=this.getProvider(e);if(n===null)return null;let r=L(t);if(r.runtime!==n.runtime)throw Error(`A Provider Runtime cannot be changed.`);let i=ft(r.avatar),a=this.now();return this.database.update(U).set({avatarData:i,avatarMimeType:r.avatar?.mimeType??null,configuration:r.configuration,name:r.name,officialWebsite:r.officialWebsite,remark:r.remark,updatedAt:a}).where(y(b(U.id,e),x(U.deletedAt))).run(),this.getProvider(e)}};const tn=new Set([404,405,501]);function nn(e,t){let n=new URL(e);return n.pathname=`${n.pathname.replace(/\/+$/u,``)}/${t}`,n.href}function rn(e){if(e.runtime===`codex`)return nn(e.configuration.baseUrl,`models`);let t=new URL(e.configuration.baseUrl).pathname.replace(/\/+$/u,``);return nn(e.configuration.baseUrl,t.endsWith(`/v1`)?`models`:`v1/models`)}function an(e){let t=new Headers({accept:`application/json`});if(e.runtime===`codex`){let{apiKey:n}=e.configuration;return n!==null&&t.set(`authorization`,`Bearer ${n}`),t}let{apiKey:n}=e.configuration;return t.set(`anthropic-version`,`2023-06-01`),t.set(e.configuration.apiKeyHeader,e.configuration.apiKeyHeader===`authorization`?`Bearer ${n}`:n),t}function on(e){return e>=300&&e<400?`The Provider redirected the request. Check the Base URL.`:e===401||e===403?`Authentication failed. Check the API key and its permissions.`:e===402?`The Provider rejected the request because billing is unavailable.`:e===408?`The Provider timed out while handling the request.`:e===429?`The Provider is rate limited or has insufficient quota.`:e>=500?`The Provider is temporarily unavailable.`:`The Provider returned HTTP ${e}.`}async function sn(e){return await e.body?.cancel(),{message:on(e.status),successful:!1}}function cn(e){return e instanceof DOMException&&e.name===`TimeoutError`?{message:`The connection timed out.`,successful:!1}:{message:`The Provider could not be reached${e instanceof Error?`: ${e.message}`:``}.`.slice(0,500),successful:!1}}var ln=class{fetcher;timeoutMs;constructor(e=fetch,t=1e4){this.fetcher=e,this.timeoutMs=t}async request(e,t){try{return{response:await this.fetcher(e,{headers:t,method:`GET`,redirect:`manual`,signal:AbortSignal.timeout(this.timeoutMs)}),type:`response`}}catch(e){return{error:e,type:`error`}}}async testProvider(e){let t=an(e),n=await this.request(rn(e),t);if(n.type===`error`)return cn(n.error);if(n.response.ok)return await n.response.body?.cancel(),{successful:!0};if(!tn.has(n.response.status))return sn(n.response);await n.response.body?.cancel();let r=await this.request(e.configuration.baseUrl,t);return r.type===`error`?cn(r.error):(await r.response.body?.cancel(),{successful:!0})}};function K(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function un(e){if(typeof e==`string`)return e;if(typeof e==`bigint`)return e.toString();let t=JSON.stringify(e);return typeof t==`string`?t:String(e)}function dn(e,t){return e===void 0?{kind:`absent`}:t?{kind:`secret`,value:un(e)}:{kind:`plain`,value:un(e)}}function q(e,t,n,r=!1){let i;return i=t===void 0&&n===void 0?`unchanged`:t===void 0?`add`:n===void 0?`remove`:t===n?`unchanged`:`update`,{current:dn(t,r),key:e,operation:i,proposed:dn(n,r)}}function J(e){return{changes:e.filter(e=>e.operation!==`unchanged`),unchanged:e.filter(e=>e.operation===`unchanged`)}}function fn(e){return g(`sha256`).update(e===null?`absent\0`:`present\0${e}`).digest(`hex`)}function pn(e,t){try{let n=e===`codex`?Ee(t):JSON.parse(t);if(!K(n))throw Error(`Configuration root must be an object.`);return n}catch{throw new B(`RUNTIME_CONFIGURATION_INVALID`,`The ${e===`codex`?`Codex`:`Claude Code`} configuration cannot be safely parsed.`)}}async function mn(e,t){try{let n=await fe(t);if(!n.isFile())throw new B(`RUNTIME_CONFIGURATION_INVALID`,`The Runtime configuration path is not a regular file.`);let r=await pe(t,`utf8`);return{content:r,exists:!0,hash:fn(r),mode:n.mode&511,values:pn(e,r)}}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return{content:null,exists:!1,hash:fn(null),mode:384,values:{}};throw e instanceof B?e:new B(`RUNTIME_APPLY_FAILED`,`The Runtime configuration could not be read.`)}}function Y(e){return structuredClone(e)}function hn(e,t,n){n===void 0?delete e[t]:e[t]=n}function gn(e,t){return e.content===null?Oe(t):De(e.content,t)}function _n(e){let t=/(?:\r\n|\n)([\t ]+)"/.exec(e)?.[1];if(t!==void 0)return t.includes(` `)?` `:t.length}function vn(e,t){if(e.content===null)return`${JSON.stringify(t,null,2)}\n`;let n=e.content.includes(`\r
|
|
20
20
|
`)?`\r
|
|
21
21
|
`:`
|
|
22
22
|
`,r=e.content.endsWith(`
|
|
23
|
-
`),i=JSON.stringify(t,null,
|
|
23
|
+
`),i=JSON.stringify(t,null,_n(e.content));return n===`\r
|
|
24
24
|
`&&(i=i.replaceAll(`
|
|
25
25
|
`,`\r
|
|
26
|
-
`)),r?`${i}${n}`:i}function Mt(e,t){return d.join(d.dirname(e),`.${d.basename(e)}.foundry-${t}-${ae()}.tmp`)}async function X(e,t,n,r){let i=Mt(e,r);try{await he(i,t,{encoding:`utf8`,flag:`wx`,mode:n}),await ce(i,n),await pe(i,e)}catch(e){try{await g(i,{force:!0})}catch{}throw e}}async function Nt(e,t,n,r){if(n.source.hash!==r)throw new R(`RUNTIME_CONFIGURATION_CHANGED`,`The Runtime configuration changed after Preview. Refresh and review it again.`);let{source:i}=n,a=d.dirname(t),o=`${t}.foundry-backup`;if(!(!i.exists||n.content!==i.content))return{rollback:async()=>{}};Dt(e,n.content);try{await h(a,{mode:448,recursive:!0}),i.exists&&i.content!==null?await X(o,i.content,384,`backup`):await g(o,{force:!0}),await X(t,n.content,i.mode,`write`)}catch(e){throw e instanceof R?e:new R(`RUNTIME_APPLY_FAILED`,`The Runtime configuration could not be safely updated.`)}return{rollback:async()=>{try{i.exists&&i.content!==null?await X(t,i.content,i.mode,`rollback`):await g(t,{force:!0})}catch{throw new R(`RUNTIME_APPLY_FAILED`,`The previous Runtime configuration could not be restored.`)}}}}const Pt=[`ANTHROPIC_DEFAULT_OPUS_MODEL`,`ANTHROPIC_DEFAULT_SONNET_MODEL`,`ANTHROPIC_DEFAULT_HAIKU_MODEL`,`ANTHROPIC_DEFAULT_FABLE_MODEL`],Ft=[``,`_NAME`,`_DESCRIPTION`,`_SUPPORTED_CAPABILITIES`],It=Pt.flatMap(e=>Ft.map(t=>`${e}${t}`)),Lt=[`CLAUDE_CODE_SUBAGENT_MODEL`,`CLAUDE_CODE_SUBAGENT_MODEL_FORCE`],Rt=[`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS`,`ENABLE_TOOL_SEARCH`,`CLAUDE_CODE_EFFORT_LEVEL`,`DISABLE_AUTOUPDATER`],zt=[`commit`,`pr`,`sessionUrl`],Z=[`ANTHROPIC_BASE_URL`,`ANTHROPIC_AUTH_TOKEN`,`ANTHROPIC_API_KEY`,`ANTHROPIC_MODEL`,...It,...Lt,...Rt];function Bt(e,t){if(t===null)return Z.filter(t=>e[t]!==void 0);let n=[`ANTHROPIC_BASE_URL`,t.apiKeyHeader===`authorization`?`ANTHROPIC_AUTH_TOKEN`:`ANTHROPIC_API_KEY`,`ANTHROPIC_MODEL`,...It,...Lt,...Rt],r=new Set(n);return[...n,...Z.filter(t=>!r.has(t)&&e[t]!==void 0)]}function Vt(e){return e===null?[void 0,void 0,void 0,void 0]:[e.model,e.displayName??void 0,e.description??void 0,e.supportedCapabilities.length>0?e.supportedCapabilities.join(`,`):void 0]}function Ht(e){let t=Object.fromEntries(Z.map(e=>[e,void 0]));if(e===null)return t;t.ANTHROPIC_BASE_URL=e.baseUrl,t.ANTHROPIC_AUTH_TOKEN=e.apiKeyHeader===`authorization`?e.apiKey:void 0,t.ANTHROPIC_API_KEY=e.apiKeyHeader===`x-api-key`?e.apiKey:void 0,t.ANTHROPIC_MODEL=e.defaultModel;let n=[e.opusModel,e.sonnetModel,e.haikuModel,e.fableModel];for(let[e,r]of Pt.entries()){let i=Vt(n[e]);for(let[e,n]of Ft.entries())t[`${r}${n}`]=i[e]}return t.CLAUDE_CODE_SUBAGENT_MODEL=e.subagentModel??void 0,t.CLAUDE_CODE_SUBAGENT_MODEL_FORCE=e.subagentModelForce?`1`:void 0,t.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=e.teammatesMode?`1`:void 0,t.ENABLE_TOOL_SEARCH=e.enableToolSearch?`true`:void 0,t.CLAUDE_CODE_EFFORT_LEVEL=e.maxEffortThinking?`max`:void 0,t.DISABLE_AUTOUPDATER=e.disableAutoUpdater?`1`:void 0,t}function Ut(e){let t=e?.hideAiAttribution===!0;return{commit:t?``:void 0,pr:t?``:void 0,sessionUrl:!t&&void 0}}function Wt(e,t,n,r){let i=e.values.env;if(i!==void 0&&!G(i))throw new R(`RUNTIME_CONFIGURATION_INVALID`,`Claude Code env must be an object.`);let a=i??{},o=Ht(r?.configuration??null),s=e.values.attribution;if(s!==void 0&&!G(s))throw new R(`RUNTIME_CONFIGURATION_INVALID`,`Claude Code attribution must be an object.`);let c=s??{},l=Ut(r?.configuration??null),u=[...Bt(a,r?.configuration??null).map(e=>K(`env.${e}`,a[e],o[e],e===`ANTHROPIC_AUTH_TOKEN`||e===`ANTHROPIC_API_KEY`)),...zt.map(e=>K(`attribution.${e}`,c[e],l[e]))],d=J(e.values),f=G(d.env)?d.env:{};d.env=f;for(let e of Z)Y(f,e,o[e]);Object.keys(f).length===0&&delete d.env;let p=G(d.attribution)?d.attribution:{};d.attribution=p;for(let e of zt){let t=l[e];t===void 0?delete p[e]:p[e]=t}Object.keys(p).length===0&&delete d.attribution;let m=q(u);return{content:jt(e,d),preview:{...m,file:{exists:e.exists,hash:e.hash,path:t},kind:`ready`,providerKey:null,runtime:`claude-code`,target:n},source:e}}const Q=[`model`,`review_model`,`model_provider`],Gt=[`name`,`base_url`,`wire_api`,`experimental_bearer_token`];function Kt(e){let t=e.model_providers;if(t===void 0)return{};if(!G(t))throw new R(`RUNTIME_CONFIGURATION_INVALID`,`Codex model_providers must be a table.`);return t}function qt(e){return Object.entries(Kt(e)).filter(e=>G(e[1])).map(([e])=>e)}function Jt(e,t){let n=qt(e);if(n.length===0){if(t!==void 0&&t!==`foundry`)throw new R(`RUNTIME_CONFIGURATION_INVALID`,`The selected Codex Provider key is unavailable.`);return{key:`foundry`,keys:n}}if(n.length===1){if(t!==void 0&&t!==n[0])throw new R(`RUNTIME_CONFIGURATION_INVALID`,`The selected Codex Provider key is unavailable.`);return{key:n[0],keys:n}}if(t===void 0)return{key:null,keys:n};if(!n.includes(t))throw new R(`RUNTIME_CONFIGURATION_INVALID`,`The selected Codex Provider key is unavailable.`);return{key:t,keys:n}}function Yt(e,t){let n=Kt(e)[t];if(n===void 0)return{};if(!G(n))throw new R(`RUNTIME_CONFIGURATION_INVALID`,`Codex model_providers.${t} must be a table.`);return n}function Xt(e,t,n,r,i){if(n.kind===`official-default`){let r=Q.map(t=>K(t,e.values[t],void 0)),i=J(e.values);for(let e of Q)delete i[e];let a=q(r);return{content:kt(e,i),preview:{...a,file:{exists:e.exists,hash:e.hash,path:t},kind:`ready`,providerKey:null,runtime:`codex`,target:n},source:e}}if(r===null)throw new R(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);let a=Jt(e.values,i);if(a.key===null)return{file:{exists:e.exists,hash:e.hash,path:t},kind:`provider-key-selection`,providerKeys:a.keys,runtime:`codex`,target:n};let o=a.key,s=Yt(e.values,o),c={model:r.configuration.defaultModel,model_provider:o,review_model:r.configuration.reviewModel??void 0},l={base_url:r.configuration.baseUrl,experimental_bearer_token:r.configuration.apiKey??void 0,name:r.name,wire_api:`responses`},u=[...Q.map(t=>K(t,e.values[t],c[t])),...Gt.map(e=>K(`[model_providers.${o}].${e}`,s[e],l[e],e===`experimental_bearer_token`))],d=J(e.values);for(let e of Q)Y(d,e,c[e]);let f=G(d.model_providers)?d.model_providers:{};d.model_providers=f;let p=G(f[o])?f[o]:{};f[o]=p;for(let e of Gt)Y(p,e,l[e]);let m=q(u);return{content:kt(e,d),preview:{...m,file:{exists:e.exists,hash:e.hash,path:t},kind:`ready`,providerKey:o,runtime:`codex`,target:n},source:e}}function Zt(e,t,n){if(t.kind===`official-default`)return null;if(n?.id!==t.providerId||n.runtime!==e)throw new R(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);return n}async function Qt(e,t,n,r,i){let a=await Ot(e,t),o=Zt(e,n,r);return e===`codex`?Xt(a,t,n,o,i):Wt(a,t,n,o)}function $t(e){return`preview`in e}var en=class{async preview(e,t,n,r,i){let a=await Qt(e,t,n,r,i);return $t(a)?a.preview:a}async apply(e,t,n,r,i,a){let o=await Qt(e,t,n,r,a);if(!$t(o))throw new R(`RUNTIME_CONFIGURATION_INVALID`,`Select a Codex Provider key before applying changes.`);return Nt(e,t,o,i)}};const tn=te(Ee),nn={"claude-code":{command:`claude`,configurationPath:d.join(`.claude`,`settings.json`)},codex:{command:`codex`,configurationPath:d.join(`.codex`,`config.toml`)}};async function rn(e){try{return await me(e),!0}catch(e){return!!(e&&typeof e==`object`&&`code`in e&&e.code!==`ENOENT`)}}async function an(e,t){let n=i.platform===`win32`?(i.env.PATHEXT??`.EXE;.CMD;.BAT;.COM`).split(`;`):[``];for(let r of t.split(d.delimiter))if(r)for(let t of n){let n=d.join(r,`${e}${t}`);try{return await se(n,i.platform===`win32`?l.F_OK:l.X_OK),await fe(n)}catch{}}return null}var on=class{homeDirectory;environmentPath;runVersion;constructor(e=ve(),t=i.env.PATH??``,n=async e=>{let t=await tn(e,[`--version`],{timeout:3e3,windowsHide:!0});return(t.stdout||t.stderr).trim()}){this.homeDirectory=e,this.environmentPath=t,this.runVersion=n}async detect(e){let t=nn[e],n=d.join(this.homeDirectory,t.configurationPath),r=await rn(n),i=await an(t.command,this.environmentPath);if(!i)return{configurationExists:r,configurationPath:n,executablePath:null,message:`${t.command} was not found in PATH.`,status:`not-detected`,version:null};try{return{configurationExists:r,configurationPath:n,executablePath:i,message:null,status:`detected`,version:await this.runVersion(i)}}catch{return{configurationExists:r,configurationPath:n,executablePath:i,message:`${t.command} --version could not be completed.`,status:`failed`,version:null}}}},sn=class{runtimeStore;providerStore;detector;configurationManager;inFlightRuntimes=new Set;constructor(e,t,n,r){this.runtimeStore=e,this.providerStore=t,this.detector=n,this.configurationManager=r}resolveProvider(e,t){if(t.kind===`official-default`)return null;let n=this.providerStore.getProvider(t.providerId);if(n?.runtime!==e)throw new R(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);return n}async requireDetection(e){let t=await this.detector.detect(e);if(t.status!==`detected`)throw new R(`RUNTIME_NOT_DETECTED`,t.message??`The Runtime could not be detected.`);return t}async listRuntimes(){let e=new Map(this.runtimeStore.listAssignments().map(e=>[e.runtime,e])),t=await Promise.all(O.map(e=>this.detector.detect(e)));return O.map((n,r)=>{let i=e.get(n);if(!i)throw Error(`Runtime assignment ${n} is missing.`);return{...i,detection:t[r]}})}async previewConfiguration(e,t){let n=await this.requireDetection(e),r=this.resolveProvider(e,t.target);return this.configurationManager.preview(e,n.configurationPath,t.target,r,t.providerKey)}async applyConfiguration(e,t){if(this.inFlightRuntimes.has(e))throw new R(`RUNTIME_APPLY_FAILED`,`A configuration update is already running for this Runtime.`);this.inFlightRuntimes.add(e);try{let n=await this.requireDetection(e),r=this.resolveProvider(e,t.target),i=await this.configurationManager.apply(e,n.configurationPath,t.target,r,t.expectedFileHash,t.providerKey);try{return{...this.runtimeStore.recordAssignment(e,t.target),detection:{...n,configurationExists:!0}}}catch(e){throw await i.rollback(),e}}finally{this.inFlightRuntimes.delete(e)}}},cn=class{database;now;constructor(e,t=Date.now){this.database=e,this.now=t}listAssignments(){let e=new Map(this.database.select().from(U).all().map(e=>[e.runtime,{appliedAt:e.appliedAt,managed:e.managed,providerId:e.providerId,runtime:e.runtime}]));return O.map(t=>{let n=e.get(t);if(!n)throw Error(`Runtime assignment ${t} is missing.`);return n})}recordAssignment(e,t){return this.database.transaction(()=>{let n=t.kind===`provider`?t.providerId:null;if(n!==null&&!this.database.select({runtime:H.runtime}).from(H).where(_(v(H.id,n),v(H.runtime,e),y(H.deletedAt))).get())throw new R(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);let r=this.now();if(this.database.update(U).set({appliedAt:r,managed:!0,providerId:n}).where(v(U.runtime,e)).run().changes!==1)throw Error(`Runtime assignment ${e} could not be saved.`);return{appliedAt:r,managed:!0,providerId:n,runtime:e}})}};const ln=`color_mode`,un=p.enum(D);var dn=class{database;now;constructor(e,t=Date.now){this.database=e,this.now=t}getApplicationSettings(){let e=this.database.select({deletedAt:V.deletedAt,key:V.key,value:V.value}).from(V).all();if(e.length!==1)throw Error(`Stored Application Settings are invalid.`);let[t]=e;if(t.key!==ln||t.deletedAt!==null)throw Error(`Stored Application Settings are invalid.`);return{colorMode:un.parse(t.value)}}updateApplicationSettings(e){if(this.database.update(V).set({updatedAt:this.now(),value:e.colorMode}).where(v(V.key,ln)).run().changes!==1)throw Error(`Stored Application Settings are invalid.`);return this.getApplicationSettings()}};const $=`127.0.0.1`;function fn(e){return new Promise((t,n)=>{e.close(e=>{if(e){n(e);return}t()})})}async function pn(e={}){let t=e.port??54321,n=await xt({databasePath:e.databasePath,migrationsFolder:e.migrationsFolder}),r=new Ct(n.db),i=lt({providerStore:r,runtimeService:new sn(new cn(n.db),r,new on,new en),settingsStore:new dn(n.db)});return new Promise((e,r)=>{let a=e=>{n.client.close(),r(e)},s=o({fetch:i.fetch,hostname:$,port:t},t=>{s.off(`error`,a);let r,i=t.port,o=async()=>{try{await fn(s)}finally{n.client.close()}};e({close:()=>(r??=o(),r),hostname:$,port:i,url:`http://${$}:${i}`})});s.once(`error`,a)})}function mn(e,t){return e instanceof Error&&`code`in e&&e.code===`EADDRINUSE`?`Port ${t} is already in use on 127.0.0.1.`:`Could not start Foundry Server: ${e instanceof Error?e.message:String(e)}`}function hn(e,t=i,n=console.error){let r=!1,a=()=>{r||(r=!0,t.off(`SIGINT`,a),t.off(`SIGTERM`,a),e.close().catch(e=>{n(`Could not stop Foundry Server: ${e instanceof Error?e.message:String(e)}`),t.exitCode=1}))};return t.once(`SIGINT`,a),t.once(`SIGTERM`,a),()=>{t.off(`SIGINT`,a),t.off(`SIGTERM`,a)}}const gn={error:console.error,log:console.info,openBrowser:a,registerShutdown:e=>{hn(e)},setExitCode:e=>{i.exitCode=e},startServer:pn};function _n(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n===`--port`){if(t+1>=e.length||e[t+1].startsWith(`--`))return`Missing value for option: --port`;t+=1;continue}if(!n.startsWith(`--port=`)&&n!==`--open`&&n!==`--no-open`)return`${n.startsWith(`-`)?`Unknown option`:`Unexpected argument`}: ${n}`}}function vn(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<1||t>65535)throw RangeError(`Port must be an integer between 1 and 65535. Received "${e}".`);return t}function yn(e=gn){return t({meta:{description:`Start the Local Web UI`,name:`ui`},args:{port:{default:`54321`,description:`Port for the Local Web UI`,type:`string`,valueHint:`port`},open:{default:!0,description:`Open the Local Web UI in the default browser`,negativeDescription:`Do not open the default browser`,type:`boolean`}},async run({args:t,rawArgs:n}){let r=_n(n);if(r){e.error(`${r}\nRun \`foundry ui --help\` for usage.`),e.setExitCode(1);return}let i;try{i=vn(t.port)}catch(t){e.error(`${t instanceof Error?t.message:String(t)}\nRun \`foundry ui --help\` for usage.`),e.setExitCode(1);return}let a;try{a=await e.startServer({port:i})}catch(t){e.error(mn(t,i)),e.setExitCode(1);return}if(e.registerShutdown(a),e.log(`Foundry Local Web UI: ${a.url}`),t.open)try{await e.openBrowser(a.url)}catch{e.error(`Could not open the default browser. Open ${a.url} manually.`)}}})}const bn=t({meta:{description:`An AI-native local developer runtime`,name:`foundry`,version:e},subCommands:{ui:yn()}});function xn(e){if(!e.some(e=>e===`--help`||e===`-h`)&&(e.length!==1||e[0]!==`--version`&&e[0]!==`-v`)&&!(e[0]===`ui`||!e[0]?.startsWith(`-`)))return`Unknown option: ${e[0]}`}async function Sn(e=i.argv.slice(2)){if(e.length===0){console.info(`${await n(bn)}\n`);return}let t=xn(e);if(t){console.error(`${t}\nRun \`foundry --help\` for usage.`),i.exitCode=1;return}await r(bn,{rawArgs:e})}Sn();export{};
|
|
26
|
+
`)),r?`${i}${n}`:i}function yn(e,t){return d.join(d.dirname(e),`.${d.basename(e)}.foundry-${t}-${ne()}.tmp`)}async function X(e,t,n,r){let i=yn(e,r);try{await ve(i,t,{encoding:`utf8`,flag:`wx`,mode:n}),await de(i,n),await ge(i,e)}catch(e){try{await v(i,{force:!0})}catch{}throw e}}async function bn(e,t,n,r){if(n.source.hash!==r)throw new B(`RUNTIME_CONFIGURATION_CHANGED`,`The Runtime configuration changed after Preview. Refresh and review it again.`);let{source:i}=n,a=d.dirname(t),o=`${t}.foundry-backup`;if(!(!i.exists||n.content!==i.content))return{rollback:async()=>{}};pn(e,n.content);try{await _(a,{mode:448,recursive:!0}),i.exists&&i.content!==null?await X(o,i.content,384,`backup`):await v(o,{force:!0}),await X(t,n.content,i.mode,`write`)}catch(e){throw e instanceof B?e:new B(`RUNTIME_APPLY_FAILED`,`The Runtime configuration could not be safely updated.`)}return{rollback:async()=>{try{i.exists&&i.content!==null?await X(t,i.content,i.mode,`rollback`):await v(t,{force:!0})}catch{throw new B(`RUNTIME_APPLY_FAILED`,`The previous Runtime configuration could not be restored.`)}}}}const xn=[`ANTHROPIC_DEFAULT_OPUS_MODEL`,`ANTHROPIC_DEFAULT_SONNET_MODEL`,`ANTHROPIC_DEFAULT_HAIKU_MODEL`,`ANTHROPIC_DEFAULT_FABLE_MODEL`],Sn=[``,`_NAME`,`_DESCRIPTION`,`_SUPPORTED_CAPABILITIES`],Cn=xn.flatMap(e=>Sn.map(t=>`${e}${t}`)),wn=[`CLAUDE_CODE_SUBAGENT_MODEL`,`CLAUDE_CODE_SUBAGENT_MODEL_FORCE`],Tn=[`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS`,`ENABLE_TOOL_SEARCH`,`CLAUDE_CODE_EFFORT_LEVEL`,`DISABLE_AUTOUPDATER`],En=[`commit`,`pr`,`sessionUrl`],Z=[`ANTHROPIC_BASE_URL`,`ANTHROPIC_AUTH_TOKEN`,`ANTHROPIC_API_KEY`,`ANTHROPIC_MODEL`,...Cn,...wn,...Tn];function Dn(e,t){if(t===null)return Z.filter(t=>e[t]!==void 0);let n=[`ANTHROPIC_BASE_URL`,t.apiKeyHeader===`authorization`?`ANTHROPIC_AUTH_TOKEN`:`ANTHROPIC_API_KEY`,`ANTHROPIC_MODEL`,...Cn,...wn,...Tn],r=new Set(n);return[...n,...Z.filter(t=>!r.has(t)&&e[t]!==void 0)]}function On(e){return e===null?[void 0,void 0,void 0,void 0]:[e.model,e.displayName??void 0,e.description??void 0,e.supportedCapabilities.length>0?e.supportedCapabilities.join(`,`):void 0]}function kn(e){let t=Object.fromEntries(Z.map(e=>[e,void 0]));if(e===null)return t;t.ANTHROPIC_BASE_URL=e.baseUrl,t.ANTHROPIC_AUTH_TOKEN=e.apiKeyHeader===`authorization`?e.apiKey:void 0,t.ANTHROPIC_API_KEY=e.apiKeyHeader===`x-api-key`?e.apiKey:void 0,t.ANTHROPIC_MODEL=e.defaultModel;let n=[e.opusModel,e.sonnetModel,e.haikuModel,e.fableModel];for(let[e,r]of xn.entries()){let i=On(n[e]);for(let[e,n]of Sn.entries())t[`${r}${n}`]=i[e]}return t.CLAUDE_CODE_SUBAGENT_MODEL=e.subagentModel??void 0,t.CLAUDE_CODE_SUBAGENT_MODEL_FORCE=e.subagentModelForce?`1`:void 0,t.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=e.teammatesMode?`1`:void 0,t.ENABLE_TOOL_SEARCH=e.enableToolSearch?`true`:void 0,t.CLAUDE_CODE_EFFORT_LEVEL=e.maxEffortThinking?`max`:void 0,t.DISABLE_AUTOUPDATER=e.disableAutoUpdater?`1`:void 0,t}function An(e){let t=e?.hideAiAttribution===!0;return{commit:t?``:void 0,pr:t?``:void 0,sessionUrl:!t&&void 0}}function jn(e,t,n,r){let i=e.values.env;if(i!==void 0&&!K(i))throw new B(`RUNTIME_CONFIGURATION_INVALID`,`Claude Code env must be an object.`);let a=i??{},o=kn(r?.configuration??null),s=e.values.attribution;if(s!==void 0&&!K(s))throw new B(`RUNTIME_CONFIGURATION_INVALID`,`Claude Code attribution must be an object.`);let c=s??{},l=An(r?.configuration??null),u=[...Dn(a,r?.configuration??null).map(e=>q(`env.${e}`,a[e],o[e],e===`ANTHROPIC_AUTH_TOKEN`||e===`ANTHROPIC_API_KEY`)),...En.map(e=>q(`attribution.${e}`,c[e],l[e]))],d=Y(e.values),f=K(d.env)?d.env:{};d.env=f;for(let e of Z)hn(f,e,o[e]);Object.keys(f).length===0&&delete d.env;let p=K(d.attribution)?d.attribution:{};d.attribution=p;for(let e of En){let t=l[e];t===void 0?delete p[e]:p[e]=t}Object.keys(p).length===0&&delete d.attribution;let m=J(u);return{content:vn(e,d),preview:{...m,file:{exists:e.exists,hash:e.hash,path:t},kind:`ready`,providerKey:null,runtime:`claude-code`,target:n},source:e}}const Q=[`model`,`review_model`,`model_provider`],Mn=[`name`,`base_url`,`wire_api`,`experimental_bearer_token`];function Nn(e){let t=e.model_providers;if(t===void 0)return{};if(!K(t))throw new B(`RUNTIME_CONFIGURATION_INVALID`,`Codex model_providers must be a table.`);return t}function Pn(e){return Object.entries(Nn(e)).filter(e=>K(e[1])).map(([e])=>e)}function Fn(e,t){let n=Pn(e);if(n.length===0){if(t!==void 0&&t!==`foundry`)throw new B(`RUNTIME_CONFIGURATION_INVALID`,`The selected Codex Provider key is unavailable.`);return{key:`foundry`,keys:n}}if(n.length===1){if(t!==void 0&&t!==n[0])throw new B(`RUNTIME_CONFIGURATION_INVALID`,`The selected Codex Provider key is unavailable.`);return{key:n[0],keys:n}}if(t===void 0)return{key:null,keys:n};if(!n.includes(t))throw new B(`RUNTIME_CONFIGURATION_INVALID`,`The selected Codex Provider key is unavailable.`);return{key:t,keys:n}}function In(e,t){let n=Nn(e)[t];if(n===void 0)return{};if(!K(n))throw new B(`RUNTIME_CONFIGURATION_INVALID`,`Codex model_providers.${t} must be a table.`);return n}function Ln(e,t,n,r,i){if(n.kind===`official-default`){let r=Q.map(t=>q(t,e.values[t],void 0)),i=Y(e.values);for(let e of Q)delete i[e];let a=J(r);return{content:gn(e,i),preview:{...a,file:{exists:e.exists,hash:e.hash,path:t},kind:`ready`,providerKey:null,runtime:`codex`,target:n},source:e}}if(r===null)throw new B(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);let a=Fn(e.values,i);if(a.key===null)return{file:{exists:e.exists,hash:e.hash,path:t},kind:`provider-key-selection`,providerKeys:a.keys,runtime:`codex`,target:n};let o=a.key,s=In(e.values,o),c={model:r.configuration.defaultModel,model_provider:o,review_model:r.configuration.reviewModel??void 0},l={base_url:r.configuration.baseUrl,experimental_bearer_token:r.configuration.apiKey??void 0,name:r.name,wire_api:`responses`},u=[...Q.map(t=>q(t,e.values[t],c[t])),...Mn.map(e=>q(`[model_providers.${o}].${e}`,s[e],l[e],e===`experimental_bearer_token`))],d=Y(e.values);for(let e of Q)hn(d,e,c[e]);let f=K(d.model_providers)?d.model_providers:{};d.model_providers=f;let p=K(f[o])?f[o]:{};f[o]=p;for(let e of Mn)hn(p,e,l[e]);let m=J(u);return{content:gn(e,d),preview:{...m,file:{exists:e.exists,hash:e.hash,path:t},kind:`ready`,providerKey:o,runtime:`codex`,target:n},source:e}}function Rn(e,t,n){if(t.kind===`official-default`)return null;if(n?.id!==t.providerId||n.runtime!==e)throw new B(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);return n}async function zn(e,t,n,r,i){let a=await mn(e,t),o=Rn(e,n,r);return e===`codex`?Ln(a,t,n,o,i):jn(a,t,n,o)}function Bn(e){return`preview`in e}var Vn=class{async preview(e,t,n,r,i){let a=await zn(e,t,n,r,i);return Bn(a)?a.preview:a}async apply(e,t,n,r,i,a){let o=await zn(e,t,n,r,a);if(!Bn(o))throw new B(`RUNTIME_CONFIGURATION_INVALID`,`Select a Codex Provider key before applying changes.`);return bn(e,t,o,i)}};const Hn=oe(ke),Un={"claude-code":{command:`claude`,configurationPath:d.join(`.claude`,`settings.json`)},codex:{command:`codex`,configurationPath:d.join(`.codex`,`config.toml`)}};async function Wn(e){try{return await _e(e),!0}catch(e){return!!(e&&typeof e==`object`&&`code`in e&&e.code!==`ENOENT`)}}async function Gn(e,t){let n=i.platform===`win32`?(i.env.PATHEXT??`.EXE;.CMD;.BAT;.COM`).split(`;`):[``];for(let r of t.split(d.delimiter))if(r)for(let t of n){let n=d.join(r,`${e}${t}`);try{return await ue(n,i.platform===`win32`?l.F_OK:l.X_OK),await he(n)}catch{}}return null}var Kn=class{homeDirectory;environmentPath;runVersion;constructor(e=xe(),t=i.env.PATH??``,n=async e=>{let t=await Hn(e,[`--version`],{timeout:3e3,windowsHide:!0});return(t.stdout||t.stderr).trim()}){this.homeDirectory=e,this.environmentPath=t,this.runVersion=n}async detect(e){let t=Un[e],n=d.join(this.homeDirectory,t.configurationPath),r=await Wn(n),i=await Gn(t.command,this.environmentPath);if(!i)return{configurationExists:r,configurationPath:n,executablePath:null,message:`${t.command} was not found in PATH.`,status:`not-detected`,version:null};try{return{configurationExists:r,configurationPath:n,executablePath:i,message:null,status:`detected`,version:await this.runVersion(i)}}catch{return{configurationExists:r,configurationPath:n,executablePath:i,message:`${t.command} --version could not be completed.`,status:`failed`,version:null}}}},qn=class{runtimeStore;providerStore;detector;configurationManager;inFlightRuntimes=new Set;constructor(e,t,n,r){this.runtimeStore=e,this.providerStore=t,this.detector=n,this.configurationManager=r}resolveProvider(e,t){if(t.kind===`official-default`)return null;let n=this.providerStore.getProvider(t.providerId);if(n?.runtime!==e)throw new B(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);return n}async requireDetection(e){let t=await this.detector.detect(e);if(t.status!==`detected`)throw new B(`RUNTIME_NOT_DETECTED`,t.message??`The Runtime could not be detected.`);return t}async listRuntimes(){let e=new Map(this.runtimeStore.listAssignments().map(e=>[e.runtime,e])),t=await Promise.all(k.map(e=>this.detector.detect(e)));return k.map((n,r)=>{let i=e.get(n);if(!i)throw Error(`Runtime assignment ${n} is missing.`);return{...i,detection:t[r]}})}async previewConfiguration(e,t){let n=await this.requireDetection(e),r=this.resolveProvider(e,t.target);return this.configurationManager.preview(e,n.configurationPath,t.target,r,t.providerKey)}async applyConfiguration(e,t){if(this.inFlightRuntimes.has(e))throw new B(`RUNTIME_APPLY_FAILED`,`A configuration update is already running for this Runtime.`);this.inFlightRuntimes.add(e);try{let n=await this.requireDetection(e),r=this.resolveProvider(e,t.target),i=await this.configurationManager.apply(e,n.configurationPath,t.target,r,t.expectedFileHash,t.providerKey);try{return{...this.runtimeStore.recordAssignment(e,t.target),detection:{...n,configurationExists:!0}}}catch(e){throw await i.rollback(),e}}finally{this.inFlightRuntimes.delete(e)}}},Jn=class{database;now;constructor(e,t=Date.now){this.database=e,this.now=t}listAssignments(){let e=new Map(this.database.select().from(W).all().map(e=>[e.runtime,{appliedAt:e.appliedAt,managed:e.managed,providerId:e.providerId,runtime:e.runtime}]));return k.map(t=>{let n=e.get(t);if(!n)throw Error(`Runtime assignment ${t} is missing.`);return n})}recordAssignment(e,t){return this.database.transaction(()=>{let n=t.kind===`provider`?t.providerId:null;if(n!==null&&!this.database.select({runtime:U.runtime}).from(U).where(y(b(U.id,n),b(U.runtime,e),x(U.deletedAt))).get())throw new B(`PROVIDER_NOT_FOUND`,`The selected Provider is unavailable.`);let r=this.now();if(this.database.update(W).set({appliedAt:r,managed:!0,providerId:n}).where(b(W.runtime,e)).run().changes!==1)throw Error(`Runtime assignment ${e} could not be saved.`);return{appliedAt:r,managed:!0,providerId:n,runtime:e}})}};const Yn=`color_mode`,Xn=p.enum(O);var Zn=class{database;now;constructor(e,t=Date.now){this.database=e,this.now=t}getApplicationSettings(){let e=this.database.select({deletedAt:H.deletedAt,key:H.key,value:H.value}).from(H).all();if(e.length!==1)throw Error(`Stored Application Settings are invalid.`);let[t]=e;if(t.key!==Yn||t.deletedAt!==null)throw Error(`Stored Application Settings are invalid.`);return{colorMode:Xn.parse(t.value)}}updateApplicationSettings(e){if(this.database.update(H).set({updatedAt:this.now(),value:e.colorMode}).where(b(H.key,Yn)).run().changes!==1)throw Error(`Stored Application Settings are invalid.`);return this.getApplicationSettings()}};const $=`127.0.0.1`;function Qn(e){return new Promise((t,n)=>{e.close(e=>{if(e){n(e);return}t()})})}async function $n(e={}){let t=e.port??54321,n=await Qt({databasePath:e.databasePath,migrationsFolder:e.migrationsFolder}),r=new en(n.db),i=Bt({providerConnectionTester:new ln,providerStore:r,runtimeService:new qn(new Jn(n.db),r,new Kn,new Vn),settingsStore:new Zn(n.db)});return new Promise((e,r)=>{let a=e=>{n.client.close(),r(e)},s=o({fetch:i.fetch,hostname:$,port:t},t=>{s.off(`error`,a);let r,i=t.port,o=async()=>{try{await Qn(s)}finally{n.client.close()}};e({close:()=>(r??=o(),r),hostname:$,port:i,url:`http://${$}:${i}`})});s.once(`error`,a)})}function er(e,t){return e instanceof Error&&`code`in e&&e.code===`EADDRINUSE`?`Port ${t} is already in use on 127.0.0.1.`:`Could not start Foundry Server: ${e instanceof Error?e.message:String(e)}`}function tr(e,t=i,n=console.error){let r=!1,a=()=>{r||(r=!0,t.off(`SIGINT`,a),t.off(`SIGTERM`,a),e.close().catch(e=>{n(`Could not stop Foundry Server: ${e instanceof Error?e.message:String(e)}`),t.exitCode=1}))};return t.once(`SIGINT`,a),t.once(`SIGTERM`,a),()=>{t.off(`SIGINT`,a),t.off(`SIGTERM`,a)}}const nr={error:console.error,log:console.info,openBrowser:a,registerShutdown:e=>{tr(e)},setExitCode:e=>{i.exitCode=e},startServer:$n};function rr(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n===`--port`){if(t+1>=e.length||e[t+1].startsWith(`--`))return`Missing value for option: --port`;t+=1;continue}if(!n.startsWith(`--port=`)&&n!==`--open`&&n!==`--no-open`)return`${n.startsWith(`-`)?`Unknown option`:`Unexpected argument`}: ${n}`}}function ir(e){let t=Number(e);if(!Number.isSafeInteger(t)||t<1||t>65535)throw RangeError(`Port must be an integer between 1 and 65535. Received "${e}".`);return t}function ar(e=nr){return t({meta:{description:`Start the Local Web UI`,name:`ui`},args:{port:{default:`54321`,description:`Port for the Local Web UI`,type:`string`,valueHint:`port`},open:{default:!0,description:`Open the Local Web UI in the default browser`,negativeDescription:`Do not open the default browser`,type:`boolean`}},async run({args:t,rawArgs:n}){let r=rr(n);if(r){e.error(`${r}\nRun \`foundry ui --help\` for usage.`),e.setExitCode(1);return}let i;try{i=ir(t.port)}catch(t){e.error(`${t instanceof Error?t.message:String(t)}\nRun \`foundry ui --help\` for usage.`),e.setExitCode(1);return}let a;try{a=await e.startServer({port:i})}catch(t){e.error(er(t,i)),e.setExitCode(1);return}if(e.registerShutdown(a),e.log(`Foundry Local Web UI: ${a.url}`),t.open)try{await e.openBrowser(a.url)}catch{e.error(`Could not open the default browser. Open ${a.url} manually.`)}}})}const or=t({meta:{description:`An AI-native local developer runtime`,name:`foundry`,version:e},subCommands:{ui:ar()}});function sr(e){if(!e.some(e=>e===`--help`||e===`-h`)&&(e.length!==1||e[0]!==`--version`&&e[0]!==`-v`)&&!(e[0]===`ui`||!e[0]?.startsWith(`-`)))return`Unknown option: ${e[0]}`}async function cr(e=i.argv.slice(2)){if(e.length===0){console.info(`${await n(or)}\n`);return}let t=sr(e);if(t){console.error(`${t}\nRun \`foundry --help\` for usage.`),i.exitCode=1;return}await r(or,{rawArgs:e})}cr();export{};
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
import{t as e}from"./package-
|
|
2
|
+
import{t as e}from"./package-CgHJEDYp.mjs";function t(){return e}export{t as getVersion};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dhzh/foundry",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.1
|
|
4
|
+
"version": "1.2.1",
|
|
5
5
|
"devEngines": {
|
|
6
6
|
"packageManager": {
|
|
7
7
|
"name": "pnpm",
|
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
"@decimalturn/toml-patch": "^3.0.5",
|
|
74
74
|
"@hono/node-server": "^2.1.1",
|
|
75
75
|
"@hono/zod-validator": "^0.9.0",
|
|
76
|
+
"@zip.js/zip.js": "^2.12.0",
|
|
76
77
|
"better-sqlite3": "^13.0.3",
|
|
77
78
|
"citty": "^0.2.2",
|
|
78
79
|
"drizzle-orm": "^0.45.2",
|
|
@@ -1,2 +0,0 @@
|
|
|
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)))){:root,:host{--shimmer-angle:20deg}*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-space-x-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-outline-style:solid;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--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-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0;--scroll-fade-t:0px;--scroll-fade-b:0px;--scroll-fade-s:0px;--scroll-fade-e:0px;--scroll-fade-mask:initial;--shimmer-image:initial;--shimmer-text-fill:initial}}}@layer theme{:root,:host{--font-sans:"Inter Variable", sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-emerald-600:#009767;--color-black:#000;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-sm:calc(var(--radius) * .6);--radius-md:calc(var(--radius) * .8);--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;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter Variable", sans-serif;--default-mono-font-family:var(--font-mono)}@supports (color:lab(0% 0 0)){:root,:host{--color-emerald-600:lab(55.0481% -49.9246 15.93)}}}@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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);min-height:100svh;color:var(--foreground)}html{font-family:Inter Variable,sans-serif}#root{min-height:100svh}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.\@container\/field-group{container:field-group/inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.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}.inset-0{inset:0}.inset-x-4{inset-inline:calc(var(--spacing) * 4)}.inset-y-0{inset-block:0}.start-1\/2{inset-inline-start:50%}.end-0{inset-inline-end:calc(var(--spacing) * 0)}.end-2{inset-inline-end:calc(var(--spacing) * 2)}.inset-e-1{inset-inline-end:var(--spacing)}.inset-e-3{inset-inline-end:calc(var(--spacing) * 3)}.inset-e-4{inset-inline-end:calc(var(--spacing) * 4)}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.bottom-4{bottom:calc(var(--spacing) * 4)}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.z-\[calc\(1000-var\(--toast-index\)\)\]{z-index:calc(1000 - var(--toast-index))}.order-first{order:-9999}.order-last{order:9999}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-auto{margin-inline:auto}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-1{margin-block:var(--spacing)}.-ms-2{margin-inline-start:calc(var(--spacing) * -2)}.ms-3{margin-inline-start:calc(var(--spacing) * 3)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.ms-auto{margin-inline-start:auto}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.no-scrollbar::-webkit-scrollbar{display:none}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-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-full{width:100%;height:100%}.size-px{width:1px;height:1px}.h-\(--height\){height:var(--height)}.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-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-20{height:calc(var(--spacing) * 20)}.h-80{height:calc(var(--spacing) * 80)}.h-\[var\(--collapsible-panel-height\)\]{height:var(--collapsible-panel-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-\(--available-height\){max-height:var(--available-height)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[85vh\]{max-height:85vh}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[calc\(100svh-2rem\)\]{min-height:calc(100svh - 2rem)}.min-h-svh{min-height:100svh}.w-\(--anchor-width\){width:var(--anchor-width)}.w-\(--sidebar-width\){width:var(--sidebar-width)}.w-5{width:calc(var(--spacing) * 5)}.w-72{width:calc(var(--spacing) * 72)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\(--skeleton-width\){max-width:var(--skeleton-width)}.max-w-2xl{max-width:var(--container-2xl)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-6{min-width:calc(var(--spacing) * 6)}.min-w-7{min-width:calc(var(--spacing) * 7)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-32{min-width:calc(var(--spacing) * 32)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-\(--transform-origin\){transform-origin:var(--transform-origin)}.origin-bottom{transform-origin:bottom}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;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-\[calc\(-50\%-2px\)\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.\[transform\:translateX\(var\(--toast-swipe-movement-x\)\)_translateY\(calc\(var\(--toast-swipe-movement-y\)-\(var\(--toast-index\)\*var\(--peek\)\)-\(var\(--shrink\)\*var\(--height\)\)\)\)_scale\(var\(--scale\)\)\]{transform:translateX(var(--toast-swipe-movement-x)) translateY(calc(var(--toast-swipe-movement-y) - (var(--toast-index) * var(--peek)) - (var(--shrink) * var(--height)))) scale(var(--scale))}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize-none{resize:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.list-disc{list-style-type:disc}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-rows-\[auto_1fr\]{grid-template-rows:auto 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-\(--card-spacing\){gap:var(--card-spacing)}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-\[--spacing\(var\(--gap\)\)\]{gap:calc(var(--spacing) * var(--gap))}.gap-px{gap:1px}: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-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * -2) * calc(1 - var(--tw-space-x-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-\[calc\(var\(--radius-sm\)\+2px\)\]{border-radius:calc(var(--radius-sm) + 2px)}.rounded-\[calc\(var\(--radius-sm\)-2px\)\]{border-radius:calc(var(--radius-sm) - 2px)}.rounded-\[min\(var\(--radius-md\)\,8px\)\]{border-radius:min(var(--radius-md), 8px)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) * .8)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) * .6)}.rounded-xl{border-radius:calc(var(--radius) * 1.4)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-lg{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.rounded-b-lg{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border{border-color:var(--border)}.border-input{border-color:var(--input)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.bg-background{background-color:var(--background)}.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-border,.bg-border\/50{background-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/50{background-color:color-mix(in oklab, var(--border) 50%, transparent)}}.bg-card{background-color:var(--card)}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-foreground{background-color:var(--foreground)}.bg-input\/20{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.bg-input\/20{background-color:color-mix(in oklab, var(--input) 20%, transparent)}}.bg-muted,.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/20{background-color:color-mix(in oklab, var(--muted) 20%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-border{background-color:var(--sidebar-border)}.bg-transparent{background-color:#0000}.bg-clip-padding{background-clip:padding-box}.fill-foreground{fill:var(--foreground)}.object-cover{object-fit:cover}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-\(--card-spacing\){padding-inline:var(--card-spacing)}.px-1{padding-inline:var(--spacing)}.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)}.py-\(--card-spacing\){padding-block:var(--card-spacing)}.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-3{padding-block:calc(var(--spacing) * 3)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-8{padding-block:calc(var(--spacing) * 8)}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.pe-2{padding-inline-end:calc(var(--spacing) * 2)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.text-center{text-align:center}.text-start{text-align:start}.font-heading{font-family:var(--font-sans)}.font-mono{font-family:var(--font-mono)}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--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-xs\/relaxed{font-size:var(--text-xs);line-height:var(--leading-relaxed)}.text-\[0\.625rem\]{font-size:.625rem}.text-\[0\.6875rem\]{font-size:.6875rem}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.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)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-background{color:var(--background)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/20{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/20{color:color-mix(in oklab, var(--muted-foreground) 20%, transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground,.text-sidebar-foreground\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.text-sidebar-foreground\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, )}.underline-offset-4{text-underline-offset:4px}.bg-blend-color{background-blend-mode:color}.shadow-\[0_0_0_1px_var\(--sidebar-border\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));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-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--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)}.ring-2{--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)}.ring-background{--tw-ring-color:var(--background)}.ring-foreground\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;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-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-shadow{transition-property:box-shadow;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))}.transition-none{transition-property:none}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-250{--tw-duration:.25s;transition-duration:.25s}.ease-\[cubic-bezier\(0\.22\,1\,0\.36\,1\)\]{--tw-ease:cubic-bezier(.22,1,.36,1);transition-timing-function:cubic-bezier(.22,1,.36,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--card-spacing\:--spacing\(4\)\]{--card-spacing:calc(var(--spacing) * 4)}.\[--gap\:0\.75rem\]{--gap:.75rem}.\[--height\:var\(--toast-frontmost-height\,var\(--toast-height\)\)\]{--height:var(--toast-frontmost-height,var(--toast-height))}.\[--offset-y\:calc\(var\(--toast-offset-y\)\*-1\+calc\(var\(--toast-index\)\*var\(--gap\)\*-1\)\+var\(--toast-swipe-movement-y\)\)\]{--offset-y:calc(var(--toast-offset-y) * -1 + calc(var(--toast-index) * var(--gap) * -1) + var(--toast-swipe-movement-y))}.\[--peek\:0\.75rem\]{--peek:.75rem}.\[--scale\:calc\(max\(0\,1-\(var\(--toast-index\)\*0\.1\)\)\)\]{--scale:calc(max(0, 1 - (var(--toast-index) * .1)))}.\[--shrink\:calc\(1-var\(--scale\)\)\]{--shrink:calc(1 - var(--scale))}.\[transition\:transform_500ms_cubic-bezier\(0\.22\,1\,0\.36\,1\)\,opacity_500ms\,height_150ms\]{transition:transform .5s cubic-bezier(.22,1,.36,1),opacity .5s,height .15s}:is(.\*\:w-full>*){width:100%}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}}.group-has-focus-visible\/field-label\:border-transparent:is(:where(.group\/field-label):has(:focus-visible) *){border-color:#0000}.group-has-focus-visible\/field-label\:ring-0:is(:where(.group\/field-label):has(:focus-visible) *){--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-has-disabled\/field\:opacity-50:is(:where(.group\/field):has(:disabled) *){opacity:.5}.group-has-data-\[sidebar\=menu-action\]\/menu-item\:pe-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-inline-end:calc(var(--spacing) * 8)}.group-has-data-\[size\=lg\]\/avatar-group\:size-10:is(:where(.group\/avatar-group):has([data-size=lg]) *){width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.group-has-data-\[size\=sm\]\/avatar-group\:size-6:is(:where(.group\/avatar-group):has([data-size=sm]) *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.group-has-data-horizontal\/field\:text-balance:is(:where(.group\/field):has(:where([data-orientation=horizontal])) *){text-wrap:balance}.group-has-\[\:focus-visible\]\/field-label\:ring-0:is(:where(.group\/field-label):has(:focus-visible) *){--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-has-\[\:focus-visible\]\/field-label\:not-data-checked\:border-input:is(:where(.group\/field-label):has(:focus-visible) *):not(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){border-color:var(--input)}.group-has-\[\>input\]\/input-group\:pt-2:is(:where(.group\/input-group):has(>input) *){padding-top:calc(var(--spacing) * 2)}.group-has-\[\>input\]\/input-group\:pb-2:is(:where(.group\/input-group):has(>input) *){padding-bottom:calc(var(--spacing) * 2)}.group-has-\[\>svg\]\/alert\:col-start-2:is(:where(.group\/alert):has(>svg) *){grid-column-start:2}.group-data-panel-open\:rotate-90:is(:where(.group)[data-panel-open] *){rotate:90deg}.group-data-\[collapsible\=icon\]\:pointer-events-none:is(:where(.group)[data-collapsible=icon] *){pointer-events:none}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:size-8\!:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\(--sidebar-width-icon\):is(:where(.group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+\(--spacing\(4\)\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)))}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+\(--spacing\(4\)\)\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)) + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:p-0\!:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:p-2\!:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *),.group-data-\[disabled\=true\]\/field\:opacity-50:is(:where(.group\/field)[data-disabled=true] *),.group-data-\[disabled\=true\]\/input-group\:opacity-50:is(:where(.group\/input-group)[data-disabled=true] *){opacity:.5}.group-data-\[side\=left\]\:border-e:is(:where(.group)[data-side=left] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-s:is(:where(.group)[data-side=right] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.group-data-\[size\=default\]\/avatar\:size-2\.5:is(:where(.group\/avatar)[data-size=default] *){width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.group-data-\[size\=default\]\/switch\:size-3\.5:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.group-data-\[size\=lg\]\/avatar\:size-3:is(:where(.group\/avatar)[data-size=lg] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[size\=sm\]\/alert-dialog-content\:grid:is(:where(.group\/alert-dialog-content)[data-size=sm] *){display:grid}.group-data-\[size\=sm\]\/alert-dialog-content\:grid-cols-2:is(:where(.group\/alert-dialog-content)[data-size=sm] *){grid-template-columns:repeat(2,minmax(0,1fr))}.group-data-\[size\=sm\]\/avatar\:size-2:is(:where(.group\/avatar)[data-size=sm] *){width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.group-data-\[size\=sm\]\/avatar\:text-xs:is(:where(.group\/avatar)[data-size=sm] *){font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[spacing\=0\]\/toggle-group\:rounded-none:is(:where(.group\/toggle-group)[data-spacing="0"] *){border-radius:0}.group-data-\[spacing\=0\]\/toggle-group\:px-2:is(:where(.group\/toggle-group)[data-spacing="0"] *){padding-inline:calc(var(--spacing) * 2)}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius)}.group-data-\[variant\=floating\]\:shadow-sm:is(:where(.group)[data-variant=floating] *){--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)}.group-data-\[variant\=floating\]\:ring-1:is(:where(.group)[data-variant=floating] *){--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)}.group-data-\[variant\=floating\]\:ring-sidebar-border:is(:where(.group)[data-variant=floating] *){--tw-ring-color:var(--sidebar-border)}.group-data-\[variant\=outline\]\/field-group\:-mb-2:is(:where(.group\/field-group)[data-variant=outline] *){margin-bottom:calc(var(--spacing) * -2)}@media (hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-active\/menu-button\:text-sidebar-accent-foreground:is(:is(:where(.peer\/menu-button):where([data-state=active]),:where(.peer\/menu-button):where([data-active]:not([data-active=false])))~*){color:var(--sidebar-accent-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.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-xs\/relaxed::file-selector-button{font-size:var(--text-xs);line-height:var(--leading-relaxed)}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-0:after{content:var(--tw-content);inset:0}.after\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * -3)}.after\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(var(--spacing) * -2)}.after\:start-0:after{content:var(--tw-content);inset-inline-start:calc(var(--spacing) * 0)}.after\:top-full:after{content:var(--tw-content);top:100%}.after\:h-\[calc\(var\(--gap\)\+1px\)\]:after{content:var(--tw-content);height:calc(var(--gap) + 1px)}.after\:w-full:after{content:var(--tw-content);width:100%}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:border:after{content:var(--tw-content);border-style:var(--tw-border-style);border-width:1px}.after\:border-border:after{content:var(--tw-content);border-color:var(--border)}.after\:text-destructive:after{content:var(--tw-content);color:var(--destructive)}.after\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.after\:content-\[\'\*\'\]:after{--tw-content:"*";content:var(--tw-content)}.last\:mt-0:last-child{margin-top:0}@media (hover:hover){.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:color-mix(in oklch,var(--secondary),var(--foreground) 5%)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.hover\:bg-input\/50:hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-input\/50:hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-primary\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.hover\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-\[0_0_0_1px_var\(--sidebar-accent\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:z-10:focus{z-index:10}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus,:is(.not-data-\[variant\=destructive\]\:focus\:\*\*\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.focus-visible\:z-10:focus-visible{z-index:10}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.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-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/30:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/30:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 30%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.active\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.active\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=combobox-content]) .in-data-\[slot\=combobox-content\]\:focus-within\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .in-data-\[slot\=combobox-content\]\:focus-within\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.has-data-\[align\=block-end\]\:rounded-md:has([data-align=block-end]),.has-data-\[align\=block-start\]\:rounded-md:has([data-align=block-start])){border-radius:calc(var(--radius) * .8)}.has-data-\[icon\=inline-end\]\:pe-1\.5:has([data-icon=inline-end]){padding-inline-end:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(var(--spacing) * 2)}.group-data-\[spacing\=0\]\/toggle-group\:has-data-\[icon\=inline-end\]\:pe-1\.5:is(:where(.group\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-end]){padding-inline-end:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:ps-1\.5:has([data-icon=inline-start]){padding-inline-start:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(var(--spacing) * 2)}.group-data-\[spacing\=0\]\/toggle-group\:has-data-\[icon\=inline-start\]\:ps-1\.5:is(:where(.group\/toggle-group)[data-spacing="0"] *):has([data-icon=inline-start]){padding-inline-start:calc(var(--spacing) * 1.5)}.has-data-\[slot\=alert-action\]\:relative:has([data-slot=alert-action]){position:relative}.has-data-\[slot\=alert-action\]\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(var(--spacing) * 18)}.has-data-\[slot\=alert-dialog-media\]\:grid-rows-\[auto_auto_1fr\]:has([data-slot=alert-dialog-media]){grid-template-rows:auto auto 1fr}.has-data-\[slot\=alert-dialog-media\]\:gap-x-4:has([data-slot=alert-dialog-media]){column-gap:calc(var(--spacing) * 4)}.has-data-\[slot\=card-action\]\:grid-cols-1:has([data-slot=card-action]){grid-template-columns:repeat(1,minmax(0,1fr))}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-data-\[slot\=kbd\]\:pe-1\.5:has([data-slot=kbd]){padding-inline-end:calc(var(--spacing) * 1.5)}.has-data-\[variant\=inset\]\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.has-data-checked\:bg-primary\/5:has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.has-data-checked\:bg-primary\/5:has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-2:has([data-slot=input-group-control]: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)}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-ring\/30:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-ring\/30:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 30%, transparent)}}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-2:has([data-slot][aria-invalid=true]){--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)}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.has-\[textarea\]\:rounded-md:has(:is(textarea)){border-radius:calc(var(--radius) * .8)}.has-\[\>\[data-align\=block-end\]\]\:h-auto:has(>[data-align=block-end]){height:auto}.has-\[\>\[data-align\=block-end\]\]\:flex-col:has(>[data-align=block-end]){flex-direction:column}.has-\[\>\[data-align\=block-start\]\]\:h-auto:has(>[data-align=block-start]){height:auto}.has-\[\>\[data-align\=block-start\]\]\:flex-col:has(>[data-align=block-start]){flex-direction:column}.has-\[\>\[data-slot\=checkbox-group\]\]\:gap-3:has(>[data-slot=checkbox-group]){gap:calc(var(--spacing) * 3)}.has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}.has-\[\>\[data-slot\=field\]\]\:w-full:has(>[data-slot=field]){width:100%}.has-\[\>\[data-slot\=field\]\]\:flex-col:has(>[data-slot=field]){flex-direction:column}.has-\[\>\[data-slot\=field\]\]\:rounded-md:has(>[data-slot=field]){border-radius:calc(var(--radius) * .8)}.has-\[\>\[data-slot\=field\]\]\:border:has(>[data-slot=field]){border-style:var(--tw-border-style);border-width:1px}@media (hover:hover){.has-\[\>\[data-slot\=field\]\]\:not-has-\[\:disabled\,\[data-disabled\]\]\:hover\:bg-input\/40:has(>[data-slot=field]):not(:has(:is(:disabled,[data-disabled]))):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.has-\[\>\[data-slot\=field\]\]\:not-has-\[\:disabled\,\[data-disabled\]\]\:hover\:bg-input\/40:has(>[data-slot=field]):not(:has(:is(:disabled,[data-disabled]))):hover{background-color:color-mix(in oklab, var(--input) 40%, transparent)}}}.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:border-ring:has(>[data-slot=field]):has(:focus-visible){border-color:var(--ring)}.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:ring-2:has(>[data-slot=field]):has(: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)}.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:ring-ring\/30:has(>[data-slot=field]):has(:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:ring-ring\/30:has(>[data-slot=field]):has(:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 30%, transparent)}}.has-\[\>\[data-slot\=radio-group\]\]\:gap-3:has(>[data-slot=radio-group]){gap:calc(var(--spacing) * 3)}.has-\[\>button\]\:ms-\[-0\.275rem\]:has(>button){margin-inline-start:-.275rem}.has-\[\>button\]\:me-\[-0\.275rem\]:has(>button){margin-inline-end:-.275rem}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:0}.has-\[\>kbd\]\:ms-\[-0\.275rem\]:has(>kbd){margin-inline-start:-.275rem}.has-\[\>kbd\]\:me-\[-0\.275rem\]:has(>kbd){margin-inline-end:-.275rem}.has-\[\>svg\]\:grid-cols-\[auto_1fr\]:has(>svg){grid-template-columns:auto 1fr}.has-\[\>svg\]\:gap-x-1\.5:has(>svg){column-gap:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:p-0:has(>svg){padding:0}.has-\[\>textarea\]\:h-auto:has(>textarea){height:auto}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.aria-expanded\:opacity-100[aria-expanded=true]{opacity:1}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-2[aria-invalid=true]{--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)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.aria-invalid\:aria-checked\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.aria-pressed\:bg-muted[aria-pressed=true]{background-color:var(--muted)}.data-behind\:opacity-0[data-behind]{opacity:0}.data-ending-style\:h-0[data-ending-style]{height:0}.data-ending-style\:opacity-0[data-ending-style]{opacity:0}.data-expanded\:h-\(--toast-height\)[data-expanded]{height:var(--toast-height)}.data-expanded\:\[transform\:translateX\(var\(--toast-swipe-movement-x\)\)_translateY\(var\(--offset-y\)\)\][data-expanded]{transform:translateX(var(--toast-swipe-movement-x)) translateY(var(--offset-y))}.data-expanded\:opacity-100[data-expanded]{opacity:1}.data-limited\:opacity-0[data-limited]{opacity:0}.data-placeholder\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-starting-style\:h-0[data-starting-style]{height:0}.data-starting-style\:\[transform\:translateY\(150\%\)\][data-starting-style]{transform:translateY(150%)}.data-starting-style\:opacity-0[data-starting-style]{opacity:0}.data-\[align-trigger\=true\]\:animate-none[data-align-trigger=true]{animation:none}.data-\[invalid\=true\]\:text-destructive[data-invalid=true]{color:var(--destructive)}.data-\[side\=bottom\]\:inset-x-0[data-side=bottom]{inset-inline:0}.data-\[side\=bottom\]\:top-1[data-side=bottom]{top:var(--spacing)}.data-\[side\=bottom\]\:bottom-0[data-side=bottom]{bottom:0}.data-\[side\=bottom\]\:h-auto[data-side=bottom]{height:auto}.data-\[side\=bottom\]\:border-t[data-side=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=bottom\]\:data-ending-style\:translate-y-10[data-side=bottom][data-ending-style],.data-\[side\=bottom\]\:data-starting-style\:translate-y-10[data-side=bottom][data-starting-style]{--tw-translate-y:calc(var(--spacing) * 10);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=inline-end\]\:-inset-s-1[data-side=inline-end]{inset-inline-start:calc(var(--spacing) * -1)}.data-\[side\=inline-end\]\:top-1\/2\![data-side=inline-end]{top:50%!important}.data-\[side\=inline-end\]\:-translate-y-1\/2[data-side=inline-end]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=inline-end\]\:slide-in-from-start-2[data-side=inline-end]:where(:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=ltr]){--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=inline-end\]\:slide-in-from-start-2[data-side=inline-end]:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl]){--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=inline-start\]\:-inset-e-1[data-side=inline-start]{inset-inline-end:calc(var(--spacing) * -1)}.data-\[side\=inline-start\]\:top-1\/2\![data-side=inline-start]{top:50%!important}.data-\[side\=inline-start\]\:-translate-y-1\/2[data-side=inline-start]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=inline-start\]\:slide-in-from-end-2[data-side=inline-start]:where(:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=ltr]){--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=inline-start\]\:slide-in-from-end-2[data-side=inline-start]:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl]){--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:inset-y-0[data-side=left]{inset-block:0}.data-\[side\=left\]\:top-1\/2\![data-side=left]{top:50%!important}.data-\[side\=left\]\:-right-1[data-side=left]{right:calc(var(--spacing) * -1)}.data-\[side\=left\]\:left-0[data-side=left]{left:0}.data-\[side\=left\]\:h-full[data-side=left]{height:100%}.data-\[side\=left\]\:w-3\/4[data-side=left]{width:75%}.data-\[side\=left\]\:-translate-y-1\/2[data-side=left]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:border-e[data-side=left]{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=left\]\:group-data-\[collapsible\=offcanvas\]\:-left-\(--sidebar-width\)[data-side=left]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.data-\[side\=left\]\:data-ending-style\:-translate-x-10[data-side=left][data-ending-style],.data-\[side\=left\]\:data-starting-style\:-translate-x-10[data-side=left][data-starting-style]{--tw-translate-x:calc(var(--spacing) * -10);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:inset-y-0[data-side=right]{inset-block:0}.data-\[side\=right\]\:top-1\/2\![data-side=right]{top:50%!important}.data-\[side\=right\]\:right-0[data-side=right]{right:0}.data-\[side\=right\]\:-left-1[data-side=right]{left:calc(var(--spacing) * -1)}.data-\[side\=right\]\:h-full[data-side=right]{height:100%}.data-\[side\=right\]\:w-3\/4[data-side=right]{width:75%}.data-\[side\=right\]\:-translate-y-1\/2[data-side=right]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:border-s[data-side=right]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=right\]\:group-data-\[collapsible\=offcanvas\]\:-right-\(--sidebar-width\)[data-side=right]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.data-\[side\=right\]\:data-ending-style\:translate-x-10[data-side=right][data-ending-style],.data-\[side\=right\]\:data-starting-style\:translate-x-10[data-side=right][data-starting-style]{--tw-translate-x:calc(var(--spacing) * 10);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:inset-x-0[data-side=top]{inset-inline:0}.data-\[side\=top\]\:top-0[data-side=top]{top:0}.data-\[side\=top\]\:-bottom-2\.5[data-side=top]{bottom:calc(var(--spacing) * -2.5)}.data-\[side\=top\]\:h-auto[data-side=top]{height:auto}.data-\[side\=top\]\:border-b[data-side=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[side\=top\]\:data-ending-style\:-translate-y-10[data-side=top][data-ending-style],.data-\[side\=top\]\:data-starting-style\:-translate-y-10[data-side=top][data-starting-style]{--tw-translate-y:calc(var(--spacing) * -10);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[size\=default\]\:h-7[data-size=default]{height:calc(var(--spacing) * 7)}.data-\[size\=default\]\:h-\[16\.6px\][data-size=default]{height:16.6px}.data-\[size\=default\]\:w-7[data-size=default]{width:calc(var(--spacing) * 7)}.data-\[size\=default\]\:max-w-xs[data-size=default]{max-width:var(--container-xs)}.data-\[size\=lg\]\:size-10[data-size=lg]{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.data-\[size\=md\]\:text-xs[data-size=md]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.data-\[size\=sm\]\:size-6[data-size=sm]{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)}.data-\[size\=sm\]\:h-6[data-size=sm]{height:calc(var(--spacing) * 6)}.data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)}.data-\[size\=sm\]\:max-w-64[data-size=sm]{max-width:calc(var(--spacing) * 64)}.data-\[size\=sm\]\:rounded-\[min\(var\(--radius-md\)\,8px\)\][data-size=sm]{border-radius:min(var(--radius-md), 8px)}.data-\[size\=sm\]\:text-xs[data-size=sm]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.data-\[size\=sm\]\:\[--card-spacing\:--spacing\(3\)\][data-size=sm]{--card-spacing:calc(var(--spacing) * 3)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.\*\:data-\[slot\=avatar\]\:ring-2>*)[data-slot=avatar]{--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)}:is(.\*\:data-\[slot\=avatar\]\:ring-background>*)[data-slot=avatar]{--tw-ring-color:var(--background)}.data-\[slot\=checkbox-group\]\:gap-3[data-slot=checkbox-group]{gap:calc(var(--spacing) * 3)}:is(.\*\:data-\[slot\=field\]\:p-2>*)[data-slot=field]{padding:calc(var(--spacing) * 2)}:is(.\*\:data-\[slot\=field-group\]\:gap-4>*)[data-slot=field-group]{gap:calc(var(--spacing) * 4)}:is(.\*\:data-\[slot\=field-label\]\:flex-auto>*)[data-slot=field-label]{flex:auto}:is(.\*\*\:data-\[slot\=kbd\]\:relative *)[data-slot=kbd]{position:relative}:is(.\*\*\:data-\[slot\=kbd\]\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.\*\*\:data-\[slot\=kbd\]\:z-50 *)[data-slot=kbd]{z-index:50}:is(.\*\*\:data-\[slot\=kbd\]\:rounded-\[calc\(var\(--radius-sm\)-2px\)\] *)[data-slot=kbd]{border-radius:calc(var(--radius-sm) - 2px)}:is(.\*\*\:data-\[slot\=kbd\]\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.\*\*\:data-\[slot\=kbd\]\:bg-muted-foreground\/10 *)[data-slot=kbd]{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){:is(.\*\*\:data-\[slot\=kbd\]\:bg-muted-foreground\/10 *)[data-slot=kbd]{background-color:color-mix(in oklab, var(--muted-foreground) 10%, transparent)}}:is(.\*\*\:data-\[slot\=kbd\]\:px-1 *)[data-slot=kbd]{padding-inline:var(--spacing)}:is(.\*\*\:data-\[slot\=kbd\]\:text-\[0\.625rem\] *)[data-slot=kbd]{font-size:.625rem}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-1\.5>*)[data-slot=select-value]{gap:calc(var(--spacing) * 1.5)}.group-data-horizontal\/toggle-group\:data-\[spacing\=0\]\:first\:rounded-s-md:is(:where(.group\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:first-child{border-start-start-radius:calc(var(--radius) * .8);border-end-start-radius:calc(var(--radius) * .8)}.group-data-vertical\/toggle-group\:data-\[spacing\=0\]\:first\:rounded-t-md:is(:where(.group\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:first-child{border-top-left-radius:calc(var(--radius) * .8);border-top-right-radius:calc(var(--radius) * .8)}.group-data-horizontal\/toggle-group\:data-\[spacing\=0\]\:last\:rounded-e-md:is(:where(.group\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"]:last-child{border-start-end-radius:calc(var(--radius) * .8);border-end-end-radius:calc(var(--radius) * .8)}.group-data-vertical\/toggle-group\:data-\[spacing\=0\]\:last\:rounded-b-md:is(:where(.group\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"]:last-child{border-bottom-right-radius:calc(var(--radius) * .8);border-bottom-left-radius:calc(var(--radius) * .8)}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.data-\[state\=on\]\:bg-muted[data-state=on]{background-color:var(--muted)}.data-ending-style\:data-\[swipe-direction\=down\]\:\[transform\:translateY\(calc\(var\(--toast-swipe-movement-y\)\+150\%\)\)\][data-ending-style][data-swipe-direction=down],.data-expanded\:data-ending-style\:data-\[swipe-direction\=down\]\:\[transform\:translateY\(calc\(var\(--toast-swipe-movement-y\)\+150\%\)\)\][data-expanded][data-ending-style][data-swipe-direction=down]{transform:translateY(calc(var(--toast-swipe-movement-y) + 150%))}.data-ending-style\:data-\[swipe-direction\=left\]\:\[transform\:translateX\(calc\(var\(--toast-swipe-movement-x\)-150\%\)\)_translateY\(var\(--offset-y\)\)\][data-ending-style][data-swipe-direction=left],.data-expanded\:data-ending-style\:data-\[swipe-direction\=left\]\:\[transform\:translateX\(calc\(var\(--toast-swipe-movement-x\)-150\%\)\)_translateY\(var\(--offset-y\)\)\][data-expanded][data-ending-style][data-swipe-direction=left]{transform:translateX(calc(var(--toast-swipe-movement-x) - 150%)) translateY(var(--offset-y))}.data-ending-style\:data-\[swipe-direction\=right\]\:\[transform\:translateX\(calc\(var\(--toast-swipe-movement-x\)\+150\%\)\)_translateY\(var\(--offset-y\)\)\][data-ending-style][data-swipe-direction=right],.data-expanded\:data-ending-style\:data-\[swipe-direction\=right\]\:\[transform\:translateX\(calc\(var\(--toast-swipe-movement-x\)\+150\%\)\)_translateY\(var\(--offset-y\)\)\][data-expanded][data-ending-style][data-swipe-direction=right]{transform:translateX(calc(var(--toast-swipe-movement-x) + 150%)) translateY(var(--offset-y))}.data-ending-style\:data-\[swipe-direction\=up\]\:\[transform\:translateY\(calc\(var\(--toast-swipe-movement-y\)-150\%\)\)\][data-ending-style][data-swipe-direction=up],.data-expanded\:data-ending-style\:data-\[swipe-direction\=up\]\:\[transform\:translateY\(calc\(var\(--toast-swipe-movement-y\)-150\%\)\)\][data-expanded][data-ending-style][data-swipe-direction=up]{transform:translateY(calc(var(--toast-swipe-movement-y) - 150%))}.data-\[variant\=label\]\:text-xs\/relaxed[data-variant=label]{font-size:var(--text-xs);line-height:var(--leading-relaxed)}.data-\[variant\=legend\]\:text-sm[data-variant=legend]{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.group-data-horizontal\/toggle-group\:data-\[spacing\=0\]\:data-\[variant\=outline\]\:border-s-0:is(:where(.group\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.group-data-vertical\/toggle-group\:data-\[spacing\=0\]\:data-\[variant\=outline\]\:border-t-0:is(:where(.group\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]{border-top-style:var(--tw-border-style);border-top-width:0}.group-data-horizontal\/toggle-group\:data-\[spacing\=0\]\:data-\[variant\=outline\]\:first\:border-s:is(:where(.group\/toggle-group):where([data-orientation=horizontal]) *)[data-spacing="0"][data-variant=outline]:first-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.group-data-vertical\/toggle-group\:data-\[spacing\=0\]\:data-\[variant\=outline\]\:first\:border-t:is(:where(.group\/toggle-group):where([data-orientation=vertical]) *)[data-spacing="0"][data-variant=outline]:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.nth-last-2\:-mt-1:nth-last-child(2){margin-top:calc(var(--spacing) * -1)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-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, )}}@media (min-width:40rem){.sm\:start-auto{inset-inline-start:auto}.sm\:end-4{inset-inline-end:calc(var(--spacing) * 4)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mx-0{margin-inline:0}.sm\:w-full{width:100%}.sm\:max-w-3xl{max-width:var(--container-3xl)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr)}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:row-span-2:is(:where(.group\/alert-dialog-content)[data-size=default] *){grid-row:span 2/span 2}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:place-items-start:is(:where(.group\/alert-dialog-content)[data-size=default] *){place-items:start}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:text-start:is(:where(.group\/alert-dialog-content)[data-size=default] *){text-align:start}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:group-has-data-\[slot\=alert-dialog-media\]\/alert-dialog-content\:col-start-2:is(:where(.group\/alert-dialog-content)[data-size=default] *):is(:where(.group\/alert-dialog-content):has([data-slot=alert-dialog-media]) *){grid-column-start:2}.sm\:group-data-\[size\=default\]\/alert-dialog-content\:has-data-\[slot\=alert-dialog-media\]\:grid-rows-\[auto_1fr\]:is(:where(.group\/alert-dialog-content)[data-size=default] *):has([data-slot=alert-dialog-media]){grid-template-rows:auto 1fr}.data-\[side\=left\]\:sm\:max-w-sm[data-side=left],.data-\[side\=right\]\:sm\:max-w-sm[data-side=right],.data-\[size\=default\]\:sm\:max-w-sm[data-size=default]{max-width:var(--container-sm)}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-xs\/relaxed{font-size:var(--text-xs);line-height:var(--leading-relaxed)}.md\:text-pretty{text-wrap:pretty}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ms-0:is(:where(.peer)[data-variant=inset]~*){margin-inline-start:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:calc(var(--radius) * 1.4)}.md\:peer-data-\[variant\=inset\]\:shadow-sm:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[variant\=inset\]\:peer-data-\[state\=collapsed\]\:ms-2:is(:where(.peer)[data-variant=inset]~*):is(:where(.peer)[data-state=collapsed]~*){margin-inline-start:calc(var(--spacing) * 2)}.md\:after\:hidden:after{content:var(--tw-content);display:none}}@container card-header (width>=24rem){.\@sm\/card-header\:col-start-2{grid-column-start:2}.\@sm\/card-header\:row-span-2{grid-row:span 2/span 2}.\@sm\/card-header\:row-start-1{grid-row-start:1}.\@sm\/card-header\:mt-0{margin-top:0}.\@sm\/card-header\:self-center{align-self:center}.\@sm\/card-header\:justify-self-end{justify-self:flex-end}.\@sm\/card-header\:has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}}@container field-group (width>=28rem){.\@md\/field-group\:flex-row{flex-direction:row}.\@md\/field-group\:items-center{align-items:center}:is(.\@md\/field-group\:\*\:w-auto>*){width:auto}.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}:is(.\@md\/field-group\:\*\:data-\[slot\=field-label\]\:flex-auto>*)[data-slot=field-label]{flex:auto}}.rtl\:-translate-x-px:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *){--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:translate-x-1\/2:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *){--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:translate-x-px:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:rotate-180:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *){rotate:180deg}.rtl\:data-\[side\=left\]\:data-ending-style\:translate-x-10:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *)[data-side=left][data-ending-style],.rtl\:data-\[side\=left\]\:data-starting-style\:translate-x-10:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *)[data-side=left][data-starting-style]{--tw-translate-x:calc(var(--spacing) * 10);translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:data-\[side\=right\]\:data-ending-style\:-translate-x-10:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *)[data-side=right][data-ending-style],.rtl\:data-\[side\=right\]\:data-starting-style\:-translate-x-10:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *)[data-side=right][data-starting-style]{--tw-translate-x:calc(var(--spacing) * -10);translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:bg-muted\/30:is(.dark *){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-muted\/30:is(.dark *){background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.dark\:bg-transparent:is(.dark *){background-color:#0000}.dark\:after\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}@media (hover:hover){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:has-data-checked\:bg-primary\/10:is(.dark *):has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:has-data-checked\:bg-primary\/10:is(.dark *):has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.dark\:has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.data-open\:animate-in:where([data-state=open]),.data-open\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:fade-in-0:where([data-state=open]),.data-open\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.data-open\:zoom-in-95:where([data-state=open]),.data-open\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}@media (hover:hover){:is(.data-open\:hover\:bg-sidebar-accent:where([data-state=open]),.data-open\:hover\:bg-sidebar-accent:where([data-open]:not([data-open=false]))):hover{background-color:var(--sidebar-accent)}:is(.data-open\:hover\:text-sidebar-accent-foreground:where([data-state=open]),.data-open\:hover\:text-sidebar-accent-foreground:where([data-open]:not([data-open=false]))):hover{color:var(--sidebar-accent-foreground)}}.data-closed\:animate-out:where([data-state=closed]),.data-closed\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:fade-out-0:where([data-state=closed]),.data-closed\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.data-closed\:zoom-out-95:where([data-state=closed]),.data-closed\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.data-checked\:border-primary:where([data-state=checked]),.data-checked\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.data-checked\:bg-primary:where([data-state=checked]),.data-checked\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.data-checked\:text-primary-foreground:where([data-state=checked]),.data-checked\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.group-has-\[\:focus-visible\]\/field-label\:data-checked\:border-primary:is(:where(.group\/field-label):has(:focus-visible) *):where([data-state=checked]),.group-has-\[\:focus-visible\]\/field-label\:data-checked\:border-primary:is(:where(.group\/field-label):has(:focus-visible) *):where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.group-data-\[size\=default\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=default] *):where([data-state=checked]),.group-data-\[size\=default\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.group-data-\[size\=sm\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=sm] *):where([data-state=checked]),.group-data-\[size\=sm\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:group-data-\[size\=default\]\/switch\:data-checked\:-translate-x-\[calc\(100\%-2px\)\]:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=default] *):where([data-state=checked]),.rtl\:group-data-\[size\=default\]\/switch\:data-checked\:-translate-x-\[calc\(100\%-2px\)\]:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.rtl\:group-data-\[size\=sm\]\/switch\:data-checked\:-translate-x-\[calc\(100\%-2px\)\]:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=sm] *):where([data-state=checked]),.rtl\:group-data-\[size\=sm\]\/switch\:data-checked\:-translate-x-\[calc\(100\%-2px\)\]:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(calc(100% - 2px) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:data-checked\:bg-primary:is(.dark *):where([data-state=checked]),.dark\:data-checked\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.dark\:data-checked\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.dark\:data-checked\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.data-unchecked\:bg-input:where([data-state=unchecked]),.data-unchecked\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=default] *):where([data-state=unchecked]),.group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=sm] *):where([data-state=unchecked]),.group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])),.rtl\:group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=default] *):where([data-state=unchecked]),.rtl\:group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.rtl\:group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=sm] *):where([data-state=unchecked]),.rtl\:group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *):is(:where(.group\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:data-unchecked\:bg-foreground:is(.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.data-disabled\:pointer-events-none:where([data-disabled=true]),.data-disabled\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.data-disabled\:cursor-not-allowed:where([data-disabled=true]),.data-disabled\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.data-disabled\:opacity-50:where([data-disabled=true]),.data-disabled\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.data-active\:bg-sidebar-accent:where([data-state=active]),.data-active\:bg-sidebar-accent:where([data-active]:not([data-active=false])){background-color:var(--sidebar-accent)}.data-active\:font-medium:where([data-state=active]),.data-active\:font-medium:where([data-active]:not([data-active=false])){--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-active\:text-sidebar-accent-foreground:where([data-state=active]),.data-active\:text-sidebar-accent-foreground:where([data-active]:not([data-active=false])){color:var(--sidebar-accent-foreground)}.data-horizontal\:h-px:where([data-orientation=horizontal]){height:1px}.data-horizontal\:w-full:where([data-orientation=horizontal]){width:100%}.data-vertical\:w-px:where([data-orientation=vertical]){width:1px}.data-vertical\:flex-col:where([data-orientation=vertical]){flex-direction:column}.data-vertical\:items-stretch:where([data-orientation=vertical]){align-items:stretch}.data-vertical\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.\[\&_a\]\:hover\:text-foreground a:hover{color:var(--foreground)}}.\[\&_p\:not\(\:last-child\)\]\:mb-4 p:not(:last-child){margin-bottom:calc(var(--spacing) * 4)}.\[\&_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}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-2\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\.border-b\]\:pb-\(--card-spacing\).border-b{padding-bottom:var(--card-spacing)}.\[\.border-b\]\:pb-2.border-b{padding-bottom:calc(var(--spacing) * 2)}.\[\.border-t\]\:pt-\(--card-spacing\).border-t{padding-top:var(--card-spacing)}.\[\.border-t\]\:pt-2.border-t{padding-top:calc(var(--spacing) * 2)}:is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}:is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){:is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.\*\:\[img\:first-child\]\:rounded-t-lg>*):is(img:first-child){border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}:is(.\*\:\[img\:last-child\]\:rounded-b-lg>*):is(img:last-child){border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.\*\:\[svg\]\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.\*\:\[svg\]\:translate-y-0\.5>*):is(svg){--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\:\[svg\]\:text-current>*):is(svg){color:currentColor}:is(.\*\:\[svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5>*):is(svg:not([class*=size-])){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}:is(.\*\:\[svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4>*):is(svg:not([class*=size-])){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>\.sr-only\]\:w-auto>.sr-only{width:auto}:is(.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]){margin-top:1px}@container field-group (width>=28rem){:is(.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]){margin-top:1px}}.\[\&\>a\]\:underline>a{text-decoration-line:underline}.\[\&\>a\]\:underline-offset-4>a{text-underline-offset:4px}.\[\&\>a\:hover\]\:text-primary>a:hover{color:var(--primary)}.\[\&\>button\]\:hidden>button{display:none}.has-\[\>\[data-align\=block-end\]\]\:\[\&\>input\]\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(var(--spacing) * 3)}.has-\[\>\[data-align\=block-start\]\]\:\[\&\>input\]\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(var(--spacing) * 3)}.has-\[\>\[data-align\=inline-end\]\]\:\[\&\>input\]\:pe-1\.5:has(>[data-align=inline-end])>input{padding-inline-end:calc(var(--spacing) * 1.5)}.has-\[\>\[data-align\=inline-start\]\]\:\[\&\>input\]\:ps-1\.5:has(>[data-align=inline-start])>input{padding-inline-start:calc(var(--spacing) * 1.5)}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.group-has-data-\[size\=lg\]\/avatar-group\:\[\&\>svg\]\:size-5:is(:where(.group\/avatar-group):has([data-size=lg]) *)>svg{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.group-has-data-\[size\=sm\]\/avatar-group\:\[\&\>svg\]\:size-3:is(:where(.group\/avatar-group):has([data-size=sm]) *)>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[size\=default\]\/avatar\:\[\&\>svg\]\:size-2:is(:where(.group\/avatar)[data-size=default] *)>svg,.group-data-\[size\=lg\]\/avatar\:\[\&\>svg\]\:size-2:is(:where(.group\/avatar)[data-size=lg] *)>svg{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.group-data-\[size\=sm\]\/avatar\:\[\&\>svg\]\:hidden:is(:where(.group\/avatar)[data-size=sm] *)>svg{display:none}.\[\&\>svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3>svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5>svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\[data-ending-style\]\:not\(\[data-limited\]\)\:not\(\[data-swipe-direction\]\)\]\:\[transform\:translateY\(150\%\)\][data-ending-style]:not([data-limited]):not([data-swipe-direction]){transform:translateY(150%)}[data-variant=legend]+.\[\[data-variant\=legend\]\+\&\]\:-mt-1\.5{margin-top:calc(var(--spacing) * -1.5)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@property --scroll-fade-t{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-b{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-s{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-e{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-mask{syntax:"*";inherits:false}@property --shimmer-angle{syntax:"<angle>";inherits:true;initial-value:20deg}@property --shimmer-image{syntax:"*";inherits:false}@property --shimmer-text-fill{syntax:"*";inherits:false}@media (prefers-reduced-motion:reduce){.shimmer{-webkit-text-fill-color:currentColor;background-image:none;animation:none}}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/static/font/inter-cyrillic-ext-wght-normal.460bdf14be.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/static/font/inter-cyrillic-wght-normal.491cbc05ce.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/static/font/inter-greek-ext-wght-normal.23aae5683d.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/static/font/inter-greek-wght-normal.4449bf7aab.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/static/font/inter-vietnamese-wght-normal.113a630f76.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/static/font/inter-latin-ext-wght-normal.3835a68e46.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:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/static/font/inter-latin-wght-normal.6c596dfcdd.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}:root{--background:#fff;--foreground:#0a0a0a;--card:#fff;--card-foreground:#0a0a0a;--popover:#fff;--popover-foreground:#0a0a0a;--primary:#171717;--primary-foreground:#fafafa;--secondary:#f5f5f5;--secondary-foreground:#171717;--muted:#f5f5f5;--muted-foreground:#737373;--accent:#f5f5f5;--accent-foreground:#171717;--destructive:#e40014;--border:#e5e5e5;--input:#e5e5e5;--ring:#a1a1a1;--chart-1:#d4d4d4;--chart-2:#737373;--chart-3:#525252;--chart-4:#404040;--chart-5:#262626;--radius:.625rem;--sidebar:#fafafa;--sidebar-foreground:#0a0a0a;--sidebar-primary:#171717;--sidebar-primary-foreground:#fafafa;--sidebar-accent:#f5f5f5;--sidebar-accent-foreground:#171717;--sidebar-border:#e5e5e5;--sidebar-ring:#a1a1a1}@supports (color:lab(0% 0 0)){:root{--background:lab(100% 0 0);--foreground:lab(2.75381% 0 0);--card:lab(100% 0 0);--card-foreground:lab(2.75381% 0 0);--popover:lab(100% 0 0);--popover-foreground:lab(2.75381% 0 0);--primary:lab(7.78201% -.0000149012 0);--primary-foreground:lab(98.26% 0 0);--secondary:lab(96.52% -.0000298023 .0000119209);--secondary-foreground:lab(7.78201% -.0000149012 0);--muted:lab(96.52% -.0000298023 .0000119209);--muted-foreground:lab(48.496% 0 0);--accent:lab(96.52% -.0000298023 .0000119209);--accent-foreground:lab(7.78201% -.0000149012 0);--destructive:lab(48.4493% 77.4328 61.5452);--border:lab(90.952% 0 -.0000119209);--input:lab(90.952% 0 -.0000119209);--ring:lab(66.128% -.0000298023 .0000119209);--chart-1:lab(84.92% 0 -.0000119209);--chart-2:lab(48.496% 0 0);--chart-3:lab(34.924% 0 0);--chart-4:lab(27.036% 0 0);--chart-5:lab(15.204% 0 -.00000596046);--sidebar:lab(98.26% 0 0);--sidebar-foreground:lab(2.75381% 0 0);--sidebar-primary:lab(7.78201% -.0000149012 0);--sidebar-primary-foreground:lab(98.26% 0 0);--sidebar-accent:lab(96.52% -.0000298023 .0000119209);--sidebar-accent-foreground:lab(7.78201% -.0000149012 0);--sidebar-border:lab(90.952% 0 -.0000119209);--sidebar-ring:lab(66.128% -.0000298023 .0000119209)}}.dark{--background:#0a0a0a;--foreground:#fafafa;--card:#171717;--card-foreground:#fafafa;--popover:#171717;--popover-foreground:#fafafa;--primary:#e5e5e5;--primary-foreground:#171717;--secondary:#262626;--secondary-foreground:#fafafa;--muted:#262626;--muted-foreground:#a1a1a1;--accent:#262626;--accent-foreground:#fafafa;--destructive:#ff6568;--border:#ffffff1a;--input:#ffffff26;--ring:#737373;--chart-1:#d4d4d4;--chart-2:#737373;--chart-3:#525252;--chart-4:#404040;--chart-5:#262626;--sidebar:#171717;--sidebar-foreground:#fafafa;--sidebar-primary:#1447e6;--sidebar-primary-foreground:#fafafa;--sidebar-accent:#262626;--sidebar-accent-foreground:#fafafa;--sidebar-border:#ffffff1a;--sidebar-ring:#737373}@supports (color:lab(0% 0 0)){.dark{--background:lab(2.75381% 0 0);--foreground:lab(98.26% 0 0);--card:lab(7.78201% -.0000149012 0);--card-foreground:lab(98.26% 0 0);--popover:lab(7.78201% -.0000149012 0);--popover-foreground:lab(98.26% 0 0);--primary:lab(90.952% 0 -.0000119209);--primary-foreground:lab(7.78201% -.0000149012 0);--secondary:lab(15.204% 0 -.00000596046);--secondary-foreground:lab(98.26% 0 0);--muted:lab(15.204% 0 -.00000596046);--muted-foreground:lab(66.128% -.0000298023 .0000119209);--accent:lab(15.204% 0 -.00000596046);--accent-foreground:lab(98.26% 0 0);--destructive:lab(63.7053% 60.745 31.3109);--border:lab(100% 0 0/.1);--input:lab(100% 0 0/.15);--ring:lab(48.496% 0 0);--chart-1:lab(84.92% 0 -.0000119209);--chart-2:lab(48.496% 0 0);--chart-3:lab(34.924% 0 0);--chart-4:lab(27.036% 0 0);--chart-5:lab(15.204% 0 -.00000596046);--sidebar:lab(7.78201% -.0000149012 0);--sidebar-foreground:lab(98.26% 0 0);--sidebar-primary:lab(36.9089% 35.0961 -85.6872);--sidebar-primary-foreground:lab(98.26% 0 0);--sidebar-accent:lab(15.204% 0 -.00000596046);--sidebar-accent-foreground:lab(98.26% 0 0);--sidebar-border:lab(100% 0 0/.1);--sidebar-ring:lab(48.496% 0 0)}}@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-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-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-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|