@mcp-b/embedded-agent 1.2.9 → 1.2.10
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 +74 -19
- package/dist/FormToolUI-Dhl3il9B.js.map +1 -1
- package/dist/jsx.d.ts +118 -29
- package/dist/styles/globals.css +1 -1
- package/dist/web-component.d.ts +90 -36
- package/dist/web-component.d.ts.map +1 -1
- package/dist/web-component.js +1104 -161
- package/dist/web-component.js.map +1 -1
- package/package.json +4 -3
package/dist/web-component.js
CHANGED
|
@@ -21,12 +21,12 @@ import { TabClientTransport } from "@mcp-b/transports";
|
|
|
21
21
|
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
22
22
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
23
23
|
import { jsonrepair } from "jsonrepair";
|
|
24
|
+
import { z } from "zod";
|
|
24
25
|
import { useAgent } from "agents/react";
|
|
25
26
|
import stableStringifyImpl from "fast-json-stable-stringify";
|
|
26
27
|
import { getToolName, isToolUIPart } from "ai";
|
|
27
28
|
import { useAgentChat } from "@cloudflare/ai-chat/react";
|
|
28
29
|
import { useWebMCP } from "@mcp-b/react-webmcp";
|
|
29
|
-
import { z } from "zod";
|
|
30
30
|
import { createPortal } from "react-dom";
|
|
31
31
|
|
|
32
32
|
//#region src/components/ui/tooltip.tsx
|
|
@@ -1628,7 +1628,7 @@ function MCPToolsProvider({ children, autoConnectLocal = true, onToolsChange, on
|
|
|
1628
1628
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
1629
1629
|
console.error(`[MCPToolsProvider:${id}] Connection failed:`, error);
|
|
1630
1630
|
sourceState.state = "error";
|
|
1631
|
-
sourceState.error = error;
|
|
1631
|
+
sourceState.error = error.message;
|
|
1632
1632
|
forceUpdate({});
|
|
1633
1633
|
}
|
|
1634
1634
|
}, [rebuildTools, rebuildPrompts]);
|
|
@@ -4927,11 +4927,637 @@ function useOptionalVoiceToolApproval() {
|
|
|
4927
4927
|
}
|
|
4928
4928
|
|
|
4929
4929
|
//#endregion
|
|
4930
|
-
//#region ../
|
|
4930
|
+
//#region ../shared-types/dist/schemas/thread.js
|
|
4931
|
+
const ThreadStatusSchema = z.enum(["regular", "archived"]);
|
|
4932
|
+
const ThreadSummarySchema = z.object({
|
|
4933
|
+
id: z.string(),
|
|
4934
|
+
status: ThreadStatusSchema,
|
|
4935
|
+
title: z.string().optional(),
|
|
4936
|
+
remoteId: z.string().optional(),
|
|
4937
|
+
externalId: z.string().optional(),
|
|
4938
|
+
organizationId: z.string(),
|
|
4939
|
+
messageCount: z.number(),
|
|
4940
|
+
totalTokens: z.number().optional(),
|
|
4941
|
+
lastMessageAt: z.number().nullable(),
|
|
4942
|
+
createdAt: z.number()
|
|
4943
|
+
});
|
|
4944
|
+
const ThreadWithDeletedSchema = z.union([ThreadSummarySchema, ThreadSummarySchema.omit({ status: true }).extend({ status: z.literal("deleted") })]);
|
|
4945
|
+
const ThreadMetadataSchema = z.object({
|
|
4946
|
+
threadId: z.string(),
|
|
4947
|
+
userId: z.string(),
|
|
4948
|
+
threadManagerName: z.string().optional(),
|
|
4949
|
+
organizationId: z.string(),
|
|
4950
|
+
title: z.string().nullable(),
|
|
4951
|
+
createdAt: z.number()
|
|
4952
|
+
});
|
|
4953
|
+
const CreateThreadParamsSchema = z.object({
|
|
4954
|
+
title: z.string().optional(),
|
|
4955
|
+
organizationId: z.string().optional()
|
|
4956
|
+
});
|
|
4957
|
+
const CreateThreadResultSchema = z.object({ threadId: z.string() });
|
|
4958
|
+
const ThreadUpdateParamsSchema = z.object({
|
|
4959
|
+
title: z.string().optional(),
|
|
4960
|
+
messageCount: z.number().optional(),
|
|
4961
|
+
totalTokensDelta: z.number().optional(),
|
|
4962
|
+
lastMessageAt: z.number().optional()
|
|
4963
|
+
});
|
|
4964
|
+
const ThreadManagerContextSchema = z.object({
|
|
4965
|
+
endUserId: z.string(),
|
|
4966
|
+
organizationId: z.string(),
|
|
4967
|
+
externalId: z.string()
|
|
4968
|
+
});
|
|
4969
|
+
|
|
4970
|
+
//#endregion
|
|
4971
|
+
//#region ../shared-types/dist/schemas/thread-manager-state.js
|
|
4972
|
+
const ThreadManagerStateSchema = z.object({
|
|
4973
|
+
threads: z.array(ThreadWithDeletedSchema),
|
|
4974
|
+
endUserId: z.string().nullable(),
|
|
4975
|
+
organizationId: z.string().nullable(),
|
|
4976
|
+
externalId: z.string().nullable(),
|
|
4977
|
+
isAnonymous: z.boolean().optional(),
|
|
4978
|
+
anthropicApiKey: z.string().optional(),
|
|
4979
|
+
lastSelectedThreadId: z.string().nullable().optional()
|
|
4980
|
+
});
|
|
4981
|
+
|
|
4982
|
+
//#endregion
|
|
4983
|
+
//#region ../shared-types/dist/schemas/tool-source.js
|
|
4984
|
+
const ToolSourceSelectorSchema = z.object({
|
|
4985
|
+
sourceId: z.string(),
|
|
4986
|
+
tabId: z.string()
|
|
4987
|
+
});
|
|
4988
|
+
const ToolSourceSchema = z.object({
|
|
4989
|
+
sourceId: z.string(),
|
|
4990
|
+
tabId: z.string(),
|
|
4991
|
+
origin: z.string().optional(),
|
|
4992
|
+
url: z.string().optional(),
|
|
4993
|
+
title: z.string().optional(),
|
|
4994
|
+
iconUrl: z.string().optional(),
|
|
4995
|
+
connectedAt: z.number(),
|
|
4996
|
+
lastSeenAt: z.number().optional()
|
|
4997
|
+
});
|
|
4998
|
+
const ToolSourceInfoSchema = ToolSourceSchema.extend({ toolCount: z.number() });
|
|
4999
|
+
const ToolConnectionMetadataSchema = z.object({
|
|
5000
|
+
origin: z.string().optional(),
|
|
5001
|
+
url: z.string().optional(),
|
|
5002
|
+
title: z.string().optional(),
|
|
5003
|
+
iconUrl: z.string().optional(),
|
|
5004
|
+
tabId: z.string()
|
|
5005
|
+
});
|
|
5006
|
+
const ThreadToolSelectionSchema = z.object({ selectedSources: z.array(ToolSourceSelectorSchema) });
|
|
5007
|
+
const ToolSourcesUpdateMessageSchema = z.object({
|
|
5008
|
+
type: z.literal("tool_sources"),
|
|
5009
|
+
sources: z.array(ToolSourceInfoSchema)
|
|
5010
|
+
});
|
|
5011
|
+
|
|
5012
|
+
//#endregion
|
|
5013
|
+
//#region ../shared-types/dist/schemas/tool-sync.js
|
|
5014
|
+
const ToolAnnotationsSchema = z.object({
|
|
5015
|
+
title: z.string().optional(),
|
|
5016
|
+
readOnlyHint: z.boolean().optional(),
|
|
5017
|
+
destructiveHint: z.boolean().optional(),
|
|
5018
|
+
idempotentHint: z.boolean().optional(),
|
|
5019
|
+
openWorldHint: z.boolean().optional()
|
|
5020
|
+
}).passthrough();
|
|
5021
|
+
const SyncedToolSchemaSchema = z.object({
|
|
5022
|
+
name: z.string(),
|
|
5023
|
+
description: z.string().optional(),
|
|
5024
|
+
inputSchema: z.record(z.unknown()).optional(),
|
|
5025
|
+
annotations: ToolAnnotationsSchema.optional(),
|
|
5026
|
+
sources: z.array(ToolSourceSchema).optional()
|
|
5027
|
+
});
|
|
5028
|
+
|
|
5029
|
+
//#endregion
|
|
5030
|
+
//#region ../shared-types/dist/schemas/tool-call-metadata.js
|
|
5031
|
+
/**
|
|
5032
|
+
* Metadata captured during tool execution.
|
|
5033
|
+
* Stored in the `artifact` field of tool-call message parts in assistant-ui.
|
|
5034
|
+
* This data persists in the thread and can be synced externally.
|
|
5035
|
+
*/
|
|
5036
|
+
const ToolCallMetadataSchema = z.object({
|
|
5037
|
+
startedAt: z.number(),
|
|
5038
|
+
duration: z.number(),
|
|
5039
|
+
sourceId: z.string(),
|
|
5040
|
+
isError: z.boolean().optional(),
|
|
5041
|
+
wasAborted: z.boolean().optional()
|
|
5042
|
+
});
|
|
5043
|
+
|
|
5044
|
+
//#endregion
|
|
5045
|
+
//#region ../shared-types/dist/schemas/rpc-messages.js
|
|
5046
|
+
const HubToSiteMessageSchema = z.discriminatedUnion("type", [z.object({
|
|
5047
|
+
type: z.literal("invoke"),
|
|
5048
|
+
callId: z.string(),
|
|
5049
|
+
toolName: z.string(),
|
|
5050
|
+
args: z.record(z.unknown()).optional()
|
|
5051
|
+
}), z.object({ type: z.literal("ping") })]);
|
|
5052
|
+
const SiteToHubMessageSchema = z.discriminatedUnion("type", [z.object({
|
|
5053
|
+
type: z.literal("result"),
|
|
5054
|
+
callId: z.string(),
|
|
5055
|
+
result: z.object({
|
|
5056
|
+
content: z.array(z.unknown()),
|
|
5057
|
+
isError: z.boolean().optional()
|
|
5058
|
+
}).passthrough()
|
|
5059
|
+
}), z.object({ type: z.literal("pong") })]);
|
|
5060
|
+
|
|
5061
|
+
//#endregion
|
|
5062
|
+
//#region ../auth/dist/oidc/validators/token-size.js
|
|
4931
5063
|
/**
|
|
4932
|
-
*
|
|
5064
|
+
* Token Size Validator
|
|
5065
|
+
*
|
|
5066
|
+
* Validates JWT token size before parsing to prevent DoS attacks.
|
|
5067
|
+
*
|
|
5068
|
+
* Security:
|
|
5069
|
+
* - Rejects oversized tokens before JSON parsing
|
|
5070
|
+
* - Prevents resource exhaustion from maliciously large tokens
|
|
5071
|
+
* - Default limit: 16KB (sufficient for normal OIDC tokens)
|
|
5072
|
+
*/
|
|
5073
|
+
/**
|
|
5074
|
+
* Default maximum token size in bytes (16KB).
|
|
5075
|
+
* Normal OIDC tokens are typically 1-4KB.
|
|
5076
|
+
*/
|
|
5077
|
+
const DEFAULT_MAX_TOKEN_SIZE_BYTES = 16 * 1024;
|
|
5078
|
+
|
|
5079
|
+
//#endregion
|
|
5080
|
+
//#region ../auth/dist/idp/constants.js
|
|
5081
|
+
/**
|
|
5082
|
+
* IDP Constants
|
|
5083
|
+
*
|
|
5084
|
+
* Constants for supported identity providers.
|
|
5085
|
+
*/
|
|
5086
|
+
/**
|
|
5087
|
+
* Supported IDP types.
|
|
5088
|
+
*/
|
|
5089
|
+
const IDP_TYPE = {
|
|
5090
|
+
OKTA: "okta",
|
|
5091
|
+
AZURE: "azure",
|
|
5092
|
+
AUTH0: "auth0",
|
|
5093
|
+
GOOGLE: "google",
|
|
5094
|
+
CUSTOM_OIDC: "custom_oidc"
|
|
5095
|
+
};
|
|
5096
|
+
/**
|
|
5097
|
+
* All IDP type values as an array.
|
|
5098
|
+
* Useful for Zod enums and iteration.
|
|
5099
|
+
*/
|
|
5100
|
+
const IDP_TYPES = Object.values(IDP_TYPE);
|
|
5101
|
+
/**
|
|
5102
|
+
* Display names for IDP types.
|
|
5103
|
+
* Uses `as const satisfies` to ensure all IDP types have display names.
|
|
5104
|
+
*/
|
|
5105
|
+
const IDP_DISPLAY_NAMES = {
|
|
5106
|
+
[IDP_TYPE.OKTA]: "Okta",
|
|
5107
|
+
[IDP_TYPE.AZURE]: "Azure AD",
|
|
5108
|
+
[IDP_TYPE.AUTH0]: "Auth0",
|
|
5109
|
+
[IDP_TYPE.GOOGLE]: "Google Workspace",
|
|
5110
|
+
[IDP_TYPE.CUSTOM_OIDC]: "Custom OIDC Provider"
|
|
5111
|
+
};
|
|
5112
|
+
/**
|
|
5113
|
+
* IDP types that require domain configuration.
|
|
5114
|
+
*/
|
|
5115
|
+
const IDP_TYPES_REQUIRING_DOMAIN$1 = [
|
|
5116
|
+
IDP_TYPE.OKTA,
|
|
5117
|
+
IDP_TYPE.AZURE,
|
|
5118
|
+
IDP_TYPE.AUTH0
|
|
5119
|
+
];
|
|
5120
|
+
/**
|
|
5121
|
+
* IDP types that require issuer configuration.
|
|
5122
|
+
*/
|
|
5123
|
+
const IDP_TYPES_REQUIRING_ISSUER = [IDP_TYPE.CUSTOM_OIDC];
|
|
5124
|
+
/**
|
|
5125
|
+
* Known issuer URL patterns for each IDP type.
|
|
5126
|
+
* Used to construct expected issuer URLs from IDP type and domain.
|
|
5127
|
+
*/
|
|
5128
|
+
const IDP_ISSUER_PATTERNS = {
|
|
5129
|
+
[IDP_TYPE.OKTA]: (domain) => `https://${domain}`,
|
|
5130
|
+
[IDP_TYPE.AZURE]: (domain) => `https://login.microsoftonline.com/${domain}/v2.0`,
|
|
5131
|
+
[IDP_TYPE.AUTH0]: (domain) => `https://${domain}/`,
|
|
5132
|
+
[IDP_TYPE.GOOGLE]: () => "https://accounts.google.com",
|
|
5133
|
+
[IDP_TYPE.CUSTOM_OIDC]: null
|
|
5134
|
+
};
|
|
5135
|
+
|
|
5136
|
+
//#endregion
|
|
5137
|
+
//#region ../auth/dist/oidc/jwt-verifier.js
|
|
5138
|
+
/**
|
|
5139
|
+
* Default max token age in seconds (24 hours).
|
|
5140
|
+
*/
|
|
5141
|
+
const DEFAULT_MAX_TOKEN_AGE_SECONDS$1 = 1440 * 60;
|
|
5142
|
+
|
|
5143
|
+
//#endregion
|
|
5144
|
+
//#region ../auth/dist/oidc/validators/expiration.js
|
|
5145
|
+
/**
|
|
5146
|
+
* Expiration Validator
|
|
5147
|
+
*
|
|
5148
|
+
* Validates JWT expiration (exp) and issued at (iat) claims.
|
|
5149
|
+
*
|
|
5150
|
+
* Security:
|
|
5151
|
+
* - Ensures token is not expired
|
|
5152
|
+
* - Enforces maximum token age (exp - iat <= 24h by default)
|
|
5153
|
+
* - Allows configurable clock skew tolerance
|
|
5154
|
+
*/
|
|
5155
|
+
/**
|
|
5156
|
+
* Default maximum token age in seconds (24 hours).
|
|
5157
|
+
* Tokens with (exp - iat) > this value are rejected.
|
|
5158
|
+
*/
|
|
5159
|
+
const DEFAULT_MAX_TOKEN_AGE_SECONDS = 1440 * 60;
|
|
5160
|
+
|
|
5161
|
+
//#endregion
|
|
5162
|
+
//#region ../auth/dist/idp/schemas.js
|
|
5163
|
+
/**
|
|
5164
|
+
* IDP Schemas
|
|
5165
|
+
*
|
|
5166
|
+
* Zod schemas for IDP configuration validation with type inference.
|
|
5167
|
+
*/
|
|
5168
|
+
/**
|
|
5169
|
+
* IDP type schema.
|
|
5170
|
+
*/
|
|
5171
|
+
const IdpTypeSchema = z.enum([
|
|
5172
|
+
IDP_TYPE.OKTA,
|
|
5173
|
+
IDP_TYPE.AZURE,
|
|
5174
|
+
IDP_TYPE.AUTH0,
|
|
5175
|
+
IDP_TYPE.GOOGLE,
|
|
5176
|
+
IDP_TYPE.CUSTOM_OIDC
|
|
5177
|
+
]).nullable();
|
|
5178
|
+
/**
|
|
5179
|
+
* Domain format validation.
|
|
5180
|
+
* Domain should be a hostname without protocol or trailing slash.
|
|
5181
|
+
*/
|
|
5182
|
+
const domainSchema = z.string().min(1).refine((val) => !val.includes("://"), { message: "Domain should not include protocol (http:// or https://)" }).refine((val) => !val.endsWith("/"), { message: "Domain should not have trailing slash" }).nullable().optional();
|
|
5183
|
+
/**
|
|
5184
|
+
* Issuer URL validation.
|
|
5185
|
+
* Must be a valid HTTP(S) URL.
|
|
5186
|
+
*/
|
|
5187
|
+
const issuerSchema = z.string().refine((val) => {
|
|
5188
|
+
try {
|
|
5189
|
+
const url = new URL(val);
|
|
5190
|
+
return url.protocol === "https:" || url.protocol === "http:";
|
|
5191
|
+
} catch {
|
|
5192
|
+
return false;
|
|
5193
|
+
}
|
|
5194
|
+
}, { message: "Issuer must be a valid HTTP(S) URL" }).nullable().optional();
|
|
5195
|
+
/**
|
|
5196
|
+
* Client ID validation.
|
|
5197
|
+
* Can be null/undefined, but if provided must not be empty.
|
|
5198
|
+
*/
|
|
5199
|
+
const clientIdSchema = z.string().refine((val) => val.trim().length > 0, { message: "Client ID cannot be empty" }).nullable().optional();
|
|
5200
|
+
/**
|
|
5201
|
+
* Base IDP configuration schema (without cross-field validation).
|
|
5202
|
+
*/
|
|
5203
|
+
const BaseIdpConfigSchema = z.object({
|
|
5204
|
+
type: IdpTypeSchema,
|
|
5205
|
+
clientId: clientIdSchema,
|
|
5206
|
+
domain: domainSchema,
|
|
5207
|
+
issuer: issuerSchema
|
|
5208
|
+
});
|
|
5209
|
+
/**
|
|
5210
|
+
* IDP types that require domain configuration.
|
|
5211
|
+
*/
|
|
5212
|
+
const IDP_TYPES_REQUIRING_DOMAIN = [
|
|
5213
|
+
IDP_TYPE.OKTA,
|
|
5214
|
+
IDP_TYPE.AZURE,
|
|
5215
|
+
IDP_TYPE.AUTH0
|
|
5216
|
+
];
|
|
5217
|
+
/**
|
|
5218
|
+
* IDP configuration schema with cross-field validation.
|
|
5219
|
+
*
|
|
5220
|
+
* Note: Unknown IDP types are caught by Zod's enum validation before superRefine runs.
|
|
5221
|
+
*/
|
|
5222
|
+
const IdpConfigSchema = BaseIdpConfigSchema.superRefine((config, ctx) => {
|
|
5223
|
+
if (!config.type) return;
|
|
5224
|
+
if (IDP_TYPES_REQUIRING_DOMAIN.includes(config.type)) {
|
|
5225
|
+
if (!config.domain) {
|
|
5226
|
+
const displayName = IDP_DISPLAY_NAMES[config.type];
|
|
5227
|
+
ctx.addIssue({
|
|
5228
|
+
code: z.ZodIssueCode.custom,
|
|
5229
|
+
message: `${displayName} requires domain configuration`,
|
|
5230
|
+
path: ["domain"]
|
|
5231
|
+
});
|
|
5232
|
+
}
|
|
5233
|
+
}
|
|
5234
|
+
if (config.type === IDP_TYPE.CUSTOM_OIDC && !config.issuer) ctx.addIssue({
|
|
5235
|
+
code: z.ZodIssueCode.custom,
|
|
5236
|
+
message: "Custom OIDC Provider requires issuer URL configuration",
|
|
5237
|
+
path: ["issuer"]
|
|
5238
|
+
});
|
|
5239
|
+
});
|
|
5240
|
+
|
|
5241
|
+
//#endregion
|
|
5242
|
+
//#region ../auth/dist/idp/domain-validation.js
|
|
5243
|
+
/**
|
|
5244
|
+
* IDP Domain Validation
|
|
5245
|
+
*
|
|
5246
|
+
* Enhanced validation for IDP configurations with security checks:
|
|
5247
|
+
* - Typosquat prevention (validates domain patterns for known IDPs)
|
|
5248
|
+
* - ReDoS mitigation (length checks before regex matching)
|
|
5249
|
+
* - Wildcard rejection (prevents subdomain takeover attacks)
|
|
5250
|
+
*/
|
|
5251
|
+
/**
|
|
5252
|
+
* Domain patterns for known IDP providers.
|
|
5253
|
+
* Used to prevent typosquat attacks (e.g., okta.com.evil.com).
|
|
5254
|
+
*
|
|
5255
|
+
* These patterns enforce that domains match the expected format for each provider,
|
|
5256
|
+
* preventing attackers from using lookalike domains.
|
|
5257
|
+
*/
|
|
5258
|
+
const IDP_DOMAIN_PATTERNS = {
|
|
5259
|
+
[IDP_TYPE.OKTA]: /^[\w-]+\.okta\.com$|^[\w-]+\.oktapreview\.com$/,
|
|
5260
|
+
[IDP_TYPE.AUTH0]: /^[\w-]+\.auth0\.com$|^[\w-]+\.us\.auth0\.com$|^[\w-]+\.eu\.auth0\.com$|^[\w-]+\.au\.auth0\.com$/
|
|
5261
|
+
};
|
|
5262
|
+
|
|
5263
|
+
//#endregion
|
|
5264
|
+
//#region ../auth/dist/errors/codes.js
|
|
5265
|
+
/**
|
|
5266
|
+
* Error Codes - Single Source of Truth
|
|
5267
|
+
*
|
|
5268
|
+
* All authentication and authorization error codes are defined here.
|
|
5269
|
+
* This is the canonical source - other packages should import from here.
|
|
5270
|
+
*
|
|
5271
|
+
* Error codes are organized into categories:
|
|
5272
|
+
* - Token validation errors (from JWT verification)
|
|
5273
|
+
* - Key/JWKS errors (from key fetching)
|
|
5274
|
+
* - Configuration errors (from IDP setup)
|
|
5275
|
+
* - Provider-specific errors (Azure, etc.)
|
|
5276
|
+
* - Application-level errors (org lookup, origin validation)
|
|
5277
|
+
*/
|
|
5278
|
+
/**
|
|
5279
|
+
* Token validation error codes.
|
|
5280
|
+
* Returned when JWT verification fails.
|
|
5281
|
+
*/
|
|
5282
|
+
const TOKEN_ERROR_CODES = {
|
|
5283
|
+
TOKEN_REQUIRED: "TOKEN_REQUIRED",
|
|
5284
|
+
TOKEN_EXPIRED: "TOKEN_EXPIRED",
|
|
5285
|
+
INVALID_TOKEN: "INVALID_TOKEN",
|
|
5286
|
+
INVALID_SIGNATURE: "INVALID_SIGNATURE",
|
|
5287
|
+
INVALID_ISSUER: "INVALID_ISSUER",
|
|
5288
|
+
INVALID_AUDIENCE: "INVALID_AUDIENCE",
|
|
5289
|
+
INVALID_ALGORITHM: "INVALID_ALGORITHM",
|
|
5290
|
+
INVALID_AZP: "INVALID_AZP",
|
|
5291
|
+
INVALID_TOKEN_AGE: "INVALID_TOKEN_AGE",
|
|
5292
|
+
TOKEN_TOO_LARGE: "TOKEN_TOO_LARGE"
|
|
5293
|
+
};
|
|
5294
|
+
/**
|
|
5295
|
+
* Key/JWKS error codes.
|
|
5296
|
+
* Returned when fetching or using signing keys fails.
|
|
5297
|
+
*/
|
|
5298
|
+
const KEY_ERROR_CODES = {
|
|
5299
|
+
KEY_NOT_FOUND: "KEY_NOT_FOUND",
|
|
5300
|
+
JWKS_FETCH_FAILED: "JWKS_FETCH_FAILED",
|
|
5301
|
+
JWKS_RATE_LIMITED: "JWKS_RATE_LIMITED"
|
|
5302
|
+
};
|
|
5303
|
+
/**
|
|
5304
|
+
* Configuration error codes.
|
|
5305
|
+
* Returned when IDP or security configuration is invalid.
|
|
5306
|
+
*/
|
|
5307
|
+
const CONFIG_ERROR_CODES = {
|
|
5308
|
+
IDP_NOT_CONFIGURED: "IDP_NOT_CONFIGURED",
|
|
5309
|
+
SSRF_BLOCKED: "SSRF_BLOCKED"
|
|
5310
|
+
};
|
|
5311
|
+
/**
|
|
5312
|
+
* Provider-specific error codes.
|
|
5313
|
+
*/
|
|
5314
|
+
const PROVIDER_ERROR_CODES = { AZURE_TID_MISMATCH: "AZURE_TID_MISMATCH" };
|
|
5315
|
+
/**
|
|
5316
|
+
* Application-level error codes.
|
|
5317
|
+
* Returned by application logic (not JWT verification).
|
|
5318
|
+
*/
|
|
5319
|
+
const APP_ERROR_CODES = {
|
|
5320
|
+
ORG_NOT_FOUND: "ORG_NOT_FOUND",
|
|
5321
|
+
ORIGIN_NOT_ALLOWED: "ORIGIN_NOT_ALLOWED",
|
|
5322
|
+
DATABASE_ERROR: "DATABASE_ERROR",
|
|
5323
|
+
LOCALHOST_REQUIRED: "LOCALHOST_REQUIRED",
|
|
5324
|
+
API_KEY_REQUIRED: "API_KEY_REQUIRED",
|
|
5325
|
+
FEATURE_NOT_IMPLEMENTED: "FEATURE_NOT_IMPLEMENTED",
|
|
5326
|
+
INTERNAL_ERROR: "INTERNAL_ERROR"
|
|
5327
|
+
};
|
|
5328
|
+
/**
|
|
5329
|
+
* All error codes combined.
|
|
5330
|
+
* Use this for exhaustive switch statements.
|
|
5331
|
+
*/
|
|
5332
|
+
const AUTH_ERROR_CODE = {
|
|
5333
|
+
...TOKEN_ERROR_CODES,
|
|
5334
|
+
...KEY_ERROR_CODES,
|
|
5335
|
+
...CONFIG_ERROR_CODES,
|
|
5336
|
+
...PROVIDER_ERROR_CODES,
|
|
5337
|
+
...APP_ERROR_CODES
|
|
5338
|
+
};
|
|
5339
|
+
/**
|
|
5340
|
+
* HTTP status codes for each error code.
|
|
5341
|
+
* Used for API responses.
|
|
5342
|
+
*/
|
|
5343
|
+
const ERROR_HTTP_STATUS = {
|
|
5344
|
+
[AUTH_ERROR_CODE.TOKEN_REQUIRED]: 401,
|
|
5345
|
+
[AUTH_ERROR_CODE.TOKEN_EXPIRED]: 401,
|
|
5346
|
+
[AUTH_ERROR_CODE.INVALID_TOKEN]: 401,
|
|
5347
|
+
[AUTH_ERROR_CODE.INVALID_SIGNATURE]: 401,
|
|
5348
|
+
[AUTH_ERROR_CODE.INVALID_ISSUER]: 401,
|
|
5349
|
+
[AUTH_ERROR_CODE.INVALID_AUDIENCE]: 401,
|
|
5350
|
+
[AUTH_ERROR_CODE.INVALID_ALGORITHM]: 401,
|
|
5351
|
+
[AUTH_ERROR_CODE.INVALID_AZP]: 401,
|
|
5352
|
+
[AUTH_ERROR_CODE.INVALID_TOKEN_AGE]: 401,
|
|
5353
|
+
[AUTH_ERROR_CODE.TOKEN_TOO_LARGE]: 400,
|
|
5354
|
+
[AUTH_ERROR_CODE.KEY_NOT_FOUND]: 401,
|
|
5355
|
+
[AUTH_ERROR_CODE.JWKS_FETCH_FAILED]: 502,
|
|
5356
|
+
[AUTH_ERROR_CODE.JWKS_RATE_LIMITED]: 429,
|
|
5357
|
+
[AUTH_ERROR_CODE.IDP_NOT_CONFIGURED]: 500,
|
|
5358
|
+
[AUTH_ERROR_CODE.SSRF_BLOCKED]: 400,
|
|
5359
|
+
[AUTH_ERROR_CODE.AZURE_TID_MISMATCH]: 401,
|
|
5360
|
+
[AUTH_ERROR_CODE.ORG_NOT_FOUND]: 404,
|
|
5361
|
+
[AUTH_ERROR_CODE.ORIGIN_NOT_ALLOWED]: 403,
|
|
5362
|
+
[AUTH_ERROR_CODE.DATABASE_ERROR]: 503,
|
|
5363
|
+
[AUTH_ERROR_CODE.LOCALHOST_REQUIRED]: 403,
|
|
5364
|
+
[AUTH_ERROR_CODE.API_KEY_REQUIRED]: 400,
|
|
5365
|
+
[AUTH_ERROR_CODE.FEATURE_NOT_IMPLEMENTED]: 501,
|
|
5366
|
+
[AUTH_ERROR_CODE.INTERNAL_ERROR]: 500
|
|
5367
|
+
};
|
|
5368
|
+
/**
|
|
5369
|
+
* Type guard to check if a string is a valid AuthErrorCode.
|
|
5370
|
+
*/
|
|
5371
|
+
function isAuthErrorCode(code) {
|
|
5372
|
+
return Object.values(AUTH_ERROR_CODE).includes(code);
|
|
5373
|
+
}
|
|
5374
|
+
|
|
5375
|
+
//#endregion
|
|
5376
|
+
//#region ../shared-types/dist/schemas/init-context.js
|
|
5377
|
+
/**
|
|
5378
|
+
* Zod schema for AuthErrorCode.
|
|
5379
|
+
* Built from the AUTH_ERROR_CODE constant to stay in sync with @char-ai/auth.
|
|
5380
|
+
*/
|
|
5381
|
+
const authErrorCodeValues = Object.values(AUTH_ERROR_CODE);
|
|
5382
|
+
const AuthErrorCodeSchema = z.enum(authErrorCodeValues);
|
|
5383
|
+
/**
|
|
5384
|
+
* Zod schema for ErrorCallToAction.
|
|
5385
|
+
* Validates the structure defined in @char-ai/auth.
|
|
5386
|
+
*/
|
|
5387
|
+
const ErrorCallToActionSchema = z.object({
|
|
5388
|
+
steps: z.array(z.string()),
|
|
5389
|
+
examples: z.array(z.string()).optional()
|
|
5390
|
+
});
|
|
5391
|
+
/**
|
|
5392
|
+
* Zod schema for ErrorContext.
|
|
5393
|
+
* Validates the structure defined in @char-ai/auth.
|
|
5394
|
+
* Uses passthrough to allow additional context properties.
|
|
5395
|
+
*
|
|
5396
|
+
* Note: We don't use `satisfies` here because Zod's passthrough produces
|
|
5397
|
+
* `unknown` for additional properties, while ErrorContext uses `string | undefined`.
|
|
5398
|
+
* The TypeScript type is re-exported from @char-ai/auth for type safety.
|
|
5399
|
+
*/
|
|
5400
|
+
const ErrorContextSchema = z.object({
|
|
5401
|
+
issuer: z.string().optional(),
|
|
5402
|
+
configuredIssuer: z.string().optional(),
|
|
5403
|
+
currentDomain: z.string().optional(),
|
|
5404
|
+
allowedDomains: z.array(z.string()).optional(),
|
|
5405
|
+
expectedIssuer: z.string().optional(),
|
|
5406
|
+
actualIssuer: z.string().optional(),
|
|
5407
|
+
missingField: z.string().optional()
|
|
5408
|
+
}).passthrough();
|
|
5409
|
+
const InitContextResultSchema = z.object({
|
|
5410
|
+
success: z.boolean(),
|
|
5411
|
+
endUserId: z.string(),
|
|
5412
|
+
organizationId: z.string().optional(),
|
|
5413
|
+
isAnonymous: z.boolean().optional(),
|
|
5414
|
+
hasOrgContext: z.boolean().optional(),
|
|
5415
|
+
message: z.string(),
|
|
5416
|
+
errorCode: AuthErrorCodeSchema.optional(),
|
|
5417
|
+
errorTitle: z.string().optional(),
|
|
5418
|
+
callToAction: ErrorCallToActionSchema.optional(),
|
|
5419
|
+
dashboardLink: z.string().optional(),
|
|
5420
|
+
docsLink: z.string().optional(),
|
|
5421
|
+
context: ErrorContextSchema.optional(),
|
|
5422
|
+
recoverable: z.boolean().optional(),
|
|
5423
|
+
debugInfo: z.string().optional()
|
|
5424
|
+
});
|
|
5425
|
+
|
|
5426
|
+
//#endregion
|
|
5427
|
+
//#region ../shared-types/dist/schemas/tool-approval.js
|
|
5428
|
+
const ToolApprovalModeSchema = z.enum(["auto", "ask"]);
|
|
5429
|
+
const ToolApprovalSettingsSchema = z.object({ mode: ToolApprovalModeSchema });
|
|
5430
|
+
|
|
5431
|
+
//#endregion
|
|
5432
|
+
//#region ../shared-types/dist/schemas/planning.js
|
|
5433
|
+
const TodoStatusSchema = z.enum([
|
|
5434
|
+
"new",
|
|
5435
|
+
"pending",
|
|
5436
|
+
"in-progress",
|
|
5437
|
+
"done"
|
|
5438
|
+
]);
|
|
5439
|
+
const TodoSchema = z.object({
|
|
5440
|
+
text: z.string(),
|
|
5441
|
+
status: TodoStatusSchema
|
|
5442
|
+
});
|
|
5443
|
+
const UpdateTodosInputSchema = z.object({
|
|
5444
|
+
new: z.array(z.string()),
|
|
5445
|
+
inProgress: z.array(z.number()),
|
|
5446
|
+
done: z.array(z.number()),
|
|
5447
|
+
clearPreviouslyDone: z.boolean(),
|
|
5448
|
+
insertAt: z.number().optional()
|
|
5449
|
+
});
|
|
5450
|
+
const UpdateTodosResultSchema = z.object({ todos: z.array(TodoSchema) });
|
|
5451
|
+
const AskForPlanApprovalInputSchema = z.object({ explainer: z.string() });
|
|
5452
|
+
const AskForPlanApprovalResultSchema = z.object({
|
|
5453
|
+
todos: z.array(TodoSchema),
|
|
5454
|
+
approved: z.boolean()
|
|
5455
|
+
});
|
|
5456
|
+
|
|
5457
|
+
//#endregion
|
|
5458
|
+
//#region ../shared-types/dist/schemas/mcp-client.js
|
|
5459
|
+
/**
|
|
5460
|
+
* MCP Client Types
|
|
4933
5461
|
*
|
|
4934
|
-
*
|
|
5462
|
+
* Types for MCP client connections and tool management.
|
|
5463
|
+
* These extend/complement the MCP SDK types.
|
|
5464
|
+
*/
|
|
5465
|
+
/**
|
|
5466
|
+
* Simple connection state for MCP clients
|
|
5467
|
+
*/
|
|
5468
|
+
const MCPClientStateSchema = z.enum([
|
|
5469
|
+
"idle",
|
|
5470
|
+
"connecting",
|
|
5471
|
+
"connected",
|
|
5472
|
+
"error"
|
|
5473
|
+
]);
|
|
5474
|
+
/**
|
|
5475
|
+
* Extended connection state for MCP clients with more granular states.
|
|
5476
|
+
* Useful for UI feedback during connection lifecycle.
|
|
5477
|
+
*/
|
|
5478
|
+
const MCPConnectionStateSchema = z.enum([
|
|
5479
|
+
"idle",
|
|
5480
|
+
"discovering",
|
|
5481
|
+
"connecting",
|
|
5482
|
+
"loading",
|
|
5483
|
+
"ready",
|
|
5484
|
+
"error"
|
|
5485
|
+
]);
|
|
5486
|
+
/**
|
|
5487
|
+
* Configuration for tab-based MCP sources (same-tab or iframe)
|
|
5488
|
+
*/
|
|
5489
|
+
const TabSourceConfigSchema = z.object({
|
|
5490
|
+
type: z.literal("tab"),
|
|
5491
|
+
targetOrigin: z.string().optional(),
|
|
5492
|
+
channelId: z.string().optional()
|
|
5493
|
+
});
|
|
5494
|
+
/**
|
|
5495
|
+
* Configuration for HTTP-based MCP sources (remote servers)
|
|
5496
|
+
*/
|
|
5497
|
+
const HttpSourceConfigSchema = z.object({
|
|
5498
|
+
type: z.literal("http"),
|
|
5499
|
+
url: z.string(),
|
|
5500
|
+
authToken: z.string().optional(),
|
|
5501
|
+
timeout: z.number().optional(),
|
|
5502
|
+
autoReconnect: z.boolean().optional(),
|
|
5503
|
+
transportType: z.enum([
|
|
5504
|
+
"auto",
|
|
5505
|
+
"http",
|
|
5506
|
+
"sse"
|
|
5507
|
+
]).optional(),
|
|
5508
|
+
customHeaders: z.record(z.string()).optional()
|
|
5509
|
+
});
|
|
5510
|
+
/**
|
|
5511
|
+
* Unified configuration for MCP sources
|
|
5512
|
+
*/
|
|
5513
|
+
const MCPSourceConfigSchema = z.discriminatedUnion("type", [TabSourceConfigSchema, HttpSourceConfigSchema]);
|
|
5514
|
+
/**
|
|
5515
|
+
* Tool annotations schema (mirrors MCP SDK Tool.annotations)
|
|
5516
|
+
* Note: This is a more complete version for tools with source tracking
|
|
5517
|
+
*/
|
|
5518
|
+
const ToolAnnotationsFullSchema = z.object({
|
|
5519
|
+
title: z.string().optional(),
|
|
5520
|
+
readOnlyHint: z.boolean().optional(),
|
|
5521
|
+
destructiveHint: z.boolean().optional(),
|
|
5522
|
+
idempotentHint: z.boolean().optional(),
|
|
5523
|
+
openWorldHint: z.boolean().optional()
|
|
5524
|
+
}).passthrough();
|
|
5525
|
+
/**
|
|
5526
|
+
* Tool with source tracking for multi-source tool management.
|
|
5527
|
+
* The _sourceId identifies which client to route tool calls to.
|
|
5528
|
+
*
|
|
5529
|
+
* This extends the MCP SDK Tool interface shape.
|
|
5530
|
+
*/
|
|
5531
|
+
const ToolWithSourceSchema = z.object({
|
|
5532
|
+
name: z.string(),
|
|
5533
|
+
description: z.string().optional(),
|
|
5534
|
+
inputSchema: z.record(z.unknown()).optional(),
|
|
5535
|
+
annotations: ToolAnnotationsFullSchema.optional(),
|
|
5536
|
+
_sourceId: z.string()
|
|
5537
|
+
});
|
|
5538
|
+
/**
|
|
5539
|
+
* State of an MCP source connection.
|
|
5540
|
+
*
|
|
5541
|
+
* Note: This schema uses z.unknown() for arrays of SDK types (Tool, Resource, etc.)
|
|
5542
|
+
* because we don't want to re-define those schemas here. Runtime validation
|
|
5543
|
+
* of these arrays should be done at the boundary where SDK types are received.
|
|
5544
|
+
*/
|
|
5545
|
+
const MCPSourceSchema = z.object({
|
|
5546
|
+
id: z.string(),
|
|
5547
|
+
config: MCPSourceConfigSchema,
|
|
5548
|
+
state: MCPClientStateSchema,
|
|
5549
|
+
error: z.string().nullable(),
|
|
5550
|
+
tools: z.array(z.unknown()),
|
|
5551
|
+
resources: z.array(z.unknown()),
|
|
5552
|
+
resourceTemplates: z.array(z.unknown()),
|
|
5553
|
+
prompts: z.array(z.unknown())
|
|
5554
|
+
});
|
|
5555
|
+
|
|
5556
|
+
//#endregion
|
|
5557
|
+
//#region ../shared-types/dist/utils/tool-destructive.js
|
|
5558
|
+
/**
|
|
5559
|
+
* Determine whether a tool should be considered destructive.
|
|
5560
|
+
* Defaults to destructive when annotations are missing (MCP default).
|
|
4935
5561
|
*/
|
|
4936
5562
|
function isToolDestructive(annotations) {
|
|
4937
5563
|
if (!annotations) return true;
|
|
@@ -5400,6 +6026,38 @@ function _temp2$5(c$1) {
|
|
|
5400
6026
|
//#region src/components/assistant-ui/thread.tsx
|
|
5401
6027
|
/** Glassmorphic button styles (from WebMCP extension) - theme-aware */
|
|
5402
6028
|
const glassmorphicButtonClass$1 = "h-8 w-8 rounded-full border border-border backdrop-blur-sm shadow-lg shadow-black/20 bg-muted/50 transition-all duration-200 hover:border-border hover:bg-muted";
|
|
6029
|
+
/**
|
|
6030
|
+
* ThinkingIndicator - Shows a subtle "Thinking" indicator when the thread is running
|
|
6031
|
+
* This provides visual feedback when the model is processing (e.g., after tool calls complete)
|
|
6032
|
+
*/
|
|
6033
|
+
const ThinkingIndicator = () => {
|
|
6034
|
+
const $ = c(1);
|
|
6035
|
+
let t0;
|
|
6036
|
+
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
6037
|
+
t0 = /* @__PURE__ */ jsx(AssistantIf, {
|
|
6038
|
+
condition: _temp2$4,
|
|
6039
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
6040
|
+
className: "aui-thinking-indicator mx-auto w-full max-w-(--thread-max-width) px-2 py-2",
|
|
6041
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
6042
|
+
className: "flex items-center gap-2 text-muted-foreground text-sm",
|
|
6043
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
6044
|
+
className: "aui-thinking-dots flex gap-1",
|
|
6045
|
+
children: [
|
|
6046
|
+
/* @__PURE__ */ jsx("span", { className: "aui-thinking-dot size-1.5 rounded-full bg-current animate-pulse" }),
|
|
6047
|
+
/* @__PURE__ */ jsx("span", { className: "aui-thinking-dot size-1.5 rounded-full bg-current animate-pulse [animation-delay:150ms]" }),
|
|
6048
|
+
/* @__PURE__ */ jsx("span", { className: "aui-thinking-dot size-1.5 rounded-full bg-current animate-pulse [animation-delay:300ms]" })
|
|
6049
|
+
]
|
|
6050
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
6051
|
+
className: "aui-thinking-text",
|
|
6052
|
+
children: "Thinking"
|
|
6053
|
+
})]
|
|
6054
|
+
})
|
|
6055
|
+
})
|
|
6056
|
+
});
|
|
6057
|
+
$[0] = t0;
|
|
6058
|
+
} else t0 = $[0];
|
|
6059
|
+
return t0;
|
|
6060
|
+
};
|
|
5403
6061
|
const Thread = ({ onThreadsClick, onNewThread, onClose }) => {
|
|
5404
6062
|
return /* @__PURE__ */ jsxs(ThreadPrimitive.Root, {
|
|
5405
6063
|
className: "aui-root aui-thread-root @container relative flex h-full min-h-0 flex-col bg-background",
|
|
@@ -5463,6 +6121,7 @@ const Thread = ({ onThreadsClick, onNewThread, onClose }) => {
|
|
|
5463
6121
|
UserMessage,
|
|
5464
6122
|
AssistantMessage
|
|
5465
6123
|
} }),
|
|
6124
|
+
/* @__PURE__ */ jsx(ThinkingIndicator, {}),
|
|
5466
6125
|
/* @__PURE__ */ jsxs(ThreadPrimitive.ViewportFooter, {
|
|
5467
6126
|
className: "aui-thread-viewport-footer sticky bottom-0 mx-auto mt-auto flex w-full max-w-(--thread-max-width) flex-col gap-4 overflow-visible bg-transparent pt-2 pb-4 md:pb-6",
|
|
5468
6127
|
children: [/* @__PURE__ */ jsx(ThreadScrollToBottom, {}), /* @__PURE__ */ jsx(Composer, {})]
|
|
@@ -5518,7 +6177,7 @@ const ThreadSuggestions = () => {
|
|
|
5518
6177
|
if (!hasPrompts) return null;
|
|
5519
6178
|
let t0;
|
|
5520
6179
|
if ($[0] !== prompts) {
|
|
5521
|
-
t0 = prompts.slice(0, 4).map(
|
|
6180
|
+
t0 = prompts.slice(0, 4).map(_temp3$3);
|
|
5522
6181
|
$[0] = prompts;
|
|
5523
6182
|
$[1] = t0;
|
|
5524
6183
|
} else t0 = $[1];
|
|
@@ -5845,7 +6504,7 @@ const ComposerAction = () => {
|
|
|
5845
6504
|
let t1;
|
|
5846
6505
|
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
|
|
5847
6506
|
t1 = /* @__PURE__ */ jsx(AssistantIf, {
|
|
5848
|
-
condition:
|
|
6507
|
+
condition: _temp4$2,
|
|
5849
6508
|
children: /* @__PURE__ */ jsx(ComposerPrimitive.Send, {
|
|
5850
6509
|
asChild: true,
|
|
5851
6510
|
children: /* @__PURE__ */ jsx(TooltipIconButton, {
|
|
@@ -5869,7 +6528,7 @@ const ComposerAction = () => {
|
|
|
5869
6528
|
children: [t0, /* @__PURE__ */ jsxs("div", {
|
|
5870
6529
|
className: "flex items-center gap-1",
|
|
5871
6530
|
children: [t1, /* @__PURE__ */ jsx(AssistantIf, {
|
|
5872
|
-
condition:
|
|
6531
|
+
condition: _temp5$2,
|
|
5873
6532
|
children: /* @__PURE__ */ jsx(ComposerPrimitive.Cancel, {
|
|
5874
6533
|
asChild: true,
|
|
5875
6534
|
children: /* @__PURE__ */ jsx(Button, {
|
|
@@ -5934,7 +6593,7 @@ const AssistantActionBar = () => {
|
|
|
5934
6593
|
let t0;
|
|
5935
6594
|
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
5936
6595
|
t0 = /* @__PURE__ */ jsx(AssistantIf, {
|
|
5937
|
-
condition:
|
|
6596
|
+
condition: _temp6$1,
|
|
5938
6597
|
children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" })
|
|
5939
6598
|
});
|
|
5940
6599
|
$[0] = t0;
|
|
@@ -5951,7 +6610,7 @@ const AssistantActionBar = () => {
|
|
|
5951
6610
|
children: /* @__PURE__ */ jsxs(TooltipIconButton, {
|
|
5952
6611
|
tooltip: "Copy",
|
|
5953
6612
|
children: [t0, /* @__PURE__ */ jsx(AssistantIf, {
|
|
5954
|
-
condition:
|
|
6613
|
+
condition: _temp7,
|
|
5955
6614
|
children: /* @__PURE__ */ jsx(CopyIcon, { className: "size-4" })
|
|
5956
6615
|
})]
|
|
5957
6616
|
})
|
|
@@ -5985,7 +6644,14 @@ const UserMessage = () => {
|
|
|
5985
6644
|
} else t1 = $[1];
|
|
5986
6645
|
return t1;
|
|
5987
6646
|
};
|
|
5988
|
-
function _temp$9(
|
|
6647
|
+
function _temp$9(message) {
|
|
6648
|
+
return message.status?.type === "requires-action" || message.status?.type === "incomplete";
|
|
6649
|
+
}
|
|
6650
|
+
function _temp2$4(t0) {
|
|
6651
|
+
const { thread } = t0;
|
|
6652
|
+
return thread.messages.at(-1)?.parts.at(-1)?.type === "tool-call" && !thread.messages.some(_temp$9);
|
|
6653
|
+
}
|
|
6654
|
+
function _temp3$3(prompt, index) {
|
|
5989
6655
|
return /* @__PURE__ */ jsx("div", {
|
|
5990
6656
|
className: "aui-thread-welcome-suggestion-display fade-in slide-in-from-bottom-2 @md:nth-[n+3]:block nth-[n+3]:hidden animate-in fill-mode-both duration-200",
|
|
5991
6657
|
style: { animationDelay: `${100 + index * 50}ms` },
|
|
@@ -6008,19 +6674,19 @@ function _temp$9(prompt, index) {
|
|
|
6008
6674
|
})
|
|
6009
6675
|
}, prompt.name);
|
|
6010
6676
|
}
|
|
6011
|
-
function
|
|
6677
|
+
function _temp4$2(t0) {
|
|
6012
6678
|
const { thread } = t0;
|
|
6013
6679
|
return !thread.isRunning;
|
|
6014
6680
|
}
|
|
6015
|
-
function
|
|
6681
|
+
function _temp5$2(t0) {
|
|
6016
6682
|
const { thread: thread_0 } = t0;
|
|
6017
6683
|
return thread_0.isRunning;
|
|
6018
6684
|
}
|
|
6019
|
-
function
|
|
6685
|
+
function _temp6$1(t0) {
|
|
6020
6686
|
const { message } = t0;
|
|
6021
6687
|
return message.isCopied;
|
|
6022
6688
|
}
|
|
6023
|
-
function
|
|
6689
|
+
function _temp7(t0) {
|
|
6024
6690
|
const { message: message_0 } = t0;
|
|
6025
6691
|
return !message_0.isCopied;
|
|
6026
6692
|
}
|
|
@@ -6375,24 +7041,19 @@ function _temp$8(step, index) {
|
|
|
6375
7041
|
//#endregion
|
|
6376
7042
|
//#region src/utils/convert-init-error.ts
|
|
6377
7043
|
/**
|
|
6378
|
-
*
|
|
7044
|
+
* Convert InitContextResult error to AuthError
|
|
7045
|
+
*
|
|
7046
|
+
* Takes the structured error response from the backend and converts it
|
|
7047
|
+
* to an AuthError that the error boundary can display properly.
|
|
7048
|
+
*/
|
|
7049
|
+
/**
|
|
7050
|
+
* Map backend error codes to frontend error codes.
|
|
7051
|
+
* Uses isAuthErrorCode from @char-ai/auth to validate known codes.
|
|
6379
7052
|
*/
|
|
6380
7053
|
function mapErrorCode(backendCode) {
|
|
6381
|
-
if (!backendCode) return
|
|
6382
|
-
if (
|
|
6383
|
-
|
|
6384
|
-
"TOKEN_EXPIRED",
|
|
6385
|
-
"INVALID_TOKEN",
|
|
6386
|
-
"INVALID_SIGNATURE",
|
|
6387
|
-
"INVALID_ISSUER",
|
|
6388
|
-
"INVALID_AUDIENCE",
|
|
6389
|
-
"KEY_NOT_FOUND",
|
|
6390
|
-
"IDP_NOT_CONFIGURED",
|
|
6391
|
-
"JWKS_FETCH_FAILED",
|
|
6392
|
-
"ORG_NOT_FOUND",
|
|
6393
|
-
"ORIGIN_NOT_ALLOWED"
|
|
6394
|
-
].includes(backendCode)) return backendCode;
|
|
6395
|
-
return "UNKNOWN_ERROR";
|
|
7054
|
+
if (!backendCode) return APP_ERROR_CODES.INTERNAL_ERROR;
|
|
7055
|
+
if (isAuthErrorCode(backendCode)) return backendCode;
|
|
7056
|
+
return APP_ERROR_CODES.INTERNAL_ERROR;
|
|
6396
7057
|
}
|
|
6397
7058
|
/**
|
|
6398
7059
|
* Convert InitContextResult failure to AuthError
|
|
@@ -6756,7 +7417,12 @@ function decodeJWT(token) {
|
|
|
6756
7417
|
const base64 = payload.replace(/-/g, "+").replace(/_/g, "/");
|
|
6757
7418
|
const jsonPayload = decodeURIComponent(atob(base64).split("").map((c$1) => "%" + ("00" + c$1.charCodeAt(0).toString(16)).slice(-2)).join(""));
|
|
6758
7419
|
return JSON.parse(jsonPayload);
|
|
6759
|
-
} catch {
|
|
7420
|
+
} catch (error) {
|
|
7421
|
+
console.debug("[JWT] Failed to decode token payload:", {
|
|
7422
|
+
error: error instanceof Error ? error.message : String(error),
|
|
7423
|
+
tokenLength: token?.length,
|
|
7424
|
+
hasThreeParts: token?.split(".").length === 3
|
|
7425
|
+
});
|
|
6760
7426
|
return null;
|
|
6761
7427
|
}
|
|
6762
7428
|
}
|
|
@@ -6773,6 +7439,73 @@ function extractUserIdFromToken(token) {
|
|
|
6773
7439
|
|
|
6774
7440
|
//#endregion
|
|
6775
7441
|
//#region src/hooks/useCloudflareThreadAdapter.tsx
|
|
7442
|
+
/**
|
|
7443
|
+
* Exchange an IDP token for a short-lived ticket.
|
|
7444
|
+
*
|
|
7445
|
+
* This unifies SPA and SSR authentication:
|
|
7446
|
+
* - SPA: Embedded agent calls this internally
|
|
7447
|
+
* - SSR: Customer's server calls this, passes ticket to embedded agent
|
|
7448
|
+
*
|
|
7449
|
+
* Both paths end up using initContextWithTicket for WebSocket auth.
|
|
7450
|
+
*/
|
|
7451
|
+
async function exchangeTokenForTicket(authToken, apiBase) {
|
|
7452
|
+
try {
|
|
7453
|
+
const response = await fetch(`${apiBase}/api/auth/ticket`, {
|
|
7454
|
+
method: "POST",
|
|
7455
|
+
headers: {
|
|
7456
|
+
"Authorization": `Bearer ${authToken}`,
|
|
7457
|
+
"Content-Type": "application/json"
|
|
7458
|
+
},
|
|
7459
|
+
body: JSON.stringify({})
|
|
7460
|
+
});
|
|
7461
|
+
if (!response.ok) {
|
|
7462
|
+
let errorData;
|
|
7463
|
+
try {
|
|
7464
|
+
errorData = await response.json();
|
|
7465
|
+
} catch (parseError) {
|
|
7466
|
+
console.error("[exchangeTokenForTicket] Failed to parse error response:", {
|
|
7467
|
+
status: response.status,
|
|
7468
|
+
statusText: response.statusText,
|
|
7469
|
+
parseError: parseError instanceof Error ? parseError.message : String(parseError),
|
|
7470
|
+
contentType: response.headers.get("content-type")
|
|
7471
|
+
});
|
|
7472
|
+
errorData = {
|
|
7473
|
+
error: "UNKNOWN",
|
|
7474
|
+
message: `Server returned status ${response.status}`
|
|
7475
|
+
};
|
|
7476
|
+
}
|
|
7477
|
+
return {
|
|
7478
|
+
success: false,
|
|
7479
|
+
error: errorData.error ?? "TICKET_EXCHANGE_FAILED",
|
|
7480
|
+
message: errorData.message ?? "Failed to exchange token for ticket"
|
|
7481
|
+
};
|
|
7482
|
+
}
|
|
7483
|
+
const data = await response.json();
|
|
7484
|
+
return {
|
|
7485
|
+
success: true,
|
|
7486
|
+
ticketAuth: {
|
|
7487
|
+
ticket: data.ticket,
|
|
7488
|
+
userId: data.userId,
|
|
7489
|
+
orgId: data.orgId
|
|
7490
|
+
}
|
|
7491
|
+
};
|
|
7492
|
+
} catch (error) {
|
|
7493
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
7494
|
+
const errorName = error instanceof Error ? error.name : "Unknown";
|
|
7495
|
+
const isNetworkError = error instanceof TypeError && errorMessage.includes("fetch") || error instanceof DOMException && error.name === "AbortError";
|
|
7496
|
+
const errorType = isNetworkError ? "NETWORK_ERROR" : "TOKEN_EXCHANGE_ERROR";
|
|
7497
|
+
console.error("[exchangeTokenForTicket] Error:", {
|
|
7498
|
+
type: errorType,
|
|
7499
|
+
error: errorMessage,
|
|
7500
|
+
name: errorName
|
|
7501
|
+
});
|
|
7502
|
+
return {
|
|
7503
|
+
success: false,
|
|
7504
|
+
error: errorType,
|
|
7505
|
+
message: isNetworkError ? "Unable to reach authentication server. Please check your connection." : `Authentication failed: ${errorMessage}`
|
|
7506
|
+
};
|
|
7507
|
+
}
|
|
7508
|
+
}
|
|
6776
7509
|
/** localStorage key for anonymous session ID persistence */
|
|
6777
7510
|
const ANONYMOUS_SESSION_KEY = "webmcp-anonymous-session-id";
|
|
6778
7511
|
/**
|
|
@@ -6808,31 +7541,79 @@ function isArchivedThread(thread) {
|
|
|
6808
7541
|
/**
|
|
6809
7542
|
* Hook that manages thread list state and syncs with ThreadManager DO.
|
|
6810
7543
|
*
|
|
6811
|
-
*
|
|
6812
|
-
*
|
|
6813
|
-
*
|
|
6814
|
-
*
|
|
6815
|
-
*
|
|
7544
|
+
* ## Unified Ticket-Based Authentication
|
|
7545
|
+
*
|
|
7546
|
+
* Both SPA and SSR flows converge on ticket-based auth:
|
|
7547
|
+
*
|
|
7548
|
+
* **SPA flow (authToken):**
|
|
7549
|
+
* 1. Embedded agent calls POST /api/auth/ticket to exchange IDP token
|
|
7550
|
+
* 2. Receives short-lived ticket with userId and orgId
|
|
7551
|
+
* 3. Connects to org-scoped ThreadManager DO
|
|
7552
|
+
* 4. Calls initContextWithTicket() with the ticket
|
|
7553
|
+
*
|
|
7554
|
+
* **SSR flow (ticketAuth):**
|
|
7555
|
+
* 1. Customer's server already called POST /api/auth/ticket
|
|
7556
|
+
* 2. Passes ticketAuth directly to embedded agent
|
|
7557
|
+
* 3. Connects to org-scoped ThreadManager DO
|
|
7558
|
+
* 4. Calls initContextWithTicket() with the ticket
|
|
7559
|
+
*
|
|
7560
|
+
* This unified approach means:
|
|
7561
|
+
* - JWKS validation happens once (at ticket creation), not on every WebSocket reconnect
|
|
7562
|
+
* - Same backend code path for both SPA and SSR
|
|
7563
|
+
* - Consistent security model (short-lived, single-use tickets)
|
|
6816
7564
|
*/
|
|
6817
7565
|
function useCloudflareThreadAdapter(options) {
|
|
6818
|
-
const { host, authToken, anthropicApiKey, mcpTools, executeMCPTool } = options;
|
|
6819
|
-
const
|
|
6820
|
-
if (!
|
|
6821
|
-
|
|
6822
|
-
|
|
7566
|
+
const { host, authToken, ticketAuth: providedTicketAuth, anthropicApiKey, mcpTools, executeMCPTool } = options;
|
|
7567
|
+
const apiBase = useMemo(() => {
|
|
7568
|
+
if (!host) return WEBMCP_PRODUCTION_API_BASE;
|
|
7569
|
+
return `${host.startsWith("localhost") || host.startsWith("127.0.0.1") ? "http" : "https"}://${host}`;
|
|
7570
|
+
}, [host]);
|
|
7571
|
+
const [exchangedTicket, setExchangedTicket] = useState(null);
|
|
7572
|
+
const [ticketExchangeError, setTicketExchangeError] = useState(null);
|
|
7573
|
+
const [isExchangingTicket, setIsExchangingTicket] = useState(false);
|
|
7574
|
+
const exchangePromiseRef = useRef(null);
|
|
7575
|
+
const isMountedRef = useRef(true);
|
|
7576
|
+
useEffect(() => {
|
|
7577
|
+
isMountedRef.current = true;
|
|
7578
|
+
return () => {
|
|
7579
|
+
isMountedRef.current = false;
|
|
6823
7580
|
};
|
|
6824
|
-
|
|
6825
|
-
|
|
6826
|
-
|
|
6827
|
-
|
|
7581
|
+
}, []);
|
|
7582
|
+
const ticketAuth = providedTicketAuth ?? exchangedTicket;
|
|
7583
|
+
const { baseUserId, isAnonymous, initialOrgId, needsTicketExchange } = useMemo(() => {
|
|
7584
|
+
if (ticketAuth) return {
|
|
7585
|
+
baseUserId: ticketAuth.userId,
|
|
7586
|
+
isAnonymous: false,
|
|
7587
|
+
initialOrgId: ticketAuth.orgId,
|
|
7588
|
+
needsTicketExchange: false
|
|
6828
7589
|
};
|
|
6829
|
-
|
|
7590
|
+
if (authToken) {
|
|
7591
|
+
const tokenUserId = extractUserIdFromToken(authToken);
|
|
7592
|
+
if (tokenUserId) return {
|
|
7593
|
+
baseUserId: tokenUserId,
|
|
7594
|
+
isAnonymous: false,
|
|
7595
|
+
initialOrgId: null,
|
|
7596
|
+
needsTicketExchange: true
|
|
7597
|
+
};
|
|
7598
|
+
console.error("[useCloudflareThreadAdapter] Failed to extract user ID from auth token - token may be malformed");
|
|
7599
|
+
return {
|
|
7600
|
+
baseUserId: `malformed-token-${crypto.randomUUID()}`,
|
|
7601
|
+
isAnonymous: false,
|
|
7602
|
+
initialOrgId: null,
|
|
7603
|
+
needsTicketExchange: true
|
|
7604
|
+
};
|
|
7605
|
+
}
|
|
6830
7606
|
return {
|
|
6831
7607
|
baseUserId: getOrCreateAnonymousId(),
|
|
6832
|
-
isAnonymous: true
|
|
7608
|
+
isAnonymous: true,
|
|
7609
|
+
initialOrgId: null,
|
|
7610
|
+
needsTicketExchange: false
|
|
6833
7611
|
};
|
|
6834
|
-
}, [authToken]);
|
|
6835
|
-
const [compositeManagerName, setCompositeManagerName] = useState(
|
|
7612
|
+
}, [authToken, ticketAuth]);
|
|
7613
|
+
const [compositeManagerName, setCompositeManagerName] = useState(() => {
|
|
7614
|
+
if (initialOrgId) return `${initialOrgId}:${baseUserId}`;
|
|
7615
|
+
return null;
|
|
7616
|
+
});
|
|
6836
7617
|
const effectiveUserId = compositeManagerName ?? baseUserId;
|
|
6837
7618
|
const [isInitialized, setIsInitialized] = useState(false);
|
|
6838
7619
|
const [initialSyncComplete, setInitialSyncComplete] = useState(false);
|
|
@@ -6842,12 +7623,11 @@ function useCloudflareThreadAdapter(options) {
|
|
|
6842
7623
|
const [threads, setThreads] = useState([]);
|
|
6843
7624
|
const [lastSelectedThreadId, setLastSelectedThreadId] = useState(null);
|
|
6844
7625
|
const initPromiseRef = useRef(null);
|
|
6845
|
-
const prevAuthTokenRef = useRef(authToken);
|
|
6846
7626
|
const manager = useAgent({
|
|
6847
7627
|
agent: "ThreadManager",
|
|
6848
7628
|
name: effectiveUserId,
|
|
6849
7629
|
host,
|
|
6850
|
-
query: isAnonymous ? { anonymous: "true" } :
|
|
7630
|
+
query: isAnonymous ? { anonymous: "true" } : void 0,
|
|
6851
7631
|
onStateUpdate: (state, source) => {
|
|
6852
7632
|
setThreads(state.threads);
|
|
6853
7633
|
if (state.lastSelectedThreadId !== void 0) setLastSelectedThreadId(state.lastSelectedThreadId);
|
|
@@ -6911,20 +7691,32 @@ function useCloudflareThreadAdapter(options) {
|
|
|
6911
7691
|
tabId,
|
|
6912
7692
|
manager
|
|
6913
7693
|
]);
|
|
7694
|
+
const prevAuthTokenRef = useRef(authToken);
|
|
7695
|
+
const prevProvidedTicketRef = useRef(providedTicketAuth?.ticket);
|
|
6914
7696
|
useEffect(() => {
|
|
6915
|
-
|
|
7697
|
+
const authTokenChanged = authToken !== prevAuthTokenRef.current;
|
|
7698
|
+
const providedTicketChanged = providedTicketAuth?.ticket !== prevProvidedTicketRef.current;
|
|
7699
|
+
if (!authTokenChanged && !providedTicketChanged) return;
|
|
6916
7700
|
prevAuthTokenRef.current = authToken;
|
|
7701
|
+
prevProvidedTicketRef.current = providedTicketAuth?.ticket;
|
|
7702
|
+
setExchangedTicket(null);
|
|
7703
|
+
setTicketExchangeError(null);
|
|
7704
|
+
setIsExchangingTicket(false);
|
|
7705
|
+
exchangePromiseRef.current = null;
|
|
6917
7706
|
initPromiseRef.current = null;
|
|
6918
7707
|
setIsInitialized(false);
|
|
6919
7708
|
setInitialSyncComplete(false);
|
|
6920
7709
|
setEndUserId(null);
|
|
6921
7710
|
setOrganizationId(null);
|
|
6922
|
-
setCompositeManagerName(null);
|
|
7711
|
+
setCompositeManagerName(initialOrgId ? `${initialOrgId}:${baseUserId}` : null);
|
|
6923
7712
|
setLastSelectedThreadId(null);
|
|
6924
7713
|
}, [
|
|
6925
7714
|
authToken,
|
|
7715
|
+
providedTicketAuth?.ticket,
|
|
6926
7716
|
anthropicApiKey,
|
|
6927
|
-
isAnonymous
|
|
7717
|
+
isAnonymous,
|
|
7718
|
+
initialOrgId,
|
|
7719
|
+
baseUserId
|
|
6928
7720
|
]);
|
|
6929
7721
|
useEffect(() => {
|
|
6930
7722
|
if (manager.readyState === WebSocket.OPEN) return;
|
|
@@ -6932,52 +7724,93 @@ function useCloudflareThreadAdapter(options) {
|
|
|
6932
7724
|
setIsInitialized(false);
|
|
6933
7725
|
setInitialSyncComplete(false);
|
|
6934
7726
|
}, [manager.readyState]);
|
|
7727
|
+
useEffect(() => {
|
|
7728
|
+
if (!exchangedTicket) return;
|
|
7729
|
+
setCompositeManagerName(`${exchangedTicket.orgId}:${exchangedTicket.userId}`);
|
|
7730
|
+
}, [exchangedTicket]);
|
|
6935
7731
|
const ensureInitialized = useCallback(async () => {
|
|
6936
7732
|
if (manager.readyState !== WebSocket.OPEN) throw new Error("ThreadManager is not connected");
|
|
6937
|
-
|
|
6938
|
-
|
|
6939
|
-
if (
|
|
6940
|
-
|
|
6941
|
-
|
|
6942
|
-
}
|
|
6943
|
-
|
|
6944
|
-
|
|
6945
|
-
|
|
6946
|
-
|
|
7733
|
+
const origin = typeof window !== "undefined" ? window.location.origin : void 0;
|
|
7734
|
+
if (needsTicketExchange && authToken && !ticketAuth) {
|
|
7735
|
+
if (!exchangePromiseRef.current) {
|
|
7736
|
+
setIsExchangingTicket(true);
|
|
7737
|
+
exchangePromiseRef.current = exchangeTokenForTicket(authToken, apiBase);
|
|
7738
|
+
}
|
|
7739
|
+
const result_0 = await exchangePromiseRef.current;
|
|
7740
|
+
exchangePromiseRef.current = null;
|
|
7741
|
+
if (!isMountedRef.current) return;
|
|
7742
|
+
setIsExchangingTicket(false);
|
|
7743
|
+
if (!result_0.success) {
|
|
7744
|
+
setTicketExchangeError({
|
|
7745
|
+
error: result_0.error,
|
|
7746
|
+
message: result_0.message
|
|
7747
|
+
});
|
|
7748
|
+
throw {
|
|
7749
|
+
code: result_0.error,
|
|
7750
|
+
title: "Authentication Failed",
|
|
7751
|
+
message: result_0.message,
|
|
7752
|
+
recoverable: result_0.error === "NETWORK_ERROR"
|
|
7753
|
+
};
|
|
7754
|
+
}
|
|
7755
|
+
setExchangedTicket(result_0.ticketAuth);
|
|
7756
|
+
return;
|
|
7757
|
+
}
|
|
7758
|
+
if (ticketAuth && ticketAuth.orgId) {
|
|
7759
|
+
const expectedDOName = `${ticketAuth.orgId}:${ticketAuth.userId}`;
|
|
7760
|
+
if (effectiveUserId !== expectedDOName) {
|
|
7761
|
+
console.debug("[useCloudflareThreadAdapter] Waiting for org-scoped DO connection", {
|
|
7762
|
+
current: effectiveUserId,
|
|
7763
|
+
expected: expectedDOName
|
|
7764
|
+
});
|
|
7765
|
+
return;
|
|
7766
|
+
}
|
|
6947
7767
|
}
|
|
7768
|
+
if (!initPromiseRef.current) if (isAnonymous) initPromiseRef.current = manager.call("initContextAnonymous", [{
|
|
7769
|
+
origin,
|
|
7770
|
+
anthropicApiKey
|
|
7771
|
+
}]);
|
|
7772
|
+
else if (ticketAuth) initPromiseRef.current = manager.call("initContextWithTicket", [{
|
|
7773
|
+
ticket: ticketAuth.ticket,
|
|
7774
|
+
origin
|
|
7775
|
+
}]);
|
|
7776
|
+
else throw new Error("No authentication method available");
|
|
6948
7777
|
const initResult = await initPromiseRef.current;
|
|
7778
|
+
if (!isMountedRef.current) return;
|
|
6949
7779
|
if (!initResult.success) throwInitError(initResult);
|
|
6950
7780
|
setEndUserId(initResult.endUserId);
|
|
6951
7781
|
if (initResult.organizationId) setOrganizationId(initResult.organizationId);
|
|
6952
|
-
if (!isAnonymous && initResult.organizationId) {
|
|
6953
|
-
const composite = `${initResult.organizationId}:${baseUserId}`;
|
|
6954
|
-
if (!compositeManagerName) {
|
|
6955
|
-
initPromiseRef.current = null;
|
|
6956
|
-
setCompositeManagerName(composite);
|
|
6957
|
-
return;
|
|
6958
|
-
}
|
|
6959
|
-
}
|
|
6960
7782
|
setIsInitialized(true);
|
|
6961
7783
|
}, [
|
|
6962
7784
|
manager,
|
|
6963
7785
|
authToken,
|
|
7786
|
+
ticketAuth,
|
|
6964
7787
|
anthropicApiKey,
|
|
6965
7788
|
isAnonymous,
|
|
6966
|
-
|
|
6967
|
-
|
|
7789
|
+
needsTicketExchange,
|
|
7790
|
+
isExchangingTicket,
|
|
7791
|
+
apiBase,
|
|
7792
|
+
effectiveUserId
|
|
6968
7793
|
]);
|
|
6969
7794
|
useEffect(() => {
|
|
6970
7795
|
if (manager.readyState !== WebSocket.OPEN) return;
|
|
6971
7796
|
if (isInitialized) return;
|
|
6972
7797
|
if (authError) return;
|
|
7798
|
+
if (isExchangingTicket) return;
|
|
6973
7799
|
ensureInitialized().catch((error_0) => {
|
|
6974
7800
|
console.error("[useCloudflareThreadAdapter] initContext error:", error_0);
|
|
6975
7801
|
if (error_0 && typeof error_0 === "object" && "code" in error_0 && "title" in error_0) setAuthError(error_0);
|
|
7802
|
+
else setAuthError({
|
|
7803
|
+
code: "INTERNAL_ERROR",
|
|
7804
|
+
title: "Connection Error",
|
|
7805
|
+
message: error_0 instanceof Error ? error_0.message : "Failed to initialize. Please try again.",
|
|
7806
|
+
recoverable: true
|
|
7807
|
+
});
|
|
6976
7808
|
});
|
|
6977
7809
|
}, [
|
|
6978
7810
|
manager.readyState,
|
|
6979
7811
|
isInitialized,
|
|
6980
7812
|
authError,
|
|
7813
|
+
isExchangingTicket,
|
|
6981
7814
|
ensureInitialized
|
|
6982
7815
|
]);
|
|
6983
7816
|
const activeThreads = useMemo(() => {
|
|
@@ -7022,7 +7855,9 @@ function useCloudflareThreadAdapter(options) {
|
|
|
7022
7855
|
await managerRef.current.call("archiveThread", [threadId_1]);
|
|
7023
7856
|
if (threadId_1 === currentThreadIdRef.current) {
|
|
7024
7857
|
const nextActive = activeThreadsRef.current.filter((t_2) => t_2.id !== threadId_1)[0]?.id;
|
|
7025
|
-
if (nextActive) managerRef.current.call("setLastSelectedThread", [nextActive]).catch(() => {
|
|
7858
|
+
if (nextActive) managerRef.current.call("setLastSelectedThread", [nextActive]).catch((error_2) => {
|
|
7859
|
+
console.warn("[WebMCP] Failed to update thread selection after archive:", error_2);
|
|
7860
|
+
});
|
|
7026
7861
|
else await createThread();
|
|
7027
7862
|
}
|
|
7028
7863
|
}, [
|
|
@@ -7041,7 +7876,9 @@ function useCloudflareThreadAdapter(options) {
|
|
|
7041
7876
|
await managerRef.current.call("deleteThread", [threadId_3]);
|
|
7042
7877
|
if (threadId_3 === currentThreadIdRef.current) {
|
|
7043
7878
|
const nextActive_0 = activeThreadsRef.current.filter((t_3) => t_3.id !== threadId_3)[0]?.id;
|
|
7044
|
-
if (nextActive_0) managerRef.current.call("setLastSelectedThread", [nextActive_0]).catch(() => {
|
|
7879
|
+
if (nextActive_0) managerRef.current.call("setLastSelectedThread", [nextActive_0]).catch((error_3) => {
|
|
7880
|
+
console.warn("[WebMCP] Failed to update thread selection after delete:", error_3);
|
|
7881
|
+
});
|
|
7045
7882
|
}
|
|
7046
7883
|
}, [
|
|
7047
7884
|
ensureInitializedRef,
|
|
@@ -7131,7 +7968,7 @@ const convertParts = (message, metadata) => {
|
|
|
7131
7968
|
let result;
|
|
7132
7969
|
let isError = false;
|
|
7133
7970
|
const rawInput = getRawInput(part);
|
|
7134
|
-
if (part.state === "input-streaming" || part.state === "input-available") args = part.input || {};
|
|
7971
|
+
if (part.state === "input-streaming" || part.state === "input-available" || part.state === "approval-requested") args = part.input || {};
|
|
7135
7972
|
else if (part.state === "output-available") {
|
|
7136
7973
|
args = part.input || {};
|
|
7137
7974
|
result = part.output;
|
|
@@ -7293,7 +8130,6 @@ function useThreadRuntime$2(options) {
|
|
|
7293
8130
|
agent: "ThreadAgent",
|
|
7294
8131
|
name: threadId ?? DISCONNECTED_THREAD_ID,
|
|
7295
8132
|
host,
|
|
7296
|
-
query: authToken ? { auth_token: authToken } : void 0,
|
|
7297
8133
|
startClosed: threadId == null,
|
|
7298
8134
|
onStateUpdate: (state) => {
|
|
7299
8135
|
setAgentState(state);
|
|
@@ -7664,10 +8500,11 @@ function ThreadRuntimeBridge({ children, threadId, host, authToken, manager, mcp
|
|
|
7664
8500
|
* }
|
|
7665
8501
|
* ```
|
|
7666
8502
|
*/
|
|
7667
|
-
function CloudflareThreadRuntimeProvider({ children, host, authToken, anthropicApiKey, mcpTools, executeMCPTool, dashboardBaseUrl, docsBaseUrl, onClose }) {
|
|
8503
|
+
function CloudflareThreadRuntimeProvider({ children, host, authToken, ticketAuth, anthropicApiKey, mcpTools, executeMCPTool, dashboardBaseUrl, docsBaseUrl, onClose }) {
|
|
7668
8504
|
const { currentThreadId, setCurrentThreadId, threadListAdapter, isInitialized, isReady, endUserId, organizationId, authError, manager, toolSources } = useCloudflareThreadAdapter({
|
|
7669
8505
|
host,
|
|
7670
8506
|
authToken,
|
|
8507
|
+
ticketAuth,
|
|
7671
8508
|
anthropicApiKey,
|
|
7672
8509
|
mcpTools,
|
|
7673
8510
|
executeMCPTool
|
|
@@ -8447,7 +9284,7 @@ var AuthErrorBoundary = class extends React.Component {
|
|
|
8447
9284
|
return {
|
|
8448
9285
|
hasError: true,
|
|
8449
9286
|
error: isAuthError(error) ? error : {
|
|
8450
|
-
code:
|
|
9287
|
+
code: APP_ERROR_CODES.INTERNAL_ERROR,
|
|
8451
9288
|
title: "Something Went Wrong",
|
|
8452
9289
|
message: "An unexpected error occurred. Please try refreshing the page.",
|
|
8453
9290
|
recoverable: true,
|
|
@@ -9055,7 +9892,7 @@ function useWebMCPDebugTools(options) {
|
|
|
9055
9892
|
id,
|
|
9056
9893
|
state: source.state,
|
|
9057
9894
|
toolCount: source.tools.length,
|
|
9058
|
-
error: source.error
|
|
9895
|
+
error: source.error ?? null
|
|
9059
9896
|
})) : [],
|
|
9060
9897
|
remoteSources: state.toolSelection ? state.toolSelection.sources.map((s_0) => ({
|
|
9061
9898
|
sourceId: s_0.sourceId,
|
|
@@ -9568,8 +10405,8 @@ const StatefulRuntimeBridge = (t0) => {
|
|
|
9568
10405
|
* Note: Tool approval mode is now managed by ThreadAgent state (synced across clients).
|
|
9569
10406
|
*/
|
|
9570
10407
|
const UnifiedRuntime = (t0) => {
|
|
9571
|
-
const $ = c(
|
|
9572
|
-
const { children, apiBase, authToken, anthropicApiKey, host, tokenEndpoint, enableDebugTools, dashboardBaseUrl, docsBaseUrl, onClose, onVoiceError, onVoiceConnect, onVoiceDisconnect } = t0;
|
|
10408
|
+
const $ = c(21);
|
|
10409
|
+
const { children, apiBase, authToken, ticketAuth, anthropicApiKey, host, tokenEndpoint, enableDebugTools, dashboardBaseUrl, docsBaseUrl, onClose, onVoiceError, onVoiceConnect, onVoiceDisconnect } = t0;
|
|
9573
10410
|
const { tools: mcpTools, callTool } = useMCPTools();
|
|
9574
10411
|
const resolvedApiBase = apiBase ?? WEBMCP_PRODUCTION_API_BASE;
|
|
9575
10412
|
let t1;
|
|
@@ -9606,10 +10443,11 @@ const UnifiedRuntime = (t0) => {
|
|
|
9606
10443
|
$[9] = t2;
|
|
9607
10444
|
} else t2 = $[9];
|
|
9608
10445
|
let t3;
|
|
9609
|
-
if ($[10] !== anthropicApiKey || $[11] !== authToken || $[12] !== callTool || $[13] !== dashboardBaseUrl || $[14] !== docsBaseUrl || $[15] !== mcpTools || $[16] !== onClose || $[17] !== resolvedHost || $[18] !== t2) {
|
|
10446
|
+
if ($[10] !== anthropicApiKey || $[11] !== authToken || $[12] !== callTool || $[13] !== dashboardBaseUrl || $[14] !== docsBaseUrl || $[15] !== mcpTools || $[16] !== onClose || $[17] !== resolvedHost || $[18] !== t2 || $[19] !== ticketAuth) {
|
|
9610
10447
|
t3 = /* @__PURE__ */ jsx(CloudflareThreadRuntimeProvider, {
|
|
9611
10448
|
host: resolvedHost,
|
|
9612
10449
|
authToken,
|
|
10450
|
+
ticketAuth,
|
|
9613
10451
|
anthropicApiKey,
|
|
9614
10452
|
mcpTools,
|
|
9615
10453
|
executeMCPTool: callTool,
|
|
@@ -9627,8 +10465,9 @@ const UnifiedRuntime = (t0) => {
|
|
|
9627
10465
|
$[16] = onClose;
|
|
9628
10466
|
$[17] = resolvedHost;
|
|
9629
10467
|
$[18] = t2;
|
|
9630
|
-
$[19] =
|
|
9631
|
-
|
|
10468
|
+
$[19] = ticketAuth;
|
|
10469
|
+
$[20] = t3;
|
|
10470
|
+
} else t3 = $[20];
|
|
9632
10471
|
return t3;
|
|
9633
10472
|
};
|
|
9634
10473
|
/**
|
|
@@ -9639,13 +10478,14 @@ const UnifiedRuntime = (t0) => {
|
|
|
9639
10478
|
* - Anonymous: no authToken, anthropicApiKey provided (localhost dev mode)
|
|
9640
10479
|
*/
|
|
9641
10480
|
const AgentRuntime = (t0) => {
|
|
9642
|
-
const $ = c(
|
|
9643
|
-
const { children, apiBase, authToken, anthropicApiKey, host, tokenEndpoint, enableDebugTools, dashboardBaseUrl, docsBaseUrl, onClose, onVoiceError, onVoiceConnect, onVoiceDisconnect } = t0;
|
|
10481
|
+
const $ = c(15);
|
|
10482
|
+
const { children, apiBase, authToken, ticketAuth, anthropicApiKey, host, tokenEndpoint, enableDebugTools, dashboardBaseUrl, docsBaseUrl, onClose, onVoiceError, onVoiceConnect, onVoiceDisconnect } = t0;
|
|
9644
10483
|
let t1;
|
|
9645
|
-
if ($[0] !== anthropicApiKey || $[1] !== apiBase || $[2] !== authToken || $[3] !== children || $[4] !== dashboardBaseUrl || $[5] !== docsBaseUrl || $[6] !== enableDebugTools || $[7] !== host || $[8] !== onClose || $[9] !== onVoiceConnect || $[10] !== onVoiceDisconnect || $[11] !== onVoiceError || $[12] !== tokenEndpoint) {
|
|
10484
|
+
if ($[0] !== anthropicApiKey || $[1] !== apiBase || $[2] !== authToken || $[3] !== children || $[4] !== dashboardBaseUrl || $[5] !== docsBaseUrl || $[6] !== enableDebugTools || $[7] !== host || $[8] !== onClose || $[9] !== onVoiceConnect || $[10] !== onVoiceDisconnect || $[11] !== onVoiceError || $[12] !== ticketAuth || $[13] !== tokenEndpoint) {
|
|
9646
10485
|
t1 = /* @__PURE__ */ jsx(UnifiedRuntime, {
|
|
9647
10486
|
apiBase,
|
|
9648
10487
|
authToken,
|
|
10488
|
+
ticketAuth,
|
|
9649
10489
|
anthropicApiKey,
|
|
9650
10490
|
host,
|
|
9651
10491
|
tokenEndpoint,
|
|
@@ -9670,9 +10510,10 @@ const AgentRuntime = (t0) => {
|
|
|
9670
10510
|
$[9] = onVoiceConnect;
|
|
9671
10511
|
$[10] = onVoiceDisconnect;
|
|
9672
10512
|
$[11] = onVoiceError;
|
|
9673
|
-
$[12] =
|
|
9674
|
-
$[13] =
|
|
9675
|
-
|
|
10513
|
+
$[12] = ticketAuth;
|
|
10514
|
+
$[13] = tokenEndpoint;
|
|
10515
|
+
$[14] = t1;
|
|
10516
|
+
} else t1 = $[14];
|
|
9676
10517
|
return t1;
|
|
9677
10518
|
};
|
|
9678
10519
|
/**
|
|
@@ -9693,8 +10534,8 @@ const AgentRuntime = (t0) => {
|
|
|
9693
10534
|
* across all connected clients. The defaultApprovalMode prop has been removed.
|
|
9694
10535
|
*/
|
|
9695
10536
|
const AgentProvider = (t0) => {
|
|
9696
|
-
const $ = c(
|
|
9697
|
-
const { children, apiBase, authToken, anthropicApiKey: anthropicApiKeyProp, devMode, host, tokenEndpoint, autoConnectLocal: t1, open, defaultOpen: t2, defaultMode: t3, excludeTools, excludeToolNames, excludeToolPrefixes, enableDebugTools: t4, dashboardBaseUrl, docsBaseUrl, onAuthError, showErrorDebug: t5, onClose, onToolsChange, onVoiceError, onVoiceConnect, onVoiceDisconnect, onOpenChange, onModeChange } = t0;
|
|
10537
|
+
const $ = c(39);
|
|
10538
|
+
const { children, apiBase, authToken, ticketAuth, anthropicApiKey: anthropicApiKeyProp, devMode, host, tokenEndpoint, autoConnectLocal: t1, open, defaultOpen: t2, defaultMode: t3, excludeTools, excludeToolNames, excludeToolPrefixes, enableDebugTools: t4, dashboardBaseUrl, docsBaseUrl, onAuthError, showErrorDebug: t5, onClose, onToolsChange, onVoiceError, onVoiceConnect, onVoiceDisconnect, onOpenChange, onModeChange } = t0;
|
|
9698
10539
|
const autoConnectLocal = t1 === void 0 ? true : t1;
|
|
9699
10540
|
const defaultOpen = t2 === void 0 ? false : t2;
|
|
9700
10541
|
const defaultMode = t3 === void 0 ? "collapsed" : t3;
|
|
@@ -9703,10 +10544,11 @@ const AgentProvider = (t0) => {
|
|
|
9703
10544
|
const anthropicApiKey = devMode?.anthropicApiKey ?? anthropicApiKeyProp;
|
|
9704
10545
|
const hasExclusions = excludeTools || excludeToolNames || excludeToolPrefixes;
|
|
9705
10546
|
let t6;
|
|
9706
|
-
if ($[0] !== anthropicApiKey || $[1] !== apiBase || $[2] !== authToken || $[3] !== children || $[4] !== dashboardBaseUrl || $[5] !== docsBaseUrl || $[6] !== enableDebugTools || $[7] !== host || $[8] !== onClose || $[9] !== onVoiceConnect || $[10] !== onVoiceDisconnect || $[11] !== onVoiceError || $[12] !== tokenEndpoint) {
|
|
10547
|
+
if ($[0] !== anthropicApiKey || $[1] !== apiBase || $[2] !== authToken || $[3] !== children || $[4] !== dashboardBaseUrl || $[5] !== docsBaseUrl || $[6] !== enableDebugTools || $[7] !== host || $[8] !== onClose || $[9] !== onVoiceConnect || $[10] !== onVoiceDisconnect || $[11] !== onVoiceError || $[12] !== ticketAuth || $[13] !== tokenEndpoint) {
|
|
9707
10548
|
t6 = /* @__PURE__ */ jsx(AgentRuntime, {
|
|
9708
10549
|
apiBase,
|
|
9709
10550
|
authToken,
|
|
10551
|
+
ticketAuth,
|
|
9710
10552
|
anthropicApiKey,
|
|
9711
10553
|
host,
|
|
9712
10554
|
tokenEndpoint,
|
|
@@ -9731,39 +10573,40 @@ const AgentProvider = (t0) => {
|
|
|
9731
10573
|
$[9] = onVoiceConnect;
|
|
9732
10574
|
$[10] = onVoiceDisconnect;
|
|
9733
10575
|
$[11] = onVoiceError;
|
|
9734
|
-
$[12] =
|
|
9735
|
-
$[13] =
|
|
9736
|
-
|
|
10576
|
+
$[12] = ticketAuth;
|
|
10577
|
+
$[13] = tokenEndpoint;
|
|
10578
|
+
$[14] = t6;
|
|
10579
|
+
} else t6 = $[14];
|
|
9737
10580
|
let t7;
|
|
9738
|
-
if ($[
|
|
10581
|
+
if ($[15] !== autoConnectLocal || $[16] !== onToolsChange || $[17] !== t6) {
|
|
9739
10582
|
t7 = /* @__PURE__ */ jsx(MCPToolsProvider, {
|
|
9740
10583
|
autoConnectLocal,
|
|
9741
10584
|
onToolsChange,
|
|
9742
10585
|
children: t6
|
|
9743
10586
|
});
|
|
9744
|
-
$[
|
|
9745
|
-
$[
|
|
9746
|
-
$[
|
|
9747
|
-
$[
|
|
9748
|
-
} else t7 = $[
|
|
10587
|
+
$[15] = autoConnectLocal;
|
|
10588
|
+
$[16] = onToolsChange;
|
|
10589
|
+
$[17] = t6;
|
|
10590
|
+
$[18] = t7;
|
|
10591
|
+
} else t7 = $[18];
|
|
9749
10592
|
const content = t7;
|
|
9750
10593
|
let t8;
|
|
9751
|
-
if ($[
|
|
10594
|
+
if ($[19] !== content || $[20] !== excludeToolNames || $[21] !== excludeToolPrefixes || $[22] !== excludeTools || $[23] !== hasExclusions) {
|
|
9752
10595
|
t8 = hasExclusions ? /* @__PURE__ */ jsx(ToolExclusionProvider, {
|
|
9753
10596
|
exclude: excludeTools,
|
|
9754
10597
|
excludeNames: excludeToolNames,
|
|
9755
10598
|
excludePrefixes: excludeToolPrefixes,
|
|
9756
10599
|
children: content
|
|
9757
10600
|
}) : content;
|
|
9758
|
-
$[
|
|
9759
|
-
$[
|
|
9760
|
-
$[
|
|
9761
|
-
$[
|
|
9762
|
-
$[
|
|
9763
|
-
$[
|
|
9764
|
-
} else t8 = $[
|
|
10601
|
+
$[19] = content;
|
|
10602
|
+
$[20] = excludeToolNames;
|
|
10603
|
+
$[21] = excludeToolPrefixes;
|
|
10604
|
+
$[22] = excludeTools;
|
|
10605
|
+
$[23] = hasExclusions;
|
|
10606
|
+
$[24] = t8;
|
|
10607
|
+
} else t8 = $[24];
|
|
9765
10608
|
let t9;
|
|
9766
|
-
if ($[
|
|
10609
|
+
if ($[25] !== defaultMode || $[26] !== defaultOpen || $[27] !== onModeChange || $[28] !== onOpenChange || $[29] !== open || $[30] !== t8) {
|
|
9767
10610
|
t9 = /* @__PURE__ */ jsx(AgentUIProvider, {
|
|
9768
10611
|
open,
|
|
9769
10612
|
defaultOpen,
|
|
@@ -9772,16 +10615,16 @@ const AgentProvider = (t0) => {
|
|
|
9772
10615
|
onModeChange,
|
|
9773
10616
|
children: t8
|
|
9774
10617
|
});
|
|
9775
|
-
$[
|
|
9776
|
-
$[
|
|
9777
|
-
$[
|
|
9778
|
-
$[
|
|
9779
|
-
$[
|
|
9780
|
-
$[
|
|
9781
|
-
$[
|
|
9782
|
-
} else t9 = $[
|
|
10618
|
+
$[25] = defaultMode;
|
|
10619
|
+
$[26] = defaultOpen;
|
|
10620
|
+
$[27] = onModeChange;
|
|
10621
|
+
$[28] = onOpenChange;
|
|
10622
|
+
$[29] = open;
|
|
10623
|
+
$[30] = t8;
|
|
10624
|
+
$[31] = t9;
|
|
10625
|
+
} else t9 = $[31];
|
|
9783
10626
|
let t10;
|
|
9784
|
-
if ($[
|
|
10627
|
+
if ($[32] !== dashboardBaseUrl || $[33] !== docsBaseUrl || $[34] !== onAuthError || $[35] !== onClose || $[36] !== showErrorDebug || $[37] !== t9) {
|
|
9785
10628
|
t10 = /* @__PURE__ */ jsx(AuthErrorBoundary, {
|
|
9786
10629
|
dashboardBaseUrl,
|
|
9787
10630
|
docsBaseUrl,
|
|
@@ -9790,14 +10633,14 @@ const AgentProvider = (t0) => {
|
|
|
9790
10633
|
showDebug: showErrorDebug,
|
|
9791
10634
|
children: t9
|
|
9792
10635
|
});
|
|
9793
|
-
$[
|
|
9794
|
-
$[
|
|
9795
|
-
$[
|
|
9796
|
-
$[
|
|
9797
|
-
$[
|
|
9798
|
-
$[
|
|
9799
|
-
$[
|
|
9800
|
-
} else t10 = $[
|
|
10636
|
+
$[32] = dashboardBaseUrl;
|
|
10637
|
+
$[33] = docsBaseUrl;
|
|
10638
|
+
$[34] = onAuthError;
|
|
10639
|
+
$[35] = onClose;
|
|
10640
|
+
$[36] = showErrorDebug;
|
|
10641
|
+
$[37] = t9;
|
|
10642
|
+
$[38] = t10;
|
|
10643
|
+
} else t10 = $[38];
|
|
9801
10644
|
return t10;
|
|
9802
10645
|
};
|
|
9803
10646
|
|
|
@@ -10227,7 +11070,7 @@ function _temp() {
|
|
|
10227
11070
|
* - No @property declarations (not supported in shadow DOM)
|
|
10228
11071
|
* - Uses :host selector for theming (in addition to :root)
|
|
10229
11072
|
*/
|
|
10230
|
-
const WEBMCP_SHADOW_STYLES = "/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--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}}}@layer theme{:root,:host{--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-600:oklch(55.8% .288 302.321);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0,0,.2,1);--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-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--char-font-sans);--default-mono-font-family:var(--char-font-mono);--color-background:var(--char-color-background)}}@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,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-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{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}:host,:root{--char-color-background:oklch(100% 0 0);--char-color-foreground:oklch(14.1% .005 285.823);--char-color-primary:oklch(21% .006 285.885);--char-color-primary-foreground:oklch(98.5% 0 0);--char-color-muted:oklch(96.7% .001 286.375);--char-color-muted-foreground:oklch(55.2% .016 285.938);--char-color-border:oklch(92% .004 286.32);--char-color-success:oklch(70% .2 145);--char-color-warning:oklch(75% .15 85);--char-color-error:oklch(65% .25 25);--char-color-card:var(--char-color-background);--char-color-card-foreground:var(--char-color-foreground);--char-color-popover:var(--char-color-background);--char-color-popover-foreground:var(--char-color-foreground);--char-color-secondary:var(--char-color-muted);--char-color-secondary-foreground:var(--char-color-foreground);--char-color-accent:var(--char-color-muted);--char-color-accent-foreground:var(--char-color-foreground);--char-color-destructive:var(--char-color-error);--char-color-destructive-foreground:var(--char-color-primary-foreground);--char-color-input:var(--char-color-border);--char-color-ring:var(--char-color-muted-foreground);--char-user-bubble-bg:var(--char-color-muted);--char-user-bubble-text:var(--char-color-foreground);--char-assistant-bubble-bg:transparent;--char-assistant-bubble-text:var(--char-color-foreground);--char-composer-bg:var(--char-color-background);--char-composer-border:var(--char-color-input);--char-composer-text:var(--char-color-foreground);--char-composer-placeholder:var(--char-color-muted-foreground);--char-composer-button-bg:var(--char-color-primary);--char-composer-button-text:var(--char-color-primary-foreground);--char-tool-bg:var(--char-color-muted);--char-tool-border:var(--char-color-border);--char-tool-text:var(--char-color-foreground);--char-tool-header-bg:var(--char-color-muted);--char-tool-approve-bg:var(--char-color-primary);--char-tool-approve-text:var(--char-color-primary-foreground);--char-tool-deny-bg:transparent;--char-tool-deny-text:var(--char-color-muted-foreground);--char-code-bg:oklch(14.1% .005 285.823);--char-code-text:oklch(98.5% 0 0);--char-code-header-bg:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){:host,:root{--char-code-header-bg:color-mix(in oklch,var(--char-color-muted-foreground),transparent 85%)}}:host,:root{--char-radius:.75rem;--char-radius-sm:calc(var(--char-radius) - 4px);--char-radius-md:calc(var(--char-radius) - 2px);--char-radius-lg:var(--char-radius);--char-radius-xl:calc(var(--char-radius) + 4px);--char-radius-full:9999px;--char-spacing-unit:.25rem;--char-font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--char-font-mono:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;--char-font-size-xs:.6875rem;--char-font-size-sm:.75rem;--char-font-size-base:.875rem;--char-font-size-lg:1rem;--char-duration-fast:.15s;--char-duration-normal:.25s;--char-duration-slow:.4s;--char-easing-default:cubic-bezier(.4,0,.2,1);--char-easing-spring:cubic-bezier(.34,1.56,.64,1);--char-z-base:0;--char-z-content:10;--char-z-overlay:50;--char-z-max:2147480000;--char-shadow-sm:0 1px 2px #0000000d;--char-shadow-md:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--char-shadow-lg:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--char-blur-sm:8px;--char-blur-md:12px;--char-blur-lg:20px}:host(.dark),.dark{--char-color-background:oklch(14.1% .005 285.823);--char-color-foreground:oklch(98.5% 0 0);--char-color-primary:oklch(92% .004 286.32);--char-color-primary-foreground:oklch(21% .006 285.885);--char-color-muted:oklch(27.4% .006 286.033);--char-color-muted-foreground:oklch(70.5% .015 286.067);--char-color-border:oklch(100% 0 0/.1);--char-color-input:oklch(100% 0 0/.15);--char-color-ring:oklch(55.2% .016 285.938);--char-color-success:oklch(75% .18 145);--char-color-warning:oklch(80% .14 85);--char-color-error:oklch(70% .22 25)}*{border-color:var(--char-color-border);outline-color:var(--char-color-ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklch,var(--char-color-ring),transparent 50%)}}}@layer components{.char-animate-fade-in-up{opacity:0;animation:.5s ease-out forwards char-fade-in-up}.char-animate-gradient-shift{background-size:200% 200%;animation:20s ease-in-out infinite char-gradient-shift}.char-animate-float-slow{animation:20s ease-in-out infinite char-float}.char-animate-float-delayed{animation:25s ease-in-out 5s infinite char-float-delayed}.char-animate-shimmer{animation:2s linear infinite char-shimmer}.char-animate-pulse-success{animation:.6s ease-out char-pulse-success}.char-animate-shake{animation:.3s ease-out char-shake}.char-animate-pulse-glow{animation:2s ease-in-out infinite char-pulse-glow}.char-animate-gradient-x{animation:8s ease-in-out infinite char-gradient-x}.char-transition-spring{transition:all var(--char-duration-slow)var(--char-easing-spring)}.char-transition-smooth{transition:all var(--char-duration-normal)var(--char-easing-default)}.char-app-shell{z-index:var(--char-z-base);background-color:var(--char-color-background);background-image:radial-gradient(80% 60% at -10% -10%,oklch(82% .15 270/.15),#0000),radial-gradient(60% 50% at 110% 10%,oklch(85% .1 220/.12),#0000),radial-gradient(50% 45% at 50% 120%,oklch(95% .02 250/.08),#0000);position:relative}.dark .char-app-shell{background-image:radial-gradient(80% 60% at -10% -10%,oklch(55% .14 270/.25),#0000),radial-gradient(60% 50% at 110% 15%,oklch(60% .12 220/.22),#0000),radial-gradient(50% 45% at 50% 120%,oklch(35% .04 250/.16),#0000)}.char-app-shell:before,.char-app-shell:after{content:\"\";pointer-events:none;border-radius:var(--char-radius-full);filter:blur(32px);opacity:.6;z-index:-1;position:absolute;inset:auto}.char-app-shell:before{background:radial-gradient(60% 60% at 40% 40%,oklch(80% .12 270/.3),#0000);width:260px;height:260px;top:-60px;left:-80px}.char-app-shell:after{background:radial-gradient(60% 60% at 60% 60%,oklch(84% .1 220/.25),#0000);width:300px;height:300px;bottom:-80px;right:-60px}.char-toolbar-surface{border-top:1px solid var(--char-color-border);background:linear-gradient(to right,var(--char-color-background),var(--char-color-background),var(--char-color-background))}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface{background:linear-gradient(to right,var(--char-color-background),color-mix(in oklch,var(--char-color-background),transparent 5%),var(--char-color-background))}}.char-toolbar-surface{-webkit-backdrop-filter:blur(var(--char-blur-md));backdrop-filter:blur(var(--char-blur-md))}@supports ((-webkit-backdrop-filter:blur(12px)) or (backdrop-filter:blur(12px))){.char-toolbar-surface{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface{background:color-mix(in oklch,var(--char-color-background),transparent 20%)}}}.char-toolbar-surface-top{border-bottom:1px solid var(--char-color-border);background:linear-gradient(to right,var(--char-color-background),var(--char-color-background),var(--char-color-background))}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface-top{background:linear-gradient(to right,var(--char-color-background),color-mix(in oklch,var(--char-color-background),transparent 5%),var(--char-color-background))}}.char-toolbar-surface-top{-webkit-backdrop-filter:blur(var(--char-blur-md));backdrop-filter:blur(var(--char-blur-md))}@supports ((-webkit-backdrop-filter:blur(12px)) or (backdrop-filter:blur(12px))){.char-toolbar-surface-top{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface-top{background:color-mix(in oklch,var(--char-color-background),transparent 20%)}}}.char-toolbar-inner{justify-content:space-between;align-items:center;padding:.5rem .75rem;display:flex}.char-toolbar-card{background:var(--char-color-card);justify-content:space-between;align-items:center;gap:.5rem;display:flex}@supports (color:color-mix(in lab, red, red)){.char-toolbar-card{background:color-mix(in oklch,var(--char-color-card),transparent 60%)}}.char-toolbar-card{border:1px solid var(--char-color-border);border-radius:var(--char-radius-lg);padding:.5rem .75rem}.char-toolbar-group{align-items:center;gap:.25rem;display:flex}.char-btn-toolbar-primary{border-radius:var(--char-radius-lg);background:linear-gradient(to right,var(--char-color-primary),var(--char-color-primary));align-items:center;gap:.5rem;height:2.25rem;padding:0 .75rem;display:flex}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-primary{background:linear-gradient(to right,color-mix(in oklch,var(--char-color-primary),transparent 95%),color-mix(in oklch,var(--char-color-primary),transparent 90%))}}.char-btn-toolbar-primary{border:1px solid var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-primary{border:1px solid color-mix(in oklch,var(--char-color-primary),transparent 80%)}}.char-btn-toolbar-primary{transition:all var(--char-duration-fast)}.char-btn-toolbar-primary:hover{background:linear-gradient(to right,var(--char-color-primary),var(--char-color-primary))}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-primary:hover{background:linear-gradient(to right,color-mix(in oklch,var(--char-color-primary),transparent 90%),color-mix(in oklch,var(--char-color-primary),transparent 80%))}}.char-btn-toolbar-icon-primary{border-radius:var(--char-radius-full);background:linear-gradient(to bottom right,var(--char-color-primary),var(--char-color-primary));width:2rem;height:2rem;padding:0}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-primary{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-primary),transparent 90%),color-mix(in oklch,var(--char-color-primary),transparent 80%))}}.char-btn-toolbar-icon-primary{border:1px solid var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-primary{border:1px solid color-mix(in oklch,var(--char-color-primary),transparent 70%)}}.char-btn-toolbar-icon-primary{box-shadow:var(--char-shadow-sm);transition:all var(--char-duration-fast)}.char-btn-toolbar-icon-primary:hover{background:linear-gradient(to bottom right,var(--char-color-primary),var(--char-color-primary))}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-primary:hover{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-primary),transparent 80%),color-mix(in oklch,var(--char-color-primary),transparent 70%))}}.char-btn-toolbar-icon-secondary{border-radius:var(--char-radius-full);background:linear-gradient(to bottom right,var(--char-color-secondary),var(--char-color-secondary));width:2rem;height:2rem;padding:0}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-secondary{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-secondary),transparent 90%),color-mix(in oklch,var(--char-color-secondary),transparent 80%))}}.char-btn-toolbar-icon-secondary{border:1px solid var(--char-color-secondary)}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-secondary{border:1px solid color-mix(in oklch,var(--char-color-secondary),transparent 70%)}}.char-btn-toolbar-icon-secondary{box-shadow:var(--char-shadow-sm);transition:all var(--char-duration-fast)}.char-btn-toolbar-icon-secondary:hover{background:linear-gradient(to bottom right,var(--char-color-secondary),var(--char-color-secondary))}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-secondary:hover{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-secondary),transparent 80%),color-mix(in oklch,var(--char-color-secondary),transparent 70%))}}.char-badge-compact{height:1.25rem;padding:0 .5rem;font-size:10px}.char-badge-mini{height:1rem;padding:0 .375rem;font-size:10px}.char-shimmer{background:linear-gradient(90deg,transparent,var(--char-color-foreground),transparent);animation:3s linear infinite char-shimmer}@supports (color:color-mix(in lab, red, red)){.char-shimmer{background:linear-gradient(90deg,transparent,color-mix(in oklch,var(--char-color-foreground),transparent 90%),transparent)}}.char-shimmer{background-size:1000px 100%}.char-gradient-text{background:linear-gradient(to right,var(--char-color-foreground),var(--char-color-foreground))}@supports (color:color-mix(in lab, red, red)){.char-gradient-text{background:linear-gradient(to right,var(--char-color-foreground),color-mix(in oklch,var(--char-color-foreground),transparent 30%))}}.char-gradient-text{-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.char-glass{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass{background:color-mix(in oklch,var(--char-color-background),transparent 50%)}}.char-glass{-webkit-backdrop-filter:blur(var(--char-blur-md));backdrop-filter:blur(var(--char-blur-md));border:1px solid var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.char-glass{border:1px solid color-mix(in oklch,var(--char-color-border),transparent 50%)}}.char-tool-card{transition:all .3s ease-out}.char-tool-card:hover{box-shadow:var(--char-shadow-lg);transform:scale(1.02)}.char-tool-border-calling{position:relative;overflow:hidden}.char-tool-border-calling:before{content:\"\";background:conic-gradient(from 0deg,transparent 0deg,transparent 60deg,var(--char-color-primary)90deg,var(--char-color-primary)120deg,var(--char-color-primary)150deg,transparent 180deg,transparent 360deg);position:absolute;inset:-50%}@supports (color:color-mix(in lab, red, red)){.char-tool-border-calling:before{background:conic-gradient(from 0deg,transparent 0deg,transparent 60deg,color-mix(in oklch,var(--char-color-primary),transparent 50%)90deg,color-mix(in oklch,var(--char-color-primary),transparent 30%)120deg,color-mix(in oklch,var(--char-color-primary),transparent 50%)150deg,transparent 180deg,transparent 360deg)}}.char-tool-border-calling:before{animation:1.5s linear infinite char-border-rotate}.char-tool-border-success{background:var(--char-color-success)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-success{background:color-mix(in oklch,var(--char-color-success),transparent 60%)}}.char-tool-border-success{box-shadow:0 0 12px var(--char-color-success),inset 0 0 8px var(--char-color-success)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-success{box-shadow:0 0 12px color-mix(in oklch,var(--char-color-success),transparent 70%),inset 0 0 8px color-mix(in oklch,var(--char-color-success),transparent 90%)}}.char-tool-border-error{background:var(--char-color-error)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-error{background:color-mix(in oklch,var(--char-color-error),transparent 60%)}}.char-tool-border-error{box-shadow:0 0 12px var(--char-color-error),inset 0 0 8px var(--char-color-error)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-error{box-shadow:0 0 12px color-mix(in oklch,var(--char-color-error),transparent 70%),inset 0 0 8px color-mix(in oklch,var(--char-color-error),transparent 90%)}}.char-scrollbar-thin{scrollbar-width:thin;scrollbar-color:var(--char-color-primary)transparent}@supports (color:color-mix(in lab, red, red)){.char-scrollbar-thin{scrollbar-color:color-mix(in oklch,var(--char-color-primary),transparent 80%)transparent}}.char-scrollbar-thin::-webkit-scrollbar{width:6px;height:6px}.char-scrollbar-thin::-webkit-scrollbar-track{background:0 0}.char-scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-scrollbar-thin::-webkit-scrollbar-thumb{background-color:color-mix(in oklch,var(--char-color-primary),transparent 80%)}}.char-scrollbar-thin::-webkit-scrollbar-thumb{border-radius:3px}.char-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:color-mix(in oklch,var(--char-color-primary),transparent 70%)}}.char-glass-pill{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill{background:color-mix(in oklch,var(--char-color-background),transparent 15%)}}.char-glass-pill{-webkit-backdrop-filter:blur(var(--char-blur-lg))saturate(150%);box-shadow:0 4px 16px var(--char-color-foreground),inset 0 .5px 0 var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill{box-shadow:0 4px 16px color-mix(in oklch,var(--char-color-foreground),transparent 80%),inset 0 .5px 0 color-mix(in oklch,var(--char-color-foreground),transparent 92%)}}.char-glass-pill{border:1px solid var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill{border:1px solid color-mix(in oklch,var(--char-color-foreground),transparent 94%)}}.char-glass-pill:before{content:\"\";border-radius:inherit;background:linear-gradient(180deg,var(--char-color-foreground)0%,transparent 40%);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.char-glass-pill:before{background:linear-gradient(180deg,color-mix(in oklch,var(--char-color-foreground),transparent 96%)0%,transparent 40%)}}.char-glass-pill:before{pointer-events:none;z-index:1}.char-glass-pill-collapsed{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-collapsed{background:color-mix(in oklch,var(--char-color-background),transparent 15%)}}.char-glass-pill-collapsed{-webkit-backdrop-filter:blur(var(--char-blur-lg))saturate(150%);box-shadow:0 2px 8px var(--char-color-foreground),inset 0 .5px 0 var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-collapsed{box-shadow:0 2px 8px color-mix(in oklch,var(--char-color-foreground),transparent 80%),inset 0 .5px 0 color-mix(in oklch,var(--char-color-foreground),transparent 92%)}}.char-glass-pill-collapsed{border:1px solid var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-collapsed{border:1px solid color-mix(in oklch,var(--char-color-foreground),transparent 94%)}}.char-glass-pill-hovered{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-hovered{background:color-mix(in oklch,var(--char-color-background),transparent 20%)}}.char-glass-pill-hovered{-webkit-backdrop-filter:blur(16px)saturate(140%);box-shadow:0 2px 12px var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-hovered{box-shadow:0 2px 12px color-mix(in oklch,var(--char-color-foreground),transparent 82%)}}.char-glass-pill-hovered{border:1px solid var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-hovered{border:1px solid color-mix(in oklch,var(--char-color-foreground),transparent 94%)}}.char-glass-shimmer{background:linear-gradient(90deg,var(--char-color-foreground)0%,var(--char-color-foreground)50%,var(--char-color-foreground)100%)}@supports (color:color-mix(in lab, red, red)){.char-glass-shimmer{background:linear-gradient(90deg,color-mix(in oklch,var(--char-color-foreground),transparent 92%)0%,color-mix(in oklch,var(--char-color-foreground),transparent 85%)50%,color-mix(in oklch,var(--char-color-foreground),transparent 92%)100%)}}.char-glass-shimmer{background-size:200% 100%;animation:4s ease-in-out infinite char-glass-shimmer}.char-scroll-touch{-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.char-scroll-fade-y{-webkit-mask-image:linear-gradient(#0000,#000 8px calc(100% - 8px),#0000);mask-image:linear-gradient(#0000,#000 8px calc(100% - 8px),#0000)}.char-pb-safe{padding-bottom:env(safe-area-inset-bottom,0px)}.char-mb-safe{margin-bottom:env(safe-area-inset-bottom,0px)}.char-bottom-safe{bottom:max(1rem,env(safe-area-inset-bottom,0px))}@supports (padding-bottom:env(safe-area-inset-bottom)){.char-pill-safe-bottom{padding-bottom:calc(env(safe-area-inset-bottom,0px) + .5rem)}}}@layer utilities{.\\@container\\/card-header{container:card-header/inline-size}.\\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-\\[1px\\]{inset:-1px}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1{top:calc(var(--spacing)*-1)}.-top-1\\.5{top:calc(var(--spacing)*-1.5)}.-top-12{top:calc(var(--spacing)*-12)}.top-0{top:calc(var(--spacing)*0)}.top-1\\.5{top:calc(var(--spacing)*1.5)}.top-1\\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\\[50\\%\\]{top:50%}.-right-0\\.5{right:calc(var(--spacing)*-.5)}.-right-1{right:calc(var(--spacing)*-1)}.-right-1\\.5{right:calc(var(--spacing)*-1.5)}.right-0{right:calc(var(--spacing)*0)}.right-1\\.5{right:calc(var(--spacing)*1.5)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.-bottom-0\\.5{bottom:calc(var(--spacing)*-.5)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-\\[50\\%\\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-1{margin:calc(var(--spacing)*-1)}.m-0{margin:calc(var(--spacing)*0)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-3{margin-block:calc(var(--spacing)*3)}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.my-auto{margin-block:auto}.-mt-1{margin-top:calc(var(--spacing)*-1)}.mt-0\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-auto{margin-top:auto}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\\.5{margin-right:calc(var(--spacing)*1.5)}.-mb-1{margin-bottom:calc(var(--spacing)*-1)}.-mb-2{margin-bottom:calc(var(--spacing)*-2)}.mb-0\\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-0\\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.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-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-14{width:calc(var(--spacing)*14);height:calc(var(--spacing)*14)}.size-\\[34px\\]{width:34px;height:34px}.size-full{width:100%;height:100%}.h-1{height:calc(var(--spacing)*1)}.h-1\\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-4\\.5{height:calc(var(--spacing)*4.5)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-16{height:calc(var(--spacing)*16)}.h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.max-h-20{max-height:calc(var(--spacing)*20)}.max-h-24{max-height:calc(var(--spacing)*24)}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-\\[30vh\\]{max-height:30vh}.max-h-\\[80dvh\\]{max-height:80dvh}.max-h-\\[80vh\\]{max-height:80vh}.max-h-\\[90vh\\]{max-height:90vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-7{min-height:calc(var(--spacing)*7)}.min-h-11{min-height:calc(var(--spacing)*11)}.min-h-14{min-height:calc(var(--spacing)*14)}.min-h-40{min-height:calc(var(--spacing)*40)}.min-h-screen{min-height:100vh}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-1\\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-2\\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\\.5{width:calc(var(--spacing)*3.5)}.w-3\\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-4\\.5{width:calc(var(--spacing)*4.5)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-11{width:calc(var(--spacing)*11)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\\(--thread-max-width\\){max-width:var(--thread-max-width)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-24{max-width:calc(var(--spacing)*24)}.max-w-32{max-width:calc(var(--spacing)*32)}.max-w-\\[75\\%\\]{max-width:75%}.max-w-\\[100px\\]{max-width:100px}.max-w-\\[140px\\]{max-width:140px}.max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-4{min-width:calc(var(--spacing)*4)}.min-w-7{min-width:calc(var(--spacing)*7)}.min-w-11{min-width:calc(var(--spacing)*11)}.min-w-\\[8rem\\]{min-width:8rem}.min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\\[-50\\%\\]{--tw-translate-x:-50%;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-\\[-50\\%\\]{--tw-translate-y:-50%;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)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-45{rotate:45deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform-gpu{transform:translateZ(0)var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-in{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)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.scroll-m-20{scroll-margin:calc(var(--spacing)*20)}.scroll-my-1{scroll-margin-block:calc(var(--spacing)*1)}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\\[minmax\\(72px\\,1fr\\)_auto\\]{grid-template-columns:minmax(72px,1fr) auto}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.grid-rows-\\[auto_auto\\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-end{justify-items:end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.gap-y-2{row-gap:calc(var(--spacing)*2)}.self-center{align-self:center}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\[2px\\]{border-radius:2px}.rounded-\\[14px\\]{border-radius:14px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--char-radius-lg)}.rounded-md{border-radius:var(--char-radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--char-radius-sm)}.rounded-xl{border-radius:var(--char-radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-lg{border-top-left-radius:var(--char-radius-lg);border-top-right-radius:var(--char-radius-lg)}.rounded-t-none\\!{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-b-lg{border-bottom-right-radius:var(--char-radius-lg);border-bottom-left-radius:var(--char-radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-amber-500\\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\\/30{border-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.border-amber-500\\/50{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.border-amber-500\\/50{border-color:color-mix(in oklab,var(--color-amber-500)50%,transparent)}}.border-blue-500\\/20{border-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.border-blue-500\\/20{border-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.border-blue-500\\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.border-blue-500\\/30{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.border-border,.border-border\\/50{border-color:var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab,var(--char-color-border)50%,transparent)}}.border-composer-border{border-color:var(--char-composer-border)}.border-destructive,.border-destructive\\/20{border-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\\/20{border-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.border-emerald-500\\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\\/20{border-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.border-foreground\\/20{border-color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/20{border-color:color-mix(in oklab,var(--char-color-foreground)20%,transparent)}}.border-gray-200{border-color:var(--color-gray-200)}.border-input{border-color:var(--char-color-input)}.border-muted-foreground\\/20{border-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\\/20{border-color:color-mix(in oklab,var(--char-color-muted-foreground)20%,transparent)}}.border-muted-foreground\\/30{border-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\\/30{border-color:color-mix(in oklab,var(--char-color-muted-foreground)30%,transparent)}}.border-orange-500\\/20{border-color:#fe6e0033}@supports (color:color-mix(in lab, red, red)){.border-orange-500\\/20{border-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.border-primary\\/50{border-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\\/50{border-color:color-mix(in oklab,var(--char-color-primary)50%,transparent)}}.border-red-500\\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.border-red-500\\/20{border-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.border-transparent{border-color:#0000}.border-white\\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.border-white\\/5{border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.border-white\\/8{border-color:#ffffff14}@supports (color:color-mix(in lab, red, red)){.border-white\\/8{border-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.border-white\\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-200\\/80{border-color:#e4e4e7cc}@supports (color:color-mix(in lab, red, red)){.border-zinc-200\\/80{border-color:color-mix(in oklab,var(--color-zinc-200)80%,transparent)}}.border-zinc-600{border-color:var(--color-zinc-600)}.border-t-muted-foreground\\/60{border-top-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.border-t-muted-foreground\\/60{border-top-color:color-mix(in oklab,var(--char-color-muted-foreground)60%,transparent)}}.bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_20\\%\\,transparent\\)\\]{background-color:rgb(var(--background))}@supports (color:color-mix(in lab, red, red)){.bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_20\\%\\,transparent\\)\\]{background-color:color-mix(in oklab,rgb(var(--background))20%,transparent)}}.bg-accent{background-color:var(--char-color-accent)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/5{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\\/20{background-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-background,.bg-background\\/80{background-color:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.bg-background\\/80{background-color:color-mix(in oklab,var(--char-color-background)80%,transparent)}}.bg-black\\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\/5{background-color:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.bg-blue-500\\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\\/70{background-color:#3080ffb3}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\/70{background-color:color-mix(in oklab,var(--color-blue-500)70%,transparent)}}.bg-border{background-color:var(--char-color-border)}.bg-card{background-color:var(--char-color-card)}.bg-code-bg{background-color:var(--char-code-bg)}.bg-code-header-bg{background-color:var(--char-code-header-bg)}.bg-composer-bg{background-color:var(--char-composer-bg)}.bg-destructive,.bg-destructive\\/10{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/10{background-color:color-mix(in oklab,var(--char-color-destructive)10%,transparent)}}.bg-emerald-500\\/6{background-color:#00bb7f0f}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/6{background-color:color-mix(in oklab,var(--color-emerald-500)6%,transparent)}}.bg-emerald-500\\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/10{background-color:color-mix(in oklab,var(--color-emerald-500)10%,transparent)}}.bg-foreground{background-color:var(--char-color-foreground)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-400\\/60{background-color:#05df7299}@supports (color:color-mix(in lab, red, red)){.bg-green-400\\/60{background-color:color-mix(in oklab,var(--color-green-400)60%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\\/10{background-color:#00c7581a}@supports (color:color-mix(in lab, red, red)){.bg-green-500\\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-500\\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-muted{background-color:var(--char-color-muted)}.bg-muted-foreground\\/40{background-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\/40{background-color:color-mix(in oklab,var(--char-color-muted-foreground)40%,transparent)}}.bg-muted\\/5{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/5{background-color:color-mix(in oklab,var(--char-color-muted)5%,transparent)}}.bg-muted\\/30{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/30{background-color:color-mix(in oklab,var(--char-color-muted)30%,transparent)}}.bg-muted\\/40{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/40{background-color:color-mix(in oklab,var(--char-color-muted)40%,transparent)}}.bg-muted\\/50{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/50{background-color:color-mix(in oklab,var(--char-color-muted)50%,transparent)}}.bg-orange-500\\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab, red, red)){.bg-orange-500\\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.bg-popover{background-color:var(--char-color-popover)}.bg-primary,.bg-primary\\/10{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/10{background-color:color-mix(in oklab,var(--char-color-primary)10%,transparent)}}.bg-primary\\/90{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/90{background-color:color-mix(in oklab,var(--char-color-primary)90%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\/5{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-500\\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-secondary{background-color:var(--char-color-secondary)}.bg-slate-500\\/10{background-color:#62748e1a}@supports (color:color-mix(in lab, red, red)){.bg-slate-500\\/10{background-color:color-mix(in oklab,var(--color-slate-500)10%,transparent)}}.bg-transparent{background-color:#0000}.bg-user-bubble-bg{background-color:var(--char-user-bubble-bg)}.bg-white{background-color:var(--color-white)}.bg-white\\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.bg-white\\/5{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.bg-white\\/8{background-color:#ffffff14}@supports (color:color-mix(in lab, red, red)){.bg-white\\/8{background-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.bg-white\\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.bg-white\\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\\/60{background-color:color-mix(in oklab,var(--color-white)60%,transparent)}}.bg-white\\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.bg-white\\/90{background-color:color-mix(in oklab,var(--color-white)90%,transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-700\\/50{background-color:#3f3f4680}@supports (color:color-mix(in lab, red, red)){.bg-zinc-700\\/50{background-color:color-mix(in oklab,var(--color-zinc-700)50%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\\[linear-gradient\\(to_top\\,var\\(--color-background\\)\\,transparent\\)\\]{background-image:linear-gradient(to top,var(--color-background),transparent)}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.fill-current{fill:currentColor}.fill-foreground{fill:var(--char-color-foreground)}.stroke-\\[1\\.5px\\]{stroke-width:1.5px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-0\\.5{padding-top:calc(var(--spacing)*.5)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\\.5{padding-top:calc(var(--spacing)*1.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-14{padding-top:calc(var(--spacing)*14)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-mono{font-family:var(--char-font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-\\[15px\\]{font-size:15px}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-\\[21px\\]{--tw-leading:21px;line-height:21px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.wrap-break-word{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-assistant-bubble-text{color:var(--char-assistant-bubble-text)}.text-background{color:var(--char-color-background)}.text-blue-400{color:var(--color-blue-400)}.text-blue-400\\/60{color:#54a2ff99}@supports (color:color-mix(in lab, red, red)){.text-blue-400\\/60{color:color-mix(in oklab,var(--color-blue-400)60%,transparent)}}.text-blue-600{color:var(--color-blue-600)}.text-card-foreground{color:var(--char-color-card-foreground)}.text-code-text{color:var(--char-code-text)}.text-composer-text{color:var(--char-composer-text)}.text-destructive,.text-destructive\\/70{color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.text-destructive\\/70{color:color-mix(in oklab,var(--char-color-destructive)70%,transparent)}}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground,.text-foreground\\/70{color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\\/70{color:color-mix(in oklab,var(--char-color-foreground)70%,transparent)}}.text-foreground\\/80{color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\\/80{color:color-mix(in oklab,var(--char-color-foreground)80%,transparent)}}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground,.text-muted-foreground\\/70{color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\\/70{color:color-mix(in oklab,var(--char-color-muted-foreground)70%,transparent)}}.text-muted-foreground\\/80{color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\\/80{color:color-mix(in oklab,var(--char-color-muted-foreground)80%,transparent)}}.text-orange-600{color:var(--color-orange-600)}.text-popover-foreground{color:var(--char-color-popover-foreground)}.text-primary{color:var(--char-color-primary)}.text-primary-foreground{color:var(--char-color-primary-foreground)}.text-primary\\/80{color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.text-primary\\/80{color:color-mix(in oklab,var(--char-color-primary)80%,transparent)}}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--char-color-secondary-foreground)}.text-slate-600{color:var(--color-slate-600)}.text-slate-900{color:var(--color-slate-900)}.text-user-bubble-text{color:var(--char-user-bubble-text)}.text-white{color:var(--color-white)}.text-white\\/30{color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.text-white\\/30{color:color-mix(in oklab,var(--color-white)30%,transparent)}}.text-white\\/40{color:#fff6}@supports (color:color-mix(in lab, red, red)){.text-white\\/40{color:color-mix(in oklab,var(--color-white)40%,transparent)}}.text-white\\/50{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.text-white\\/50{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.text-white\\/60{color:#fff9}@supports (color:color-mix(in lab, red, red)){.text-white\\/60{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.text-white\\/70{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.text-white\\/70{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.text-white\\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-white\\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\\/90{color:color-mix(in oklab,var(--color-white)90%,transparent)}}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-700{color:var(--color-zinc-700)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-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)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.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)}.\\[box-shadow\\:inset_0_1px_2px_0_rgba\\(255\\,255\\,255\\,0\\.15\\)\\]{box-shadow:inset 0 1px 2px #ffffff26}.shadow-black\\/10{--tw-shadow-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.shadow-black\\/10{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)10%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-black\\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab, red, red)){.shadow-black\\/20{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)20%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-amber-500\\/30{--tw-ring-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.ring-amber-500\\/30{--tw-ring-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.ring-blue-500\\/25{--tw-ring-color:#3080ff40}@supports (color:color-mix(in lab, red, red)){.ring-blue-500\\/25{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)25%,transparent)}}.ring-border\\/20{--tw-ring-color:var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.ring-border\\/20{--tw-ring-color:color-mix(in oklab,var(--char-color-border)20%,transparent)}}.ring-emerald-400\\/30{--tw-ring-color:#00d2944d}@supports (color:color-mix(in lab, red, red)){.ring-emerald-400\\/30{--tw-ring-color:color-mix(in oklab,var(--color-emerald-400)30%,transparent)}}.ring-red-500\\/30{--tw-ring-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.ring-red-500\\/30{--tw-ring-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--char-color-background)}.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}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,opacity\\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-75{transition-delay:75ms}.duration-\\(--animation-duration\\){--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.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-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-transform{will-change:transform}.delay-75{--tw-animation-delay:75ms;animation-delay:75ms}.fade-in-0{--tw-enter-opacity:0}.fill-mode-both{--tw-animation-fill-mode:both;animation-fill-mode:both}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.fade-in{--tw-enter-opacity:0}.paused{animation-play-state:paused}.running{animation-play-state:running}.slide-in-from-bottom-1{--tw-enter-translate-y:calc(1*var(--spacing))}.slide-in-from-bottom-2{--tw-enter-translate-y:calc(2*var(--spacing))}@media (hover:hover){.group-hover\\:scale-100:is(:where(.group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:animate-out:is(:where(.group\\/collapsible-content)[data-state=closed] *){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)}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:duration-\\(--animation-duration\\):is(:where(.group\\/collapsible-content)[data-state=closed] *){--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:fade-out-0:is(:where(.group\\/collapsible-content)[data-state=closed] *){--tw-exit-opacity:0}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:slide-out-to-top-4:is(:where(.group\\/collapsible-content)[data-state=closed] *){--tw-exit-translate-y:calc(4*var(--spacing)*-1)}.group-data-\\[state\\=closed\\]\\/trigger\\:-rotate-90:is(:where(.group\\/trigger)[data-state=closed] *){rotate:-90deg}.group-data-\\[state\\=open\\]\\/collapsible-content\\:animate-in:is(:where(.group\\/collapsible-content)[data-state=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)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:animate-out:is(:where(.group\\/collapsible-content)[data-state=open] *){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)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:delay-\\[calc\\(var\\(--animation-duration\\)\\*0\\.75\\)\\]:is(:where(.group\\/collapsible-content)[data-state=open] *){transition-delay:calc(var(--animation-duration)*.75)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:duration-\\(--animation-duration\\):is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:delay-\\[calc\\(var\\(--animation-duration\\)\\*0\\.75\\)\\]:is(:where(.group\\/collapsible-content)[data-state=open] *){animation-delay:calc(var(--animation-duration)*.75);--tw-animation-delay:calc(var(--animation-duration)*.75)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:fade-in-0:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-enter-opacity:0}.group-data-\\[state\\=open\\]\\/collapsible-content\\:fade-out-0:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-exit-opacity:0}.group-data-\\[state\\=open\\]\\/collapsible-content\\:fill-mode-forwards:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-animation-fill-mode:forwards;animation-fill-mode:forwards}.group-data-\\[state\\=open\\]\\/collapsible-content\\:slide-in-from-top-4:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-enter-translate-y:calc(4*var(--spacing)*-1)}.group-data-\\[state\\=open\\]\\/trigger\\:rotate-0:is(:where(.group\\/trigger)[data-state=open] *){rotate:none}.selection\\:bg-primary ::selection{background-color:var(--char-color-primary)}.selection\\:bg-primary::selection{background-color:var(--char-color-primary)}.selection\\:text-primary-foreground ::selection{color:var(--char-color-primary-foreground)}.selection\\:text-primary-foreground::selection{color:var(--char-color-primary-foreground)}.file\\:inline-flex::file-selector-button{display:inline-flex}.file\\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--char-color-foreground)}.placeholder\\:text-composer-placeholder::placeholder{color:var(--char-composer-placeholder)}.placeholder\\:text-muted-foreground::placeholder{color:var(--char-color-muted-foreground)}.placeholder\\:text-white\\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-white\\/40::placeholder{color:color-mix(in oklab,var(--color-white)40%,transparent)}}.first\\:mt-0:first-child{margin-top:calc(var(--spacing)*0)}.first\\:rounded-tl-lg:first-child{border-top-left-radius:var(--char-radius-lg)}.first\\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.last\\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\\:rounded-tr-lg:last-child{border-top-right-radius:var(--char-radius-lg)}.last\\:border-r:last-child{border-right-style:var(--tw-border-style);border-right-width:1px}.empty\\:hidden:empty{display:none}.focus-within\\:border-white\\/15:focus-within{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.focus-within\\:border-white\\/15:focus-within{border-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.focus-within\\:bg-white\\/10:focus-within{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.focus-within\\:bg-white\\/10:focus-within{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (hover:hover){.hover\\:border-amber-500:hover{border-color:var(--color-amber-500)}.hover\\:border-border:hover{border-color:var(--char-color-border)}.hover\\:border-red-500\\/50:hover{border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.hover\\:border-red-500\\/50:hover{border-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.hover\\:border-white\\/20:hover{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\\:border-white\\/20:hover{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_30\\%\\,transparent\\)\\]:hover{background-color:rgb(var(--background))}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_30\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklab,rgb(var(--background))30%,transparent)}}.hover\\:bg-accent:hover,.hover\\:bg-accent\\/50:hover{background-color:var(--char-color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/50:hover{background-color:color-mix(in oklab,var(--char-color-accent)50%,transparent)}}.hover\\:bg-amber-500\\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-amber-500\\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.hover\\:bg-amber-500\\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-amber-500\\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.hover\\:bg-amber-500\\/30:hover{background-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-amber-500\\/30:hover{background-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.hover\\:bg-blue-500\\/20:hover{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-blue-500\\/20:hover{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.hover\\:bg-destructive\\/15:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/15:hover{background-color:color-mix(in oklab,var(--char-color-destructive)15%,transparent)}}.hover\\:bg-destructive\\/20:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.hover\\:bg-destructive\\/90:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--char-color-destructive)90%,transparent)}}.hover\\:bg-emerald-500\\/5:hover{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-emerald-500\\/5:hover{background-color:color-mix(in oklab,var(--color-emerald-500)5%,transparent)}}.hover\\:bg-green-500\\/30:hover{background-color:#00c7584d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-green-500\\/30:hover{background-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.hover\\:bg-muted:hover{background-color:var(--char-color-muted)}.hover\\:bg-muted-foreground\\/15:hover{background-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted-foreground\\/15:hover{background-color:color-mix(in oklab,var(--char-color-muted-foreground)15%,transparent)}}.hover\\:bg-muted\\/50:hover{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab,var(--char-color-muted)50%,transparent)}}.hover\\:bg-muted\\/60:hover{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/60:hover{background-color:color-mix(in oklab,var(--char-color-muted)60%,transparent)}}.hover\\:bg-muted\\/70:hover{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/70:hover{background-color:color-mix(in oklab,var(--char-color-muted)70%,transparent)}}.hover\\:bg-orange-500\\/20:hover{background-color:#fe6e0033}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-orange-500\\/20:hover{background-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--char-color-primary)90%,transparent)}}.hover\\:bg-red-500\\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-red-500\\/20:hover{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.hover\\:bg-red-500\\/30:hover{background-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-red-500\\/30:hover{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.hover\\:bg-secondary\\/80:hover{background-color:var(--char-color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab,var(--char-color-secondary)80%,transparent)}}.hover\\:bg-white:hover{background-color:var(--color-white)}.hover\\:bg-white\\!:hover{background-color:var(--color-white)!important}.hover\\:bg-white\\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/5:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.hover\\:bg-white\\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.hover\\:bg-white\\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/15:hover{background-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.hover\\:bg-white\\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\\:bg-white\\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}.hover\\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.hover\\:text-accent-foreground:hover{color:var(--char-color-accent-foreground)}.hover\\:text-amber-400:hover{color:var(--color-amber-400)}.hover\\:text-foreground:hover{color:var(--char-color-foreground)}.hover\\:text-primary\\/80:hover{color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\\:text-primary\\/80:hover{color:color-mix(in oklab,var(--char-color-primary)80%,transparent)}}.hover\\:text-red-200:hover{color:var(--color-red-200)}.hover\\:text-red-300:hover{color:var(--color-red-300)}.hover\\:text-red-400:hover{color:var(--color-red-400)}.hover\\:text-white:hover{color:var(--color-white)}.hover\\:text-white\\/50:hover{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/50:hover{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.hover\\:text-white\\/60:hover{color:#fff9}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/60:hover{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.hover\\:text-white\\/70:hover{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/70:hover{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.hover\\:text-white\\/80:hover{color:#fffc}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/80:hover{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.hover\\:text-zinc-600:hover{color:var(--color-zinc-600)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-75:hover{opacity:.75}.hover\\:opacity-100:hover{opacity:1}}.focus\\:bg-accent:focus{background-color:var(--char-color-accent)}.focus\\:text-accent-foreground:focus{color:var(--char-color-accent-foreground)}.focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\\:ring-ring:focus{--tw-ring-color:var(--char-color-ring)}.focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:border-ring:focus-visible{border-color:var(--char-color-ring)}.focus-visible\\:bg-muted:focus-visible{background-color:var(--char-color-muted)}.focus-visible\\:opacity-100:focus-visible{opacity:1}.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-blue-500:focus-visible{--tw-ring-color:var(--color-blue-500)}.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--char-color-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--char-color-ring)50%,transparent)}}.focus-visible\\:ring-white\\/30:focus-visible{--tw-ring-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-white\\/30:focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.focus-visible\\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\\:ring-offset-transparent:focus-visible{--tw-ring-offset-color:transparent}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\\:scale-\\[0\\.98\\]:active{scale:.98}.active\\:cursor-grabbing:active{cursor:grabbing}.active\\:bg-white\\/15:active{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.active\\:bg-white\\/15:active{background-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.active\\:bg-white\\/20:active{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.active\\:bg-white\\/20:active{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:invisible:disabled{visibility:hidden}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}.has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\\[textarea\\:focus-visible\\]\\:border-ring:has(:is(textarea:focus-visible)){border-color:var(--char-color-ring)}.has-\\[textarea\\:focus-visible\\]\\:ring-2:has(:is(textarea: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-\\[textarea\\:focus-visible\\]\\:ring-ring\\/20:has(:is(textarea:focus-visible)){--tw-ring-color:var(--char-color-ring)}@supports (color:color-mix(in lab, red, red)){.has-\\[textarea\\:focus-visible\\]\\:ring-ring\\/20:has(:is(textarea:focus-visible)){--tw-ring-color:color-mix(in oklab,var(--char-color-ring)20%,transparent)}}.has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\\[\\>svg\\]\\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\\[\\>svg\\]\\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--char-color-destructive)}.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--char-color-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(--char-color-destructive)20%,transparent)}}.data-floating\\:absolute[data-floating]{position:absolute}.data-floating\\:rounded-md[data-floating]{border-radius:var(--char-radius-md)}.data-floating\\:border[data-floating]{border-style:var(--tw-border-style);border-width:1px}.data-floating\\:bg-background[data-floating]{background-color:var(--char-color-background)}.data-floating\\:p-1[data-floating]{padding:calc(var(--spacing)*1)}.data-floating\\:shadow-sm[data-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)}.data-\\[active\\=true\\]\\:bg-muted[data-active=true]{background-color:var(--char-color-muted)}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[dragging\\=true\\]\\:border-dashed[data-dragging=true]{--tw-border-style:dashed;border-style:dashed}.data-\\[dragging\\=true\\]\\:border-ring[data-dragging=true]{border-color:var(--char-color-ring)}.data-\\[dragging\\=true\\]\\:bg-accent\\/50[data-dragging=true]{background-color:var(--char-color-accent)}@supports (color:color-mix(in lab, red, red)){.data-\\[dragging\\=true\\]\\:bg-accent\\/50[data-dragging=true]{background-color:color-mix(in oklab,var(--char-color-accent)50%,transparent)}}.data-\\[inset\\]\\:pl-8[data-inset]{padding-left:calc(var(--spacing)*8)}.data-\\[orientation\\=horizontal\\]\\:h-px[data-orientation=horizontal]{height:1px}.data-\\[orientation\\=horizontal\\]\\:w-full[data-orientation=horizontal]{width:100%}.data-\\[orientation\\=vertical\\]\\:h-full[data-orientation=vertical]{height:100%}.data-\\[orientation\\=vertical\\]\\:w-px[data-orientation=vertical]{width:1px}.data-\\[placeholder\\]\\:text-muted-foreground[data-placeholder]{color:var(--char-color-muted-foreground)}.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\\[size\\=default\\]\\:h-9[data-size=default]{height:calc(var(--spacing)*9)}.data-\\[size\\=sm\\]\\:h-8[data-size=sm]{height:calc(var(--spacing)*8)}: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-2>*)[data-slot=select-value]{gap:calc(var(--spacing)*2)}.data-\\[state\\=closed\\]\\:pointer-events-none[data-state=closed]{pointer-events:none}.data-\\[state\\=closed\\]\\:animate-collapsible-up[data-state=closed]{animation:collapsible-up var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\\[state\\=closed\\]\\:animate-out[data-state=closed]{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-\\[state\\=closed\\]\\:duration-\\(--animation-duration\\)[data-state=closed]{--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.data-\\[state\\=closed\\]\\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\\[state\\=closed\\]\\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\\[state\\=closed\\]\\:fill-mode-forwards[data-state=closed]{--tw-animation-fill-mode:forwards;animation-fill-mode:forwards}.data-\\[state\\=closed\\]\\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\\[state\\=closed\\]\\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\\[state\\=closed\\]\\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\\[state\\=closed\\]\\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\\[state\\=closed\\]\\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\\[state\\=open\\]\\:animate-collapsible-down[data-state=open]{animation:collapsible-down var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\\[state\\=open\\]\\:animate-in[data-state=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\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--char-color-accent)}.data-\\[state\\=open\\]\\:bg-secondary[data-state=open]{background-color:var(--char-color-secondary)}.data-\\[state\\=open\\]\\:text-accent-foreground[data-state=open]{color:var(--char-color-accent-foreground)}.data-\\[state\\=open\\]\\:text-muted-foreground[data-state=open]{color:var(--char-color-muted-foreground)}.data-\\[state\\=open\\]\\:duration-\\(--animation-duration\\)[data-state=open]{--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.data-\\[state\\=open\\]\\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\\[state\\=open\\]\\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\\[state\\=open\\]\\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\\[state\\=open\\]\\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\\[state\\=open\\]\\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\\[state\\=open\\]\\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\\[state\\=open\\]\\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--char-color-destructive)}.data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--char-color-destructive)10%,transparent)}}.data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--char-color-destructive)}.nth-\\[n\\+3\\]\\:hidden:nth-child(n+3){display:none}@media (prefers-reduced-motion:reduce){.motion-reduce\\:animate-none{animation:none}}@media (min-width:40rem){.sm\\:flex{display:flex}.sm\\:h-3{height:calc(var(--spacing)*3)}.sm\\:h-3\\.5{height:calc(var(--spacing)*3.5)}.sm\\:h-4{height:calc(var(--spacing)*4)}.sm\\:h-7{height:calc(var(--spacing)*7)}.sm\\:max-h-24{max-height:calc(var(--spacing)*24)}.sm\\:max-h-32{max-height:calc(var(--spacing)*32)}.sm\\:max-h-48{max-height:calc(var(--spacing)*48)}.sm\\:min-h-7{min-height:calc(var(--spacing)*7)}.sm\\:w-3{width:calc(var(--spacing)*3)}.sm\\:w-3\\.5{width:calc(var(--spacing)*3.5)}.sm\\:w-4{width:calc(var(--spacing)*4)}.sm\\:w-7{width:calc(var(--spacing)*7)}.sm\\:max-w-3xl{max-width:var(--container-3xl)}.sm\\:max-w-16{max-width:calc(var(--spacing)*16)}.sm\\:max-w-24{max-width:calc(var(--spacing)*24)}.sm\\:max-w-lg{max-width:var(--container-lg)}.sm\\:max-w-sm{max-width:var(--container-sm)}.sm\\:min-w-7{min-width:calc(var(--spacing)*7)}.sm\\:flex-row{flex-direction:row}.sm\\:justify-end{justify-content:flex-end}.sm\\:gap-1{gap:calc(var(--spacing)*1)}.sm\\:gap-1\\.5{gap:calc(var(--spacing)*1.5)}.sm\\:p-1{padding:calc(var(--spacing)*1)}.sm\\:p-1\\.5{padding:calc(var(--spacing)*1.5)}.sm\\:px-2{padding-inline:calc(var(--spacing)*2)}.sm\\:py-1{padding-block:calc(var(--spacing)*1)}.sm\\:text-left{text-align:left}.sm\\:opacity-0{opacity:0}@media (hover:hover){.sm\\:group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}}@media (min-width:48rem){.md\\:pb-6{padding-bottom:calc(var(--spacing)*6)}.md\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@container (min-width:28rem){.\\@md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\\@md\\:flex-col{flex-direction:column}.\\@md\\:nth-\\[n\\+3\\]\\:block:nth-child(n+3){display:block}}.dark\\:border-input:is(.dark *){border-color:var(--char-color-input)}.dark\\:border-muted-foreground\\/15:is(.dark *){border-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.dark\\:border-muted-foreground\\/15:is(.dark *){border-color:color-mix(in oklab,var(--char-color-muted-foreground)15%,transparent)}}.dark\\:border-zinc-600:is(.dark *){border-color:var(--color-zinc-600)}.dark\\:border-zinc-700\\/80:is(.dark *){border-color:#3f3f46cc}@supports (color:color-mix(in lab, red, red)){.dark\\:border-zinc-700\\/80:is(.dark *){border-color:color-mix(in oklab,var(--color-zinc-700)80%,transparent)}}.dark\\:bg-amber-500\\/10:is(.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-amber-500\\/10:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.dark\\:bg-blue-500\\/10:is(.dark *){background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-blue-500\\/10:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark\\:bg-destructive\\/5:is(.dark *){background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/5:is(.dark *){background-color:color-mix(in oklab,var(--char-color-destructive)5%,transparent)}}.dark\\:bg-destructive\\/60:is(.dark *){background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/60:is(.dark *){background-color:color-mix(in oklab,var(--char-color-destructive)60%,transparent)}}.dark\\:bg-emerald-500\\/12:is(.dark *){background-color:#00bb7f1f}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-emerald-500\\/12:is(.dark *){background-color:color-mix(in oklab,var(--color-emerald-500)12%,transparent)}}.dark\\:bg-input\\/30:is(.dark *){background-color:var(--char-color-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab,var(--char-color-input)30%,transparent)}}.dark\\:bg-muted:is(.dark *){background-color:var(--char-color-muted)}.dark\\:bg-red-500\\/10:is(.dark *){background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-red-500\\/10:is(.dark *){background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.dark\\:bg-zinc-700:is(.dark *){background-color:var(--color-zinc-700)}.dark\\:bg-zinc-800:is(.dark *){background-color:var(--color-zinc-800)}.dark\\:stroke-\\[2\\.5px\\]:is(.dark *){stroke-width:2.5px}.dark\\:text-amber-300:is(.dark *){color:var(--color-amber-300)}.dark\\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\\:text-emerald-300:is(.dark *){color:var(--color-emerald-300)}.dark\\:text-foreground:is(.dark *){color:var(--char-color-foreground)}.dark\\:text-orange-400:is(.dark *){color:var(--color-orange-400)}.dark\\:text-red-200:is(.dark *){color:var(--color-red-200)}.dark\\:text-red-300:is(.dark *){color:var(--color-red-300)}.dark\\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\\:text-slate-300:is(.dark *){color:var(--color-slate-300)}.dark\\:text-zinc-200:is(.dark *){color:var(--color-zinc-200)}.dark\\:text-zinc-400:is(.dark *){color:var(--color-zinc-400)}.dark\\:shadow-black\\/30:is(.dark *){--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.dark\\:shadow-black\\/30:is(.dark *){--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)30%,transparent)var(--tw-shadow-alpha),transparent)}}.dark\\:ring-amber-400\\/30:is(.dark *){--tw-ring-color:#fcbb004d}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-amber-400\\/30:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-amber-400)30%,transparent)}}.dark\\:ring-blue-400\\/25:is(.dark *){--tw-ring-color:#54a2ff40}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-blue-400\\/25:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-blue-400)25%,transparent)}}.dark\\:ring-border\\/30:is(.dark *){--tw-ring-color:var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-border\\/30:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--char-color-border)30%,transparent)}}.dark\\:ring-emerald-500\\/25:is(.dark *){--tw-ring-color:#00bb7f40}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-emerald-500\\/25:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-emerald-500)25%,transparent)}}.dark\\:ring-red-400\\/30:is(.dark *){--tw-ring-color:#ff65684d}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-red-400\\/30:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-red-400)30%,transparent)}}@media (hover:hover){.dark\\:hover\\:bg-accent\\/50:is(.dark *):hover{background-color:var(--char-color-accent)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-accent\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--char-color-accent)50%,transparent)}}.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--char-color-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--char-color-input)50%,transparent)}}.dark\\:hover\\:bg-muted-foreground\\/30:is(.dark *):hover{background-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-muted-foreground\\/30:is(.dark *):hover{background-color:color-mix(in oklab,var(--char-color-muted-foreground)30%,transparent)}}.dark\\:hover\\:bg-zinc-600:is(.dark *):hover{background-color:var(--color-zinc-600)}.dark\\:hover\\:bg-zinc-700:is(.dark *):hover{background-color:var(--color-zinc-700)}.dark\\:hover\\:text-zinc-200:is(.dark *):hover{color:var(--color-zinc-200)}}.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--char-color-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(--char-color-destructive)40%,transparent)}}.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--char-color-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(--char-color-destructive)40%,transparent)}}.dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.\\[\\&_p\\]\\:-mb-2 p{margin-bottom:calc(var(--spacing)*-2)}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&_svg\\]\\:text-background svg{color:var(--char-color-background)}.\\[\\&_svg\\]\\:text-black svg{color:var(--color-black)}@media (hover:hover){.hover\\:\\[\\&_svg\\]\\:text-destructive:hover svg{color:var(--char-color-destructive)}}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]){color:var(--char-color-muted-foreground)}.\\[\\.border-b\\]\\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\\[\\.border-t\\]\\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}.\\[\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.\\[\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}: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(.data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive[data-variant=destructive]>*):is(svg){color:var(--char-color-destructive)!important}.\\[\\&\\:last-child\\>td\\:first-child\\]\\:rounded-bl-lg:last-child>td:first-child{border-bottom-left-radius:var(--char-radius-lg)}.\\[\\&\\:last-child\\>td\\:last-child\\]\\:rounded-br-lg:last-child>td:last-child{border-bottom-right-radius:var(--char-radius-lg)}.\\[\\&\\:where\\(\\>\\*\\)\\]\\:col-start-2:where(){grid-column-start:2}.only\\:\\[\\&\\>\\#attachment-tile\\]\\:size-24:only-child>#attachment-tile{width:calc(var(--spacing)*24);height:calc(var(--spacing)*24)}.\\[\\&\\>a\\]\\:text-xs>a{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\[\\&\\>a\\]\\:no-underline>a{text-decoration-line:none}.\\[\\&\\>button\\]\\:rounded-full>button{border-radius:3.40282e38px}.\\[\\&\\>button\\]\\:bg-foreground\\/60>button{background-color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.\\[\\&\\>button\\]\\:bg-foreground\\/60>button{background-color:color-mix(in oklab,var(--char-color-foreground)60%,transparent)}}.\\[\\&\\>button\\]\\:p-1>button{padding:calc(var(--spacing)*1)}.\\[\\&\\>button\\]\\:opacity-100>button{opacity:1}.\\[\\&\\>button\\]\\:ring-0\\!>button{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}@media (hover:hover){.\\[\\&\\>button\\]\\:hover\\:\\[\\&_svg\\]\\:text-destructive>button:hover svg{color:var(--char-color-destructive)}}.\\[\\&\\>li\\]\\:mt-0\\.5>li{margin-top:calc(var(--spacing)*.5)}.\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(var(--spacing)*2)}.\\[\\&\\>span\\]\\:text-xs>span{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.\\[\\&\\>svg\\]\\:size-3>svg{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}@media (hover:hover){a.\\[a\\&\\]\\:hover\\:bg-accent:hover{background-color:var(--char-color-accent)}a.\\[a\\&\\]\\:hover\\:bg-destructive\\/90:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){a.\\[a\\&\\]\\:hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--char-color-destructive)90%,transparent)}}a.\\[a\\&\\]\\:hover\\:bg-primary\\/90:hover{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){a.\\[a\\&\\]\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--char-color-primary)90%,transparent)}}a.\\[a\\&\\]\\:hover\\:bg-secondary\\/90:hover{background-color:var(--char-color-secondary)}@supports (color:color-mix(in lab, red, red)){a.\\[a\\&\\]\\:hover\\:bg-secondary\\/90:hover{background-color:color-mix(in oklab,var(--char-color-secondary)90%,transparent)}}a.\\[a\\&\\]\\:hover\\:text-accent-foreground:hover{color:var(--char-color-accent-foreground)}}}@keyframes aui-pulse{50%{opacity:.5}}:where(.aui-md[data-status=running]):empty:after,:where(.aui-md[data-status=running])>:where(:not(ol):not(ul):not(pre)):last-child:after,:where(.aui-md[data-status=running])>pre:last-child code:after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child):after{--aui-content:\"●\";content:var(--aui-content);margin-left:.25rem;margin-right:.25rem;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;animation:2s cubic-bezier(.4,0,.6,1) infinite aui-pulse}@keyframes char-shimmer{0%{transform:translate(-100%)}to{transform:translate(200%)}}@keyframes char-subtle-pulse{0%,to{opacity:1}50%{opacity:.85}}@keyframes char-slide-down{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes char-fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes char-gradient-shift{0%,to{transform:translate(0%)translateY(0%)}25%{transform:translate(100%)translateY(100%)}50%{transform:translate(100%)translateY(0%)}75%{transform:translate(0%)translateY(100%)}}@keyframes char-float{0%,to{transform:translateY(0)translate(0)}33%{transform:translateY(-30px)translate(20px)}66%{transform:translateY(20px)translate(-20px)}}@keyframes char-float-delayed{0%,to{transform:translateY(0)translate(0)}33%{transform:translateY(30px)translate(-30px)}66%{transform:translateY(-20px)translate(20px)}}@keyframes char-border-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes char-pulse-success{0%,to{box-shadow:0 0 0 0 color-mix(in oklch,var(--char-color-success),transparent 60%)}50%{box-shadow:0 0 0 8px #0000}}@keyframes char-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}@keyframes char-pulse-glow{0%,to{box-shadow:0 0 20px color-mix(in oklch,var(--char-color-primary),transparent 90%)}50%{box-shadow:0 0 30px color-mix(in oklch,var(--char-color-primary),transparent 80%)}}@keyframes char-gradient-x{0%,to{background-position:0%}50%{background-position:100%}}@keyframes char-glass-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes char-aui-pulse{50%{opacity:.5}}.char-no-scrollbar::-webkit-scrollbar{display:none}.char-no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}@media (hover:none){.char-scrollbar-thin{scrollbar-width:none}.char-scrollbar-thin::-webkit-scrollbar{display:none}}:where(.aui-md[data-status=running]):empty:after,:where(.aui-md[data-status=running])>:where(:not(ol):not(ul):not(pre)):last-child:after,:where(.aui-md[data-status=running])>pre:last-child code:after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child):after{font-family:var(--char-font-sans);--aui-content:\"●\";content:var(--aui-content);margin-left:.25rem;margin-right:.25rem;animation:2s cubic-bezier(.4,0,.6,1) infinite char-aui-pulse}@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))}}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height,var(--bits-collapsible-content-height,var(--reka-collapsible-content-height,var(--kb-collapsible-content-height,auto))))}}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height,var(--bits-collapsible-content-height,var(--reka-collapsible-content-height,var(--kb-collapsible-content-height,auto))))}to{height:0}}";
|
|
11073
|
+
const WEBMCP_SHADOW_STYLES = "/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--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}}}@layer theme{:root,:host{--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-600:oklch(55.8% .288 302.321);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs--line-height:calc(1/.75);--text-sm--line-height:calc(1.25/.875);--text-base:var(--char-font-size-base);--text-base--line-height:calc(1.5/1);--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0,0,.2,1);--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-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--char-font-sans);--default-mono-font-family:var(--char-font-mono);--color-background:var(--char-color-background)}}@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,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-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{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}:host,:root{--char-color-background:oklch(100% 0 0);--char-color-foreground:oklch(14.1% .005 285.823);--char-color-primary:oklch(21% .006 285.885);--char-color-primary-foreground:oklch(98.5% 0 0);--char-color-muted:oklch(96.7% .001 286.375);--char-color-muted-foreground:oklch(55.2% .016 285.938);--char-color-border:oklch(92% .004 286.32);--char-color-success:oklch(70% .2 145);--char-color-warning:oklch(75% .15 85);--char-color-error:oklch(65% .25 25);--char-color-card:var(--char-color-background);--char-color-card-foreground:var(--char-color-foreground);--char-color-popover:var(--char-color-background);--char-color-popover-foreground:var(--char-color-foreground);--char-color-secondary:var(--char-color-muted);--char-color-secondary-foreground:var(--char-color-foreground);--char-color-accent:var(--char-color-muted);--char-color-accent-foreground:var(--char-color-foreground);--char-color-destructive:var(--char-color-error);--char-color-destructive-foreground:var(--char-color-primary-foreground);--char-color-input:var(--char-color-border);--char-color-ring:var(--char-color-muted-foreground);--char-user-bubble-bg:var(--char-color-muted);--char-user-bubble-text:var(--char-color-foreground);--char-assistant-bubble-bg:transparent;--char-assistant-bubble-text:var(--char-color-foreground);--char-composer-bg:var(--char-color-background);--char-composer-border:var(--char-color-input);--char-composer-text:var(--char-color-foreground);--char-composer-placeholder:var(--char-color-muted-foreground);--char-composer-button-bg:var(--char-color-primary);--char-composer-button-text:var(--char-color-primary-foreground);--char-tool-bg:var(--char-color-muted);--char-tool-border:var(--char-color-border);--char-tool-text:var(--char-color-foreground);--char-tool-header-bg:var(--char-color-muted);--char-tool-approve-bg:var(--char-color-primary);--char-tool-approve-text:var(--char-color-primary-foreground);--char-tool-deny-bg:transparent;--char-tool-deny-text:var(--char-color-muted-foreground);--char-code-bg:oklch(14.1% .005 285.823);--char-code-text:oklch(98.5% 0 0);--char-code-header-bg:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){:host,:root{--char-code-header-bg:color-mix(in oklch,var(--char-color-muted-foreground),transparent 85%)}}:host,:root{--char-radius:.75rem;--char-radius-sm:calc(var(--char-radius) - 4px);--char-radius-md:calc(var(--char-radius) - 2px);--char-radius-lg:var(--char-radius);--char-radius-xl:calc(var(--char-radius) + 4px);--char-radius-full:9999px;--char-spacing-unit:.25rem;--char-font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--char-font-mono:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;--char-font-size-xs:.75rem;--char-font-size-sm:.8125rem;--char-font-size-base:.875rem;--char-font-size-lg:1rem;--char-duration-fast:.15s;--char-duration-normal:.25s;--char-duration-slow:.4s;--char-easing-default:cubic-bezier(.4,0,.2,1);--char-easing-spring:cubic-bezier(.34,1.56,.64,1);--char-z-base:0;--char-z-content:10;--char-z-overlay:50;--char-z-max:2147480000;--char-shadow-sm:0 1px 2px #0000000d;--char-shadow-md:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--char-shadow-lg:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--char-blur-sm:8px;--char-blur-md:12px;--char-blur-lg:20px}:host(.dark),.dark{--char-color-background:oklch(14.1% .005 285.823);--char-color-foreground:oklch(98.5% 0 0);--char-color-primary:oklch(92% .004 286.32);--char-color-primary-foreground:oklch(21% .006 285.885);--char-color-muted:oklch(27.4% .006 286.033);--char-color-muted-foreground:oklch(70.5% .015 286.067);--char-color-border:oklch(100% 0 0/.1);--char-color-input:oklch(100% 0 0/.15);--char-color-ring:oklch(55.2% .016 285.938);--char-color-success:oklch(75% .18 145);--char-color-warning:oklch(80% .14 85);--char-color-error:oklch(70% .22 25)}*{border-color:var(--char-color-border);outline-color:var(--char-color-ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklch,var(--char-color-ring),transparent 50%)}}}@layer components{.char-animate-fade-in-up{opacity:0;animation:.5s ease-out forwards char-fade-in-up}.char-animate-gradient-shift{background-size:200% 200%;animation:20s ease-in-out infinite char-gradient-shift}.char-animate-float-slow{animation:20s ease-in-out infinite char-float}.char-animate-float-delayed{animation:25s ease-in-out 5s infinite char-float-delayed}.char-animate-shimmer{animation:2s linear infinite char-shimmer}.char-animate-pulse-success{animation:.6s ease-out char-pulse-success}.char-animate-shake{animation:.3s ease-out char-shake}.char-animate-pulse-glow{animation:2s ease-in-out infinite char-pulse-glow}.char-animate-gradient-x{animation:8s ease-in-out infinite char-gradient-x}.char-transition-spring{transition:all var(--char-duration-slow)var(--char-easing-spring)}.char-transition-smooth{transition:all var(--char-duration-normal)var(--char-easing-default)}.char-app-shell{z-index:var(--char-z-base);background-color:var(--char-color-background);background-image:radial-gradient(80% 60% at -10% -10%,oklch(82% .15 270/.15),#0000),radial-gradient(60% 50% at 110% 10%,oklch(85% .1 220/.12),#0000),radial-gradient(50% 45% at 50% 120%,oklch(95% .02 250/.08),#0000);position:relative}.dark .char-app-shell{background-image:radial-gradient(80% 60% at -10% -10%,oklch(55% .14 270/.25),#0000),radial-gradient(60% 50% at 110% 15%,oklch(60% .12 220/.22),#0000),radial-gradient(50% 45% at 50% 120%,oklch(35% .04 250/.16),#0000)}.char-app-shell:before,.char-app-shell:after{content:\"\";pointer-events:none;border-radius:var(--char-radius-full);filter:blur(32px);opacity:.6;z-index:-1;position:absolute;inset:auto}.char-app-shell:before{background:radial-gradient(60% 60% at 40% 40%,oklch(80% .12 270/.3),#0000);width:260px;height:260px;top:-60px;left:-80px}.char-app-shell:after{background:radial-gradient(60% 60% at 60% 60%,oklch(84% .1 220/.25),#0000);width:300px;height:300px;bottom:-80px;right:-60px}.char-toolbar-surface{border-top:1px solid var(--char-color-border);background:linear-gradient(to right,var(--char-color-background),var(--char-color-background),var(--char-color-background))}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface{background:linear-gradient(to right,var(--char-color-background),color-mix(in oklch,var(--char-color-background),transparent 5%),var(--char-color-background))}}.char-toolbar-surface{-webkit-backdrop-filter:blur(var(--char-blur-md));backdrop-filter:blur(var(--char-blur-md))}@supports ((-webkit-backdrop-filter:blur(12px)) or (backdrop-filter:blur(12px))){.char-toolbar-surface{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface{background:color-mix(in oklch,var(--char-color-background),transparent 20%)}}}.char-toolbar-surface-top{border-bottom:1px solid var(--char-color-border);background:linear-gradient(to right,var(--char-color-background),var(--char-color-background),var(--char-color-background))}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface-top{background:linear-gradient(to right,var(--char-color-background),color-mix(in oklch,var(--char-color-background),transparent 5%),var(--char-color-background))}}.char-toolbar-surface-top{-webkit-backdrop-filter:blur(var(--char-blur-md));backdrop-filter:blur(var(--char-blur-md))}@supports ((-webkit-backdrop-filter:blur(12px)) or (backdrop-filter:blur(12px))){.char-toolbar-surface-top{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-toolbar-surface-top{background:color-mix(in oklch,var(--char-color-background),transparent 20%)}}}.char-toolbar-inner{justify-content:space-between;align-items:center;padding:.5rem .75rem;display:flex}.char-toolbar-card{background:var(--char-color-card);justify-content:space-between;align-items:center;gap:.5rem;display:flex}@supports (color:color-mix(in lab, red, red)){.char-toolbar-card{background:color-mix(in oklch,var(--char-color-card),transparent 60%)}}.char-toolbar-card{border:1px solid var(--char-color-border);border-radius:var(--char-radius-lg);padding:.5rem .75rem}.char-toolbar-group{align-items:center;gap:.25rem;display:flex}.char-btn-toolbar-primary{border-radius:var(--char-radius-lg);background:linear-gradient(to right,var(--char-color-primary),var(--char-color-primary));align-items:center;gap:.5rem;height:2.25rem;padding:0 .75rem;display:flex}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-primary{background:linear-gradient(to right,color-mix(in oklch,var(--char-color-primary),transparent 95%),color-mix(in oklch,var(--char-color-primary),transparent 90%))}}.char-btn-toolbar-primary{border:1px solid var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-primary{border:1px solid color-mix(in oklch,var(--char-color-primary),transparent 80%)}}.char-btn-toolbar-primary{transition:all var(--char-duration-fast)}.char-btn-toolbar-primary:hover{background:linear-gradient(to right,var(--char-color-primary),var(--char-color-primary))}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-primary:hover{background:linear-gradient(to right,color-mix(in oklch,var(--char-color-primary),transparent 90%),color-mix(in oklch,var(--char-color-primary),transparent 80%))}}.char-btn-toolbar-icon-primary{border-radius:var(--char-radius-full);background:linear-gradient(to bottom right,var(--char-color-primary),var(--char-color-primary));width:2rem;height:2rem;padding:0}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-primary{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-primary),transparent 90%),color-mix(in oklch,var(--char-color-primary),transparent 80%))}}.char-btn-toolbar-icon-primary{border:1px solid var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-primary{border:1px solid color-mix(in oklch,var(--char-color-primary),transparent 70%)}}.char-btn-toolbar-icon-primary{box-shadow:var(--char-shadow-sm);transition:all var(--char-duration-fast)}.char-btn-toolbar-icon-primary:hover{background:linear-gradient(to bottom right,var(--char-color-primary),var(--char-color-primary))}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-primary:hover{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-primary),transparent 80%),color-mix(in oklch,var(--char-color-primary),transparent 70%))}}.char-btn-toolbar-icon-secondary{border-radius:var(--char-radius-full);background:linear-gradient(to bottom right,var(--char-color-secondary),var(--char-color-secondary));width:2rem;height:2rem;padding:0}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-secondary{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-secondary),transparent 90%),color-mix(in oklch,var(--char-color-secondary),transparent 80%))}}.char-btn-toolbar-icon-secondary{border:1px solid var(--char-color-secondary)}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-secondary{border:1px solid color-mix(in oklch,var(--char-color-secondary),transparent 70%)}}.char-btn-toolbar-icon-secondary{box-shadow:var(--char-shadow-sm);transition:all var(--char-duration-fast)}.char-btn-toolbar-icon-secondary:hover{background:linear-gradient(to bottom right,var(--char-color-secondary),var(--char-color-secondary))}@supports (color:color-mix(in lab, red, red)){.char-btn-toolbar-icon-secondary:hover{background:linear-gradient(to bottom right,color-mix(in oklch,var(--char-color-secondary),transparent 80%),color-mix(in oklch,var(--char-color-secondary),transparent 70%))}}.char-badge-compact{height:1.25rem;padding:0 .5rem;font-size:10px}.char-badge-mini{height:1rem;padding:0 .375rem;font-size:10px}.char-shimmer{background:linear-gradient(90deg,transparent,var(--char-color-foreground),transparent);animation:3s linear infinite char-shimmer}@supports (color:color-mix(in lab, red, red)){.char-shimmer{background:linear-gradient(90deg,transparent,color-mix(in oklch,var(--char-color-foreground),transparent 90%),transparent)}}.char-shimmer{background-size:1000px 100%}.char-gradient-text{background:linear-gradient(to right,var(--char-color-foreground),var(--char-color-foreground))}@supports (color:color-mix(in lab, red, red)){.char-gradient-text{background:linear-gradient(to right,var(--char-color-foreground),color-mix(in oklch,var(--char-color-foreground),transparent 30%))}}.char-gradient-text{-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.char-glass{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass{background:color-mix(in oklch,var(--char-color-background),transparent 50%)}}.char-glass{-webkit-backdrop-filter:blur(var(--char-blur-md));backdrop-filter:blur(var(--char-blur-md));border:1px solid var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.char-glass{border:1px solid color-mix(in oklch,var(--char-color-border),transparent 50%)}}.char-tool-card{transition:all .3s ease-out}.char-tool-card:hover{box-shadow:var(--char-shadow-lg);transform:scale(1.02)}.char-tool-border-calling{position:relative;overflow:hidden}.char-tool-border-calling:before{content:\"\";background:conic-gradient(from 0deg,transparent 0deg,transparent 60deg,var(--char-color-primary)90deg,var(--char-color-primary)120deg,var(--char-color-primary)150deg,transparent 180deg,transparent 360deg);position:absolute;inset:-50%}@supports (color:color-mix(in lab, red, red)){.char-tool-border-calling:before{background:conic-gradient(from 0deg,transparent 0deg,transparent 60deg,color-mix(in oklch,var(--char-color-primary),transparent 50%)90deg,color-mix(in oklch,var(--char-color-primary),transparent 30%)120deg,color-mix(in oklch,var(--char-color-primary),transparent 50%)150deg,transparent 180deg,transparent 360deg)}}.char-tool-border-calling:before{animation:1.5s linear infinite char-border-rotate}.char-tool-border-success{background:var(--char-color-success)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-success{background:color-mix(in oklch,var(--char-color-success),transparent 60%)}}.char-tool-border-success{box-shadow:0 0 12px var(--char-color-success),inset 0 0 8px var(--char-color-success)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-success{box-shadow:0 0 12px color-mix(in oklch,var(--char-color-success),transparent 70%),inset 0 0 8px color-mix(in oklch,var(--char-color-success),transparent 90%)}}.char-tool-border-error{background:var(--char-color-error)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-error{background:color-mix(in oklch,var(--char-color-error),transparent 60%)}}.char-tool-border-error{box-shadow:0 0 12px var(--char-color-error),inset 0 0 8px var(--char-color-error)}@supports (color:color-mix(in lab, red, red)){.char-tool-border-error{box-shadow:0 0 12px color-mix(in oklch,var(--char-color-error),transparent 70%),inset 0 0 8px color-mix(in oklch,var(--char-color-error),transparent 90%)}}.char-scrollbar-thin{scrollbar-width:thin;scrollbar-color:var(--char-color-primary)transparent}@supports (color:color-mix(in lab, red, red)){.char-scrollbar-thin{scrollbar-color:color-mix(in oklch,var(--char-color-primary),transparent 80%)transparent}}.char-scrollbar-thin::-webkit-scrollbar{width:6px;height:6px}.char-scrollbar-thin::-webkit-scrollbar-track{background:0 0}.char-scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-scrollbar-thin::-webkit-scrollbar-thumb{background-color:color-mix(in oklch,var(--char-color-primary),transparent 80%)}}.char-scrollbar-thin::-webkit-scrollbar-thumb{border-radius:3px}.char-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.char-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:color-mix(in oklch,var(--char-color-primary),transparent 70%)}}.char-glass-pill{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill{background:color-mix(in oklch,var(--char-color-background),transparent 15%)}}.char-glass-pill{-webkit-backdrop-filter:blur(var(--char-blur-lg))saturate(150%);box-shadow:0 4px 16px var(--char-color-foreground),inset 0 .5px 0 var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill{box-shadow:0 4px 16px color-mix(in oklch,var(--char-color-foreground),transparent 80%),inset 0 .5px 0 color-mix(in oklch,var(--char-color-foreground),transparent 92%)}}.char-glass-pill{border:1px solid var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill{border:1px solid color-mix(in oklch,var(--char-color-foreground),transparent 94%)}}.char-glass-pill:before{content:\"\";border-radius:inherit;background:linear-gradient(180deg,var(--char-color-foreground)0%,transparent 40%);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.char-glass-pill:before{background:linear-gradient(180deg,color-mix(in oklch,var(--char-color-foreground),transparent 96%)0%,transparent 40%)}}.char-glass-pill:before{pointer-events:none;z-index:1}.char-glass-pill-collapsed{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-collapsed{background:color-mix(in oklch,var(--char-color-background),transparent 15%)}}.char-glass-pill-collapsed{-webkit-backdrop-filter:blur(var(--char-blur-lg))saturate(150%);box-shadow:0 2px 8px var(--char-color-foreground),inset 0 .5px 0 var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-collapsed{box-shadow:0 2px 8px color-mix(in oklch,var(--char-color-foreground),transparent 80%),inset 0 .5px 0 color-mix(in oklch,var(--char-color-foreground),transparent 92%)}}.char-glass-pill-collapsed{border:1px solid var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-collapsed{border:1px solid color-mix(in oklch,var(--char-color-foreground),transparent 94%)}}.char-glass-pill-hovered{background:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-hovered{background:color-mix(in oklch,var(--char-color-background),transparent 20%)}}.char-glass-pill-hovered{-webkit-backdrop-filter:blur(16px)saturate(140%);box-shadow:0 2px 12px var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-hovered{box-shadow:0 2px 12px color-mix(in oklch,var(--char-color-foreground),transparent 82%)}}.char-glass-pill-hovered{border:1px solid var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.char-glass-pill-hovered{border:1px solid color-mix(in oklch,var(--char-color-foreground),transparent 94%)}}.char-glass-shimmer{background:linear-gradient(90deg,var(--char-color-foreground)0%,var(--char-color-foreground)50%,var(--char-color-foreground)100%)}@supports (color:color-mix(in lab, red, red)){.char-glass-shimmer{background:linear-gradient(90deg,color-mix(in oklch,var(--char-color-foreground),transparent 92%)0%,color-mix(in oklch,var(--char-color-foreground),transparent 85%)50%,color-mix(in oklch,var(--char-color-foreground),transparent 92%)100%)}}.char-glass-shimmer{background-size:200% 100%;animation:4s ease-in-out infinite char-glass-shimmer}.char-scroll-touch{-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.char-scroll-fade-y{-webkit-mask-image:linear-gradient(#0000,#000 8px calc(100% - 8px),#0000);mask-image:linear-gradient(#0000,#000 8px calc(100% - 8px),#0000)}.char-pb-safe{padding-bottom:env(safe-area-inset-bottom,0px)}.char-mb-safe{margin-bottom:env(safe-area-inset-bottom,0px)}.char-bottom-safe{bottom:max(1rem,env(safe-area-inset-bottom,0px))}@supports (padding-bottom:env(safe-area-inset-bottom)){.char-pill-safe-bottom{padding-bottom:calc(env(safe-area-inset-bottom,0px) + .5rem)}}}@layer utilities{.\\@container\\/card-header{container:card-header/inline-size}.\\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-\\[1px\\]{inset:-1px}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1{top:calc(var(--spacing)*-1)}.-top-1\\.5{top:calc(var(--spacing)*-1.5)}.-top-12{top:calc(var(--spacing)*-12)}.top-0{top:calc(var(--spacing)*0)}.top-1\\.5{top:calc(var(--spacing)*1.5)}.top-1\\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\\[50\\%\\]{top:50%}.-right-0\\.5{right:calc(var(--spacing)*-.5)}.-right-1{right:calc(var(--spacing)*-1)}.-right-1\\.5{right:calc(var(--spacing)*-1.5)}.right-0{right:calc(var(--spacing)*0)}.right-1\\.5{right:calc(var(--spacing)*1.5)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.-bottom-0\\.5{bottom:calc(var(--spacing)*-.5)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-\\[50\\%\\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-1{margin:calc(var(--spacing)*-1)}.m-0{margin:calc(var(--spacing)*0)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-3{margin-block:calc(var(--spacing)*3)}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.my-auto{margin-block:auto}.-mt-1{margin-top:calc(var(--spacing)*-1)}.mt-0\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-auto{margin-top:auto}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\\.5{margin-right:calc(var(--spacing)*1.5)}.-mb-1{margin-bottom:calc(var(--spacing)*-1)}.-mb-2{margin-bottom:calc(var(--spacing)*-2)}.mb-0\\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-0\\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-1\\.5{width:calc(var(--spacing)*1.5);height:calc(var(--spacing)*1.5)}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.size-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-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.size-14{width:calc(var(--spacing)*14);height:calc(var(--spacing)*14)}.size-\\[34px\\]{width:34px;height:34px}.size-full{width:100%;height:100%}.h-1{height:calc(var(--spacing)*1)}.h-1\\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-4\\.5{height:calc(var(--spacing)*4.5)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-16{height:calc(var(--spacing)*16)}.h-\\[var\\(--radix-select-trigger-height\\)\\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\\(--radix-dropdown-menu-content-available-height\\){max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-\\(--radix-select-content-available-height\\){max-height:var(--radix-select-content-available-height)}.max-h-20{max-height:calc(var(--spacing)*20)}.max-h-24{max-height:calc(var(--spacing)*24)}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-\\[30vh\\]{max-height:30vh}.max-h-\\[80dvh\\]{max-height:80dvh}.max-h-\\[80vh\\]{max-height:80vh}.max-h-\\[90vh\\]{max-height:90vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-7{min-height:calc(var(--spacing)*7)}.min-h-11{min-height:calc(var(--spacing)*11)}.min-h-14{min-height:calc(var(--spacing)*14)}.min-h-40{min-height:calc(var(--spacing)*40)}.min-h-screen{min-height:100vh}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-1\\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-2\\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\\.5{width:calc(var(--spacing)*3.5)}.w-3\\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-4\\.5{width:calc(var(--spacing)*4.5)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-11{width:calc(var(--spacing)*11)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\\(--thread-max-width\\){max-width:var(--thread-max-width)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-24{max-width:calc(var(--spacing)*24)}.max-w-32{max-width:calc(var(--spacing)*32)}.max-w-\\[75\\%\\]{max-width:75%}.max-w-\\[100px\\]{max-width:100px}.max-w-\\[140px\\]{max-width:140px}.max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-4{min-width:calc(var(--spacing)*4)}.min-w-7{min-width:calc(var(--spacing)*7)}.min-w-11{min-width:calc(var(--spacing)*11)}.min-w-\\[8rem\\]{min-width:8rem}.min-w-\\[var\\(--radix-select-trigger-width\\)\\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.origin-\\(--radix-dropdown-menu-content-transform-origin\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\\(--radix-select-content-transform-origin\\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\\[-50\\%\\]{--tw-translate-x:-50%;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-\\[-50\\%\\]{--tw-translate-y:-50%;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)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-45{rotate:45deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform-gpu{transform:translateZ(0)var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-in{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)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.scroll-m-20{scroll-margin:calc(var(--spacing)*20)}.scroll-my-1{scroll-margin-block:calc(var(--spacing)*1)}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\\[minmax\\(72px\\,1fr\\)_auto\\]{grid-template-columns:minmax(72px,1fr) auto}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.grid-rows-\\[auto_auto\\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-end{justify-items:end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.gap-y-2{row-gap:calc(var(--spacing)*2)}.self-center{align-self:center}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\[2px\\]{border-radius:2px}.rounded-\\[14px\\]{border-radius:14px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--char-radius-lg)}.rounded-md{border-radius:var(--char-radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--char-radius-sm)}.rounded-xl{border-radius:var(--char-radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-lg{border-top-left-radius:var(--char-radius-lg);border-top-right-radius:var(--char-radius-lg)}.rounded-t-none\\!{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-b-lg{border-bottom-right-radius:var(--char-radius-lg);border-bottom-left-radius:var(--char-radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-amber-500\\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\\/30{border-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.border-amber-500\\/50{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.border-amber-500\\/50{border-color:color-mix(in oklab,var(--color-amber-500)50%,transparent)}}.border-blue-500\\/20{border-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.border-blue-500\\/20{border-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.border-blue-500\\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.border-blue-500\\/30{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.border-border,.border-border\\/50{border-color:var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab,var(--char-color-border)50%,transparent)}}.border-composer-border{border-color:var(--char-composer-border)}.border-destructive,.border-destructive\\/20{border-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\\/20{border-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.border-emerald-500\\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\\/20{border-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.border-foreground\\/20{border-color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/20{border-color:color-mix(in oklab,var(--char-color-foreground)20%,transparent)}}.border-gray-200{border-color:var(--color-gray-200)}.border-input{border-color:var(--char-color-input)}.border-muted-foreground\\/20{border-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\\/20{border-color:color-mix(in oklab,var(--char-color-muted-foreground)20%,transparent)}}.border-muted-foreground\\/30{border-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.border-muted-foreground\\/30{border-color:color-mix(in oklab,var(--char-color-muted-foreground)30%,transparent)}}.border-orange-500\\/20{border-color:#fe6e0033}@supports (color:color-mix(in lab, red, red)){.border-orange-500\\/20{border-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.border-primary\\/50{border-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\\/50{border-color:color-mix(in oklab,var(--char-color-primary)50%,transparent)}}.border-red-500\\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.border-red-500\\/20{border-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.border-transparent{border-color:#0000}.border-white\\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.border-white\\/5{border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.border-white\\/8{border-color:#ffffff14}@supports (color:color-mix(in lab, red, red)){.border-white\\/8{border-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.border-white\\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-200\\/80{border-color:#e4e4e7cc}@supports (color:color-mix(in lab, red, red)){.border-zinc-200\\/80{border-color:color-mix(in oklab,var(--color-zinc-200)80%,transparent)}}.border-zinc-600{border-color:var(--color-zinc-600)}.border-t-muted-foreground\\/60{border-top-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.border-t-muted-foreground\\/60{border-top-color:color-mix(in oklab,var(--char-color-muted-foreground)60%,transparent)}}.bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_20\\%\\,transparent\\)\\]{background-color:rgb(var(--background))}@supports (color:color-mix(in lab, red, red)){.bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_20\\%\\,transparent\\)\\]{background-color:color-mix(in oklab,rgb(var(--background))20%,transparent)}}.bg-accent{background-color:var(--char-color-accent)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/5{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\\/20{background-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-background,.bg-background\\/80{background-color:var(--char-color-background)}@supports (color:color-mix(in lab, red, red)){.bg-background\\/80{background-color:color-mix(in oklab,var(--char-color-background)80%,transparent)}}.bg-black\\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\/5{background-color:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.bg-blue-500\\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\\/70{background-color:#3080ffb3}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\\/70{background-color:color-mix(in oklab,var(--color-blue-500)70%,transparent)}}.bg-border{background-color:var(--char-color-border)}.bg-card{background-color:var(--char-color-card)}.bg-code-bg{background-color:var(--char-code-bg)}.bg-code-header-bg{background-color:var(--char-code-header-bg)}.bg-composer-bg{background-color:var(--char-composer-bg)}.bg-current{background-color:currentColor}.bg-destructive,.bg-destructive\\/10{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/10{background-color:color-mix(in oklab,var(--char-color-destructive)10%,transparent)}}.bg-emerald-500\\/6{background-color:#00bb7f0f}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/6{background-color:color-mix(in oklab,var(--color-emerald-500)6%,transparent)}}.bg-emerald-500\\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/10{background-color:color-mix(in oklab,var(--color-emerald-500)10%,transparent)}}.bg-foreground{background-color:var(--char-color-foreground)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-400\\/60{background-color:#05df7299}@supports (color:color-mix(in lab, red, red)){.bg-green-400\\/60{background-color:color-mix(in oklab,var(--color-green-400)60%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\\/10{background-color:#00c7581a}@supports (color:color-mix(in lab, red, red)){.bg-green-500\\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-500\\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-muted{background-color:var(--char-color-muted)}.bg-muted-foreground\\/40{background-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\/40{background-color:color-mix(in oklab,var(--char-color-muted-foreground)40%,transparent)}}.bg-muted\\/5{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/5{background-color:color-mix(in oklab,var(--char-color-muted)5%,transparent)}}.bg-muted\\/30{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/30{background-color:color-mix(in oklab,var(--char-color-muted)30%,transparent)}}.bg-muted\\/40{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/40{background-color:color-mix(in oklab,var(--char-color-muted)40%,transparent)}}.bg-muted\\/50{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/50{background-color:color-mix(in oklab,var(--char-color-muted)50%,transparent)}}.bg-orange-500\\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab, red, red)){.bg-orange-500\\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.bg-popover{background-color:var(--char-color-popover)}.bg-primary,.bg-primary\\/10{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/10{background-color:color-mix(in oklab,var(--char-color-primary)10%,transparent)}}.bg-primary\\/90{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/90{background-color:color-mix(in oklab,var(--char-color-primary)90%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\/5{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-500\\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.bg-red-500\\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-secondary{background-color:var(--char-color-secondary)}.bg-slate-500\\/10{background-color:#62748e1a}@supports (color:color-mix(in lab, red, red)){.bg-slate-500\\/10{background-color:color-mix(in oklab,var(--color-slate-500)10%,transparent)}}.bg-transparent{background-color:#0000}.bg-user-bubble-bg{background-color:var(--char-user-bubble-bg)}.bg-white{background-color:var(--color-white)}.bg-white\\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.bg-white\\/5{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.bg-white\\/8{background-color:#ffffff14}@supports (color:color-mix(in lab, red, red)){.bg-white\\/8{background-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.bg-white\\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.bg-white\\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\\/60{background-color:color-mix(in oklab,var(--color-white)60%,transparent)}}.bg-white\\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.bg-white\\/90{background-color:color-mix(in oklab,var(--color-white)90%,transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-700\\/50{background-color:#3f3f4680}@supports (color:color-mix(in lab, red, red)){.bg-zinc-700\\/50{background-color:color-mix(in oklab,var(--color-zinc-700)50%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\\[linear-gradient\\(to_top\\,var\\(--color-background\\)\\,transparent\\)\\]{background-image:linear-gradient(to top,var(--color-background),transparent)}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.fill-current{fill:currentColor}.fill-foreground{fill:var(--char-color-foreground)}.stroke-\\[1\\.5px\\]{stroke-width:1.5px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-0\\.5{padding-top:calc(var(--spacing)*.5)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\\.5{padding-top:calc(var(--spacing)*1.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-14{padding-top:calc(var(--spacing)*14)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-mono{font-family:var(--char-font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--char-font-size-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--char-font-size-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--char-font-size-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(--char-font-size-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.text-\\[15px\\]{font-size:15px}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-\\[21px\\]{--tw-leading:21px;line-height:21px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.wrap-break-word{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-assistant-bubble-text{color:var(--char-assistant-bubble-text)}.text-background{color:var(--char-color-background)}.text-blue-400{color:var(--color-blue-400)}.text-blue-400\\/60{color:#54a2ff99}@supports (color:color-mix(in lab, red, red)){.text-blue-400\\/60{color:color-mix(in oklab,var(--color-blue-400)60%,transparent)}}.text-blue-600{color:var(--color-blue-600)}.text-card-foreground{color:var(--char-color-card-foreground)}.text-code-text{color:var(--char-code-text)}.text-composer-text{color:var(--char-composer-text)}.text-destructive,.text-destructive\\/70{color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.text-destructive\\/70{color:color-mix(in oklab,var(--char-color-destructive)70%,transparent)}}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground,.text-foreground\\/70{color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\\/70{color:color-mix(in oklab,var(--char-color-foreground)70%,transparent)}}.text-foreground\\/80{color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\\/80{color:color-mix(in oklab,var(--char-color-foreground)80%,transparent)}}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground,.text-muted-foreground\\/70{color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\\/70{color:color-mix(in oklab,var(--char-color-muted-foreground)70%,transparent)}}.text-muted-foreground\\/80{color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\\/80{color:color-mix(in oklab,var(--char-color-muted-foreground)80%,transparent)}}.text-orange-600{color:var(--color-orange-600)}.text-popover-foreground{color:var(--char-color-popover-foreground)}.text-primary{color:var(--char-color-primary)}.text-primary-foreground{color:var(--char-color-primary-foreground)}.text-primary\\/80{color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.text-primary\\/80{color:color-mix(in oklab,var(--char-color-primary)80%,transparent)}}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--char-color-secondary-foreground)}.text-slate-600{color:var(--color-slate-600)}.text-slate-900{color:var(--color-slate-900)}.text-user-bubble-text{color:var(--char-user-bubble-text)}.text-white{color:var(--color-white)}.text-white\\/30{color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.text-white\\/30{color:color-mix(in oklab,var(--color-white)30%,transparent)}}.text-white\\/40{color:#fff6}@supports (color:color-mix(in lab, red, red)){.text-white\\/40{color:color-mix(in oklab,var(--color-white)40%,transparent)}}.text-white\\/50{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.text-white\\/50{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.text-white\\/60{color:#fff9}@supports (color:color-mix(in lab, red, red)){.text-white\\/60{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.text-white\\/70{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.text-white\\/70{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.text-white\\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-white\\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\\/90{color:color-mix(in oklab,var(--color-white)90%,transparent)}}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-700{color:var(--color-zinc-700)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-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)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.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)}.\\[box-shadow\\:inset_0_1px_2px_0_rgba\\(255\\,255\\,255\\,0\\.15\\)\\]{box-shadow:inset 0 1px 2px #ffffff26}.shadow-black\\/10{--tw-shadow-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.shadow-black\\/10{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)10%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-black\\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab, red, red)){.shadow-black\\/20{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)20%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-amber-500\\/30{--tw-ring-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.ring-amber-500\\/30{--tw-ring-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.ring-blue-500\\/25{--tw-ring-color:#3080ff40}@supports (color:color-mix(in lab, red, red)){.ring-blue-500\\/25{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)25%,transparent)}}.ring-border\\/20{--tw-ring-color:var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.ring-border\\/20{--tw-ring-color:color-mix(in oklab,var(--char-color-border)20%,transparent)}}.ring-emerald-400\\/30{--tw-ring-color:#00d2944d}@supports (color:color-mix(in lab, red, red)){.ring-emerald-400\\/30{--tw-ring-color:color-mix(in oklab,var(--color-emerald-400)30%,transparent)}}.ring-red-500\\/30{--tw-ring-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.ring-red-500\\/30{--tw-ring-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--char-color-background)}.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}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[transform\\,opacity\\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-75{transition-delay:75ms}.duration-\\(--animation-duration\\){--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.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-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-transform{will-change:transform}.delay-75{--tw-animation-delay:75ms;animation-delay:75ms}.fade-in-0{--tw-enter-opacity:0}.fill-mode-both{--tw-animation-fill-mode:both;animation-fill-mode:both}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.\\[animation-delay\\:150ms\\]{animation-delay:.15s}.\\[animation-delay\\:300ms\\]{animation-delay:.3s}.fade-in{--tw-enter-opacity:0}.paused{animation-play-state:paused}.running{animation-play-state:running}.slide-in-from-bottom-1{--tw-enter-translate-y:calc(1*var(--spacing))}.slide-in-from-bottom-2{--tw-enter-translate-y:calc(2*var(--spacing))}@media (hover:hover){.group-hover\\:scale-100:is(:where(.group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:animate-out:is(:where(.group\\/collapsible-content)[data-state=closed] *){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)}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:duration-\\(--animation-duration\\):is(:where(.group\\/collapsible-content)[data-state=closed] *){--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:fade-out-0:is(:where(.group\\/collapsible-content)[data-state=closed] *){--tw-exit-opacity:0}.group-data-\\[state\\=closed\\]\\/collapsible-content\\:slide-out-to-top-4:is(:where(.group\\/collapsible-content)[data-state=closed] *){--tw-exit-translate-y:calc(4*var(--spacing)*-1)}.group-data-\\[state\\=closed\\]\\/trigger\\:-rotate-90:is(:where(.group\\/trigger)[data-state=closed] *){rotate:-90deg}.group-data-\\[state\\=open\\]\\/collapsible-content\\:animate-in:is(:where(.group\\/collapsible-content)[data-state=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)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:animate-out:is(:where(.group\\/collapsible-content)[data-state=open] *){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)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:delay-\\[calc\\(var\\(--animation-duration\\)\\*0\\.75\\)\\]:is(:where(.group\\/collapsible-content)[data-state=open] *){transition-delay:calc(var(--animation-duration)*.75)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:duration-\\(--animation-duration\\):is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:delay-\\[calc\\(var\\(--animation-duration\\)\\*0\\.75\\)\\]:is(:where(.group\\/collapsible-content)[data-state=open] *){animation-delay:calc(var(--animation-duration)*.75);--tw-animation-delay:calc(var(--animation-duration)*.75)}.group-data-\\[state\\=open\\]\\/collapsible-content\\:fade-in-0:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-enter-opacity:0}.group-data-\\[state\\=open\\]\\/collapsible-content\\:fade-out-0:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-exit-opacity:0}.group-data-\\[state\\=open\\]\\/collapsible-content\\:fill-mode-forwards:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-animation-fill-mode:forwards;animation-fill-mode:forwards}.group-data-\\[state\\=open\\]\\/collapsible-content\\:slide-in-from-top-4:is(:where(.group\\/collapsible-content)[data-state=open] *){--tw-enter-translate-y:calc(4*var(--spacing)*-1)}.group-data-\\[state\\=open\\]\\/trigger\\:rotate-0:is(:where(.group\\/trigger)[data-state=open] *){rotate:none}.selection\\:bg-primary ::selection{background-color:var(--char-color-primary)}.selection\\:bg-primary::selection{background-color:var(--char-color-primary)}.selection\\:text-primary-foreground ::selection{color:var(--char-color-primary-foreground)}.selection\\:text-primary-foreground::selection{color:var(--char-color-primary-foreground)}.file\\:inline-flex::file-selector-button{display:inline-flex}.file\\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--char-font-size-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--char-color-foreground)}.placeholder\\:text-composer-placeholder::placeholder{color:var(--char-composer-placeholder)}.placeholder\\:text-muted-foreground::placeholder{color:var(--char-color-muted-foreground)}.placeholder\\:text-white\\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-white\\/40::placeholder{color:color-mix(in oklab,var(--color-white)40%,transparent)}}.first\\:mt-0:first-child{margin-top:calc(var(--spacing)*0)}.first\\:rounded-tl-lg:first-child{border-top-left-radius:var(--char-radius-lg)}.first\\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.last\\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\\:rounded-tr-lg:last-child{border-top-right-radius:var(--char-radius-lg)}.last\\:border-r:last-child{border-right-style:var(--tw-border-style);border-right-width:1px}.empty\\:hidden:empty{display:none}.focus-within\\:border-white\\/15:focus-within{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.focus-within\\:border-white\\/15:focus-within{border-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.focus-within\\:bg-white\\/10:focus-within{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.focus-within\\:bg-white\\/10:focus-within{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (hover:hover){.hover\\:border-amber-500:hover{border-color:var(--color-amber-500)}.hover\\:border-border:hover{border-color:var(--char-color-border)}.hover\\:border-red-500\\/50:hover{border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.hover\\:border-red-500\\/50:hover{border-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.hover\\:border-white\\/20:hover{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\\:border-white\\/20:hover{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\\:bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_30\\%\\,transparent\\)\\]:hover{background-color:rgb(var(--background))}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-\\[color-mix\\(in_oklab\\,rgb\\(var\\(--background\\)\\)_30\\%\\,transparent\\)\\]:hover{background-color:color-mix(in oklab,rgb(var(--background))30%,transparent)}}.hover\\:bg-accent:hover,.hover\\:bg-accent\\/50:hover{background-color:var(--char-color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/50:hover{background-color:color-mix(in oklab,var(--char-color-accent)50%,transparent)}}.hover\\:bg-amber-500\\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-amber-500\\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.hover\\:bg-amber-500\\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-amber-500\\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.hover\\:bg-amber-500\\/30:hover{background-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-amber-500\\/30:hover{background-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.hover\\:bg-blue-500\\/20:hover{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-blue-500\\/20:hover{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.hover\\:bg-destructive\\/15:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/15:hover{background-color:color-mix(in oklab,var(--char-color-destructive)15%,transparent)}}.hover\\:bg-destructive\\/20:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.hover\\:bg-destructive\\/90:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--char-color-destructive)90%,transparent)}}.hover\\:bg-emerald-500\\/5:hover{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-emerald-500\\/5:hover{background-color:color-mix(in oklab,var(--color-emerald-500)5%,transparent)}}.hover\\:bg-green-500\\/30:hover{background-color:#00c7584d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-green-500\\/30:hover{background-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.hover\\:bg-muted:hover{background-color:var(--char-color-muted)}.hover\\:bg-muted-foreground\\/15:hover{background-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted-foreground\\/15:hover{background-color:color-mix(in oklab,var(--char-color-muted-foreground)15%,transparent)}}.hover\\:bg-muted\\/50:hover{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab,var(--char-color-muted)50%,transparent)}}.hover\\:bg-muted\\/60:hover{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/60:hover{background-color:color-mix(in oklab,var(--char-color-muted)60%,transparent)}}.hover\\:bg-muted\\/70:hover{background-color:var(--char-color-muted)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/70:hover{background-color:color-mix(in oklab,var(--char-color-muted)70%,transparent)}}.hover\\:bg-orange-500\\/20:hover{background-color:#fe6e0033}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-orange-500\\/20:hover{background-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--char-color-primary)90%,transparent)}}.hover\\:bg-red-500\\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-red-500\\/20:hover{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.hover\\:bg-red-500\\/30:hover{background-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-red-500\\/30:hover{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.hover\\:bg-secondary\\/80:hover{background-color:var(--char-color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab,var(--char-color-secondary)80%,transparent)}}.hover\\:bg-white:hover{background-color:var(--color-white)}.hover\\:bg-white\\!:hover{background-color:var(--color-white)!important}.hover\\:bg-white\\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/5:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.hover\\:bg-white\\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.hover\\:bg-white\\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/15:hover{background-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.hover\\:bg-white\\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\\:bg-white\\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-white\\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}.hover\\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.hover\\:text-accent-foreground:hover{color:var(--char-color-accent-foreground)}.hover\\:text-amber-400:hover{color:var(--color-amber-400)}.hover\\:text-foreground:hover{color:var(--char-color-foreground)}.hover\\:text-primary\\/80:hover{color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\\:text-primary\\/80:hover{color:color-mix(in oklab,var(--char-color-primary)80%,transparent)}}.hover\\:text-red-200:hover{color:var(--color-red-200)}.hover\\:text-red-300:hover{color:var(--color-red-300)}.hover\\:text-red-400:hover{color:var(--color-red-400)}.hover\\:text-white:hover{color:var(--color-white)}.hover\\:text-white\\/50:hover{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/50:hover{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.hover\\:text-white\\/60:hover{color:#fff9}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/60:hover{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.hover\\:text-white\\/70:hover{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/70:hover{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.hover\\:text-white\\/80:hover{color:#fffc}@supports (color:color-mix(in lab, red, red)){.hover\\:text-white\\/80:hover{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.hover\\:text-zinc-600:hover{color:var(--color-zinc-600)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-75:hover{opacity:.75}.hover\\:opacity-100:hover{opacity:1}}.focus\\:bg-accent:focus{background-color:var(--char-color-accent)}.focus\\:text-accent-foreground:focus{color:var(--char-color-accent-foreground)}.focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\\:ring-ring:focus{--tw-ring-color:var(--char-color-ring)}.focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:border-ring:focus-visible{border-color:var(--char-color-ring)}.focus-visible\\:bg-muted:focus-visible{background-color:var(--char-color-muted)}.focus-visible\\:opacity-100:focus-visible{opacity:1}.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-blue-500:focus-visible{--tw-ring-color:var(--color-blue-500)}.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--char-color-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--char-color-ring)50%,transparent)}}.focus-visible\\:ring-white\\/30:focus-visible{--tw-ring-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-white\\/30:focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.focus-visible\\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\\:ring-offset-transparent:focus-visible{--tw-ring-offset-color:transparent}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\\:scale-\\[0\\.98\\]:active{scale:.98}.active\\:cursor-grabbing:active{cursor:grabbing}.active\\:bg-white\\/15:active{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.active\\:bg-white\\/15:active{background-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.active\\:bg-white\\/20:active{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.active\\:bg-white\\/20:active{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:invisible:disabled{visibility:hidden}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}.has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\\[textarea\\:focus-visible\\]\\:border-ring:has(:is(textarea:focus-visible)){border-color:var(--char-color-ring)}.has-\\[textarea\\:focus-visible\\]\\:ring-2:has(:is(textarea: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-\\[textarea\\:focus-visible\\]\\:ring-ring\\/20:has(:is(textarea:focus-visible)){--tw-ring-color:var(--char-color-ring)}@supports (color:color-mix(in lab, red, red)){.has-\\[textarea\\:focus-visible\\]\\:ring-ring\\/20:has(:is(textarea:focus-visible)){--tw-ring-color:color-mix(in oklab,var(--char-color-ring)20%,transparent)}}.has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\\[\\>svg\\]\\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\\[\\>svg\\]\\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--char-color-destructive)}.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--char-color-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(--char-color-destructive)20%,transparent)}}.data-floating\\:absolute[data-floating]{position:absolute}.data-floating\\:rounded-md[data-floating]{border-radius:var(--char-radius-md)}.data-floating\\:border[data-floating]{border-style:var(--tw-border-style);border-width:1px}.data-floating\\:bg-background[data-floating]{background-color:var(--char-color-background)}.data-floating\\:p-1[data-floating]{padding:calc(var(--spacing)*1)}.data-floating\\:shadow-sm[data-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)}.data-\\[active\\=true\\]\\:bg-muted[data-active=true]{background-color:var(--char-color-muted)}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[dragging\\=true\\]\\:border-dashed[data-dragging=true]{--tw-border-style:dashed;border-style:dashed}.data-\\[dragging\\=true\\]\\:border-ring[data-dragging=true]{border-color:var(--char-color-ring)}.data-\\[dragging\\=true\\]\\:bg-accent\\/50[data-dragging=true]{background-color:var(--char-color-accent)}@supports (color:color-mix(in lab, red, red)){.data-\\[dragging\\=true\\]\\:bg-accent\\/50[data-dragging=true]{background-color:color-mix(in oklab,var(--char-color-accent)50%,transparent)}}.data-\\[inset\\]\\:pl-8[data-inset]{padding-left:calc(var(--spacing)*8)}.data-\\[orientation\\=horizontal\\]\\:h-px[data-orientation=horizontal]{height:1px}.data-\\[orientation\\=horizontal\\]\\:w-full[data-orientation=horizontal]{width:100%}.data-\\[orientation\\=vertical\\]\\:h-full[data-orientation=vertical]{height:100%}.data-\\[orientation\\=vertical\\]\\:w-px[data-orientation=vertical]{width:1px}.data-\\[placeholder\\]\\:text-muted-foreground[data-placeholder]{color:var(--char-color-muted-foreground)}.data-\\[side\\=bottom\\]\\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\\[side\\=left\\]\\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\\[side\\=right\\]\\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\\[side\\=top\\]\\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\\[size\\=default\\]\\:h-9[data-size=default]{height:calc(var(--spacing)*9)}.data-\\[size\\=sm\\]\\:h-8[data-size=sm]{height:calc(var(--spacing)*8)}: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-2>*)[data-slot=select-value]{gap:calc(var(--spacing)*2)}.data-\\[state\\=closed\\]\\:pointer-events-none[data-state=closed]{pointer-events:none}.data-\\[state\\=closed\\]\\:animate-collapsible-up[data-state=closed]{animation:collapsible-up var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\\[state\\=closed\\]\\:animate-out[data-state=closed]{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-\\[state\\=closed\\]\\:duration-\\(--animation-duration\\)[data-state=closed]{--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.data-\\[state\\=closed\\]\\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\\[state\\=closed\\]\\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\\[state\\=closed\\]\\:fill-mode-forwards[data-state=closed]{--tw-animation-fill-mode:forwards;animation-fill-mode:forwards}.data-\\[state\\=closed\\]\\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\\[state\\=closed\\]\\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\\[state\\=closed\\]\\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\\[state\\=closed\\]\\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\\[state\\=closed\\]\\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\\[state\\=open\\]\\:animate-collapsible-down[data-state=open]{animation:collapsible-down var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\\[state\\=open\\]\\:animate-in[data-state=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\\=open\\]\\:bg-accent[data-state=open]{background-color:var(--char-color-accent)}.data-\\[state\\=open\\]\\:bg-secondary[data-state=open]{background-color:var(--char-color-secondary)}.data-\\[state\\=open\\]\\:text-accent-foreground[data-state=open]{color:var(--char-color-accent-foreground)}.data-\\[state\\=open\\]\\:text-muted-foreground[data-state=open]{color:var(--char-color-muted-foreground)}.data-\\[state\\=open\\]\\:duration-\\(--animation-duration\\)[data-state=open]{--tw-duration:var(--animation-duration);transition-duration:var(--animation-duration)}.data-\\[state\\=open\\]\\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\\[state\\=open\\]\\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\\[state\\=open\\]\\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\\[state\\=open\\]\\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\\[state\\=open\\]\\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\\[state\\=open\\]\\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\\[state\\=open\\]\\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\\[variant\\=destructive\\]\\:text-destructive[data-variant=destructive]{color:var(--char-color-destructive)}.data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--char-color-destructive)10%,transparent)}}.data-\\[variant\\=destructive\\]\\:focus\\:text-destructive[data-variant=destructive]:focus{color:var(--char-color-destructive)}.nth-\\[n\\+3\\]\\:hidden:nth-child(n+3){display:none}@media (prefers-reduced-motion:reduce){.motion-reduce\\:animate-none{animation:none}}@media (min-width:40rem){.sm\\:flex{display:flex}.sm\\:h-3{height:calc(var(--spacing)*3)}.sm\\:h-3\\.5{height:calc(var(--spacing)*3.5)}.sm\\:h-4{height:calc(var(--spacing)*4)}.sm\\:h-7{height:calc(var(--spacing)*7)}.sm\\:max-h-24{max-height:calc(var(--spacing)*24)}.sm\\:max-h-32{max-height:calc(var(--spacing)*32)}.sm\\:max-h-48{max-height:calc(var(--spacing)*48)}.sm\\:min-h-7{min-height:calc(var(--spacing)*7)}.sm\\:w-3{width:calc(var(--spacing)*3)}.sm\\:w-3\\.5{width:calc(var(--spacing)*3.5)}.sm\\:w-4{width:calc(var(--spacing)*4)}.sm\\:w-7{width:calc(var(--spacing)*7)}.sm\\:max-w-3xl{max-width:var(--container-3xl)}.sm\\:max-w-16{max-width:calc(var(--spacing)*16)}.sm\\:max-w-24{max-width:calc(var(--spacing)*24)}.sm\\:max-w-lg{max-width:var(--container-lg)}.sm\\:max-w-sm{max-width:var(--container-sm)}.sm\\:min-w-7{min-width:calc(var(--spacing)*7)}.sm\\:flex-row{flex-direction:row}.sm\\:justify-end{justify-content:flex-end}.sm\\:gap-1{gap:calc(var(--spacing)*1)}.sm\\:gap-1\\.5{gap:calc(var(--spacing)*1.5)}.sm\\:p-1{padding:calc(var(--spacing)*1)}.sm\\:p-1\\.5{padding:calc(var(--spacing)*1.5)}.sm\\:px-2{padding-inline:calc(var(--spacing)*2)}.sm\\:py-1{padding-block:calc(var(--spacing)*1)}.sm\\:text-left{text-align:left}.sm\\:opacity-0{opacity:0}@media (hover:hover){.sm\\:group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}}@media (min-width:48rem){.md\\:pb-6{padding-bottom:calc(var(--spacing)*6)}.md\\:text-sm{font-size:var(--char-font-size-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@container (min-width:28rem){.\\@md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\\@md\\:flex-col{flex-direction:column}.\\@md\\:nth-\\[n\\+3\\]\\:block:nth-child(n+3){display:block}}.dark\\:border-input:is(.dark *){border-color:var(--char-color-input)}.dark\\:border-muted-foreground\\/15:is(.dark *){border-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.dark\\:border-muted-foreground\\/15:is(.dark *){border-color:color-mix(in oklab,var(--char-color-muted-foreground)15%,transparent)}}.dark\\:border-zinc-600:is(.dark *){border-color:var(--color-zinc-600)}.dark\\:border-zinc-700\\/80:is(.dark *){border-color:#3f3f46cc}@supports (color:color-mix(in lab, red, red)){.dark\\:border-zinc-700\\/80:is(.dark *){border-color:color-mix(in oklab,var(--color-zinc-700)80%,transparent)}}.dark\\:bg-amber-500\\/10:is(.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-amber-500\\/10:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.dark\\:bg-blue-500\\/10:is(.dark *){background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-blue-500\\/10:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark\\:bg-destructive\\/5:is(.dark *){background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/5:is(.dark *){background-color:color-mix(in oklab,var(--char-color-destructive)5%,transparent)}}.dark\\:bg-destructive\\/60:is(.dark *){background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/60:is(.dark *){background-color:color-mix(in oklab,var(--char-color-destructive)60%,transparent)}}.dark\\:bg-emerald-500\\/12:is(.dark *){background-color:#00bb7f1f}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-emerald-500\\/12:is(.dark *){background-color:color-mix(in oklab,var(--color-emerald-500)12%,transparent)}}.dark\\:bg-input\\/30:is(.dark *){background-color:var(--char-color-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab,var(--char-color-input)30%,transparent)}}.dark\\:bg-muted:is(.dark *){background-color:var(--char-color-muted)}.dark\\:bg-red-500\\/10:is(.dark *){background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-red-500\\/10:is(.dark *){background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.dark\\:bg-zinc-700:is(.dark *){background-color:var(--color-zinc-700)}.dark\\:bg-zinc-800:is(.dark *){background-color:var(--color-zinc-800)}.dark\\:stroke-\\[2\\.5px\\]:is(.dark *){stroke-width:2.5px}.dark\\:text-amber-300:is(.dark *){color:var(--color-amber-300)}.dark\\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\\:text-emerald-300:is(.dark *){color:var(--color-emerald-300)}.dark\\:text-foreground:is(.dark *){color:var(--char-color-foreground)}.dark\\:text-orange-400:is(.dark *){color:var(--color-orange-400)}.dark\\:text-red-200:is(.dark *){color:var(--color-red-200)}.dark\\:text-red-300:is(.dark *){color:var(--color-red-300)}.dark\\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\\:text-slate-300:is(.dark *){color:var(--color-slate-300)}.dark\\:text-zinc-200:is(.dark *){color:var(--color-zinc-200)}.dark\\:text-zinc-400:is(.dark *){color:var(--color-zinc-400)}.dark\\:shadow-black\\/30:is(.dark *){--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.dark\\:shadow-black\\/30:is(.dark *){--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)30%,transparent)var(--tw-shadow-alpha),transparent)}}.dark\\:ring-amber-400\\/30:is(.dark *){--tw-ring-color:#fcbb004d}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-amber-400\\/30:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-amber-400)30%,transparent)}}.dark\\:ring-blue-400\\/25:is(.dark *){--tw-ring-color:#54a2ff40}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-blue-400\\/25:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-blue-400)25%,transparent)}}.dark\\:ring-border\\/30:is(.dark *){--tw-ring-color:var(--char-color-border)}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-border\\/30:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--char-color-border)30%,transparent)}}.dark\\:ring-emerald-500\\/25:is(.dark *){--tw-ring-color:#00bb7f40}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-emerald-500\\/25:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-emerald-500)25%,transparent)}}.dark\\:ring-red-400\\/30:is(.dark *){--tw-ring-color:#ff65684d}@supports (color:color-mix(in lab, red, red)){.dark\\:ring-red-400\\/30:is(.dark *){--tw-ring-color:color-mix(in oklab,var(--color-red-400)30%,transparent)}}@media (hover:hover){.dark\\:hover\\:bg-accent\\/50:is(.dark *):hover{background-color:var(--char-color-accent)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-accent\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--char-color-accent)50%,transparent)}}.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--char-color-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--char-color-input)50%,transparent)}}.dark\\:hover\\:bg-muted-foreground\\/30:is(.dark *):hover{background-color:var(--char-color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-muted-foreground\\/30:is(.dark *):hover{background-color:color-mix(in oklab,var(--char-color-muted-foreground)30%,transparent)}}.dark\\:hover\\:bg-zinc-600:is(.dark *):hover{background-color:var(--color-zinc-600)}.dark\\:hover\\:bg-zinc-700:is(.dark *):hover{background-color:var(--color-zinc-700)}.dark\\:hover\\:text-zinc-200:is(.dark *):hover{color:var(--color-zinc-200)}}.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--char-color-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(--char-color-destructive)40%,transparent)}}.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--char-color-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(--char-color-destructive)40%,transparent)}}.dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20:is(.dark *)[data-variant=destructive]:focus{background-color:color-mix(in oklab,var(--char-color-destructive)20%,transparent)}}.\\[\\&_p\\]\\:-mb-2 p{margin-bottom:calc(var(--spacing)*-2)}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&_svg\\]\\:text-background svg{color:var(--char-color-background)}.\\[\\&_svg\\]\\:text-black svg{color:var(--color-black)}@media (hover:hover){.hover\\:\\[\\&_svg\\]\\:text-destructive:hover svg{color:var(--char-color-destructive)}}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]){color:var(--char-color-muted-foreground)}.\\[\\.border-b\\]\\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\\[\\.border-t\\]\\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}.\\[\\[align\\=center\\]\\]\\:text-center[align=center]{text-align:center}.\\[\\[align\\=right\\]\\]\\:text-right[align=right]{text-align:right}: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(.data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive[data-variant=destructive]>*):is(svg){color:var(--char-color-destructive)!important}.\\[\\&\\:last-child\\>td\\:first-child\\]\\:rounded-bl-lg:last-child>td:first-child{border-bottom-left-radius:var(--char-radius-lg)}.\\[\\&\\:last-child\\>td\\:last-child\\]\\:rounded-br-lg:last-child>td:last-child{border-bottom-right-radius:var(--char-radius-lg)}.\\[\\&\\:where\\(\\>\\*\\)\\]\\:col-start-2:where(){grid-column-start:2}.only\\:\\[\\&\\>\\#attachment-tile\\]\\:size-24:only-child>#attachment-tile{width:calc(var(--spacing)*24);height:calc(var(--spacing)*24)}.\\[\\&\\>a\\]\\:text-xs>a{font-size:var(--char-font-size-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\[\\&\\>a\\]\\:no-underline>a{text-decoration-line:none}.\\[\\&\\>button\\]\\:rounded-full>button{border-radius:3.40282e38px}.\\[\\&\\>button\\]\\:bg-foreground\\/60>button{background-color:var(--char-color-foreground)}@supports (color:color-mix(in lab, red, red)){.\\[\\&\\>button\\]\\:bg-foreground\\/60>button{background-color:color-mix(in oklab,var(--char-color-foreground)60%,transparent)}}.\\[\\&\\>button\\]\\:p-1>button{padding:calc(var(--spacing)*1)}.\\[\\&\\>button\\]\\:opacity-100>button{opacity:1}.\\[\\&\\>button\\]\\:ring-0\\!>button{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}@media (hover:hover){.\\[\\&\\>button\\]\\:hover\\:\\[\\&_svg\\]\\:text-destructive>button:hover svg{color:var(--char-color-destructive)}}.\\[\\&\\>li\\]\\:mt-0\\.5>li{margin-top:calc(var(--spacing)*.5)}.\\[\\&\\>li\\]\\:mt-2>li{margin-top:calc(var(--spacing)*2)}.\\[\\&\\>span\\]\\:text-xs>span{font-size:var(--char-font-size-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}.\\[\\&\\>svg\\]\\:size-3>svg{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}@media (hover:hover){a.\\[a\\&\\]\\:hover\\:bg-accent:hover{background-color:var(--char-color-accent)}a.\\[a\\&\\]\\:hover\\:bg-destructive\\/90:hover{background-color:var(--char-color-destructive)}@supports (color:color-mix(in lab, red, red)){a.\\[a\\&\\]\\:hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--char-color-destructive)90%,transparent)}}a.\\[a\\&\\]\\:hover\\:bg-primary\\/90:hover{background-color:var(--char-color-primary)}@supports (color:color-mix(in lab, red, red)){a.\\[a\\&\\]\\:hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--char-color-primary)90%,transparent)}}a.\\[a\\&\\]\\:hover\\:bg-secondary\\/90:hover{background-color:var(--char-color-secondary)}@supports (color:color-mix(in lab, red, red)){a.\\[a\\&\\]\\:hover\\:bg-secondary\\/90:hover{background-color:color-mix(in oklab,var(--char-color-secondary)90%,transparent)}}a.\\[a\\&\\]\\:hover\\:text-accent-foreground:hover{color:var(--char-color-accent-foreground)}}}@keyframes aui-pulse{50%{opacity:.5}}:where(.aui-md[data-status=running]):empty:after,:where(.aui-md[data-status=running])>:where(:not(ol):not(ul):not(pre)):last-child:after,:where(.aui-md[data-status=running])>pre:last-child code:after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child):after{--aui-content:\"●\";content:var(--aui-content);margin-left:.25rem;margin-right:.25rem;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;animation:2s cubic-bezier(.4,0,.6,1) infinite aui-pulse}@keyframes char-shimmer{0%{transform:translate(-100%)}to{transform:translate(200%)}}@keyframes char-subtle-pulse{0%,to{opacity:1}50%{opacity:.85}}@keyframes char-slide-down{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes char-fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes char-gradient-shift{0%,to{transform:translate(0%)translateY(0%)}25%{transform:translate(100%)translateY(100%)}50%{transform:translate(100%)translateY(0%)}75%{transform:translate(0%)translateY(100%)}}@keyframes char-float{0%,to{transform:translateY(0)translate(0)}33%{transform:translateY(-30px)translate(20px)}66%{transform:translateY(20px)translate(-20px)}}@keyframes char-float-delayed{0%,to{transform:translateY(0)translate(0)}33%{transform:translateY(30px)translate(-30px)}66%{transform:translateY(-20px)translate(20px)}}@keyframes char-border-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes char-pulse-success{0%,to{box-shadow:0 0 0 0 color-mix(in oklch,var(--char-color-success),transparent 60%)}50%{box-shadow:0 0 0 8px #0000}}@keyframes char-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}@keyframes char-pulse-glow{0%,to{box-shadow:0 0 20px color-mix(in oklch,var(--char-color-primary),transparent 90%)}50%{box-shadow:0 0 30px color-mix(in oklch,var(--char-color-primary),transparent 80%)}}@keyframes char-gradient-x{0%,to{background-position:0%}50%{background-position:100%}}@keyframes char-glass-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes char-aui-pulse{50%{opacity:.5}}.char-no-scrollbar::-webkit-scrollbar{display:none}.char-no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}@media (hover:none){.char-scrollbar-thin{scrollbar-width:none}.char-scrollbar-thin::-webkit-scrollbar{display:none}}.aui-md,.aui-user-message-content{font-size:var(--text-base)}.aui-md{line-height:1.5}.aui-md p{margin-bottom:.75rem;line-height:1.5}.aui-md ul,.aui-md ol{margin-top:.5rem;margin-bottom:.75rem;padding-left:1.25rem}.aui-md li{margin-top:.25rem;margin-bottom:.25rem}.aui-md li p{margin-bottom:.25rem}.aui-md h1,.aui-md h2,.aui-md h3,.aui-md h4{margin-top:1rem;margin-bottom:.5rem}.aui-md pre{margin-top:.5rem;margin-bottom:.75rem}:where(.aui-md[data-status=running]):empty:after,:where(.aui-md[data-status=running])>:where(:not(ol):not(ul):not(pre)):last-child:after,:where(.aui-md[data-status=running])>pre:last-child code:after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child:not(:has(*>li))):after,:where(.aui-md[data-status=running])>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child)>:where(:is(ol,ul):last-child)>:where(li:last-child):after{font-family:var(--char-font-sans);--aui-content:\"●\";content:var(--aui-content);margin-left:.25rem;margin-right:.25rem;animation:2s cubic-bezier(.4,0,.6,1) infinite char-aui-pulse}@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))}}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height,var(--bits-collapsible-content-height,var(--reka-collapsible-content-height,var(--kb-collapsible-content-height,auto))))}}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height,var(--bits-collapsible-content-height,var(--reka-collapsible-content-height,var(--kb-collapsible-content-height,auto))))}to{height:0}}";
|
|
10231
11074
|
|
|
10232
11075
|
//#endregion
|
|
10233
11076
|
//#region src/web-component.tsx
|
|
@@ -10240,24 +11083,36 @@ const WEBMCP_SHADOW_STYLES = "/*! tailwindcss v4.1.18 | MIT License | https://ta
|
|
|
10240
11083
|
* Styles are isolated by default using Shadow DOM. Customize appearance
|
|
10241
11084
|
* via CSS variables on the host element.
|
|
10242
11085
|
*
|
|
10243
|
-
*
|
|
10244
|
-
* ```tsx
|
|
10245
|
-
* // Use your existing IDP token - no additional login needed
|
|
10246
|
-
* const { session } = useOktaAuth() // or Azure, Auth0, Google, etc.
|
|
11086
|
+
* ## Authentication (Imperative API)
|
|
10247
11087
|
*
|
|
10248
|
-
*
|
|
10249
|
-
*
|
|
11088
|
+
* Use the `connect()` method for secure authentication. Tokens are stored
|
|
11089
|
+
* as JavaScript properties (never exposed as DOM attributes).
|
|
10250
11090
|
*
|
|
10251
|
-
* @example React
|
|
11091
|
+
* @example Imperative authentication (React)
|
|
10252
11092
|
* ```tsx
|
|
10253
|
-
* import '
|
|
11093
|
+
* import { useEffect, useRef } from 'react'
|
|
11094
|
+
* import '@mcp-b/embedded-agent/web-component'
|
|
10254
11095
|
*
|
|
10255
11096
|
* function App() {
|
|
10256
11097
|
* const { session } = useOktaAuth()
|
|
10257
|
-
*
|
|
11098
|
+
* const agentRef = useRef<WebMCPAgentElement>(null)
|
|
11099
|
+
*
|
|
11100
|
+
* useEffect(() => {
|
|
11101
|
+
* if (agentRef.current && session?.idToken) {
|
|
11102
|
+
* agentRef.current.connect({ idToken: session.idToken })
|
|
11103
|
+
* }
|
|
11104
|
+
* }, [session?.idToken])
|
|
11105
|
+
*
|
|
11106
|
+
* return <webmcp-agent ref={agentRef} />
|
|
10258
11107
|
* }
|
|
10259
11108
|
* ```
|
|
10260
11109
|
*
|
|
11110
|
+
* @example Vanilla JS
|
|
11111
|
+
* ```js
|
|
11112
|
+
* const agent = document.querySelector('webmcp-agent')
|
|
11113
|
+
* agent.connect({ idToken: 'eyJhbGciOi...' })
|
|
11114
|
+
* ```
|
|
11115
|
+
*
|
|
10261
11116
|
* @example Anonymous (dev mode - localhost only)
|
|
10262
11117
|
* ```tsx
|
|
10263
11118
|
* // No auth token = anonymous mode (requires API key, localhost only)
|
|
@@ -10293,34 +11148,37 @@ const getDefaultApiBase = (useLocalApi) => {
|
|
|
10293
11148
|
* Just pass your IDP token and you're done. Everything else is handled.
|
|
10294
11149
|
*/
|
|
10295
11150
|
const EmbeddedAgent = (t0) => {
|
|
10296
|
-
const $ = c(
|
|
10297
|
-
const { authToken, open, devMode, enableDebugTools: t1, className, onClose } = t0;
|
|
11151
|
+
const $ = c(14);
|
|
11152
|
+
const { authToken, ticketAuth, open, devMode, enableDebugTools: t1, className, onClose } = t0;
|
|
10298
11153
|
const enableDebugTools = t1 === void 0 ? false : t1;
|
|
10299
11154
|
let apiBase;
|
|
10300
|
-
if ($[0] !== authToken || $[1] !== devMode) {
|
|
11155
|
+
if ($[0] !== authToken || $[1] !== devMode || $[2] !== ticketAuth) {
|
|
10301
11156
|
apiBase = getDefaultApiBase(devMode?.useLocalApi);
|
|
10302
|
-
const authMode = authToken ? "sso-first" : "anonymous";
|
|
11157
|
+
const authMode = ticketAuth ? "ticket" : authToken ? "sso-first" : "anonymous";
|
|
10303
11158
|
if (typeof window !== "undefined") console.debug("[WebMCP] Initialized", {
|
|
10304
11159
|
hasAuthToken: !!authToken,
|
|
11160
|
+
hasTicketAuth: !!ticketAuth,
|
|
10305
11161
|
authMode,
|
|
10306
11162
|
mode: devMode ? "development" : "production",
|
|
10307
11163
|
apiBase
|
|
10308
11164
|
});
|
|
10309
11165
|
$[0] = authToken;
|
|
10310
11166
|
$[1] = devMode;
|
|
10311
|
-
$[2] =
|
|
10312
|
-
|
|
11167
|
+
$[2] = ticketAuth;
|
|
11168
|
+
$[3] = apiBase;
|
|
11169
|
+
} else apiBase = $[3];
|
|
10313
11170
|
const voiceEnabled = !devMode || !!devMode.openaiApiKey;
|
|
10314
11171
|
const anthropicApiKey = devMode?.anthropicApiKey;
|
|
10315
11172
|
const t2 = voiceEnabled ? `${apiBase}/api/realtime/session` : void 0;
|
|
10316
11173
|
const t3 = className ?? "h-full w-full";
|
|
10317
11174
|
let t4;
|
|
10318
|
-
if ($[
|
|
11175
|
+
if ($[4] !== anthropicApiKey || $[5] !== apiBase || $[6] !== authToken || $[7] !== enableDebugTools || $[8] !== onClose || $[9] !== open || $[10] !== t2 || $[11] !== t3 || $[12] !== ticketAuth) {
|
|
10319
11176
|
t4 = /* @__PURE__ */ jsx(ShadowRoot, {
|
|
10320
11177
|
styles: WEBMCP_SHADOW_STYLES,
|
|
10321
11178
|
children: /* @__PURE__ */ jsx(AgentThread, {
|
|
10322
11179
|
apiBase,
|
|
10323
11180
|
authToken,
|
|
11181
|
+
ticketAuth,
|
|
10324
11182
|
anthropicApiKey,
|
|
10325
11183
|
tokenEndpoint: t2,
|
|
10326
11184
|
autoConnectLocal: true,
|
|
@@ -10330,31 +11188,116 @@ const EmbeddedAgent = (t0) => {
|
|
|
10330
11188
|
onClose
|
|
10331
11189
|
})
|
|
10332
11190
|
});
|
|
10333
|
-
$[
|
|
10334
|
-
$[
|
|
10335
|
-
$[
|
|
10336
|
-
$[
|
|
10337
|
-
$[
|
|
10338
|
-
$[
|
|
10339
|
-
$[
|
|
10340
|
-
$[
|
|
10341
|
-
$[
|
|
10342
|
-
|
|
11191
|
+
$[4] = anthropicApiKey;
|
|
11192
|
+
$[5] = apiBase;
|
|
11193
|
+
$[6] = authToken;
|
|
11194
|
+
$[7] = enableDebugTools;
|
|
11195
|
+
$[8] = onClose;
|
|
11196
|
+
$[9] = open;
|
|
11197
|
+
$[10] = t2;
|
|
11198
|
+
$[11] = t3;
|
|
11199
|
+
$[12] = ticketAuth;
|
|
11200
|
+
$[13] = t4;
|
|
11201
|
+
} else t4 = $[13];
|
|
10343
11202
|
return t4;
|
|
10344
11203
|
};
|
|
10345
11204
|
/**
|
|
10346
|
-
* Web Component
|
|
11205
|
+
* Base Web Component from r2wc
|
|
10347
11206
|
*
|
|
10348
11207
|
* Converts EmbeddedAgent to a <webmcp-agent> custom element.
|
|
10349
|
-
* Attributes map to props in kebab-case (
|
|
11208
|
+
* Attributes map to props in kebab-case (e.g., dev-mode -> devMode).
|
|
11209
|
+
* Note: Auth props (authToken, ticketAuth) are internal only - use connect() method.
|
|
10350
11210
|
*/
|
|
10351
|
-
const
|
|
11211
|
+
const BaseWebMCPAgentElement = r2wc(EmbeddedAgent, { props: {
|
|
10352
11212
|
authToken: "string",
|
|
11213
|
+
ticketAuth: "json",
|
|
10353
11214
|
open: "boolean",
|
|
10354
11215
|
devMode: "json",
|
|
10355
11216
|
enableDebugTools: "boolean"
|
|
10356
11217
|
} });
|
|
10357
11218
|
/**
|
|
11219
|
+
* Extended Web Component with secure connect() method
|
|
11220
|
+
*
|
|
11221
|
+
* The connect() method allows passing the auth token imperatively without
|
|
11222
|
+
* exposing it as a DOM attribute. This prevents token leakage via:
|
|
11223
|
+
* - Session replay tools (e.g., FullStory, LogRocket)
|
|
11224
|
+
* - Error monitoring (e.g., Sentry, DataDog)
|
|
11225
|
+
* - DOM snapshots and inspection
|
|
11226
|
+
* - Browser extensions
|
|
11227
|
+
*
|
|
11228
|
+
* @example
|
|
11229
|
+
* ```ts
|
|
11230
|
+
* const agent = document.querySelector('webmcp-agent')
|
|
11231
|
+
* agent.connect({ idToken: 'eyJhbGciOi...' })
|
|
11232
|
+
* ```
|
|
11233
|
+
*/
|
|
11234
|
+
var WebMCPAgentElement = class extends BaseWebMCPAgentElement {
|
|
11235
|
+
/**
|
|
11236
|
+
* Connect to the Char agent with authentication.
|
|
11237
|
+
*
|
|
11238
|
+
* The token is stored as a JavaScript property (not as a DOM attribute),
|
|
11239
|
+
* preventing exposure to DOM inspection and session replay tools.
|
|
11240
|
+
* This is the recommended way to authenticate.
|
|
11241
|
+
*
|
|
11242
|
+
* @param options.idToken - IDP token (ID token) for authentication
|
|
11243
|
+
* @returns true if connection was initiated, false if idToken was missing
|
|
11244
|
+
*
|
|
11245
|
+
* @example
|
|
11246
|
+
* ```ts
|
|
11247
|
+
* // Vanilla JS
|
|
11248
|
+
* const agent = document.querySelector('webmcp-agent')
|
|
11249
|
+
* const success = agent.connect({ idToken: session.idToken })
|
|
11250
|
+
* if (!success) {
|
|
11251
|
+
* console.error('Failed to connect - missing token')
|
|
11252
|
+
* }
|
|
11253
|
+
*
|
|
11254
|
+
* // React with ref
|
|
11255
|
+
* const agentRef = useRef(null)
|
|
11256
|
+
* useEffect(() => {
|
|
11257
|
+
* agentRef.current?.connect({ idToken: session.idToken })
|
|
11258
|
+
* }, [session.idToken])
|
|
11259
|
+
* ```
|
|
11260
|
+
*/
|
|
11261
|
+
connect(options) {
|
|
11262
|
+
if (!options?.idToken && !options?.ticketAuth) {
|
|
11263
|
+
console.error("[WebMCP] connect() called without idToken or ticketAuth - authentication cannot proceed");
|
|
11264
|
+
this.dispatchEvent(new CustomEvent("char-error", {
|
|
11265
|
+
detail: {
|
|
11266
|
+
code: "MISSING_TOKEN",
|
|
11267
|
+
message: "connect() requires either idToken or ticketAuth parameter"
|
|
11268
|
+
},
|
|
11269
|
+
bubbles: true,
|
|
11270
|
+
composed: true
|
|
11271
|
+
}));
|
|
11272
|
+
return false;
|
|
11273
|
+
}
|
|
11274
|
+
if (options?.idToken && options?.ticketAuth) console.warn("[WebMCP] connect() called with both idToken and ticketAuth - using ticketAuth");
|
|
11275
|
+
const self = this;
|
|
11276
|
+
if (options.ticketAuth) {
|
|
11277
|
+
self.ticketAuth = options.ticketAuth;
|
|
11278
|
+
self.authToken = void 0;
|
|
11279
|
+
} else if (options.idToken) {
|
|
11280
|
+
self.authToken = options.idToken;
|
|
11281
|
+
self.ticketAuth = void 0;
|
|
11282
|
+
}
|
|
11283
|
+
return true;
|
|
11284
|
+
}
|
|
11285
|
+
/**
|
|
11286
|
+
* Disconnect from the Char agent.
|
|
11287
|
+
* Clears the authentication token.
|
|
11288
|
+
* @returns true if disconnection succeeded, false if an error occurred
|
|
11289
|
+
*/
|
|
11290
|
+
disconnect() {
|
|
11291
|
+
try {
|
|
11292
|
+
this.authToken = void 0;
|
|
11293
|
+
return true;
|
|
11294
|
+
} catch (error) {
|
|
11295
|
+
console.error("[WebMCP] Failed to disconnect:", error);
|
|
11296
|
+
return false;
|
|
11297
|
+
}
|
|
11298
|
+
}
|
|
11299
|
+
};
|
|
11300
|
+
/**
|
|
10358
11301
|
* Register the <webmcp-agent> custom element
|
|
10359
11302
|
*
|
|
10360
11303
|
* Called automatically when importing this module.
|