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.
Files changed (51) hide show
  1. package/bin/gencow.mjs +1 -0
  2. package/core/index.js +238 -66
  3. package/core/package.json +1 -1
  4. package/dashboard/assets/index-C6ShUtAY.css +1 -0
  5. package/dashboard/assets/index-CNlUa_9S.js +521 -0
  6. package/dashboard/index.html +2 -2
  7. package/lib/app-command.mjs +138 -7
  8. package/lib/app-create-response.d.mts +3 -0
  9. package/lib/app-delete-diagnostic.mjs +34 -2
  10. package/lib/app-diagnostics.mjs +15 -0
  11. package/lib/app-response-error.mjs +149 -1
  12. package/lib/cli-artifact-guard.mjs +1 -0
  13. package/lib/cli-dev-runtime.mjs +5 -5
  14. package/lib/cli-project-runtime.mjs +3 -2
  15. package/lib/cli-version-check.mjs +2 -1
  16. package/lib/codegen-command.mjs +12 -8
  17. package/lib/dashboard-assets.mjs +22 -0
  18. package/lib/deploy-admission-response.mjs +12 -0
  19. package/lib/deploy-auditor.mjs +4 -2
  20. package/lib/deploy-command.mjs +126 -3
  21. package/lib/deploy-correlation-diagnostic.mjs +3 -2
  22. package/lib/deploy-failure-diagnostic.mjs +144 -9
  23. package/lib/deploy-package-runtime.mjs +102 -95
  24. package/lib/deploy-project-config.mjs +35 -0
  25. package/lib/deploy-receipt-store.mjs +295 -4
  26. package/lib/deploy-release-receipt.mjs +166 -0
  27. package/lib/deploy-rollback.mjs +99 -0
  28. package/lib/deploy-runtime-asset-audit.mjs +81 -0
  29. package/lib/deploy-runtime.mjs +12 -70
  30. package/lib/deploy-static-fullstack-runtime.mjs +161 -59
  31. package/lib/deployment-admission-retry.mjs +10 -4
  32. package/lib/deployment-operation-poll.mjs +23 -1
  33. package/lib/dev-cloud-bundle.mjs +11 -0
  34. package/lib/dev-local-command.mjs +14 -3
  35. package/lib/env-command.mjs +24 -5
  36. package/lib/init-command.d.mts +30 -0
  37. package/lib/jobs-command.d.mts +14 -0
  38. package/lib/jobs-command.mjs +51 -7
  39. package/lib/platform-client.d.mts +20 -0
  40. package/lib/runtime-crash-parent-diagnostic.mjs +12 -0
  41. package/lib/static-deploy-command.mjs +38 -29
  42. package/package.json +4 -4
  43. package/runtime/config.mjs +6 -3
  44. package/runtime/crash-parent-diagnostic.mjs +208 -0
  45. package/runtime/server.mjs +110785 -69930
  46. package/runtime/tooling.mjs +104 -31
  47. package/scripts/bundle-internal.mjs +6 -2
  48. package/scripts/bundle-server.mjs +4 -12
  49. package/scripts/server-private-database-bundle.mjs +34 -0
  50. package/dashboard/assets/index-BIg8EAY8.css +0 -1
  51. package/dashboard/assets/index-CcD-YPfN.js +0 -408
package/bin/gencow.mjs CHANGED
@@ -585,6 +585,7 @@ const cmd =
585
585
  ? "version"
586
586
  : rawCmd;
587
587
  maybeCheckCliVersion({
588
+ args,
588
589
  command: cmd,
589
590
  currentVersion: CLI_VERSION,
590
591
  errorImpl: error,
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 rlsExecClient.run(leased, () => fn(leased));
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 rlsExecClient.run(c2, async () => {
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 rlsExecClient.run(client, () => fn(client));
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
- async function withPreparedQueryClient(pq, client, fn) {
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
- if (isBunSqlSession(params.baseSession)) {
4263
- return createBunSqlPreparedQueryClientExecutors(
4264
- params.baseSession,
4265
- params.prepareQuery,
4266
- params.prepareArgs
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 = rlsExecClient.getStore();
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(session, rls, reuseOuterConnection, clientExecutors.execute, placeholderValues);
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(session, rls, reuseOuterConnection, clientExecutors.all, placeholderValues);
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 rlsExecClient.getStore() ?? Reflect.get(sTarget, sProp, sRecv);
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 baseSession = db.session;
4317
- const wrappedSession = wrapSession(baseSession, rls, reuseOuterConnection);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gencow/core",
3
- "version": "0.1.45",
3
+ "version": "0.1.46",
4
4
  "type": "module",
5
5
  "main": "index.js"
6
6
  }
@@ -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))}}