gencow 0.1.246 → 0.1.248
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/bin/gencow.mjs +1 -0
- package/core/index.js +238 -66
- package/core/package.json +1 -1
- package/dashboard/assets/index-C6ShUtAY.css +1 -0
- package/dashboard/assets/index-CNlUa_9S.js +521 -0
- package/dashboard/index.html +2 -2
- package/lib/app-command.mjs +138 -7
- package/lib/app-create-response.d.mts +3 -0
- package/lib/app-delete-diagnostic.mjs +34 -2
- package/lib/app-diagnostics.mjs +15 -0
- package/lib/app-response-error.mjs +149 -1
- package/lib/cli-artifact-guard.mjs +1 -0
- package/lib/cli-dev-runtime.mjs +5 -5
- package/lib/cli-project-runtime.mjs +3 -2
- package/lib/cli-version-check.mjs +2 -1
- package/lib/codegen-command.mjs +12 -8
- package/lib/dashboard-assets.mjs +22 -0
- package/lib/deploy-admission-response.mjs +12 -0
- package/lib/deploy-auditor.mjs +4 -2
- package/lib/deploy-command.mjs +126 -3
- package/lib/deploy-correlation-diagnostic.mjs +3 -2
- package/lib/deploy-failure-diagnostic.mjs +144 -9
- package/lib/deploy-package-runtime.mjs +102 -95
- package/lib/deploy-project-config.mjs +35 -0
- package/lib/deploy-receipt-store.mjs +295 -4
- package/lib/deploy-release-receipt.mjs +166 -0
- package/lib/deploy-rollback.mjs +99 -0
- package/lib/deploy-runtime-asset-audit.mjs +81 -0
- package/lib/deploy-runtime.mjs +12 -70
- package/lib/deploy-static-fullstack-runtime.mjs +161 -59
- package/lib/deployment-admission-retry.mjs +10 -4
- package/lib/deployment-operation-poll.mjs +23 -1
- package/lib/dev-cloud-bundle.mjs +11 -0
- package/lib/dev-local-command.mjs +14 -3
- package/lib/env-command.mjs +24 -5
- package/lib/init-command.d.mts +30 -0
- package/lib/jobs-command.d.mts +14 -0
- package/lib/jobs-command.mjs +51 -7
- package/lib/platform-client.d.mts +20 -0
- package/lib/runtime-crash-parent-diagnostic.mjs +12 -0
- package/lib/static-deploy-command.mjs +38 -29
- package/package.json +4 -4
- package/runtime/config.mjs +6 -3
- package/runtime/crash-parent-diagnostic.mjs +208 -0
- package/runtime/server.mjs +110785 -69930
- package/runtime/tooling.mjs +104 -31
- package/scripts/bundle-internal.mjs +6 -2
- package/scripts/bundle-server.mjs +4 -12
- package/scripts/server-private-database-bundle.mjs +34 -0
- package/dashboard/assets/index-BIg8EAY8.css +0 -1
- package/dashboard/assets/index-CcD-YPfN.js +0 -408
package/bin/gencow.mjs
CHANGED
package/core/index.js
CHANGED
|
@@ -314,17 +314,30 @@ function buildWakeAppBootFailedResult(error) {
|
|
|
314
314
|
const publicMessage = typeof metadata.publicMessage === "string" && metadata.publicMessage.length <= 200 ? metadata.publicMessage : message;
|
|
315
315
|
const reasonCode = typeof metadata.reasonCode === "string" && /^[a-z][a-z0-9_]{2,80}$/.test(metadata.reasonCode) ? metadata.reasonCode : void 0;
|
|
316
316
|
const correlationId = typeof metadata.correlationId === "string" && /^rt_[A-Za-z0-9_-]{8,80}$/.test(metadata.correlationId) ? metadata.correlationId : void 0;
|
|
317
|
+
const safeCode = (value) => typeof value === "string" && /^[A-Z][A-Z0-9_]{2,99}$/.test(value) ? value : void 0;
|
|
318
|
+
const operationId = typeof metadata.operationId === "string" && /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(metadata.operationId) ? metadata.operationId : void 0;
|
|
319
|
+
const operationState = metadata.operationState === "completed" || metadata.operationState === "failed" ? metadata.operationState : void 0;
|
|
317
320
|
return {
|
|
318
321
|
ok: false,
|
|
319
322
|
status: "boot_failed",
|
|
320
323
|
error: publicMessage,
|
|
324
|
+
...typeof metadata.hint === "string" && metadata.hint.length <= 500 ? { hint: metadata.hint } : {},
|
|
325
|
+
...typeof metadata.stage === "string" && /^[a-z][a-z0-9_]{2,40}$/.test(metadata.stage) ? { stage: metadata.stage } : {},
|
|
326
|
+
...typeof metadata.nextAction === "string" && metadata.nextAction.length <= 200 ? { nextAction: metadata.nextAction } : {},
|
|
327
|
+
...typeof metadata.stateChanged === "boolean" ? { stateChanged: metadata.stateChanged } : {},
|
|
328
|
+
...Number.isSafeInteger(metadata.retryAfterSec) && Number(metadata.retryAfterSec) > 0 ? { retryAfterSec: Number(metadata.retryAfterSec) } : {},
|
|
329
|
+
...typeof metadata.retryCondition === "string" && metadata.retryCondition.length <= 500 ? { retryCondition: metadata.retryCondition } : {},
|
|
321
330
|
...reasonCode ? { reasonCode } : {},
|
|
322
331
|
...typeof metadata.retryable === "boolean" ? { retryable: metadata.retryable } : {},
|
|
323
|
-
...correlationId ? { correlationId } : {}
|
|
332
|
+
...correlationId ? { correlationId } : {},
|
|
333
|
+
...operationId ? { operationId } : {},
|
|
334
|
+
...operationState ? { operationState } : {},
|
|
335
|
+
...metadata.terminalResultCode === null ? { terminalResultCode: null } : safeCode(metadata.terminalResultCode) ? { terminalResultCode: safeCode(metadata.terminalResultCode) } : {},
|
|
336
|
+
...metadata.lastFailureCode === null ? { lastFailureCode: null } : safeCode(metadata.lastFailureCode) ? { lastFailureCode: safeCode(metadata.lastFailureCode) } : {}
|
|
324
337
|
};
|
|
325
338
|
}
|
|
326
339
|
function isWakeAppDeferredResult(result) {
|
|
327
|
-
return !result.ok && (result.status === "capacity_rejected" || result.status === "queue_timeout");
|
|
340
|
+
return !result.ok && (result.status === "capacity_rejected" || result.status === "queue_timeout" || result.status === "convergence_pending");
|
|
328
341
|
}
|
|
329
342
|
|
|
330
343
|
// ../core/src/platform-capacity-profile.ts
|
|
@@ -2243,11 +2256,11 @@ async function countWorkflowV1Backlog(db, workflowName) {
|
|
|
2243
2256
|
pendingByName: numberFrom(row?.pending_by_name)
|
|
2244
2257
|
};
|
|
2245
2258
|
}
|
|
2246
|
-
async function countWorkflowBacklog(db, workflowName) {
|
|
2259
|
+
async function countWorkflowBacklog(db, workflowName, requireV2 = false) {
|
|
2247
2260
|
try {
|
|
2248
2261
|
return await countWorkflowV2Backlog(db, workflowName);
|
|
2249
2262
|
} catch (error) {
|
|
2250
|
-
if (!isMissingWorkflowV2SchemaError(error)) throw error;
|
|
2263
|
+
if (!isMissingWorkflowV2SchemaError(error) || requireV2) throw error;
|
|
2251
2264
|
return countWorkflowV1Backlog(db, workflowName);
|
|
2252
2265
|
}
|
|
2253
2266
|
}
|
|
@@ -2288,7 +2301,7 @@ async function applyWorkflowStartAdmission(options) {
|
|
|
2288
2301
|
});
|
|
2289
2302
|
}
|
|
2290
2303
|
await acquireWorkflowStartAdmissionLock(options.db);
|
|
2291
|
-
const counts = await countWorkflowBacklog(options.db, options.workflowName);
|
|
2304
|
+
const counts = await countWorkflowBacklog(options.db, options.workflowName, options.requireV2);
|
|
2292
2305
|
if (counts.pending >= policy.pendingPerApp) {
|
|
2293
2306
|
throw new JobAdmissionError("job_backlog_limit_exceeded", "workflow pending backlog limit exceeded", {
|
|
2294
2307
|
details: { limit: policy.pendingPerApp, pending: counts.pending }
|
|
@@ -3615,6 +3628,7 @@ var RESERVED_TENANT_RUNTIME_ENV_KEYS = [
|
|
|
3615
3628
|
"GENCOW_FUNCTIONS",
|
|
3616
3629
|
"GENCOW_STORAGE",
|
|
3617
3630
|
"GENCOW_STORAGE_REQUIRE_READ_GRANT",
|
|
3631
|
+
"GENCOW_LOCAL_STORAGE_READ_GRANT_SECRET",
|
|
3618
3632
|
"GENCOW_STORAGE_BACKEND",
|
|
3619
3633
|
"GENCOW_STORAGE_LEGACY_LOCAL_FALLBACK",
|
|
3620
3634
|
"GENCOW_STORAGE_QUOTA_BYTES",
|
|
@@ -3627,6 +3641,8 @@ var RESERVED_TENANT_RUNTIME_ENV_KEYS = [
|
|
|
3627
3641
|
"GENCOW_MANAGED_RUNTIME",
|
|
3628
3642
|
"GENCOW_APP_DATA_DIR",
|
|
3629
3643
|
"GENCOW_RUNTIME_COMPATIBILITY",
|
|
3644
|
+
"GENCOW_RUNTIME_ENV_PATH",
|
|
3645
|
+
"GENCOW_RUNTIME_ENV_REVISION",
|
|
3630
3646
|
"GENCOW_RUNTIME_RELEASE_ID",
|
|
3631
3647
|
"GENCOW_RUNTIME_RELEASE_DIR",
|
|
3632
3648
|
"GENCOW_RUNTIME_GENERATION_DIR",
|
|
@@ -4084,8 +4100,157 @@ import { pgTable } from "drizzle-orm/pg-core";
|
|
|
4084
4100
|
var pgBaseTable = pgTable;
|
|
4085
4101
|
|
|
4086
4102
|
// ../core/src/rls-db.ts
|
|
4087
|
-
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4088
4103
|
import { sql as sql7 } from "drizzle-orm";
|
|
4104
|
+
|
|
4105
|
+
// ../core/src/rls-db-scoped-query.ts
|
|
4106
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4107
|
+
import { NoopCache } from "drizzle-orm/cache/core";
|
|
4108
|
+
import { RelationalQueryBuilder as PgRelationalQueryBuilder } from "drizzle-orm/pg-core/query-builders/query";
|
|
4109
|
+
import { PgDialect } from "drizzle-orm/pg-core/dialect";
|
|
4110
|
+
import { PgAsyncRelationalQuery } from "drizzle-orm/pg-core/async/query";
|
|
4111
|
+
var activeRlsExecution = new AsyncLocalStorage();
|
|
4112
|
+
function createRlsDiagnosticError(message, diagnostic) {
|
|
4113
|
+
return Object.assign(new Error(message), diagnostic);
|
|
4114
|
+
}
|
|
4115
|
+
function createRlsScopeToken() {
|
|
4116
|
+
return {};
|
|
4117
|
+
}
|
|
4118
|
+
function createRlsScopeConflictError() {
|
|
4119
|
+
return createRlsDiagnosticError("A query cannot switch database scopes while an RLS operation is active.", {
|
|
4120
|
+
code: "RLS_SCOPE_CONFLICT",
|
|
4121
|
+
status: 409,
|
|
4122
|
+
stage: "rls-query-execution",
|
|
4123
|
+
capability: "rls-scoped-query",
|
|
4124
|
+
stateImpact: "Rejected query executed no tenant SQL; enclosing operation may still finish independently",
|
|
4125
|
+
retryable: false,
|
|
4126
|
+
retryPrecondition: "Invoke only a database handle matching the active RLS scope, or wait until the active RLS execution completes.",
|
|
4127
|
+
nextAction: "EDIT_AND_CHECK"
|
|
4128
|
+
});
|
|
4129
|
+
}
|
|
4130
|
+
var unsupportedByReason = {
|
|
4131
|
+
cache: {
|
|
4132
|
+
message: "RLS-scoped queries do not support a shared Drizzle result cache.",
|
|
4133
|
+
retryPrecondition: "Remove the shared Drizzle cache configuration before retrying; shared result caches are not supported by RLS-scoped queries."
|
|
4134
|
+
},
|
|
4135
|
+
relations: {
|
|
4136
|
+
message: "This relational builder is not from the verified Drizzle v1 integration.",
|
|
4137
|
+
retryPrecondition: "Check the installed version with `pnpm why drizzle-orm`; use verified drizzle-orm@1.0.0-rc.4 without custom relational builders before retrying."
|
|
4138
|
+
},
|
|
4139
|
+
session: {
|
|
4140
|
+
message: "This Drizzle session cannot be safely bound to the transaction-scoped RLS client.",
|
|
4141
|
+
retryPrecondition: "Check the installed version with `pnpm why drizzle-orm`; use a verified Drizzle driver and session before retrying."
|
|
4142
|
+
}
|
|
4143
|
+
};
|
|
4144
|
+
function createRlsUnsupportedError(reason = "relations") {
|
|
4145
|
+
return createRlsDiagnosticError(unsupportedByReason[reason].message, {
|
|
4146
|
+
code: "RLS_DRIZZLE_INTEGRATION_UNSUPPORTED",
|
|
4147
|
+
status: 409,
|
|
4148
|
+
stage: "rls-query-setup",
|
|
4149
|
+
capability: "rls-scoped-query",
|
|
4150
|
+
stateImpact: "This rejected setup executed no tenant SQL and made no database state change",
|
|
4151
|
+
retryable: false,
|
|
4152
|
+
retryPrecondition: unsupportedByReason[reason].retryPrecondition,
|
|
4153
|
+
nextAction: "EDIT_AND_CHECK"
|
|
4154
|
+
});
|
|
4155
|
+
}
|
|
4156
|
+
function assertRlsScopeMayEnter(scope) {
|
|
4157
|
+
const active = activeRlsExecution.getStore();
|
|
4158
|
+
if (active?.active && active.scope !== scope) {
|
|
4159
|
+
throw createRlsScopeConflictError();
|
|
4160
|
+
}
|
|
4161
|
+
}
|
|
4162
|
+
function currentRlsExecution(scope) {
|
|
4163
|
+
const active = activeRlsExecution.getStore();
|
|
4164
|
+
if (!active?.active) return void 0;
|
|
4165
|
+
if (active.scope !== scope) throw createRlsScopeConflictError();
|
|
4166
|
+
return active;
|
|
4167
|
+
}
|
|
4168
|
+
function matchingRlsExecutionClient(scope) {
|
|
4169
|
+
const active = activeRlsExecution.getStore();
|
|
4170
|
+
return active?.active && active.scope === scope ? active.client : void 0;
|
|
4171
|
+
}
|
|
4172
|
+
async function runWithRlsScope(scope, client, work) {
|
|
4173
|
+
const active = { scope, client, active: true };
|
|
4174
|
+
return activeRlsExecution.run(active, async () => {
|
|
4175
|
+
try {
|
|
4176
|
+
return await work();
|
|
4177
|
+
} finally {
|
|
4178
|
+
active.active = false;
|
|
4179
|
+
}
|
|
4180
|
+
});
|
|
4181
|
+
}
|
|
4182
|
+
function runWithRlsTransactionScope(scope, tx, work) {
|
|
4183
|
+
assertRlsScopeMayEnter(scope);
|
|
4184
|
+
return runWithRlsScope(scope, tx.session?.client, work);
|
|
4185
|
+
}
|
|
4186
|
+
function createRlsRelationalQueryRegistry(query2, session, baseSession) {
|
|
4187
|
+
const scopedRegistry = /* @__PURE__ */ Object.create(null);
|
|
4188
|
+
for (const tableName of Reflect.ownKeys(query2)) {
|
|
4189
|
+
const descriptor = Object.getOwnPropertyDescriptor(query2, tableName);
|
|
4190
|
+
if (typeof tableName !== "string" || !descriptor || !descriptor.enumerable || !("value" in descriptor)) {
|
|
4191
|
+
throw createRlsUnsupportedError("relations");
|
|
4192
|
+
}
|
|
4193
|
+
const builder = descriptor.value;
|
|
4194
|
+
if (!builder || typeof builder !== "object" || builder.session !== baseSession || !builder.schema || typeof builder.schema !== "object" || !builder.table || typeof builder.table !== "object" || !builder.tableConfig || typeof builder.tableConfig !== "object" || !builder.dialect || typeof builder.dialect !== "object" || Object.getPrototypeOf(builder.dialect) !== PgDialect.prototype || Reflect.get(builder.dialect, "constructor") !== PgDialect || typeof builder.parseJson !== "boolean" || builder.builder !== PgAsyncRelationalQuery || Object.getPrototypeOf(builder) !== PgRelationalQueryBuilder.prototype || Reflect.get(builder, "constructor") !== PgRelationalQueryBuilder || Reflect.get(builder, "findMany") !== PgRelationalQueryBuilder.prototype.findMany || Reflect.get(builder, "findFirst") !== PgRelationalQueryBuilder.prototype.findFirst) {
|
|
4195
|
+
throw createRlsUnsupportedError("relations");
|
|
4196
|
+
}
|
|
4197
|
+
const scopedBuilder = Reflect.construct(PgRelationalQueryBuilder, [
|
|
4198
|
+
builder.schema,
|
|
4199
|
+
builder.table,
|
|
4200
|
+
builder.tableConfig,
|
|
4201
|
+
builder.dialect,
|
|
4202
|
+
session,
|
|
4203
|
+
builder.parseJson,
|
|
4204
|
+
PgAsyncRelationalQuery
|
|
4205
|
+
]);
|
|
4206
|
+
const trustedFindMany = PgRelationalQueryBuilder.prototype.findMany;
|
|
4207
|
+
const trustedFindFirst = PgRelationalQueryBuilder.prototype.findFirst;
|
|
4208
|
+
Object.defineProperties(scopedBuilder, {
|
|
4209
|
+
findMany: {
|
|
4210
|
+
value: function(config) {
|
|
4211
|
+
return Reflect.apply(trustedFindMany, this, [config]);
|
|
4212
|
+
}
|
|
4213
|
+
},
|
|
4214
|
+
findFirst: {
|
|
4215
|
+
value: function(config) {
|
|
4216
|
+
return Reflect.apply(trustedFindFirst, this, [config]);
|
|
4217
|
+
}
|
|
4218
|
+
}
|
|
4219
|
+
});
|
|
4220
|
+
Object.freeze(scopedBuilder);
|
|
4221
|
+
Object.defineProperty(scopedRegistry, tableName, {
|
|
4222
|
+
value: scopedBuilder,
|
|
4223
|
+
enumerable: true,
|
|
4224
|
+
configurable: false,
|
|
4225
|
+
writable: false
|
|
4226
|
+
});
|
|
4227
|
+
}
|
|
4228
|
+
return Object.freeze(scopedRegistry);
|
|
4229
|
+
}
|
|
4230
|
+
function isVerifiedNoopCache(cache) {
|
|
4231
|
+
if (!cache || typeof cache !== "object") return false;
|
|
4232
|
+
const candidate = cache;
|
|
4233
|
+
const ownKeys = Reflect.ownKeys(cache);
|
|
4234
|
+
const ownPropertiesAreExpected = ownKeys.every((key) => {
|
|
4235
|
+
if (key !== "invalidate") return false;
|
|
4236
|
+
const descriptor = Object.getOwnPropertyDescriptor(cache, key);
|
|
4237
|
+
return descriptor && "value" in descriptor && descriptor.value === NoopCache.prototype.onMutate;
|
|
4238
|
+
});
|
|
4239
|
+
return candidate.constructor === NoopCache && Object.getPrototypeOf(cache) === NoopCache.prototype && ownPropertiesAreExpected && candidate.strategy === NoopCache.prototype.strategy && candidate.get === NoopCache.prototype.get && candidate.put === NoopCache.prototype.put && candidate.onMutate === NoopCache.prototype.onMutate;
|
|
4240
|
+
}
|
|
4241
|
+
function hasUnpartitionedRlsCache(db, session) {
|
|
4242
|
+
const databaseCache = db?.$cache;
|
|
4243
|
+
const sessionCache = session?.cache;
|
|
4244
|
+
const hasResultCacheSurface = (cache) => {
|
|
4245
|
+
if (!cache || typeof cache !== "object") return false;
|
|
4246
|
+
return ["strategy", "get", "put"].some((method) => typeof Reflect.get(cache, method) === "function");
|
|
4247
|
+
};
|
|
4248
|
+
const hasUnverifiedSessionCache = sessionCache !== void 0 && sessionCache !== null && !isVerifiedNoopCache(sessionCache);
|
|
4249
|
+
const hasUnverifiedDatabaseCache = hasResultCacheSurface(databaseCache) && !isVerifiedNoopCache(databaseCache);
|
|
4250
|
+
return hasUnverifiedSessionCache || hasUnverifiedDatabaseCache;
|
|
4251
|
+
}
|
|
4252
|
+
|
|
4253
|
+
// ../core/src/rls-db.ts
|
|
4089
4254
|
var TRANSACTION_ISOLATION_LEVELS = /* @__PURE__ */ new Set([
|
|
4090
4255
|
"read uncommitted",
|
|
4091
4256
|
"read committed",
|
|
@@ -4127,11 +4292,6 @@ async function forEachSetConfig(rls, setOne) {
|
|
|
4127
4292
|
await setOne(name, value);
|
|
4128
4293
|
}
|
|
4129
4294
|
}
|
|
4130
|
-
var rlsExecClient = new AsyncLocalStorage();
|
|
4131
|
-
function isBunSqlSession(session) {
|
|
4132
|
-
const name = session?.constructor?.name;
|
|
4133
|
-
return typeof name === "string" && name.includes("BunSQLSession");
|
|
4134
|
-
}
|
|
4135
4295
|
function isDrizzleTransactionDb(db) {
|
|
4136
4296
|
const d = db;
|
|
4137
4297
|
if (typeof d?.rollback === "function") {
|
|
@@ -4165,11 +4325,11 @@ async function injectRlsVarsOnTx(tx, rls, onTransactionContextFailure) {
|
|
|
4165
4325
|
throw error;
|
|
4166
4326
|
}
|
|
4167
4327
|
}
|
|
4168
|
-
async function withRlsLeasedConnection(leased, rls, fn) {
|
|
4328
|
+
async function withRlsLeasedConnection(leased, rls, fn, scope) {
|
|
4169
4329
|
try {
|
|
4170
4330
|
await leased.query("begin");
|
|
4171
4331
|
await applyRlsSessionVars(leased, rls);
|
|
4172
|
-
const result = await
|
|
4332
|
+
const result = scope ? await runWithRlsScope(scope, leased, () => fn(leased)) : await fn(leased);
|
|
4173
4333
|
await leased.query("commit");
|
|
4174
4334
|
return result;
|
|
4175
4335
|
} catch (e) {
|
|
@@ -4182,19 +4342,20 @@ async function withRlsLeasedConnection(leased, rls, fn) {
|
|
|
4182
4342
|
leased.release();
|
|
4183
4343
|
}
|
|
4184
4344
|
}
|
|
4185
|
-
async function withRlsConnection(session, rls, reuseOuterConnection, fn) {
|
|
4345
|
+
async function withRlsConnection(session, rls, reuseOuterConnection, scope, fn) {
|
|
4346
|
+
assertRlsScopeMayEnter(scope);
|
|
4186
4347
|
if (reuseOuterConnection) {
|
|
4187
4348
|
const c2 = session.client;
|
|
4188
|
-
return
|
|
4349
|
+
return runWithRlsScope(scope, c2, async () => {
|
|
4189
4350
|
await applyRlsSessionVars(c2, rls);
|
|
4190
4351
|
return fn(c2);
|
|
4191
4352
|
});
|
|
4192
4353
|
}
|
|
4193
4354
|
const c = session.client;
|
|
4194
|
-
const runInner = async (client) => {
|
|
4355
|
+
const runInner = async (client) => runWithRlsScope(scope, client, async () => {
|
|
4195
4356
|
await applyRlsSessionVars(client, rls);
|
|
4196
|
-
return
|
|
4197
|
-
};
|
|
4357
|
+
return fn(client);
|
|
4358
|
+
});
|
|
4198
4359
|
if (typeof c.begin === "function") {
|
|
4199
4360
|
return c.begin(runInner);
|
|
4200
4361
|
}
|
|
@@ -4203,7 +4364,7 @@ async function withRlsConnection(session, rls, reuseOuterConnection, fn) {
|
|
|
4203
4364
|
}
|
|
4204
4365
|
if (typeof c.connect === "function" && typeof c.query === "function") {
|
|
4205
4366
|
const leased = await c.connect();
|
|
4206
|
-
return withRlsLeasedConnection(leased, rls, fn);
|
|
4367
|
+
return withRlsLeasedConnection(leased, rls, fn, scope);
|
|
4207
4368
|
}
|
|
4208
4369
|
return runInner(c);
|
|
4209
4370
|
}
|
|
@@ -4218,29 +4379,7 @@ function createClientBoundSession(session, client) {
|
|
|
4218
4379
|
}
|
|
4219
4380
|
});
|
|
4220
4381
|
}
|
|
4221
|
-
|
|
4222
|
-
if (!("client" in pq)) {
|
|
4223
|
-
return await fn();
|
|
4224
|
-
}
|
|
4225
|
-
const prevPq = pq.client;
|
|
4226
|
-
pq.client = client;
|
|
4227
|
-
try {
|
|
4228
|
-
return await fn();
|
|
4229
|
-
} finally {
|
|
4230
|
-
pq.client = prevPq;
|
|
4231
|
-
}
|
|
4232
|
-
}
|
|
4233
|
-
function createGenericPreparedQueryClientExecutors(pq) {
|
|
4234
|
-
const origExecute = pq.execute.bind(pq);
|
|
4235
|
-
const origAll = typeof pq.all === "function" ? pq.all.bind(pq) : null;
|
|
4236
|
-
return {
|
|
4237
|
-
execute(client, placeholderValues) {
|
|
4238
|
-
return withPreparedQueryClient(pq, client, () => origExecute(placeholderValues));
|
|
4239
|
-
},
|
|
4240
|
-
all: origAll ? (client, placeholderValues) => withPreparedQueryClient(pq, client, () => origAll(placeholderValues)) : void 0
|
|
4241
|
-
};
|
|
4242
|
-
}
|
|
4243
|
-
function createBunSqlPreparedQueryClientExecutors(baseSession, prepareQuery, prepareArgs) {
|
|
4382
|
+
function createSessionBoundPreparedQueryClientExecutors(pq, baseSession, prepareQuery, prepareArgs) {
|
|
4244
4383
|
const reprepareOnClient = (client) => {
|
|
4245
4384
|
const clientBoundSession = createClientBoundSession(baseSession, client);
|
|
4246
4385
|
return Reflect.apply(prepareQuery, clientBoundSession, prepareArgs);
|
|
@@ -4249,60 +4388,74 @@ function createBunSqlPreparedQueryClientExecutors(baseSession, prepareQuery, pre
|
|
|
4249
4388
|
execute(client, placeholderValues) {
|
|
4250
4389
|
return reprepareOnClient(client).execute(placeholderValues);
|
|
4251
4390
|
},
|
|
4252
|
-
all(client, placeholderValues) {
|
|
4391
|
+
all: typeof pq.all === "function" ? (client, placeholderValues) => {
|
|
4253
4392
|
const txPreparedQuery = reprepareOnClient(client);
|
|
4254
4393
|
if (typeof txPreparedQuery.all === "function") {
|
|
4255
4394
|
return txPreparedQuery.all(placeholderValues);
|
|
4256
4395
|
}
|
|
4257
4396
|
return txPreparedQuery.execute(placeholderValues);
|
|
4258
|
-
}
|
|
4397
|
+
} : void 0
|
|
4259
4398
|
};
|
|
4260
4399
|
}
|
|
4261
4400
|
function createPreparedQueryClientExecutors(params) {
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
}
|
|
4269
|
-
return createGenericPreparedQueryClientExecutors(params.pq);
|
|
4401
|
+
return createSessionBoundPreparedQueryClientExecutors(
|
|
4402
|
+
params.pq,
|
|
4403
|
+
params.baseSession,
|
|
4404
|
+
params.prepareQuery,
|
|
4405
|
+
params.prepareArgs
|
|
4406
|
+
);
|
|
4270
4407
|
}
|
|
4271
|
-
async function runPreparedQueryWithRls(session, rls, reuseOuterConnection, runOnClient, placeholderValues) {
|
|
4272
|
-
const active =
|
|
4408
|
+
async function runPreparedQueryWithRls(session, rls, reuseOuterConnection, scope, runOnClient, placeholderValues) {
|
|
4409
|
+
const active = currentRlsExecution(scope);
|
|
4273
4410
|
if (active) {
|
|
4274
|
-
return runOnClient(active, placeholderValues);
|
|
4411
|
+
return runOnClient(active.client, placeholderValues);
|
|
4275
4412
|
}
|
|
4276
4413
|
return withRlsConnection(
|
|
4277
4414
|
session,
|
|
4278
4415
|
rls,
|
|
4279
4416
|
reuseOuterConnection,
|
|
4417
|
+
scope,
|
|
4280
4418
|
(client) => runOnClient(client, placeholderValues)
|
|
4281
4419
|
);
|
|
4282
4420
|
}
|
|
4283
|
-
function wrapPreparedQuery(pq, session, baseSession, prepareQuery, prepareArgs, rls, reuseOuterConnection) {
|
|
4421
|
+
function wrapPreparedQuery(pq, session, baseSession, prepareQuery, prepareArgs, rls, reuseOuterConnection, scope) {
|
|
4284
4422
|
const clientExecutors = createPreparedQueryClientExecutors({
|
|
4285
4423
|
pq,
|
|
4286
4424
|
baseSession,
|
|
4287
4425
|
prepareQuery,
|
|
4288
4426
|
prepareArgs
|
|
4289
4427
|
});
|
|
4290
|
-
pq.execute = (placeholderValues) => runPreparedQueryWithRls(
|
|
4428
|
+
pq.execute = (placeholderValues) => runPreparedQueryWithRls(
|
|
4429
|
+
session,
|
|
4430
|
+
rls,
|
|
4431
|
+
reuseOuterConnection,
|
|
4432
|
+
scope,
|
|
4433
|
+
clientExecutors.execute,
|
|
4434
|
+
placeholderValues
|
|
4435
|
+
);
|
|
4291
4436
|
if (clientExecutors.all) {
|
|
4292
|
-
pq.all = (placeholderValues) => runPreparedQueryWithRls(
|
|
4437
|
+
pq.all = (placeholderValues) => runPreparedQueryWithRls(
|
|
4438
|
+
session,
|
|
4439
|
+
rls,
|
|
4440
|
+
reuseOuterConnection,
|
|
4441
|
+
scope,
|
|
4442
|
+
clientExecutors.all,
|
|
4443
|
+
placeholderValues
|
|
4444
|
+
);
|
|
4293
4445
|
}
|
|
4294
4446
|
}
|
|
4295
|
-
function wrapSession(session, rls, reuseOuterConnection) {
|
|
4447
|
+
function wrapSession(session, rls, reuseOuterConnection, scope) {
|
|
4296
4448
|
return new Proxy(session, {
|
|
4297
4449
|
get(sTarget, sProp, sRecv) {
|
|
4298
4450
|
if (sProp === "client") {
|
|
4299
|
-
return
|
|
4451
|
+
return matchingRlsExecutionClient(scope) ?? Reflect.get(sTarget, sProp, sRecv);
|
|
4300
4452
|
}
|
|
4301
4453
|
if (sProp === "prepareQuery") {
|
|
4302
4454
|
return (...args) => {
|
|
4303
4455
|
const prepareQuery = Reflect.get(sTarget, sProp, sRecv);
|
|
4456
|
+
if (typeof prepareQuery !== "function") throw createRlsUnsupportedError("session");
|
|
4304
4457
|
const pq = Reflect.apply(prepareQuery, sRecv, args);
|
|
4305
|
-
wrapPreparedQuery(pq, sRecv, sTarget, prepareQuery, args, rls, reuseOuterConnection);
|
|
4458
|
+
wrapPreparedQuery(pq, sRecv, sTarget, prepareQuery, args, rls, reuseOuterConnection, scope);
|
|
4306
4459
|
return pq;
|
|
4307
4460
|
};
|
|
4308
4461
|
}
|
|
@@ -4313,15 +4466,32 @@ function wrapSession(session, rls, reuseOuterConnection) {
|
|
|
4313
4466
|
}
|
|
4314
4467
|
function createRlsDb(db, rls, options = {}) {
|
|
4315
4468
|
const reuseOuterConnection = isDrizzleTransactionDb(db);
|
|
4316
|
-
const
|
|
4317
|
-
const
|
|
4469
|
+
const database = db;
|
|
4470
|
+
const baseSession = database.session ?? database._?.session;
|
|
4471
|
+
if (!baseSession || typeof baseSession !== "object") {
|
|
4472
|
+
throw createRlsUnsupportedError("session");
|
|
4473
|
+
}
|
|
4474
|
+
if (hasUnpartitionedRlsCache(db, baseSession)) {
|
|
4475
|
+
throw createRlsUnsupportedError("cache");
|
|
4476
|
+
}
|
|
4477
|
+
const scope = createRlsScopeToken();
|
|
4478
|
+
const wrappedSession = wrapSession(baseSession, rls, reuseOuterConnection, scope);
|
|
4479
|
+
const baseQuery = Reflect.get(db, "query", db);
|
|
4480
|
+
const scopedQuery = baseQuery && typeof baseQuery === "object" ? createRlsRelationalQueryRegistry(baseQuery, wrappedSession, baseSession) : baseQuery;
|
|
4318
4481
|
return new Proxy(db, {
|
|
4319
4482
|
get(target, prop, receiver) {
|
|
4483
|
+
if (prop === "query") {
|
|
4484
|
+
return scopedQuery;
|
|
4485
|
+
}
|
|
4486
|
+
if (prop === "$client") {
|
|
4487
|
+
return Reflect.get(target, prop, target);
|
|
4488
|
+
}
|
|
4320
4489
|
if (prop === "session") {
|
|
4321
4490
|
return wrappedSession;
|
|
4322
4491
|
}
|
|
4323
4492
|
if (prop === "_") {
|
|
4324
|
-
const inner = target
|
|
4493
|
+
const inner = Reflect.get(target, prop, receiver);
|
|
4494
|
+
if (!inner || typeof inner !== "object") return inner;
|
|
4325
4495
|
return new Proxy(inner, {
|
|
4326
4496
|
get(i, p, r) {
|
|
4327
4497
|
if (p === "session") return wrappedSession;
|
|
@@ -4331,6 +4501,7 @@ function createRlsDb(db, rls, options = {}) {
|
|
|
4331
4501
|
}
|
|
4332
4502
|
if (prop === "transaction") {
|
|
4333
4503
|
return async (callback, ...rest) => {
|
|
4504
|
+
assertRlsScopeMayEnter(scope);
|
|
4334
4505
|
let callbackStarted = false;
|
|
4335
4506
|
const configStatement = transactionConfigSql(rest[0]);
|
|
4336
4507
|
const transactionArgs = configStatement ? [] : rest;
|
|
@@ -4340,7 +4511,7 @@ function createRlsDb(db, rls, options = {}) {
|
|
|
4340
4511
|
if (configStatement) await tx.execute(configStatement);
|
|
4341
4512
|
await injectRlsVarsOnTx(tx, rls, options.onTransactionContextFailure);
|
|
4342
4513
|
callbackStarted = true;
|
|
4343
|
-
return await callback(tx);
|
|
4514
|
+
return await runWithRlsTransactionScope(scope, tx, () => callback(tx));
|
|
4344
4515
|
},
|
|
4345
4516
|
...transactionArgs
|
|
4346
4517
|
);
|
|
@@ -4358,13 +4529,14 @@ function createRlsDb(db, rls, options = {}) {
|
|
|
4358
4529
|
}
|
|
4359
4530
|
if (prop === "transactionWithCharacteristics") {
|
|
4360
4531
|
return async (characteristics, callback) => {
|
|
4532
|
+
assertRlsScopeMayEnter(scope);
|
|
4361
4533
|
return await target.transaction(async (tx) => {
|
|
4362
4534
|
await applyTransactionConfig(tx, {
|
|
4363
4535
|
...characteristics?.isolationLevel ? { isolationLevel: characteristics.isolationLevel } : {},
|
|
4364
4536
|
...characteristics?.readOnly ? { accessMode: "read only" } : {}
|
|
4365
4537
|
});
|
|
4366
4538
|
await injectRlsVarsOnTx(tx, rls, options.onTransactionContextFailure);
|
|
4367
|
-
return callback(tx);
|
|
4539
|
+
return runWithRlsTransactionScope(scope, tx, () => callback(tx));
|
|
4368
4540
|
});
|
|
4369
4541
|
};
|
|
4370
4542
|
}
|
package/core/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:"";--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-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-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--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-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-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-cyan-300:oklch(86.5% .127 207.078);--color-cyan-500:oklch(71.5% .143 215.221);--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-400:oklch(67.3% .182 276.935);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--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-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--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(--font-geist-sans);--default-mono-font-family:var(--font-geist-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.left-0{left:0}.left-2\.5{left:calc(var(--spacing) * 2.5)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[5\]{z-index:5}.z-\[100\]{z-index:100}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.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-full{width:100%;height:100%}.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-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-24{height:calc(var(--spacing) * 24)}.h-40{height:calc(var(--spacing) * 40)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-0{min-height:0}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-12{min-height:calc(var(--spacing) * 12)}.w-0{width:0}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-48{width:calc(var(--spacing) * 48)}.w-60{width:calc(var(--spacing) * 60)}.w-\[22\%\]{width:22%}.w-\[36\%\]{width:36%}.w-\[42\%\]{width:42%}.w-\[400px\]{width:400px}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[180px\]{max-width:180px}.max-w-\[400px\]{max-width:400px}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-56{min-width:calc(var(--spacing) * 56)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.basis-0{flex-basis:0}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.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-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.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-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.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-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-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,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-border{border-color:var(--border)}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-destructive\/30{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--destructive) 30%,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-green-500\/20{border-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.border-green-500\/20{border-color:color-mix(in oklab,var(--color-green-500) 20%,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,.border-primary\/50{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,var(--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-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500) 50%,transparent)}}.border-slate-500\/20{border-color:#62748e33}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/20{border-color:color-mix(in oklab,var(--color-slate-500) 20%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/20{border-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/20{border-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.border-yellow-500\/20{border-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/20{border-color:color-mix(in oklab,var(--color-yellow-500) 20%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-accent,.bg-accent\/50{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/50{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.bg-accent\/60{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/60{background-color:color-mix(in oklab,var(--accent) 60%,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\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.bg-background,.bg-background\/60{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,var(--background) 60%,transparent)}}.bg-background\/70{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/70{background-color:color-mix(in oklab,var(--background) 70%,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\/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\/15{background-color:#3080ff26}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/15{background-color:color-mix(in oklab,var(--color-blue-500) 15%,transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-destructive,.bg-destructive\/5{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/5{background-color:color-mix(in oklab,var(--destructive) 5%,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-green-500{background-color:var(--color-green-500)}.bg-green-500\/5{background-color:#00c7580d}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/5{background-color:color-mix(in oklab,var(--color-green-500) 5%,transparent)}}.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-muted{background-color:var(--muted)}.bg-muted-foreground{background-color:var(--muted-foreground)}.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--muted) 20%,transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--muted) 30%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.bg-muted\/80{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/80{background-color:color-mix(in oklab,var(--muted) 80%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.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(--popover)}.bg-primary,.bg-primary\/5{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--primary) 5%,transparent)}}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--primary) 10%,transparent)}}.bg-primary\/60{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/60{background-color:color-mix(in oklab,var(--primary) 60%,transparent)}}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500) 10%,transparent)}}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500) 15%,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-secondary{background-color:var(--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-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500) 10%,transparent)}}.bg-zinc-500\/10{background-color:#71717b1a}@supports (color:color-mix(in lab,red,red)){.bg-zinc-500\/10{background-color:color-mix(in oklab,var(--color-zinc-500) 10%,transparent)}}.bg-zinc-600{background-color:var(--color-zinc-600)}.object-cover{object-fit:cover}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[3px\]{padding:3px}.p-px{padding:1px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-\[20vh\]{padding-top:20vh}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-geist-mono)}.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-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-amber-500\/30{color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.text-amber-500\/30{color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.text-amber-600{color:var(--color-amber-600)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-card-foreground{color:var(--card-foreground)}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-500\/30{color:#00b7d74d}@supports (color:color-mix(in lab,red,red)){.text-cyan-500\/30{color:color-mix(in oklab,var(--color-cyan-500) 30%,transparent)}}.text-destructive{color:var(--destructive)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/50{color:#00d29480}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/50{color:color-mix(in oklab,var(--color-emerald-400) 50%,transparent)}}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/60{color:color-mix(in oklab,var(--foreground) 60%,transparent)}}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-indigo-400{color:var(--color-indigo-400)}.text-muted-foreground,.text-muted-foreground\/30{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/30{color:color-mix(in oklab,var(--muted-foreground) 30%,transparent)}}.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.text-orange-400{color:var(--color-orange-400)}.text-orange-500{color:var(--color-orange-500)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-purple-600{color:var(--color-purple-600)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-slate-300{color:var(--color-slate-300)}.text-violet-400{color:var(--color-violet-400)}.text-violet-400\/50{color:#a685ff80}@supports (color:color-mix(in lab,red,red)){.text-violet-400\/50{color:color-mix(in oklab,var(--color-violet-400) 50%,transparent)}}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-zinc-400{color:var(--color-zinc-400)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.decoration-violet-400\/30{text-decoration-color:#a685ff4d}@supports (color:color-mix(in lab,red,red)){.decoration-violet-400\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-violet-400) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-violet-400) 30%,transparent)}}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-30{opacity:.3}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);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-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)}.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-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-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.paused{animation-play-state:paused}.running{animation-play-state:running}.slide-in-from-right{--tw-enter-translate-x:100%}@media(hover:hover){.group-hover\:text-emerald-400:is(:where(.group):hover *){color:var(--color-emerald-400)}.group-hover\:text-violet-400:is(:where(.group):hover *){color:var(--color-violet-400)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}}.group-data-\[orientation\=horizontal\]\/tabs\:h-9:is(:where(.group\/tabs)[data-orientation=horizontal] *){height:calc(var(--spacing) * 9)}.group-data-\[orientation\=vertical\]\/tabs\:h-fit:is(:where(.group\/tabs)[data-orientation=vertical] *){height:fit-content}.group-data-\[orientation\=vertical\]\/tabs\:w-full:is(:where(.group\/tabs)[data-orientation=vertical] *){width:100%}.group-data-\[orientation\=vertical\]\/tabs\:flex-col:is(:where(.group\/tabs)[data-orientation=vertical] *){flex-direction:column}.group-data-\[orientation\=vertical\]\/tabs\:justify-start:is(:where(.group\/tabs)[data-orientation=vertical] *){justify-content:flex-start}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--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(--foreground)}.placeholder\:text-muted-foreground::placeholder,.placeholder\:text-muted-foreground\/50::placeholder{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-muted-foreground\/50::placeholder{color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);inset-inline:0}.group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);bottom:-5px}.group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:is(:where(.group\/tabs)[data-orientation=horizontal] *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);inset-block:0}.group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:is(:where(.group\/tabs)[data-orientation=vertical] *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}@media(hover:hover){.hover\:border-emerald-500\/40:hover{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.hover\:border-emerald-500\/40:hover{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.hover\:border-primary\/30:hover{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab,var(--primary) 30%,transparent)}}.hover\:border-primary\/50:hover{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,var(--primary) 50%,transparent)}}.hover\:border-violet-500\/40:hover{border-color:#8d54ff66}@supports (color:color-mix(in lab,red,red)){.hover\:border-violet-500\/40:hover{border-color:color-mix(in oklab,var(--color-violet-500) 40%,transparent)}}.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--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-destructive\/10:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--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-emerald-500\/20:hover{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/20:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.hover\:bg-primary\/40:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/40:hover{background-color:color-mix(in oklab,var(--primary) 40%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:bg-transparent:hover{background-color:#0000}.hover\:bg-violet-500\/5:hover{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-violet-500\/5:hover{background-color:color-mix(in oklab,var(--color-violet-500) 5%,transparent)}}.hover\:bg-violet-500\/20:hover{background-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-violet-500\/20:hover{background-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-amber-400:hover{color:var(--color-amber-400)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary\/50:focus{--tw-ring-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.focus\:ring-offset-1:focus{--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\:ring-offset-background:focus{--tw-ring-offset-color:var(--background)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-primary\/60:active{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-primary\/60:active{background-color:color-mix(in oklab,var(--primary) 60%,transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.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-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.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(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *)[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{--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)}.group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]:after{content:var(--tw-content);opacity:1}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@media(min-width:40rem){.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:48rem){.md\:block{display:block}.md\:hidden{display:none}.md\:w-\[320px\]{width:320px}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *)[data-state=active]{background-color:#0000}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary) 90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@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))}}
|