@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.
- package/app/server/app-BLBOjh4e.mjs +29147 -0
- package/app/server/app-BLBOjh4e.mjs.map +1 -0
- package/app/server/index.mjs +2 -0
- package/app/server/start.mjs +520 -0
- package/app/server/start.mjs.map +1 -0
- package/app/web/assets/index-IcxJQt7a.css +2 -0
- package/app/web/assets/index-iSfjEV4I.js +52 -0
- package/app/web/index.html +16 -0
- package/package.json +1 -1
- package/phantom.js +60 -32
- package/app/.output/nitro.json +0 -17
- package/app/.output/public/assets/index-CI6IWFKa.css +0 -2
- package/app/.output/public/assets/index-DHMHkew5.js +0 -12
- package/app/.output/public/assets/jsx-runtime-CUBmso4R.js +0 -1
- package/app/.output/public/assets/routes-Boii8-De.js +0 -1
- package/app/.output/server/__23tanstack-start-plugin-adapters-y_fshQDY.mjs +0 -5
- package/app/.output/server/_chunks/ssr-renderer.mjs +0 -15
- package/app/.output/server/_libs/@tanstack/react-router+[...].mjs +0 -14637
- package/app/.output/server/_libs/h3+rou3+srvx.mjs +0 -1210
- package/app/.output/server/_libs/hookable.mjs +0 -41
- package/app/.output/server/_libs/lucide-react.mjs +0 -351
- package/app/.output/server/_libs/tanstack__history.mjs +0 -342
- package/app/.output/server/_libs/tanstack__router-core.mjs +0 -6
- package/app/.output/server/_libs/ufo.mjs +0 -64
- package/app/.output/server/_libs/zod.mjs +0 -3745
- package/app/.output/server/_runtime.mjs +0 -26
- package/app/.output/server/_ssr/router-C0zvMxvt.mjs +0 -3475
- package/app/.output/server/_ssr/routes-DpnTz1lw.mjs +0 -1450
- package/app/.output/server/_ssr/ssr.mjs +0 -5174
- package/app/.output/server/_ssr/start-DaFzyN3q.mjs +0 -4
- package/app/.output/server/_tanstack-start-manifest_v-CWxREUaR.mjs +0 -35
- 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
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
|
|
4555
|
-
else if (line
|
|
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 ?
|
|
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 &&
|
|
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
|
|
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({
|
|
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
|
|
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, {
|
|
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, {
|
|
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-
|
|
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
|
|
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
|
|
25107
|
-
"The underlying
|
|
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
|
|
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-
|
|
25284
|
+
var version = "6.3.0-2";
|
|
25257
25285
|
//#endregion
|
|
25258
25286
|
//#region src/version.ts
|
|
25259
25287
|
function getVersion() {
|
package/app/.output/nitro.json
DELETED
|
@@ -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:""}
|