@aku11i/phantom 6.3.0-0 → 6.3.0-2

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 (32) hide show
  1. package/app/server/app-BLBOjh4e.mjs +29147 -0
  2. package/app/server/app-BLBOjh4e.mjs.map +1 -0
  3. package/app/server/index.mjs +2 -0
  4. package/app/server/start.mjs +520 -0
  5. package/app/server/start.mjs.map +1 -0
  6. package/app/web/assets/index-IcxJQt7a.css +2 -0
  7. package/app/web/assets/index-iSfjEV4I.js +52 -0
  8. package/app/web/index.html +16 -0
  9. package/package.json +1 -1
  10. package/phantom.js +60 -32
  11. package/app/.output/nitro.json +0 -17
  12. package/app/.output/public/assets/index-CI6IWFKa.css +0 -2
  13. package/app/.output/public/assets/index-DHMHkew5.js +0 -12
  14. package/app/.output/public/assets/jsx-runtime-CUBmso4R.js +0 -1
  15. package/app/.output/public/assets/routes-Boii8-De.js +0 -1
  16. package/app/.output/server/__23tanstack-start-plugin-adapters-y_fshQDY.mjs +0 -5
  17. package/app/.output/server/_chunks/ssr-renderer.mjs +0 -15
  18. package/app/.output/server/_libs/@tanstack/react-router+[...].mjs +0 -14637
  19. package/app/.output/server/_libs/h3+rou3+srvx.mjs +0 -1210
  20. package/app/.output/server/_libs/hookable.mjs +0 -41
  21. package/app/.output/server/_libs/lucide-react.mjs +0 -351
  22. package/app/.output/server/_libs/tanstack__history.mjs +0 -342
  23. package/app/.output/server/_libs/tanstack__router-core.mjs +0 -6
  24. package/app/.output/server/_libs/ufo.mjs +0 -64
  25. package/app/.output/server/_libs/zod.mjs +0 -3745
  26. package/app/.output/server/_runtime.mjs +0 -26
  27. package/app/.output/server/_ssr/router-C0zvMxvt.mjs +0 -3475
  28. package/app/.output/server/_ssr/routes-DpnTz1lw.mjs +0 -1450
  29. package/app/.output/server/_ssr/ssr.mjs +0 -5174
  30. package/app/.output/server/_ssr/start-DaFzyN3q.mjs +0 -4
  31. package/app/.output/server/_tanstack-start-manifest_v-CWxREUaR.mjs +0 -35
  32. package/app/.output/server/index.mjs +0 -326
@@ -0,0 +1,16 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta
6
+ name="viewport"
7
+ content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content"
8
+ />
9
+ <title>Phantom Serve</title>
10
+ <script type="module" crossorigin src="/assets/index-iSfjEV4I.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-IcxJQt7a.css">
12
+ </head>
13
+ <body>
14
+ <div id="root"></div>
15
+ </body>
16
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aku11i/phantom",
3
- "version": "6.3.0-0",
3
+ "version": "6.3.0-2",
4
4
  "description": "A powerful CLI tool for managing Git worktrees for parallel development",
5
5
  "keywords": [
6
6
  "git",
package/phantom.js CHANGED
@@ -4551,8 +4551,8 @@ async function listWorktrees$1(gitRoot) {
4551
4551
  const fullBranch = line.substring(7);
4552
4552
  currentWorktree.branch = fullBranch.startsWith("refs/heads/") ? fullBranch.substring(11) : fullBranch;
4553
4553
  } else if (line === "detached") currentWorktree.branch = "(detached HEAD)";
4554
- else if (line === "locked") currentWorktree.isLocked = true;
4555
- else if (line === "prunable") currentWorktree.isPrunable = true;
4554
+ else if (line.startsWith("locked")) currentWorktree.isLocked = true;
4555
+ else if (line.startsWith("prunable")) currentWorktree.isPrunable = true;
4556
4556
  if (currentWorktree.path) worktrees.push(currentWorktree);
4557
4557
  return worktrees;
4558
4558
  }
