@shepai/cli 1.69.0 → 1.70.1
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/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts +1 -1
- package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.d.ts +7 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.js +17 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +60 -7
- package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.js +13 -6
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +17 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/CLAUDE.md +45 -18
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/iterm2.json +17 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/kitty.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/tmux.json +27 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +17 -0
- package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-feature.js +11 -0
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-repository.js +8 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/tools/tools-page-client.js +2 -1
- package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-deploy-action.js +36 -5
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__09413611._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
- package/web/.next/server/chunks/ssr/_68b5e0de._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
- package/web/.next/server/chunks/ssr/_690ea95f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +18 -18
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/app/actions/deploy-feature.ts +16 -0
- package/web/.next/standalone/src/presentation/web/app/actions/deploy-repository.ts +10 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +5 -1
- package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +45 -5
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/16e380b8dd9d11bc.js +1 -0
- package/web/.next/static/chunks/{5bc5d426870feb7e.js → 1ed0df845a1625f6.js} +1 -1
- package/web/.next/static/chunks/{2da52289a4a8f9e2.js → 24e1d97cab8bad6d.js} +1 -1
- package/web/.next/static/chunks/{491ae2bbae40857c.js → 505c6a9e4c5d0808.js} +1 -1
- package/web/.next/static/chunks/{5ef9d8b7401f2f1f.js → 9db5c06001f3e664.js} +2 -2
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/static/chunks/faf8ad4c823884d7.js +0 -1
- /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_buildManifest.js +0 -0
- /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_ssgManifest.js +0 -0
|
@@ -2,15 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
import { existsSync } from 'node:fs';
|
|
4
4
|
import { resolve } from '@/lib/server-container';
|
|
5
|
+
import { createDeploymentLogger } from '@shepai/core/infrastructure/services/deployment/deployment-logger';
|
|
5
6
|
import { computeWorktreePath } from '@shepai/core/infrastructure/services/ide-launchers/compute-worktree-path';
|
|
6
7
|
import type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';
|
|
7
8
|
import type { IDeploymentService } from '@shepai/core/application/ports/output/services/deployment-service.interface';
|
|
8
9
|
import { DeploymentState } from '@shepai/core/domain/generated/output';
|
|
9
10
|
|
|
11
|
+
const log = createDeploymentLogger('[deployFeature]');
|
|
12
|
+
|
|
10
13
|
export async function deployFeature(
|
|
11
14
|
featureId: string
|
|
12
15
|
): Promise<{ success: boolean; error?: string; state?: DeploymentState }> {
|
|
16
|
+
log.info(`called — featureId="${featureId}"`);
|
|
17
|
+
|
|
13
18
|
if (!featureId?.trim()) {
|
|
19
|
+
log.warn('rejected — featureId is empty');
|
|
14
20
|
return { success: false, error: 'featureId is required' };
|
|
15
21
|
}
|
|
16
22
|
|
|
@@ -19,21 +25,31 @@ export async function deployFeature(
|
|
|
19
25
|
const feature = await featureRepo.findById(featureId);
|
|
20
26
|
|
|
21
27
|
if (!feature) {
|
|
28
|
+
log.warn(`feature not found in repository: "${featureId}"`);
|
|
22
29
|
return { success: false, error: `Feature not found: ${featureId}` };
|
|
23
30
|
}
|
|
24
31
|
|
|
32
|
+
log.info(
|
|
33
|
+
`feature found — repositoryPath="${feature.repositoryPath}", branch="${feature.branch}"`
|
|
34
|
+
);
|
|
35
|
+
|
|
25
36
|
const worktreePath = computeWorktreePath(feature.repositoryPath, feature.branch);
|
|
37
|
+
log.info(`computed worktreePath="${worktreePath}"`);
|
|
26
38
|
|
|
27
39
|
if (!existsSync(worktreePath)) {
|
|
40
|
+
log.warn(`worktree path does not exist on disk: "${worktreePath}"`);
|
|
28
41
|
return { success: false, error: `Worktree path does not exist: ${worktreePath}` };
|
|
29
42
|
}
|
|
30
43
|
|
|
44
|
+
log.info('worktree path exists, calling deploymentService.start()');
|
|
31
45
|
const deploymentService = resolve<IDeploymentService>('IDeploymentService');
|
|
32
46
|
deploymentService.start(featureId, worktreePath);
|
|
33
47
|
|
|
48
|
+
log.info('start() returned successfully — state=Booting');
|
|
34
49
|
return { success: true, state: DeploymentState.Booting };
|
|
35
50
|
} catch (error: unknown) {
|
|
36
51
|
const message = error instanceof Error ? error.message : 'Failed to deploy feature';
|
|
52
|
+
log.error(`error: ${message}`, error);
|
|
37
53
|
return { success: false, error: message };
|
|
38
54
|
}
|
|
39
55
|
}
|
|
@@ -2,27 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
import { existsSync } from 'node:fs';
|
|
4
4
|
import { resolve } from '@/lib/server-container';
|
|
5
|
+
import { createDeploymentLogger } from '@shepai/core/infrastructure/services/deployment/deployment-logger';
|
|
5
6
|
import type { IDeploymentService } from '@shepai/core/application/ports/output/services/deployment-service.interface';
|
|
6
7
|
import { DeploymentState } from '@shepai/core/domain/generated/output';
|
|
7
8
|
|
|
9
|
+
const log = createDeploymentLogger('[deployRepository]');
|
|
10
|
+
|
|
8
11
|
export async function deployRepository(
|
|
9
12
|
repositoryPath: string
|
|
10
13
|
): Promise<{ success: boolean; error?: string; state?: DeploymentState }> {
|
|
14
|
+
log.info(`called — repositoryPath="${repositoryPath}"`);
|
|
15
|
+
|
|
11
16
|
if (!repositoryPath?.startsWith('/')) {
|
|
17
|
+
log.warn('rejected — not an absolute path');
|
|
12
18
|
return { success: false, error: 'repositoryPath must be an absolute path' };
|
|
13
19
|
}
|
|
14
20
|
|
|
15
21
|
try {
|
|
16
22
|
if (!existsSync(repositoryPath)) {
|
|
23
|
+
log.warn(`directory does not exist: "${repositoryPath}"`);
|
|
17
24
|
return { success: false, error: `Directory does not exist: ${repositoryPath}` };
|
|
18
25
|
}
|
|
19
26
|
|
|
27
|
+
log.info('directory exists, calling deploymentService.start()');
|
|
20
28
|
const deploymentService = resolve<IDeploymentService>('IDeploymentService');
|
|
21
29
|
deploymentService.start(repositoryPath, repositoryPath);
|
|
22
30
|
|
|
31
|
+
log.info('start() returned successfully — state=Booting');
|
|
23
32
|
return { success: true, state: DeploymentState.Booting };
|
|
24
33
|
} catch (error: unknown) {
|
|
25
34
|
const message = error instanceof Error ? error.message : 'Failed to deploy repository';
|
|
35
|
+
log.error(`error: ${message}`, error);
|
|
26
36
|
return { success: false, error: message };
|
|
27
37
|
}
|
|
28
38
|
}
|
|
@@ -28,6 +28,7 @@ const TAG_CONFIG: Record<string, { label: string; icon: typeof Monitor }> = {
|
|
|
28
28
|
ide: { label: 'IDE', icon: Monitor },
|
|
29
29
|
'cli-agent': { label: 'CLI Agent', icon: Terminal },
|
|
30
30
|
vcs: { label: 'VCS', icon: GitBranch },
|
|
31
|
+
terminal: { label: 'Terminal', icon: Terminal },
|
|
31
32
|
};
|
|
32
33
|
|
|
33
34
|
export function ToolCard({ tool, onRefresh, className }: ToolCardProps) {
|
package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx
CHANGED
|
@@ -12,13 +12,14 @@ export interface ToolsPageClientProps {
|
|
|
12
12
|
className?: string;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
type TabValue = 'all' | 'ide' | 'cli-agent' | 'vcs';
|
|
15
|
+
type TabValue = 'all' | 'ide' | 'cli-agent' | 'vcs' | 'terminal';
|
|
16
16
|
|
|
17
17
|
const TAB_FILTER: Record<TabValue, (tool: ToolItem) => boolean> = {
|
|
18
18
|
all: () => true,
|
|
19
19
|
ide: (tool) => tool.tags.includes('ide'),
|
|
20
20
|
'cli-agent': (tool) => tool.tags.includes('cli-agent'),
|
|
21
21
|
vcs: (tool) => tool.tags.includes('vcs'),
|
|
22
|
+
terminal: (tool) => tool.tags.includes('terminal'),
|
|
22
23
|
};
|
|
23
24
|
|
|
24
25
|
export function ToolsPageClient({ tools: initialTools, className }: ToolsPageClientProps) {
|
|
@@ -72,6 +73,9 @@ export function ToolsPageClient({ tools: initialTools, className }: ToolsPageCli
|
|
|
72
73
|
<TabsTrigger value="vcs" data-testid="tools-tab-vcs" className="px-2.5 text-xs">
|
|
73
74
|
Version Control
|
|
74
75
|
</TabsTrigger>
|
|
76
|
+
<TabsTrigger value="terminal" data-testid="tools-tab-terminal" className="px-2.5 text-xs">
|
|
77
|
+
Terminals
|
|
78
|
+
</TabsTrigger>
|
|
75
79
|
</TabsList>
|
|
76
80
|
|
|
77
81
|
<TabsContent value={activeTab} className="mt-3">
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
+
/* eslint-disable no-console */
|
|
2
3
|
|
|
3
4
|
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
4
5
|
import type { DeploymentState } from '@shepai/core/domain/generated/output';
|
|
@@ -24,6 +25,16 @@ export interface DeployActionState {
|
|
|
24
25
|
url: string | null;
|
|
25
26
|
}
|
|
26
27
|
|
|
28
|
+
const PREFIX = '[useDeployAction]';
|
|
29
|
+
const isDebug = !!process.env.NEXT_PUBLIC_DEBUG;
|
|
30
|
+
const noop = () => undefined;
|
|
31
|
+
const log = {
|
|
32
|
+
info: isDebug ? (...args: unknown[]) => console.info(PREFIX, ...args) : noop,
|
|
33
|
+
debug: isDebug ? (...args: unknown[]) => console.debug(PREFIX, ...args) : noop,
|
|
34
|
+
warn: (...args: unknown[]) => console.warn(PREFIX, ...args),
|
|
35
|
+
error: (...args: unknown[]) => console.error(PREFIX, ...args),
|
|
36
|
+
};
|
|
37
|
+
|
|
27
38
|
const ERROR_CLEAR_DELAY = 5000;
|
|
28
39
|
const POLL_INTERVAL = 3000;
|
|
29
40
|
|
|
@@ -56,6 +67,7 @@ export function useDeployAction(input: DeployActionInput | null): DeployActionSt
|
|
|
56
67
|
|
|
57
68
|
const stopPolling = useCallback(() => {
|
|
58
69
|
if (pollIntervalRef.current) {
|
|
70
|
+
log.debug('stopping polling');
|
|
59
71
|
clearInterval(pollIntervalRef.current);
|
|
60
72
|
pollIntervalRef.current = null;
|
|
61
73
|
}
|
|
@@ -64,6 +76,7 @@ export function useDeployAction(input: DeployActionInput | null): DeployActionSt
|
|
|
64
76
|
const startPolling = useCallback(
|
|
65
77
|
(targetId: string) => {
|
|
66
78
|
stopPolling();
|
|
79
|
+
log.debug(`starting polling for "${targetId}" every ${POLL_INTERVAL}ms`);
|
|
67
80
|
|
|
68
81
|
pollIntervalRef.current = setInterval(async () => {
|
|
69
82
|
if (!mountedRef.current) {
|
|
@@ -76,20 +89,37 @@ export function useDeployAction(input: DeployActionInput | null): DeployActionSt
|
|
|
76
89
|
if (!mountedRef.current) return;
|
|
77
90
|
|
|
78
91
|
if (!result || result.state === 'Stopped') {
|
|
92
|
+
log.info(
|
|
93
|
+
`poll result: ${result ? `state=${result.state}` : 'null (deployment gone)'} — stopping poll`
|
|
94
|
+
);
|
|
79
95
|
setStatus(null);
|
|
80
96
|
setUrl(null);
|
|
81
97
|
stopPolling();
|
|
82
98
|
} else {
|
|
99
|
+
if (result.state !== status) {
|
|
100
|
+
log.info(`poll state changed: ${status} → ${result.state}, url=${result.url}`);
|
|
101
|
+
}
|
|
83
102
|
setStatus(result.state as DeploymentState);
|
|
84
103
|
setUrl(result.url);
|
|
85
104
|
}
|
|
86
105
|
}, POLL_INTERVAL);
|
|
87
106
|
},
|
|
88
|
-
[stopPolling]
|
|
107
|
+
[stopPolling, status]
|
|
89
108
|
);
|
|
90
109
|
|
|
91
110
|
const handleDeploy = useCallback(async () => {
|
|
92
|
-
if (!input
|
|
111
|
+
if (!input) {
|
|
112
|
+
log.warn('deploy() called but input is null — no-op');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (deployLoading) {
|
|
116
|
+
log.warn('deploy() called but already loading — no-op');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
log.info(
|
|
121
|
+
`deploy() — targetType="${input.targetType}", targetId="${input.targetId}", repositoryPath="${input.repositoryPath}"`
|
|
122
|
+
);
|
|
93
123
|
|
|
94
124
|
if (errorTimerRef.current) clearTimeout(errorTimerRef.current);
|
|
95
125
|
|
|
@@ -102,13 +132,20 @@ export function useDeployAction(input: DeployActionInput | null): DeployActionSt
|
|
|
102
132
|
? await deployFeature(input.targetId)
|
|
103
133
|
: await deployRepository(input.repositoryPath);
|
|
104
134
|
|
|
105
|
-
|
|
135
|
+
log.info('server action result:', result);
|
|
136
|
+
|
|
137
|
+
if (!mountedRef.current) {
|
|
138
|
+
log.warn('component unmounted after deploy — discarding result');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
106
141
|
|
|
107
142
|
if (!result.success) {
|
|
108
143
|
const errorMessage = result.error ?? 'An unexpected error occurred';
|
|
144
|
+
log.error(`deploy failed: ${errorMessage}`);
|
|
109
145
|
setDeployError(errorMessage);
|
|
110
146
|
errorTimerRef.current = setTimeout(() => setDeployError(null), ERROR_CLEAR_DELAY);
|
|
111
147
|
} else {
|
|
148
|
+
log.info(`deploy succeeded — initial state=${result.state}, starting polling`);
|
|
112
149
|
setStatus(result.state ?? null);
|
|
113
150
|
setUrl(null);
|
|
114
151
|
startPolling(input.targetId);
|
|
@@ -116,6 +153,7 @@ export function useDeployAction(input: DeployActionInput | null): DeployActionSt
|
|
|
116
153
|
} catch (err: unknown) {
|
|
117
154
|
if (!mountedRef.current) return;
|
|
118
155
|
const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
|
|
156
|
+
log.error(`deploy threw exception: ${errorMessage}`, err);
|
|
119
157
|
setDeployError(errorMessage);
|
|
120
158
|
errorTimerRef.current = setTimeout(() => setDeployError(null), ERROR_CLEAR_DELAY);
|
|
121
159
|
} finally {
|
|
@@ -128,10 +166,12 @@ export function useDeployAction(input: DeployActionInput | null): DeployActionSt
|
|
|
128
166
|
const handleStop = useCallback(async () => {
|
|
129
167
|
if (!input || stopLoading) return;
|
|
130
168
|
|
|
169
|
+
log.info(`stop() — targetId="${input.targetId}"`);
|
|
131
170
|
setStopLoading(true);
|
|
132
171
|
|
|
133
172
|
try {
|
|
134
173
|
const result = await stopDeployment(input.targetId);
|
|
174
|
+
log.info('stop result:', result);
|
|
135
175
|
|
|
136
176
|
if (!mountedRef.current) return;
|
|
137
177
|
|
|
@@ -140,8 +180,8 @@ export function useDeployAction(input: DeployActionInput | null): DeployActionSt
|
|
|
140
180
|
setStatus(null);
|
|
141
181
|
setUrl(null);
|
|
142
182
|
}
|
|
143
|
-
} catch {
|
|
144
|
-
|
|
183
|
+
} catch (err) {
|
|
184
|
+
log.warn('stop error (non-critical):', err);
|
|
145
185
|
} finally {
|
|
146
186
|
if (mountedRef.current) {
|
|
147
187
|
setStopLoading(false);
|
|
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
15
15
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
16
16
|
|
|
17
17
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
18
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.
|
|
18
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.70.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
|
|
19
19
|
|
|
20
20
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
21
21
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,54793,7729,e=>{"use strict";var t=e.i(20314),n=e.i(31777);function r({icon:e,title:r,description:a,action:o,className:l,...i}){return(0,t.jsxs)("div",{className:(0,n.cn)("flex flex-col items-center gap-4 px-4 py-12 text-center",l),...i,children:[e?(0,t.jsx)("div",{className:"text-muted-foreground",children:e}):null,(0,t.jsx)("h3",{className:"text-lg font-semibold",children:r}),a?(0,t.jsx)("p",{className:"text-muted-foreground max-w-md text-sm",children:a}):null,o?(0,t.jsx)("div",{className:"mt-2",children:o}):null]})}e.s(["EmptyState",()=>r],7729),e.s([],54793)},19933,24042,64970,72714,81803,17466,99348,e=>{"use strict";var t=e.i(3645);let n=(0,t.default)("folder-open",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);e.s(["FolderOpen",()=>n],19933);let r=(0,t.default)("play",[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]);e.s(["Play",()=>r],24042);let a=(0,t.default)("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);e.s(["Square",()=>a],64970);var o=e.i(20314),l=e.i(83428),i=e.i(51251),u=e.i(31777),s=e.i(35364),d=e.i(8361);function c({label:e,onClick:t,loading:n,error:r,icon:a,iconOnly:c=!1,variant:f="outline",size:p="sm"}){let m=(0,d.useSoundAction)("click");return(0,o.jsxs)(s.Button,{variant:f,size:p,"aria-label":e,disabled:n,onClick:()=>{m.play(),t()},className:(0,u.cn)("gap-1.5",r&&"text-destructive hover:text-destructive",!r&&c&&"ghost"===f&&"text-muted-foreground cursor-pointer rounded-full transition-colors hover:text-blue-500"),children:[n?(0,o.jsx)(l.Loader2,{className:"size-4 animate-spin"}):r?(0,o.jsx)(i.CircleAlert,{className:"size-4"}):(0,o.jsx)(a,{className:"size-4"}),c?null:e]})}e.s(["ActionButton",()=>c],72714),e.s([],81803);var f=e.i(30702),p=e.i(17406),m=e.i(81846);function g({status:e,url:t}){switch(e){case p.DeploymentState.Booting:return(0,o.jsxs)(m.Badge,{className:"border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50",children:[(0,o.jsx)(l.Loader2,{className:"mr-1 h-3.5 w-3.5 animate-spin"}),"Starting..."]});case p.DeploymentState.Ready:return(0,o.jsxs)(m.Badge,{className:"border-transparent bg-green-50 text-green-700 hover:bg-green-50",children:[(0,o.jsx)("span",{className:"mr-1 inline-block h-2 w-2 rounded-full bg-green-500"}),t?(0,o.jsxs)("a",{href:t,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 hover:underline",onClick:e=>e.stopPropagation(),children:[t,(0,o.jsx)(f.ExternalLink,{className:"h-3 w-3"})]}):"Ready"]});default:return null}}e.s(["DeploymentStatusBadge",()=>g],17466),e.s([],99348)},8537,e=>{"use strict";var t=e.i(44172),n=e.i(79054),r=e.i(21023);let a=(0,r.createServerReference)("4006b7a73487a4e583f3422160008ccfc06c941c75",r.callServer,void 0,r.findSourceMapURL,"deployFeature"),o=(0,r.createServerReference)("40a8c0bacad41d1221c10df1eb2b2902eb4b44dd6b",r.callServer,void 0,r.findSourceMapURL,"deployRepository"),l=(0,r.createServerReference)("40a7808d5c3be6afa44680ca161c6c013e4140ff15",r.callServer,void 0,r.findSourceMapURL,"stopDeployment"),i=(0,r.createServerReference)("402466b72a304624e93d5c2c6f5a6ab2d3a5fc0776",r.callServer,void 0,r.findSourceMapURL,"getDeploymentStatus"),u="[useDeployAction]",s=!!t.default.env.NEXT_PUBLIC_DEBUG,d=()=>void 0,c={info:s?(...e)=>console.info(u,...e):d,debug:s?(...e)=>console.debug(u,...e):d,warn:(...e)=>console.warn(u,...e),error:(...e)=>console.error(u,...e)};function f(e){let[t,r]=(0,n.useState)(!1),[u,s]=(0,n.useState)(!1),[d,f]=(0,n.useState)(null),[p,m]=(0,n.useState)(null),[g,h]=(0,n.useState)(null),v=(0,n.useRef)(null),w=(0,n.useRef)(null),y=(0,n.useRef)(!0);(0,n.useEffect)(()=>(y.current=!0,()=>{y.current=!1}),[]),(0,n.useEffect)(()=>()=>{v.current&&clearTimeout(v.current),w.current&&clearInterval(w.current)},[]);let b=(0,n.useCallback)(()=>{w.current&&(c.debug("stopping polling"),clearInterval(w.current),w.current=null)},[]),x=(0,n.useCallback)(e=>{b(),c.debug(`starting polling for "${e}" every 3000ms`),w.current=setInterval(async()=>{if(!y.current)return void b();let t=await i(e);y.current&&(t&&"Stopped"!==t.state?(t.state!==p&&c.info(`poll state changed: ${p} → ${t.state}, url=${t.url}`),m(t.state),h(t.url)):(c.info(`poll result: ${t?`state=${t.state}`:"null (deployment gone)"} — stopping poll`),m(null),h(null),b()))},3e3)},[b,p]),R=(0,n.useCallback)(async()=>{if(!e)return void c.warn("deploy() called but input is null — no-op");if(t)return void c.warn("deploy() called but already loading — no-op");c.info(`deploy() — targetType="${e.targetType}", targetId="${e.targetId}", repositoryPath="${e.repositoryPath}"`),v.current&&clearTimeout(v.current),r(!0),f(null);try{let t="feature"===e.targetType?await a(e.targetId):await o(e.repositoryPath);if(c.info("server action result:",t),!y.current)return void c.warn("component unmounted after deploy — discarding result");if(t.success)c.info(`deploy succeeded — initial state=${t.state}, starting polling`),m(t.state??null),h(null),x(e.targetId);else{let e=t.error??"An unexpected error occurred";c.error(`deploy failed: ${e}`),f(e),v.current=setTimeout(()=>f(null),5e3)}}catch(t){if(!y.current)return;let e=t instanceof Error?t.message:"An unexpected error occurred";c.error(`deploy threw exception: ${e}`,t),f(e),v.current=setTimeout(()=>f(null),5e3)}finally{y.current&&r(!1)}},[e,t,x]),T=(0,n.useCallback)(async()=>{if(e&&!u){c.info(`stop() — targetId="${e.targetId}"`),s(!0);try{let t=await l(e.targetId);if(c.info("stop result:",t),!y.current)return;t.success&&(b(),m(null),h(null))}catch(e){c.warn("stop error (non-critical):",e)}finally{y.current&&s(!1)}}},[e,u,b]);return{deploy:R,stop:T,deployLoading:t,stopLoading:u,deployError:d,status:p,url:g}}e.s(["useDeployAction",()=>f],8537)},45811,e=>{"use strict";let t;var n=e.i(20314),r=e.i(48249),a=e.i(567),o=e.i(79054);let l=o.default.createContext({drawerRef:{current:null},overlayRef:{current:null},onPress:()=>{},onRelease:()=>{},onDrag:()=>{},onNestedDrag:()=>{},onNestedOpenChange:()=>{},onNestedRelease:()=>{},openProp:void 0,dismissible:!1,isOpen:!1,isDragging:!1,keyboardIsOpen:{current:!1},snapPointsOffset:null,snapPoints:null,handleOnly:!1,modal:!1,shouldFade:!1,activeSnapPoint:null,onOpenChange:()=>{},setActiveSnapPoint:()=>{},closeDrawer:()=>{},direction:"bottom",shouldAnimate:{current:!0},shouldScaleBackground:!1,setBackgroundColorOnScale:!0,noBodyStyles:!1,container:null,autoFocus:!1}),i=()=>{let e=o.default.useContext(l);if(!e)throw Error("useDrawerContext must be used within a Drawer.Root");return e};function u(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function s(){return d(/^iPhone/)||d(/^iPad/)||d(/^Mac/)&&navigator.maxTouchPoints>1}function d(e){return"u">typeof window&&null!=window.navigator?e.test(window.navigator.platform):void 0}!function(e){if(!e||"u"<typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}("[data-vaul-drawer]{touch-action:none;will-change:transform;transition:transform .5s cubic-bezier(.32, .72, 0, 1);animation-duration:.5s;animation-timing-function:cubic-bezier(0.32,0.72,0,1)}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=bottom][data-state=open]{animation-name:slideFromBottom}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=bottom][data-state=closed]{animation-name:slideToBottom}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=top][data-state=open]{animation-name:slideFromTop}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=top][data-state=closed]{animation-name:slideToTop}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=left][data-state=open]{animation-name:slideFromLeft}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=left][data-state=closed]{animation-name:slideToLeft}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=right][data-state=open]{animation-name:slideFromRight}[data-vaul-drawer][data-vaul-snap-points=false][data-vaul-drawer-direction=right][data-state=closed]{animation-name:slideToRight}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=bottom]{transform:translate3d(0,var(--initial-transform,100%),0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=top]{transform:translate3d(0,calc(var(--initial-transform,100%) * -1),0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=left]{transform:translate3d(calc(var(--initial-transform,100%) * -1),0,0)}[data-vaul-drawer][data-vaul-snap-points=true][data-vaul-drawer-direction=right]{transform:translate3d(var(--initial-transform,100%),0,0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=top]{transform:translate3d(0,var(--snap-point-height,0),0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=bottom]{transform:translate3d(0,var(--snap-point-height,0),0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=left]{transform:translate3d(var(--snap-point-height,0),0,0)}[data-vaul-drawer][data-vaul-delayed-snap-points=true][data-vaul-drawer-direction=right]{transform:translate3d(var(--snap-point-height,0),0,0)}[data-vaul-overlay][data-vaul-snap-points=false]{animation-duration:.5s;animation-timing-function:cubic-bezier(0.32,0.72,0,1)}[data-vaul-overlay][data-vaul-snap-points=false][data-state=open]{animation-name:fadeIn}[data-vaul-overlay][data-state=closed]{animation-name:fadeOut}[data-vaul-animate=false]{animation:none!important}[data-vaul-overlay][data-vaul-snap-points=true]{opacity:0;transition:opacity .5s cubic-bezier(.32, .72, 0, 1)}[data-vaul-overlay][data-vaul-snap-points=true]{opacity:1}[data-vaul-drawer]:not([data-vaul-custom-container=true])::after{content:'';position:absolute;background:inherit;background-color:inherit}[data-vaul-drawer][data-vaul-drawer-direction=top]::after{top:initial;bottom:100%;left:0;right:0;height:200%}[data-vaul-drawer][data-vaul-drawer-direction=bottom]::after{top:100%;bottom:initial;left:0;right:0;height:200%}[data-vaul-drawer][data-vaul-drawer-direction=left]::after{left:initial;right:100%;top:0;bottom:0;width:200%}[data-vaul-drawer][data-vaul-drawer-direction=right]::after{left:100%;right:initial;top:0;bottom:0;width:200%}[data-vaul-overlay][data-vaul-snap-points=true]:not([data-vaul-snap-points-overlay=true]):not(\n[data-state=closed]\n){opacity:0}[data-vaul-overlay][data-vaul-snap-points-overlay=true]{opacity:1}[data-vaul-handle]{display:block;position:relative;opacity:.7;background:#e2e2e4;margin-left:auto;margin-right:auto;height:5px;width:32px;border-radius:1rem;touch-action:pan-y}[data-vaul-handle]:active,[data-vaul-handle]:hover{opacity:1}[data-vaul-handle-hitarea]{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:max(100%,2.75rem);height:max(100%,2.75rem);touch-action:inherit}@media (hover:hover) and (pointer:fine){[data-vaul-drawer]{user-select:none}}@media (pointer:fine){[data-vaul-handle-hitarea]:{width:100%;height:100%}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeOut{to{opacity:0}}@keyframes slideFromBottom{from{transform:translate3d(0,var(--initial-transform,100%),0)}to{transform:translate3d(0,0,0)}}@keyframes slideToBottom{to{transform:translate3d(0,var(--initial-transform,100%),0)}}@keyframes slideFromTop{from{transform:translate3d(0,calc(var(--initial-transform,100%) * -1),0)}to{transform:translate3d(0,0,0)}}@keyframes slideToTop{to{transform:translate3d(0,calc(var(--initial-transform,100%) * -1),0)}}@keyframes slideFromLeft{from{transform:translate3d(calc(var(--initial-transform,100%) * -1),0,0)}to{transform:translate3d(0,0,0)}}@keyframes slideToLeft{to{transform:translate3d(calc(var(--initial-transform,100%) * -1),0,0)}}@keyframes slideFromRight{from{transform:translate3d(var(--initial-transform,100%),0,0)}to{transform:translate3d(0,0,0)}}@keyframes slideToRight{to{transform:translate3d(var(--initial-transform,100%),0,0)}}");let c="u">typeof window?o.useLayoutEffect:o.useEffect;function f(...e){return(...t)=>{for(let n of e)"function"==typeof n&&n(...t)}}let p="u">typeof document&&window.visualViewport;function m(e){let t=window.getComputedStyle(e);return/(auto|scroll)/.test(t.overflow+t.overflowX+t.overflowY)}function g(e){for(m(e)&&(e=e.parentElement);e&&!m(e);)e=e.parentElement;return e||document.scrollingElement||document.documentElement}let h=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]),v=0;function w(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}function y(e){let t=document.scrollingElement||document.documentElement;for(;e&&e!==t;){let t=g(e);if(t!==document.documentElement&&t!==document.body&&t!==e){let n=t.getBoundingClientRect().top,r=e.getBoundingClientRect().top;e.getBoundingClientRect().bottom>t.getBoundingClientRect().bottom+24&&(t.scrollTop+=r-n)}e=t.parentElement}}function b(e){return e instanceof HTMLInputElement&&!h.has(e.type)||e instanceof HTMLTextAreaElement||e instanceof HTMLElement&&e.isContentEditable}function x(...e){return o.useCallback(function(...e){return t=>e.forEach(e=>{"function"==typeof e?e(t):null!=e&&(e.current=t)})}(...e),e)}let R=new WeakMap;function T(e,t,n=!1){if(!e||!(e instanceof HTMLElement))return;let r={};Object.entries(t).forEach(([t,n])=>{t.startsWith("--")?e.style.setProperty(t,n):(r[t]=e.style[t],e.style[t]=n)}),n||R.set(e,r)}let E=e=>{switch(e){case"top":case"bottom":return!0;case"left":case"right":return!1;default:return e}};function C(e,t){if(!e)return null;let n=window.getComputedStyle(e),r=n.transform||n.webkitTransform||n.mozTransform,a=r.match(/^matrix3d\((.+)\)$/);return a?parseFloat(a[1].split(", ")[E(t)?13:12]):(a=r.match(/^matrix\((.+)\)$/))?parseFloat(a[1].split(", ")[E(t)?5:4]):null}function D(e,t){if(!e)return()=>{};let n=e.style.cssText;return Object.assign(e.style,t),()=>{e.style.cssText=n}}let S=[.32,.72,0,1],$="vaul-dragging";function j(e){let t=o.default.useRef(e);return o.default.useEffect(()=>{t.current=e}),o.default.useMemo(()=>(...e)=>null==t.current?void 0:t.current.call(t,...e),[])}function k({prop:e,defaultProp:t,onChange:n=()=>{}}){let[r,a]=function({defaultProp:e,onChange:t}){let n=o.default.useState(e),[r]=n,a=o.default.useRef(r),l=j(t);return o.default.useEffect(()=>{a.current!==r&&(l(r),a.current=r)},[r,a,l]),n}({defaultProp:t,onChange:n}),l=void 0!==e,i=l?e:r,u=j(n);return[i,o.default.useCallback(t=>{if(l){let n="function"==typeof t?t(e):t;n!==e&&u(n)}else a(t)},[l,e,a,u])]}let N=()=>()=>{},P=null;function M({open:e,onOpenChange:n,children:r,onDrag:i,onRelease:d,snapPoints:m,shouldScaleBackground:h=!1,setBackgroundColorOnScale:x=!0,closeThreshold:D=.25,scrollLockTimeout:j=100,dismissible:N=!0,handleOnly:M=!1,fadeFromIndex:B=m&&m.length-1,activeSnapPoint:O,setActiveSnapPoint:L,fixed:z,modal:F=!0,onClose:A,nested:H,noBodyStyles:I=!1,direction:W="bottom",defaultOpen:q=!1,disablePreventScroll:U=!0,snapToSequentialPoint:Y=!1,preventScrollRestoration:X=!1,repositionInputs:V=!0,onAnimationEnd:_,container:K,autoFocus:G=!1}){var J,Q;let[Z=!1,ee]=k({defaultProp:q,prop:e,onChange:e=>{null==n||n(e),e||H||eN(),setTimeout(()=>{null==_||_(e)},500),e&&!F&&"u">typeof window&&window.requestAnimationFrame(()=>{document.body.style.pointerEvents="auto"}),e||(document.body.style.pointerEvents="auto")}}),[et,en]=o.default.useState(!1),[er,ea]=o.default.useState(!1),[eo,el]=o.default.useState(!1),ei=o.default.useRef(null),eu=o.default.useRef(null),es=o.default.useRef(null),ed=o.default.useRef(null),ec=o.default.useRef(null),ef=o.default.useRef(!1),ep=o.default.useRef(null),em=o.default.useRef(0),eg=o.default.useRef(!1),eh=o.default.useRef(!q),ev=o.default.useRef(0),ew=o.default.useRef(null),ey=o.default.useRef((null==(J=ew.current)?void 0:J.getBoundingClientRect().height)||0),eb=o.default.useRef((null==(Q=ew.current)?void 0:Q.getBoundingClientRect().width)||0),ex=o.default.useRef(0),eR=o.default.useCallback(e=>{m&&e===eS.length-1&&(eu.current=new Date)},[]),{activeSnapPoint:eT,activeSnapPointIndex:eE,setActiveSnapPoint:eC,onRelease:eD,snapPointsOffset:eS,onDrag:e$,shouldFade:ej,getPercentageDragged:ek}=function({activeSnapPointProp:e,setActiveSnapPointProp:t,snapPoints:n,drawerRef:r,overlayRef:a,fadeFromIndex:l,onSnapPointChange:i,direction:u="bottom",container:s,snapToSequentialPoint:d}){let[c,f]=k({prop:e,defaultProp:null==n?void 0:n[0],onChange:t}),[p,m]=o.default.useState("u">typeof window?{innerWidth:window.innerWidth,innerHeight:window.innerHeight}:void 0);o.default.useEffect(()=>{function e(){m({innerWidth:window.innerWidth,innerHeight:window.innerHeight})}return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]);let g=o.default.useMemo(()=>c===(null==n?void 0:n[n.length-1])||null,[n,c]),h=o.default.useMemo(()=>{var e;return null!=(e=null==n?void 0:n.findIndex(e=>e===c))?e:null},[n,c]),v=n&&n.length>0&&(l||0===l)&&!Number.isNaN(l)&&n[l]===c||!n,w=o.default.useMemo(()=>{var e;let t=s?{width:s.getBoundingClientRect().width,height:s.getBoundingClientRect().height}:"u">typeof window?{width:window.innerWidth,height:window.innerHeight}:{width:0,height:0};return null!=(e=null==n?void 0:n.map(e=>{let n="string"==typeof e,r=0;if(n&&(r=parseInt(e,10)),E(u)){let a=n?r:p?e*t.height:0;return p?"bottom"===u?t.height-a:-t.height+a:a}let a=n?r:p?e*t.width:0;return p?"right"===u?t.width-a:-t.width+a:a}))?e:[]},[n,p,s]),y=o.default.useMemo(()=>null!==h?null==w?void 0:w[h]:null,[w,h]),b=o.default.useCallback(e=>{var t;let o=null!=(t=null==w?void 0:w.findIndex(t=>t===e))?t:null;i(o),T(r.current,{transition:`transform 0.5s cubic-bezier(${S.join(",")})`,transform:E(u)?`translate3d(0, ${e}px, 0)`:`translate3d(${e}px, 0, 0)`}),w&&o!==w.length-1&&void 0!==l&&o!==l&&o<l?T(a.current,{transition:`opacity 0.5s cubic-bezier(${S.join(",")})`,opacity:"0"}):T(a.current,{transition:`opacity 0.5s cubic-bezier(${S.join(",")})`,opacity:"1"}),f(null==n?void 0:n[Math.max(o,0)])},[r.current,n,w,l,a,f]);return o.default.useEffect(()=>{if(c||e){var t;let r=null!=(t=null==n?void 0:n.findIndex(t=>t===e||t===c))?t:-1;w&&-1!==r&&"number"==typeof w[r]&&b(w[r])}},[c,e,n,w,b]),{isLastSnapPoint:g,activeSnapPoint:c,shouldFade:v,getPercentageDragged:function(e,t){if(!n||"number"!=typeof h||!w||void 0===l)return null;let r=h===l-1;if(h>=l&&t)return 0;if(r&&!t)return 1;if(!v&&!r)return null;let a=r?h+1:h-1,o=e/Math.abs(r?w[a]-w[a-1]:w[a+1]-w[a]);return r?1-o:o},setActiveSnapPoint:f,activeSnapPointIndex:h,onRelease:function({draggedDistance:e,closeDrawer:t,velocity:r,dismissible:o}){if(void 0===l)return;let i="bottom"===u||"right"===u?(null!=y?y:0)-e:(null!=y?y:0)+e,s=h===l-1,c=0===h,f=e>0;if(s&&T(a.current,{transition:`opacity 0.5s cubic-bezier(${S.join(",")})`}),!d&&r>2&&!f)return void(o?t():b(w[0]));if(!d&&r>2&&f&&w&&n)return void b(w[n.length-1]);let p=null==w?void 0:w.reduce((e,t)=>"number"!=typeof e||"number"!=typeof t?e:Math.abs(t-i)<Math.abs(e-i)?t:e),m=E(u)?window.innerHeight:window.innerWidth;if(r>.4&&Math.abs(e)<.4*m){let e=f?1:-1;return e>0&&g&&n?void b(w[n.length-1]):void(c&&e<0&&o&&t(),null===h||b(w[h+e]))}b(p)},onDrag:function({draggedDistance:e}){if(null===y)return;let t="bottom"===u||"right"===u?y-e:y+e;("bottom"===u||"right"===u)&&t<w[w.length-1]||("top"===u||"left"===u)&&t>w[w.length-1]||T(r.current,{transform:E(u)?`translate3d(0, ${t}px, 0)`:`translate3d(${t}px, 0, 0)`})},snapPointsOffset:w}}({snapPoints:m,activeSnapPointProp:O,setActiveSnapPointProp:L,drawerRef:ew,fadeFromIndex:B,overlayRef:ei,onSnapPointChange:eR,direction:W,container:K,snapToSequentialPoint:Y});!function(e={}){let{isDisabled:n}=e;c(()=>{if(!n){var e,r,a;let n,o,l,i,u,d,c;return 1==++v&&s()&&(l=0,i=window.pageXOffset,u=window.pageYOffset,d=f((e=document.documentElement,r="paddingRight",a=`${window.innerWidth-document.documentElement.clientWidth}px`,n=e.style[r],e.style[r]=a,()=>{e.style[r]=n})),window.scrollTo(0,0),c=f(w(document,"touchstart",e=>{((o=g(e.target))!==document.documentElement||o!==document.body)&&(l=e.changedTouches[0].pageY)},{passive:!1,capture:!0}),w(document,"touchmove",e=>{if(!o||o===document.documentElement||o===document.body)return void e.preventDefault();let t=e.changedTouches[0].pageY,n=o.scrollTop,r=o.scrollHeight-o.clientHeight;0!==r&&((n<=0&&t>l||n>=r&&t<l)&&e.preventDefault(),l=t)},{passive:!1,capture:!0}),w(document,"touchend",e=>{let t=e.target;b(t)&&t!==document.activeElement&&(e.preventDefault(),t.style.transform="translateY(-2000px)",t.focus(),requestAnimationFrame(()=>{t.style.transform=""}))},{passive:!1,capture:!0}),w(document,"focus",e=>{let t=e.target;b(t)&&(t.style.transform="translateY(-2000px)",requestAnimationFrame(()=>{t.style.transform="",p&&(p.height<window.innerHeight?requestAnimationFrame(()=>{y(t)}):p.addEventListener("resize",()=>y(t),{once:!0}))}))},!0),w(window,"scroll",()=>{window.scrollTo(0,0)})),t=()=>{d(),c(),window.scrollTo(i,u)}),()=>{0==--v&&(null==t||t())}}},[n])}({isDisabled:!Z||er||!F||eo||!et||!V||!U});let{restorePositionSetting:eN}=function({isOpen:e,modal:t,nested:n,hasBeenOpened:r,preventScrollRestoration:a,noBodyStyles:l}){let[i,s]=o.default.useState(()=>"u">typeof window?window.location.href:""),d=o.default.useRef(0),c=o.default.useCallback(()=>{if(u()&&null===P&&e&&!l){P={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left,height:document.body.style.height,right:"unset"};let{scrollX:e,innerHeight:t}=window;document.body.style.setProperty("position","fixed","important"),Object.assign(document.body.style,{top:`${-d.current}px`,left:`${-e}px`,right:"0px",height:"auto"}),window.setTimeout(()=>window.requestAnimationFrame(()=>{let e=t-window.innerHeight;e&&d.current>=t&&(document.body.style.top=`${-(d.current+e)}px`)}),300)}},[e]),f=o.default.useCallback(()=>{if(u()&&null!==P&&!l){let e=-parseInt(document.body.style.top,10),t=-parseInt(document.body.style.left,10);Object.assign(document.body.style,P),window.requestAnimationFrame(()=>{a&&i!==window.location.href?s(window.location.href):window.scrollTo(t,e)}),P=null}},[i]);return o.default.useEffect(()=>{function e(){d.current=window.scrollY}return e(),window.addEventListener("scroll",e),()=>{window.removeEventListener("scroll",e)}},[]),o.default.useEffect(()=>{if(t)return()=>{"u"<typeof document||document.querySelector("[data-vaul-drawer]")||f()}},[t,f]),o.default.useEffect(()=>{!n&&r&&(e?(window.matchMedia("(display-mode: standalone)").matches||c(),t||window.setTimeout(()=>{f()},500)):f())},[e,r,i,t,n,c,f]),{restorePositionSetting:f}}({isOpen:Z,modal:F,nested:null!=H&&H,hasBeenOpened:et,preventScrollRestoration:X,noBodyStyles:I});function eP(){return(window.innerWidth-26)/window.innerWidth}function eM(e,t){var n;let r=e,a=null==(n=window.getSelection())?void 0:n.toString(),o=ew.current?C(ew.current,W):null,l=new Date;if("SELECT"===r.tagName||r.hasAttribute("data-vaul-no-drag")||r.closest("[data-vaul-no-drag]"))return!1;if("right"===W||"left"===W)return!0;if(eu.current&&l.getTime()-eu.current.getTime()<500)return!1;if(null!==o&&("bottom"===W?o>0:o<0))return!0;if(a&&a.length>0)return!1;if(ec.current&&l.getTime()-ec.current.getTime()<j&&0===o||t)return ec.current=l,!1;for(;r;){if(r.scrollHeight>r.clientHeight){if(0!==r.scrollTop)return ec.current=new Date,!1;if("dialog"===r.getAttribute("role"))break}r=r.parentNode}return!0}function eB(e){er&&ew.current&&(ew.current.classList.remove($),ef.current=!1,ea(!1),ed.current=new Date),null==A||A(),e||ee(!1),setTimeout(()=>{m&&eC(m[0])},500)}function eO(){if(!ew.current)return;let e=document.querySelector("[data-vaul-drawer-wrapper]"),t=C(ew.current,W);T(ew.current,{transform:"translate3d(0, 0, 0)",transition:`transform 0.5s cubic-bezier(${S.join(",")})`}),T(ei.current,{transition:`opacity 0.5s cubic-bezier(${S.join(",")})`,opacity:"1"}),h&&t&&t>0&&Z&&T(e,{borderRadius:"8px",overflow:"hidden",...E(W)?{transform:`scale(${eP()}) translate3d(0, calc(env(safe-area-inset-top) + 14px), 0)`,transformOrigin:"top"}:{transform:`scale(${eP()}) translate3d(calc(env(safe-area-inset-top) + 14px), 0, 0)`,transformOrigin:"left"},transitionProperty:"transform, border-radius",transitionDuration:"0.5s",transitionTimingFunction:`cubic-bezier(${S.join(",")})`},!0)}return o.default.useEffect(()=>{window.requestAnimationFrame(()=>{eh.current=!0})},[]),o.default.useEffect(()=>{var e;function t(){if(ew.current&&V&&(b(document.activeElement)||eg.current)){var e;let t=(null==(e=window.visualViewport)?void 0:e.height)||0,n=window.innerHeight,r=n-t,a=ew.current.getBoundingClientRect().height||0;ex.current||(ex.current=a);let o=ew.current.getBoundingClientRect().top;if(Math.abs(ev.current-r)>60&&(eg.current=!eg.current),m&&m.length>0&&eS&&eE&&(r+=eS[eE]||0),ev.current=r,a>t||eg.current){let e=ew.current.getBoundingClientRect().height,l=e;e>t&&(l=t-(a>.8*n?o:26)),z?ew.current.style.height=`${e-Math.max(r,0)}px`:ew.current.style.height=`${Math.max(l,t-o)}px`}else{let e;e=navigator.userAgent,"u">typeof window&&(/Firefox/.test(e)&&/Mobile/.test(e)||/FxiOS/.test(e))||(ew.current.style.height=`${ex.current}px`)}m&&m.length>0&&!eg.current?ew.current.style.bottom="0px":ew.current.style.bottom=`${Math.max(r,0)}px`}}return null==(e=window.visualViewport)||e.addEventListener("resize",t),()=>{var e;return null==(e=window.visualViewport)?void 0:e.removeEventListener("resize",t)}},[eE,m,eS]),o.default.useEffect(()=>(Z&&(T(document.documentElement,{scrollBehavior:"auto"}),eu.current=new Date),()=>{!function(e,t){if(!e||!(e instanceof HTMLElement))return;let n=R.get(e);n&&(e.style[t]=n[t])}(document.documentElement,"scrollBehavior")}),[Z]),o.default.useEffect(()=>{F||window.requestAnimationFrame(()=>{document.body.style.pointerEvents="auto"})},[F]),o.default.createElement(a.Root,{defaultOpen:q,onOpenChange:e=>{(N||e)&&(e?en(!0):eB(!0),ee(e))},open:Z},o.default.createElement(l.Provider,{value:{activeSnapPoint:eT,snapPoints:m,setActiveSnapPoint:eC,drawerRef:ew,overlayRef:ei,onOpenChange:n,onPress:function(e){var t,n;!N&&!m||(!ew.current||ew.current.contains(e.target))&&(ey.current=(null==(t=ew.current)?void 0:t.getBoundingClientRect().height)||0,eb.current=(null==(n=ew.current)?void 0:n.getBoundingClientRect().width)||0,ea(!0),es.current=new Date,s()&&window.addEventListener("touchend",()=>ef.current=!1,{once:!0}),e.target.setPointerCapture(e.pointerId),em.current=E(W)?e.pageY:e.pageX)},onRelease:function(e){var t,n;if(!er||!ew.current)return;ew.current.classList.remove($),ef.current=!1,ea(!1),ed.current=new Date;let r=C(ew.current,W);if(!e||!eM(e.target,!1)||!r||Number.isNaN(r)||null===es.current)return;let a=ed.current.getTime()-es.current.getTime(),o=em.current-(E(W)?e.pageY:e.pageX),l=Math.abs(o)/a;if(l>.05&&(el(!0),setTimeout(()=>{el(!1)},200)),m){eD({draggedDistance:o*("bottom"===W||"right"===W?1:-1),closeDrawer:eB,velocity:l,dismissible:N}),null==d||d(e,!0);return}if("bottom"===W||"right"===W?o>0:o<0){eO(),null==d||d(e,!0);return}if(l>.4){eB(),null==d||d(e,!1);return}let i=Math.min(null!=(t=ew.current.getBoundingClientRect().height)?t:0,window.innerHeight),u=Math.min(null!=(n=ew.current.getBoundingClientRect().width)?n:0,window.innerWidth);if(Math.abs(r)>=("left"===W||"right"===W?u:i)*D){eB(),null==d||d(e,!1);return}null==d||d(e,!0),eO()},onDrag:function(e){if(ew.current&&er){let t="bottom"===W||"right"===W?1:-1,n=(em.current-(E(W)?e.pageY:e.pageX))*t,r=n>0,a=m&&!N&&!r;if(a&&0===eE)return;let o=Math.abs(n),l=document.querySelector("[data-vaul-drawer-wrapper]"),u=o/("bottom"===W||"top"===W?ey.current:eb.current),s=ek(o,r);if(null!==s&&(u=s),a&&u>=1||!ef.current&&!eM(e.target,r))return;if(ew.current.classList.add($),ef.current=!0,T(ew.current,{transition:"none"}),T(ei.current,{transition:"none"}),m&&e$({draggedDistance:n}),r&&!m){let e=Math.min(-(8*(Math.log(n+1)-2)*1),0)*t;T(ew.current,{transform:E(W)?`translate3d(0, ${e}px, 0)`:`translate3d(${e}px, 0, 0)`});return}let d=1-u;if((ej||B&&eE===B-1)&&(null==i||i(e,u),T(ei.current,{opacity:`${d}`,transition:"none"},!0)),l&&ei.current&&h){let e=Math.min(eP()+u*(1-eP()),1),t=8-8*u,n=Math.max(0,14-14*u);T(l,{borderRadius:`${t}px`,transform:E(W)?`scale(${e}) translate3d(0, ${n}px, 0)`:`scale(${e}) translate3d(${n}px, 0, 0)`,transition:"none"},!0)}if(!m){let e=o*t;T(ew.current,{transform:E(W)?`translate3d(0, ${e}px, 0)`:`translate3d(${e}px, 0, 0)`})}}},dismissible:N,shouldAnimate:eh,handleOnly:M,isOpen:Z,isDragging:er,shouldFade:ej,closeDrawer:eB,onNestedDrag:function(e,t){if(t<0)return;let n=(window.innerWidth-16)/window.innerWidth,r=n+t*(1-n),a=-16+16*t;T(ew.current,{transform:E(W)?`scale(${r}) translate3d(0, ${a}px, 0)`:`scale(${r}) translate3d(${a}px, 0, 0)`,transition:"none"})},onNestedOpenChange:function(e){let t=e?(window.innerWidth-16)/window.innerWidth:1,n=e?-16:0;ep.current&&window.clearTimeout(ep.current),T(ew.current,{transition:`transform 0.5s cubic-bezier(${S.join(",")})`,transform:E(W)?`scale(${t}) translate3d(0, ${n}px, 0)`:`scale(${t}) translate3d(${n}px, 0, 0)`}),!e&&ew.current&&(ep.current=setTimeout(()=>{let e=C(ew.current,W);T(ew.current,{transition:"none",transform:E(W)?`translate3d(0, ${e}px, 0)`:`translate3d(${e}px, 0, 0)`})},500))},onNestedRelease:function(e,t){let n=E(W)?window.innerHeight:window.innerWidth,r=t?(n-16)/n:1,a=t?-16:0;t&&T(ew.current,{transition:`transform 0.5s cubic-bezier(${S.join(",")})`,transform:E(W)?`scale(${r}) translate3d(0, ${a}px, 0)`:`scale(${r}) translate3d(${a}px, 0, 0)`})},keyboardIsOpen:eg,modal:F,snapPointsOffset:eS,activeSnapPointIndex:eE,direction:W,shouldScaleBackground:h,setBackgroundColorOnScale:x,noBodyStyles:I,container:K,autoFocus:G}},r))}let B=o.default.forwardRef(function({...e},t){let{overlayRef:n,snapPoints:r,onRelease:l,shouldFade:u,isOpen:s,modal:d,shouldAnimate:c}=i(),f=x(t,n),p=r&&r.length>0;if(!d)return null;let m=o.default.useCallback(e=>l(e),[l]);return o.default.createElement(a.Overlay,{onMouseUp:m,ref:f,"data-vaul-overlay":"","data-vaul-snap-points":s&&p?"true":"false","data-vaul-snap-points-overlay":s&&u?"true":"false","data-vaul-animate":(null==c?void 0:c.current)?"true":"false",...e})});B.displayName="Drawer.Overlay";let O=o.default.forwardRef(function({onPointerDownOutside:e,style:t,onOpenAutoFocus:n,...r},l){let{drawerRef:u,onPress:s,onRelease:d,onDrag:c,keyboardIsOpen:f,snapPointsOffset:p,activeSnapPointIndex:m,modal:g,isOpen:h,direction:v,snapPoints:w,container:y,handleOnly:b,shouldAnimate:R,autoFocus:T}=i(),[C,$]=o.default.useState(!1),j=x(l,u),k=o.default.useRef(null),P=o.default.useRef(null),M=o.default.useRef(!1),B=w&&w.length>0;function O(e){k.current=null,M.current=!1,d(e)}return!function(){let{direction:e,isOpen:t,shouldScaleBackground:n,setBackgroundColorOnScale:r,noBodyStyles:a}=i(),l=o.default.useRef(null),u=(0,o.useMemo)(()=>document.body.style.backgroundColor,[]);function s(){return(window.innerWidth-26)/window.innerWidth}o.default.useEffect(()=>{if(t&&n){l.current&&clearTimeout(l.current);let t=document.querySelector("[data-vaul-drawer-wrapper]")||document.querySelector("[vaul-drawer-wrapper]");if(!t)return;!function(...e){}(r&&!a?D(document.body,{background:"black"}):N,D(t,{transformOrigin:E(e)?"top":"left",transitionProperty:"transform, border-radius",transitionDuration:"0.5s",transitionTimingFunction:`cubic-bezier(${S.join(",")})`}));let n=D(t,{borderRadius:"8px",overflow:"hidden",...E(e)?{transform:`scale(${s()}) translate3d(0, calc(env(safe-area-inset-top) + 14px), 0)`}:{transform:`scale(${s()}) translate3d(calc(env(safe-area-inset-top) + 14px), 0, 0)`}});return()=>{n(),l.current=window.setTimeout(()=>{u?document.body.style.background=u:document.body.style.removeProperty("background")},500)}}},[t,n,u])}(),o.default.useEffect(()=>{B&&window.requestAnimationFrame(()=>{$(!0)})},[]),o.default.createElement(a.Content,{"data-vaul-drawer-direction":v,"data-vaul-drawer":"","data-vaul-delayed-snap-points":C?"true":"false","data-vaul-snap-points":h&&B?"true":"false","data-vaul-custom-container":y?"true":"false","data-vaul-animate":(null==R?void 0:R.current)?"true":"false",...r,ref:j,style:p&&p.length>0?{"--snap-point-height":`${p[null!=m?m:0]}px`,...t}:t,onPointerDown:e=>{b||(null==r.onPointerDown||r.onPointerDown.call(r,e),k.current={x:e.pageX,y:e.pageY},s(e))},onOpenAutoFocus:e=>{null==n||n(e),T||e.preventDefault()},onPointerDownOutside:t=>{(null==e||e(t),!g||t.defaultPrevented)?t.preventDefault():f.current&&(f.current=!1)},onFocusOutside:e=>{if(!g)return void e.preventDefault()},onPointerMove:e=>{if(P.current=e,b||(null==r.onPointerMove||r.onPointerMove.call(r,e),!k.current))return;let t=e.pageY-k.current.y,n=e.pageX-k.current.x,a="touch"===e.pointerType?10:2;((e,t,n=0)=>{if(M.current)return!0;let r=Math.abs(e.y),a=Math.abs(e.x),o=a>r,l=["bottom","right"].includes(t)?1:-1;if("left"===t||"right"===t){if(!(e.x*l<0)&&a>=0&&a<=n)return o}else if(!(e.y*l<0)&&r>=0&&r<=n)return!o;return M.current=!0,!0})({x:n,y:t},v,a)?c(e):(Math.abs(n)>a||Math.abs(t)>a)&&(k.current=null)},onPointerUp:e=>{null==r.onPointerUp||r.onPointerUp.call(r,e),k.current=null,M.current=!1,d(e)},onPointerOut:e=>{null==r.onPointerOut||r.onPointerOut.call(r,e),O(P.current)},onContextMenu:e=>{null==r.onContextMenu||r.onContextMenu.call(r,e),P.current&&O(P.current)}})});O.displayName="Drawer.Content";let L=o.default.forwardRef(function({preventCycle:e=!1,children:t,...n},r){let{closeDrawer:a,isDragging:l,snapPoints:u,activeSnapPoint:s,setActiveSnapPoint:d,dismissible:c,handleOnly:f,isOpen:p,onPress:m,onDrag:g}=i(),h=o.default.useRef(null),v=o.default.useRef(!1);function w(){h.current&&window.clearTimeout(h.current),v.current=!1}return o.default.createElement("div",{onClick:function(){v.current?w():window.setTimeout(()=>{!function(){if(l||e||v.current)return w();if(w(),!u||0===u.length){c||a();return}if(s===u[u.length-1]&&c)return a();let t=u.findIndex(e=>e===s);-1===t||d(u[t+1])}()},120)},onPointerCancel:w,onPointerDown:e=>{f&&m(e),h.current=window.setTimeout(()=>{v.current=!0},250)},onPointerMove:e=>{f&&g(e)},ref:r,"data-vaul-drawer-visible":p?"true":"false","data-vaul-handle":"","aria-hidden":"true",...n},o.default.createElement("span",{"data-vaul-handle-hitarea":"","aria-hidden":"true"},t))});L.displayName="Drawer.Handle";let z={Root:M,NestedRoot:function({onDrag:e,onOpenChange:t,open:n,...r}){let{onNestedDrag:a,onNestedOpenChange:l,onNestedRelease:u}=i();if(!a)throw Error("Drawer.NestedRoot must be placed in another drawer");return o.default.createElement(M,{nested:!0,open:n,onClose:()=>{l(!1)},onDrag:(t,n)=>{a(t,n),null==e||e(t,n)},onOpenChange:e=>{e&&l(e),null==t||t(e)},onRelease:u,...r})},Content:O,Overlay:B,Trigger:a.Trigger,Portal:function(e){let t=i(),{container:n=t.container,...r}=e;return o.default.createElement(a.Portal,{container:n,...r})},Handle:L,Close:a.Close,Title:a.Title,Description:a.Description};var F=e.i(31777);function A({...e}){return(0,n.jsx)(z.Root,{"data-slot":"drawer",...e})}function H({...e}){return(0,n.jsx)(z.Portal,{"data-slot":"drawer-portal",...e})}function I({className:e,...t}){return(0,n.jsx)(z.Overlay,{"data-slot":"drawer-overlay",className:(0,F.cn)("fixed inset-0 z-50 bg-black/50",e),...t})}function W({className:e,children:t,direction:a="bottom",showCloseButton:o=!0,...l}){return(0,n.jsx)(H,{children:(0,n.jsxs)(z.Content,{"data-slot":"drawer-content",className:(0,F.cn)("bg-background fixed z-50 flex flex-col shadow-lg","bottom"===a&&"inset-x-0 bottom-0 mb-24 rounded-t-lg border-t","top"===a&&"inset-x-0 top-0 mt-24 rounded-b-lg border-b","right"===a&&"inset-y-0 right-0 h-full w-3/4 border-l","left"===a&&"inset-y-0 left-0 h-full w-3/4 border-r",e),style:{"--initial-transform":"right"===a?"calc(100% + 8px)":"left"===a||"top"===a?"calc(-100% - 8px)":"calc(100% + 8px)",userSelect:"text",...l.style??{}},...l,children:[t,o?(0,n.jsxs)(z.Close,{className:"ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[(0,n.jsx)(r.XIcon,{className:"size-4"}),(0,n.jsx)("span",{className:"sr-only",children:"Close"})]}):null]})})}function q({className:e,...t}){return(0,n.jsx)("div",{"data-slot":"drawer-header",className:(0,F.cn)("flex flex-col gap-1.5 p-4",e),...t})}function U({className:e,...t}){return(0,n.jsx)("div",{"data-slot":"drawer-footer",className:(0,F.cn)("mt-auto flex flex-col gap-2 p-4",e),...t})}function Y({className:e,...t}){return(0,n.jsx)(z.Title,{"data-slot":"drawer-title",className:(0,F.cn)("text-foreground font-semibold",e),...t})}function X({className:e,...t}){return(0,n.jsx)(z.Description,{"data-slot":"drawer-description",className:(0,F.cn)("text-muted-foreground text-sm",e),...t})}e.s(["Drawer",()=>A,"DrawerContent",()=>W,"DrawerDescription",()=>X,"DrawerFooter",()=>U,"DrawerHeader",()=>q,"DrawerOverlay",()=>I,"DrawerTitle",()=>Y],45811)},1650,11495,e=>{"use strict";var t=e.i(20314),n=e.i(79054),r=e.i(48249),a=e.i(24042),o=e.i(64970),l=e.i(94237),i=e.i(31777);e.i(81803);var u=e.i(72714);e.i(99348);var s=e.i(17466),d=e.i(45811),c=e.i(25235),f=e.i(2828),p=e.i(8537),m=e.i(63629);let g=(0,l.cva)("",{variants:{size:{sm:"w-96",md:"w-xl"}},defaultVariants:{size:"sm"}});function h({open:e,onClose:a,modal:o=!1,size:l,header:u,children:s,footer:f,className:p,"data-testid":h,deployTarget:w}){let y=(0,n.useRef)(null);return(0,n.useEffect)(()=>{if(!e||o)return;let t=e=>{let t=e.target;y.current?.contains(t)||t.closest('[data-no-drawer-close], [role="alertdialog"], [role="menu"], [role="listbox"], [data-radix-popper-content-wrapper]')||a()};return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[e,o,a]),(0,t.jsxs)(d.Drawer,{direction:"right",modal:o,handleOnly:!0,open:e,onOpenChange:e=>{e||a()},children:[o?(0,t.jsx)(d.DrawerOverlay,{}):null,(0,t.jsxs)(d.DrawerContent,{ref:y,direction:"right",showCloseButton:!1,className:(0,i.cn)(g({size:l}),p),"data-testid":h,children:[(0,t.jsxs)("button",{type:"button","aria-label":"Close",onClick:a,className:"ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden","data-testid":h?`${h}-close-button`:void 0,children:[(0,t.jsx)(r.XIcon,{className:"size-4"}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]}),u?(0,t.jsx)(d.DrawerHeader,{className:"shrink-0",children:u}):null,u?(0,t.jsx)(c.Separator,{}):null,m.featureFlags.envDeploy&&w?(0,t.jsx)(v,{deployTarget:w}):null,(0,t.jsx)("div",{className:"flex min-h-0 flex-1 flex-col",children:s}),f?(0,t.jsx)(d.DrawerFooter,{className:"shrink-0",children:f}):null]})]})}function v({deployTarget:e}){let n=(0,p.useDeployAction)(e),r="Booting"===n.status||"Ready"===n.status;return(0,t.jsxs)("div",{"data-testid":"base-drawer-deploy-bar",className:"flex items-center gap-2 px-4 pb-3",children:[(0,t.jsx)(f.TooltipProvider,{children:(0,t.jsxs)(f.Tooltip,{children:[(0,t.jsx)(f.TooltipTrigger,{asChild:!0,children:(0,t.jsx)("span",{children:(0,t.jsx)(u.ActionButton,{label:r?"Stop Dev Server":"Start Dev Server",onClick:r?n.stop:n.deploy,loading:n.deployLoading||n.stopLoading,error:!!n.deployError,icon:r?o.Square:a.Play,iconOnly:!0,variant:"outline",size:"icon-sm"})})}),(0,t.jsx)(f.TooltipContent,{children:r?"Stop Dev Server":"Start Dev Server"})]})}),r?(0,t.jsx)(s.DeploymentStatusBadge,{status:n.status,url:n.url}):null]})}e.s(["BaseDrawer",()=>h],11495),e.s([],1650)}]);
|