@@ -4795,11 +4795,12 @@ async function getWorktreeStatus(worktreePath) {
4795
4795
  async function listWorktrees(gitRoot, options = {}) {
4796
4796
  try {
4797
4797
  const gitWorktrees = await listWorktrees$1(gitRoot);
4798
+ const availableGitWorktrees = options.includePrunable ?? true ? gitWorktrees : gitWorktrees.filter((worktree) => !worktree.isPrunable);
4798
4799
  const excludeDefault = options.excludeDefault ?? false;
4799
- const filteredWorktrees = excludeDefault ? gitWorktrees.filter((worktree) => worktree.path !== gitRoot) : gitWorktrees;
4800
+ const filteredWorktrees = excludeDefault ? availableGitWorktrees.filter((worktree) => worktree.path !== gitRoot) : availableGitWorktrees;
4800
4801
  if (filteredWorktrees.length === 0) return ok({
4801
4802
  worktrees: [],
4802
- message: excludeDefault && gitWorktrees.length > 0 ? "No sub worktrees found" : "No worktrees found"
4803
+ message: excludeDefault && availableGitWorktrees.length > 0 ? "No sub worktrees found" : "No worktrees found"
4803
4804
  });
4804
4805
  return ok({ worktrees: await Promise.all(filteredWorktrees.map(async (gitWorktree) => {
4805
4806
  const shortHead = gitWorktree.head?.slice(0, 7) ?? "HEAD";
@@ -4822,9 +4823,10 @@ async function listWorktrees(gitRoot, options = {}) {
4822
4823
  //#endregion
4823
4824
  //#region ../core/src/worktree/validate.ts
4824
4825
  async function validateWorktreeExists(gitRoot, _worktreeDirectory, name, options = {}) {
4825
- const worktreesResult = await listWorktrees(gitRoot, options);
4826
+ const { expectedPath, ...listOptions } = options;
4827
+ const worktreesResult = await listWorktrees(gitRoot, listOptions);
4826
4828
  if (isErr(worktreesResult)) return err(new WorktreeNotFoundError(name));
4827
- const worktree = worktreesResult.value.worktrees.find((wt) => wt.name === name);
4829
+ const worktree = worktreesResult.value.worktrees.find((wt) => wt.name === name && (!expectedPath || wt.path === expectedPath));
4828
4830
  if (!worktree) return err(new WorktreeNotFoundError(name));
4829
4831
  return ok({ path: worktree.path });
4830
4832
  }
@@ -7395,15 +7397,15 @@ const repoInfoSchema = object$1({
7395
7397
  owner: string(),
7396
7398
  repo: string()
7397
7399
  });
7398
- async function getGitHubRepoInfo() {
7400
+ async function getGitHubRepoInfo(options = {}) {
7399
7401
  try {
7400
7402
  const { stdout } = await execFileAsync("gh", [
7401
7403
  "repo",
7402
7404
  "view",
7403
7405
  "--json",
7404
7406
  "owner,name"
7405
- ]);
7406
- const data = JSON.parse(stdout);
7407
+ ], options.cwd ? { cwd: options.cwd } : void 0);
7408
+ const data = JSON.parse(stdout.toString());
7407
7409
  return repoInfoSchema.parse({
7408
7410
  owner: data.owner.login,
7409
7411
  repo: data.name
@@ -8533,9 +8535,9 @@ async function runCreateWorktree(options) {
8533
8535
  }
8534
8536
  //#endregion
8535
8537
  //#region ../core/src/github/checkout/issue.ts
8536
- async function checkoutIssue(issue, base) {
8538
+ async function checkoutIssue(issue, base, options = {}) {
8537
8539
  if (isPullRequest(issue)) return err(/* @__PURE__ */ new Error(`#${issue.number} is a pull request, not an issue. Cannot checkout as an issue.`));
8538
- const context = await createContext(await getGitRoot());
8540
+ const context = await createContext(await getGitRoot({ cwd: options.cwd }));
8539
8541
  const worktreeName = `issues/${issue.number}`;
8540
8542
  const branchName = `issues/${issue.number}`;
8541
8543
  const existsResult = await validateWorktreeExists(context.gitRoot, context.worktreesDirectory, worktreeName);
@@ -8543,7 +8545,8 @@ async function checkoutIssue(issue, base) {
8543
8545
  message: `Issue #${issue.number} is already checked out`,
8544
8546
  worktree: worktreeName,
8545
8547
  path: existsResult.value.path,
8546
- alreadyExists: true
8548
+ alreadyExists: true,
8549
+ createdBranch: false
8547
8550
  });
8548
8551
  const result = await createWorktree(context.gitRoot, context.worktreesDirectory, worktreeName, {
8549
8552
  branch: branchName,
@@ -8553,7 +8556,8 @@ async function checkoutIssue(issue, base) {
8553
8556
  return ok({
8554
8557
  message: result.value.message,
8555
8558
  worktree: worktreeName,
8556
- path: result.value.path
8559
+ path: result.value.path,
8560
+ createdBranch: true
8557
8561
  });
8558
8562
  }
8559
8563
  //#endregion
@@ -8628,8 +8632,8 @@ function getForkWorktreeName(pullRequest) {
8628
8632
  if (!owner) return pullRequest.head.ref;
8629
8633
  return `${owner}/${pullRequest.head.ref}`;
8630
8634
  }
8631
- async function checkoutPullRequest(pullRequest, worktreeName = pullRequest.isFromFork ? getForkWorktreeName(pullRequest) : pullRequest.head.ref) {
8632
- const gitRoot = await getGitRoot();
8635
+ async function checkoutPullRequest(pullRequest, worktreeName = pullRequest.isFromFork ? getForkWorktreeName(pullRequest) : pullRequest.head.ref, options = {}) {
8636
+ const gitRoot = await getGitRoot({ cwd: options.cwd });
8633
8637
  const context = await createContext(gitRoot);
8634
8638
  const localBranch = worktreeName;
8635
8639
  const existsResult = await validateWorktreeExists(context.gitRoot, context.worktreesDirectory, worktreeName);
@@ -8637,10 +8641,17 @@ async function checkoutPullRequest(pullRequest, worktreeName = pullRequest.isFro
8637
8641
  message: `PR #${pullRequest.number} is already checked out`,
8638
8642
  worktree: worktreeName,
8639
8643
  path: existsResult.value.path,
8640
- alreadyExists: true
8644
+ alreadyExists: true,
8645
+ createdBranch: false
8641
8646
  });
8647
+ const branchExistsResult = await branchExists(context.gitRoot, localBranch);
8648
+ if (isErr(branchExistsResult)) return err(branchExistsResult.error);
8649
+ const createdBranch = !branchExistsResult.value;
8642
8650
  const upstream = pullRequest.isFromFork ? `origin/pull/${pullRequest.number}/head` : `origin/${pullRequest.head.ref}`;
8643
- const fetchResult = await fetch({ refspec: `${upstream.replace("origin/", "")}:${localBranch}` });
8651
+ const fetchResult = await fetch({
8652
+ cwd: gitRoot,
8653
+ refspec: `${upstream.replace("origin/", "")}:${localBranch}`
8654
+ });
8644
8655
  if (isErr(fetchResult)) return err(/* @__PURE__ */ new Error(`Failed to fetch PR #${pullRequest.number}: ${fetchResult.error.message}`));
8645
8656
  const setUpstreamResult = await setUpstreamBranch(gitRoot, localBranch, upstream);
8646
8657
  if (isErr(setUpstreamResult)) console.warn(`Warning: Could not set upstream branch: ${setUpstreamResult.error.message}`);
@@ -8649,21 +8660,22 @@ async function checkoutPullRequest(pullRequest, worktreeName = pullRequest.isFro
8649
8660
  return ok({
8650
8661
  message: pullRequest.isFromFork ? `Checked out PR #${pullRequest.number} from fork ${pullRequest.head.repo.full_name}` : `Checked out PR #${pullRequest.number} from branch ${pullRequest.head.ref}`,
8651
8662
  worktree: worktreeName,
8652
- path: attachResult.value
8663
+ path: attachResult.value,
8664
+ createdBranch
8653
8665
  });
8654
8666
  }
8655
8667
  //#endregion
8656
8668
  //#region ../core/src/github/checkout.ts
8657
8669
  async function githubCheckout(options) {
8658
- const { number, base } = options;
8659
- const { owner, repo } = await getGitHubRepoInfo();
8670
+ const { number, base, cwd } = options;
8671
+ const { owner, repo } = cwd ? await getGitHubRepoInfo({ cwd }) : await getGitHubRepoInfo();
8660
8672
  const issue = await fetchIssue(owner, repo, number);
8661
8673
  if (!issue) return err(/* @__PURE__ */ new Error(`GitHub issue or pull request #${number} not found or you don't have permission to access it.`));
8662
8674
  if (isPullRequest(issue)) {
8663
8675
  if (base) return err(/* @__PURE__ */ new Error(`The --base option cannot be used with pull requests. Pull request #${number} already has a branch '${issue.pullRequest.head.ref}'.`));
8664
- return await checkoutPullRequest(issue.pullRequest);
8676
+ return cwd ? await checkoutPullRequest(issue.pullRequest, void 0, { cwd }) : await checkoutPullRequest(issue.pullRequest);
8665
8677
  }
8666
- return await checkoutIssue(issue, base);
8678
+ return cwd ? await checkoutIssue(issue, base, { cwd }) : await checkoutIssue(issue, base);
8667
8679
  }
8668
8680
  //#endregion
8669
8681
  //#region ../core/src/worktree/current.ts
@@ -8733,9 +8745,12 @@ async function deleteBranch(gitRoot, branchName) {
8733
8745
  async function deleteWorktree(gitRoot, worktreeDirectory, name, options, preDeleteCommands) {
8734
8746
  const { force = false } = options || {};
8735
8747
  const keepBranch = options?.keepBranch ?? false;
8736
- const validation = await validateWorktreeExists(gitRoot, worktreeDirectory, name, { excludeDefault: true });
8748
+ const validateOptions = { excludeDefault: true };
8749
+ if (options?.path) validateOptions.expectedPath = options.path;
8750
+ const validation = await validateWorktreeExists(gitRoot, worktreeDirectory, name, validateOptions);
8737
8751
  if (isErr(validation)) return err(validation.error);
8738
8752
  const worktreePath = validation.value.path;
8753
+ if (!isPathInsideDirectory(worktreePath, worktreeDirectory)) return err(new WorktreeError(`Worktree '${name}' is not managed by Phantom and cannot be deleted.`));
8739
8754
  const status = await getWorktreeChangesStatus(worktreePath);
8740
8755
  if (status.hasUncommittedChanges && !force) return err(new WorktreeError(`Worktree '${name}' has uncommitted changes (${status.changedFiles} files). Use --force to delete anyway.`));
8741
8756
  if (preDeleteCommands && preDeleteCommands.length > 0) {
@@ -8771,10 +8786,17 @@ async function deleteWorktree(gitRoot, worktreeDirectory, name, options, preDele
8771
8786
  return err(new WorktreeError(`worktree remove failed: ${error instanceof Error ? error.message : String(error)}`));
8772
8787
  }
8773
8788
  }
8789
+ function isPathInsideDirectory(path, directory) {
8790
+ const relativePath = relative(directory, path);
8791
+ return Boolean(relativePath && !relativePath.startsWith("..") && !isAbsolute(relativePath));
8792
+ }
8774
8793
  //#endregion
8775
8794
  //#region ../core/src/worktree/select.ts
8776
8795
  async function selectWorktreeWithFzf(gitRoot, options = {}) {
8777
- const listResult = await listWorktrees(gitRoot, { excludeDefault: options.excludeDefault });
8796
+ const listResult = await listWorktrees(gitRoot, {
8797
+ excludeDefault: options.excludeDefault,
8798
+ includePrunable: false
8799
+ });
8778
8800
  if (isErr(listResult)) return listResult;
8779
8801
  const { worktrees } = listResult.value;
8780
8802
  if (worktrees.length === 0) return {
@@ -10199,7 +10221,10 @@ async function listHandler(args = []) {
10199
10221
  if (isErr(selectResult)) exitWithError(selectResult.error.message, exitCodes.generalError);
10200
10222
  if (selectResult.value) output.log(selectResult.value.name);
10201
10223
  } else {
10202
- const result = await listWorktrees(gitRoot, { excludeDefault });
10224
+ const result = await listWorktrees(gitRoot, {
10225
+ excludeDefault,
10226
+ includePrunable: false
10227
+ });
10203
10228
  if (isErr(result)) exitWithError("Failed to list worktrees", exitCodes.generalError);
10204
10229
  const { worktrees, message } = result.value;
10205
10230
  if (worktrees.length === 0) {
@@ -24657,7 +24682,7 @@ var StdioServerTransport = class {
24657
24682
  };
24658
24683
  //#endregion
24659
24684
  //#region ../mcp/package.json
24660
- var version$1 = "6.3.0-0";
24685
+ var version$1 = "6.3.0-2";
24661
24686
  const createWorktreeTool = {
24662
24687
  name: "phantom_create_worktree",
24663
24688
  description: "Create a new Git worktree (phantom)",
@@ -24738,7 +24763,7 @@ const listWorktreesTool = {
24738
24763
  description: "List all Git worktrees (phantoms)",
24739
24764
  inputSchema: object$1({}),
24740
24765
  handler: async () => {
24741
- const result = await listWorktrees(await getGitRoot());
24766
+ const result = await listWorktrees(await getGitRoot(), { includePrunable: false });
24742
24767
  if (!isOk(result)) throw new Error("Failed to list worktrees");
24743
24768
  return { content: [{
24744
24769
  type: "text",
@@ -25099,12 +25124,12 @@ const serveHelp = {
25099
25124
  }],
25100
25125
  notes: [
25101
25126
  "Experimental: this command and its runtime behavior may change without notice.",
25102
- "The server runs the bundled TanStack Start application shipped with Phantom.",
25127
+ "The server runs the bundled Hono API and Vite web application shipped with Phantom.",
25103
25128
  "The default host is 127.0.0.1.",
25104
25129
  "The default port is 9640.",
25105
25130
  "The Codex executable defaults to codex.",
25106
- "The bundled app assets must exist under packages/cli/dist/app/.output.",
25107
- "The underlying Nitro server also respects HOST/PORT and NITRO_HOST/NITRO_PORT."
25131
+ "The bundled app assets must exist under packages/cli/dist/app/server and packages/cli/dist/app/web.",
25132
+ "The underlying Hono server respects HOST/PORT."
25108
25133
  ]
25109
25134
  };
25110
25135
  //#endregion
@@ -25166,7 +25191,10 @@ async function serveHandler(args = []) {
25166
25191
  process.env.NITRO_PORT = port;
25167
25192
  process.env.PHANTOM_SERVE_CODEX_BIN = codexBin;
25168
25193
  if (values["data-dir"]) process.env.PHANTOM_SERVE_DATA_DIR = values["data-dir"];
25169
- const serverEntry = join(dirname(fileURLToPath(import.meta.url)), "app", ".output", "server", "index.mjs");
25194
+ const bundledEntrypoint = fileURLToPath(import.meta.url);
25195
+ const serverEntry = join(dirname(bundledEntrypoint), "app", "server", "start.mjs");
25196
+ const webDistDirectory = join(dirname(bundledEntrypoint), "app", "web");
25197
+ process.env.PHANTOM_WEB_DIST_DIR = webDistDirectory;
25170
25198
  try {
25171
25199
  await access(serverEntry);
25172
25200
  } catch {
@@ -25253,7 +25281,7 @@ async function shellHandler(args) {
25253
25281
  }
25254
25282
  //#endregion
25255
25283
  //#region package.json
25256
- var version = "6.3.0-0";
25284
+ var version = "6.3.0-2";
25257
25285
  //#endregion
25258
25286
  //#region src/version.ts
25259
25287
  function getVersion() {
@@ -1,17 +0,0 @@
1
- {
2
- "date": "2026-04-26T12:51:44.433Z",
3
- "preset": "node-server",
4
- "framework": {
5
- "name": "nitro",
6
- "version": "3.0.260311-beta"
7
- },
8
- "versions": {
9
- "nitro": "3.0.260311-beta"
10
- },
11
- "serverEntry": "server/index.mjs",
12
- "publicDir": "public",
13
- "commands": {
14
- "preview": "node ./server/index.mjs"
15
- },
16
- "config": {}
17
- }
@@ -1,2 +0,0 @@
1
- /*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-rose-500:oklch(64.5% .246 16.439);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--font-weight-medium:500;--font-weight-semibold:600;--leading-tight:1.25;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--shadow-xs:0 1px 2px 0 #0000000d;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.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}.inset-0{inset:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-full{top:100%}.-right-3{right:calc(var(--spacing) * -3)}.right-0{right:calc(var(--spacing) * 0)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-auto{margin-right:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-full{height:100%}.h-screen{height:100vh}.h-svh{height:100svh}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[var\(--layout-topbar-height\)\]{min-height:var(--layout-topbar-height)}.min-h-svh{min-height:100svh}.w-6{width:calc(var(--spacing) * 6)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-80{width:calc(var(--spacing) * 80)}.w-\[var\(--sidebar-width\)\]{width:var(--sidebar-width)}.w-full{width:100%}.w-px{width:1px}.max-w-24{max-width:calc(var(--spacing) * 24)}.max-w-44{max-width:calc(var(--spacing) * 44)}.max-w-52{max-width:calc(var(--spacing) * 52)}.max-w-\[78\%\]{max-width:78%}.max-w-\[82\%\]{max-width:82%}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-\[var\(--layout-max-content-width\)\]{max-width:var(--layout-max-content-width)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.resize-none{resize:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-\[var\(--radius-lg\)\]{border-radius:var(--radius-lg)}.rounded-\[var\(--radius-md\)\]{border-radius:var(--radius-md)}.rounded-\[var\(--radius-sm\)\]{border-radius:var(--radius-sm)}.rounded-\[var\(--radius-xs\)\]{border-radius:var(--radius-xs)}.rounded-full{border-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.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-\[var\(--border-divider\)\]{border-color:var(--border-divider)}.border-\[var\(--semantic-danger-border\)\]{border-color:var(--semantic-danger-border)}.border-\[var\(--semantic-info-border\)\]{border-color:var(--semantic-info-border)}.border-\[var\(--semantic-success-border\)\]{border-color:var(--semantic-success-border)}.border-\[var\(--semantic-warning-border\)\]{border-color:var(--semantic-warning-border)}.border-border{border-color:var(--border)}.border-input{border-color:var(--input)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.bg-\[var\(--border-divider\)\]{background-color:var(--border-divider)}.bg-\[var\(--color-gray-400\)\]{background-color:var(--color-gray-400)}.bg-\[var\(--color-gray-500\)\]{background-color:var(--color-gray-500)}.bg-\[var\(--color-gray-900\)\]{background-color:var(--color-gray-900)}.bg-\[var\(--semantic-danger-bg\)\]{background-color:var(--semantic-danger-bg)}.bg-\[var\(--semantic-danger-fg\)\]{background-color:var(--semantic-danger-fg)}.bg-\[var\(--semantic-info-bg\)\]{background-color:var(--semantic-info-bg)}.bg-\[var\(--semantic-info-fg\)\]{background-color:var(--semantic-info-fg)}.bg-\[var\(--semantic-success-bg\)\]{background-color:var(--semantic-success-bg)}.bg-\[var\(--semantic-warning-bg\)\]{background-color:var(--semantic-warning-bg)}.bg-\[var\(--semantic-warning-fg\)\]{background-color:var(--semantic-warning-fg)}.bg-\[var\(--state-selected-bg\)\]{background-color:var(--state-selected-bg)}.bg-\[var\(--surface-card\)\]{background-color:var(--surface-card)}.bg-\[var\(--surface-code\)\]{background-color:var(--surface-code)}.bg-\[var\(--surface-floating\)\]{background-color:var(--surface-floating)}.bg-\[var\(--surface-input\)\]{background-color:var(--surface-input)}.bg-\[var\(--surface-overlay\)\]{background-color:var(--surface-overlay)}.bg-\[var\(--surface-panel\)\]{background-color:var(--surface-panel)}.bg-background{background-color:var(--background)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-transparent{background-color:#0000}.p-1{padding:calc(var(--spacing) * 1)}.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)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.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-5{padding-inline:calc(var(--spacing) * 5)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-\[length\:var\(--font-size-lg\)\]{font-size:var(--font-size-lg)}.text-\[length\:var\(--font-size-md\)\]{font-size:var(--font-size-md)}.text-\[length\:var\(--font-size-sm\)\]{font-size:var(--font-size-sm)}.text-\[length\:var\(--font-size-xl\)\]{font-size:var(--font-size-xl)}.text-\[length\:var\(--font-size-xs\)\]{font-size:var(--font-size-xs)}.leading-\[var\(--line-height-relaxed\)\]{--tw-leading:var(--line-height-relaxed);line-height:var(--line-height-relaxed)}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--icon-color-active\)\]{color:var(--icon-color-active)}.text-\[var\(--icon-color-default\)\]{color:var(--icon-color-default)}.text-\[var\(--icon-color-muted\)\]{color:var(--icon-color-muted)}.text-\[var\(--semantic-danger-fg\)\]{color:var(--semantic-danger-fg)}.text-\[var\(--semantic-info-fg\)\]{color:var(--semantic-info-fg)}.text-\[var\(--semantic-success-fg\)\]{color:var(--semantic-success-fg)}.text-\[var\(--semantic-warning-fg\)\]{color:var(--semantic-warning-fg)}.text-\[var\(--text-primary\)\]{color:var(--text-primary)}.text-\[var\(--text-secondary\)\]{color:var(--text-secondary)}.text-\[var\(--text-tertiary\)\]{color:var(--text-tertiary)}.text-card-foreground{color:var(--card-foreground)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.opacity-0{opacity:0}.shadow-\[var\(--shadow-lg\)\]{--tw-shadow:var(--shadow-lg);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-md\)\]{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-xs\)\]{--tw-shadow:var(--shadow-xs);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.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{--tw-backdrop-blur:blur(8px);-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-\[border-color\,box-shadow\]{transition-property:border-color,box-shadow;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-\[var\(--motion-duration-fast\)\]{--tw-duration:var(--motion-duration-fast);transition-duration:var(--motion-duration-fast)}.duration-\[var\(--motion-duration-normal\)\]{--tw-duration:var(--motion-duration-normal);transition-duration:var(--motion-duration-normal)}.ease-\[var\(--motion-ease-standard\)\]{--tw-ease:var(--motion-ease-standard);transition-timing-function:var(--motion-ease-standard)}.outline-none{--tw-outline-style:none;outline-style:none}.group-data-\[state\=collapsed\]\/sidebar\:hidden:is(:where(.group\/sidebar)[data-state=collapsed] *){display:none}.group-data-\[state\=collapsed\]\/sidebar\:flex-none:is(:where(.group\/sidebar)[data-state=collapsed] *){flex:none}.group-data-\[state\=collapsed\]\/sidebar\:justify-center:is(:where(.group\/sidebar)[data-state=collapsed] *){justify-content:center}:where(.group-data-\[state\=collapsed\]\/sidebar\:space-y-2:is(:where(.group\/sidebar)[data-state=collapsed] *)>: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)))}.group-data-\[state\=collapsed\]\/sidebar\:px-0:is(:where(.group\/sidebar)[data-state=collapsed] *){padding-inline:calc(var(--spacing) * 0)}.group-data-\[state\=collapsed\]\/sidebar\:px-2:is(:where(.group\/sidebar)[data-state=collapsed] *){padding-inline:calc(var(--spacing) * 2)}.placeholder\:text-\[var\(--text-tertiary\)\]::placeholder{color:var(--text-tertiary)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing) * 0)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-px:after{content:var(--tw-content);width:1px}@media (hover:hover){.hover\:bg-\[var\(--color-gray-150\)\]:hover{background-color:var(--color-gray-150)}.hover\:bg-\[var\(--color-gray-800\)\]:hover{background-color:var(--color-gray-800)}.hover\:bg-\[var\(--color-rose-500\)\]:hover{background-color:var(--color-rose-500)}.hover\:bg-\[var\(--state-hover-bg\)\]:hover{background-color:var(--state-hover-bg)}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.hover\:text-\[var\(--icon-color-active\)\]:hover{color:var(--icon-color-active)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:shadow-\[var\(--state-focus-ring\)\]:focus-visible{--tw-shadow:var(--state-focus-ring);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\:shadow-none:focus-visible{--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)}.focus-visible\:ring-\[var\(--semantic-danger-border\)\]\/40:focus-visible{--tw-ring-color:var(--semantic-danger-border)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-\[var\(--semantic-danger-border\)\]\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--semantic-danger-border) 40%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-\[var\(--opacity-disabled\)\]:disabled{opacity:var(--opacity-disabled)}.has-\[\[data-variant\=inset\]\]\:bg-background:has([data-variant=inset]){background-color:var(--background)}@media (width>=40rem){.sm\:flex{display:flex}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media (width>=48rem){.md\:relative{position:relative}.md\:z-auto{z-index:auto}.md\:hidden{display:none}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}}:root{--color-white:#fdfdfd;--color-gray-50:#f7f8fa;--color-gray-75:#f3f4f7;--color-gray-100:#f0f1f5;--color-gray-150:#edeef0;--color-gray-200:#e5e7ec;--color-gray-250:#dadde5;--color-gray-300:#c9ccd6;--color-gray-400:#aeb1bb;--color-gray-500:#8d909b;--color-gray-600:#747783;--color-gray-700:#565a66;--color-gray-800:#343844;--color-gray-900:#1f2330;--color-green-50:#e7f0ea;--color-green-100:#dde7df;--color-green-500:#2f7a4e;--color-rose-50:#f0e1e7;--color-rose-100:#e8d7df;--color-rose-500:#9b3f5a;--color-yellow-50:#f3ead2;--color-yellow-100:#eadcad;--color-yellow-600:#8a6a1d;--color-blue-50:#e4e9f7;--color-blue-100:#d8e0f3;--color-blue-600:#4d5f9e;--surface-window:#f0f1f5;--surface-sidebar:#edeef0;--surface-panel:#f3f4f7;--surface-card:#f7f8fa;--surface-code:#f1f2f6;--surface-input:#f3f4f7;--surface-floating:#ffffffb8;--surface-overlay:#1f23305c;--text-primary:#2c303a;--text-secondary:#5f636f;--text-tertiary:#8a8e99;--text-muted:#a9adb6;--text-disabled:#c4c7cf;--text-link:#4d5f9e;--text-success:#2f7a4e;--text-danger:#9b3f5a;--text-warning:#8a6a1d;--border-subtle:#e0e2e8;--border-default:#d5d8e0;--border-strong:#c4c8d2;--border-focus:#aeb7d8;--border-divider:#1f233014;--semantic-success-bg:#e7f0ea;--semantic-success-fg:#2f7a4e;--semantic-success-border:#8ec7a2;--semantic-danger-bg:#f0e1e7;--semantic-danger-fg:#9b3f5a;--semantic-danger-border:#d18ba0;--semantic-warning-bg:#f3ead2;--semantic-warning-fg:#8a6a1d;--semantic-warning-border:#d7bc73;--semantic-info-bg:#e4e9f7;--semantic-info-fg:#4d5f9e;--semantic-info-border:#a8b7e0;--diff-added-bg:#dde7df;--diff-added-bg-soft:#e7f0ea;--diff-added-fg:#2f7a4e;--diff-added-border:#8ec7a2;--diff-removed-bg:#e8d7df;--diff-removed-bg-soft:#f0e1e7;--diff-removed-fg:#9b3f5a;--diff-removed-border:#d18ba0;--diff-hunk-bg:#e9e7f5;--diff-hunk-fg:#6b61a8;--diff-hunk-border:#c8c2ea;--font-sans:-apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", sans-serif;--font-mono:"SF Mono", "Menlo", "Monaco", "Consolas", "Liberation Mono", monospace;--font-size-2xs:10px;--font-size-xs:11px;--font-size-sm:12px;--font-size-md:13px;--font-size-lg:14px;--font-size-xl:16px;--font-size-2xl:20px;--line-height-tight:1.25;--line-height-normal:1.45;--line-height-relaxed:1.6;--font-weight-regular:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--space-0:0;--space-0_5:2px;--space-1:4px;--space-1_5:6px;--space-2:8px;--space-2_5:10px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--space-12:48px;--radius-xs:4px;--radius-sm:6px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-pill:9999px;--shadow-xs:0 1px 2px #1f23300f;--shadow-sm:0 2px 6px #1f233014;--shadow-md:0 8px 24px #1f23301f;--shadow-lg:0 16px 48px #1f233029;--motion-duration-fast:.12s;--motion-duration-normal:.18s;--motion-duration-slow:.24s;--motion-ease-standard:cubic-bezier(.2, 0, 0, 1);--motion-ease-out:cubic-bezier(0, 0, .2, 1);--motion-ease-in:cubic-bezier(.4, 0, 1, 1);--state-hover-bg:#1f23300d;--state-pressed-bg:#1f233017;--state-selected-bg:#1f233012;--state-focus-ring:0 0 0 3px #6874b438;--opacity-disabled:.42;--opacity-muted:.64;--layout-sidebar-width:320px;--layout-topbar-height:56px;--layout-panel-min-width:320px;--layout-max-content-width:1200px;--icon-size-xs:12px;--icon-size-sm:14px;--icon-size-md:16px;--icon-size-lg:20px;--icon-color-default:#747783;--icon-color-muted:#a9adb6;--icon-color-active:#343844;--background:var(--surface-window);--foreground:var(--text-primary);--card:var(--surface-card);--card-foreground:var(--text-primary);--popover:var(--surface-floating);--popover-foreground:var(--text-primary);--primary:var(--color-gray-900);--primary-foreground:var(--color-white);--secondary:var(--color-gray-100);--secondary-foreground:var(--text-primary);--muted:var(--surface-panel);--muted-foreground:var(--text-secondary);--accent:var(--state-hover-bg);--accent-foreground:var(--text-primary);--destructive:var(--semantic-danger-fg);--destructive-foreground:var(--color-white);--border:var(--border-default);--input:var(--border-default);--ring:var(--border-focus);--sidebar:var(--surface-sidebar);--sidebar-foreground:var(--text-primary);--sidebar-accent:var(--state-selected-bg);--sidebar-accent-foreground:var(--text-primary);--sidebar-border:var(--border-divider);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;font-family:var(--font-sans);background:var(--surface-window);color:var(--text-primary)}*{box-sizing:border-box}html,body{min-height:100%}body{background:var(--surface-window);color:var(--text-primary);font-family:var(--font-sans);font-size:var(--font-size-md);line-height:var(--line-height-normal);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;margin:0}button,input,textarea{font:inherit}::selection{background:var(--semantic-info-bg);color:var(--text-primary)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-gray-300);border-radius:var(--radius-pill);background-clip:padding-box;border:3px solid #0000}::-webkit-scrollbar-thumb:hover{background:var(--color-gray-400);background-clip:padding-box;border:3px solid #0000}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}