gitspace 0.2.0-rc.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/.claude/settings.local.json +21 -0
- package/.gitspace/bundle.json +50 -0
- package/.gitspace/select/01-status.sh +40 -0
- package/.gitspace/setup/01-install-deps.sh +12 -0
- package/.gitspace/setup/02-typecheck.sh +16 -0
- package/AGENTS.md +439 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +25 -0
- package/README.md +607 -0
- package/bin/gssh +62 -0
- package/bun.lock +647 -0
- package/docs/CONNECTION.md +623 -0
- package/docs/GATEWAY-WORKER.md +319 -0
- package/docs/GETTING-STARTED.md +448 -0
- package/docs/GITSPACE-PLATFORM.md +1819 -0
- package/docs/INFRASTRUCTURE.md +1347 -0
- package/docs/PROTOCOL.md +619 -0
- package/docs/QUICKSTART.md +174 -0
- package/docs/RELAY.md +327 -0
- package/docs/REMOTE-DESIGN.md +549 -0
- package/docs/ROADMAP.md +564 -0
- package/docs/SITE_DOCS_FIGMA_MAKE.md +1167 -0
- package/docs/STACK-DESIGN.md +588 -0
- package/docs/UNIFIED_ARCHITECTURE.md +292 -0
- package/experiments/pty-benchmark.ts +148 -0
- package/experiments/pty-latency.ts +100 -0
- package/experiments/router/client.ts +199 -0
- package/experiments/router/protocol.ts +74 -0
- package/experiments/router/router.ts +217 -0
- package/experiments/router/session.ts +180 -0
- package/experiments/router/test.ts +133 -0
- package/experiments/socket-bandwidth.ts +77 -0
- package/homebrew/gitspace.rb +45 -0
- package/landing-page/ATTRIBUTIONS.md +3 -0
- package/landing-page/README.md +11 -0
- package/landing-page/bun.lock +801 -0
- package/landing-page/guidelines/Guidelines.md +61 -0
- package/landing-page/index.html +37 -0
- package/landing-page/package.json +90 -0
- package/landing-page/postcss.config.mjs +15 -0
- package/landing-page/public/_redirects +1 -0
- package/landing-page/public/favicon.png +0 -0
- package/landing-page/src/app/App.tsx +53 -0
- package/landing-page/src/app/components/figma/ImageWithFallback.tsx +27 -0
- package/landing-page/src/app/components/ui/accordion.tsx +66 -0
- package/landing-page/src/app/components/ui/alert-dialog.tsx +157 -0
- package/landing-page/src/app/components/ui/alert.tsx +66 -0
- package/landing-page/src/app/components/ui/aspect-ratio.tsx +11 -0
- package/landing-page/src/app/components/ui/avatar.tsx +53 -0
- package/landing-page/src/app/components/ui/badge.tsx +46 -0
- package/landing-page/src/app/components/ui/breadcrumb.tsx +109 -0
- package/landing-page/src/app/components/ui/button.tsx +57 -0
- package/landing-page/src/app/components/ui/calendar.tsx +75 -0
- package/landing-page/src/app/components/ui/card.tsx +92 -0
- package/landing-page/src/app/components/ui/carousel.tsx +241 -0
- package/landing-page/src/app/components/ui/chart.tsx +353 -0
- package/landing-page/src/app/components/ui/checkbox.tsx +32 -0
- package/landing-page/src/app/components/ui/collapsible.tsx +33 -0
- package/landing-page/src/app/components/ui/command.tsx +177 -0
- package/landing-page/src/app/components/ui/context-menu.tsx +252 -0
- package/landing-page/src/app/components/ui/dialog.tsx +135 -0
- package/landing-page/src/app/components/ui/drawer.tsx +132 -0
- package/landing-page/src/app/components/ui/dropdown-menu.tsx +257 -0
- package/landing-page/src/app/components/ui/form.tsx +168 -0
- package/landing-page/src/app/components/ui/hover-card.tsx +44 -0
- package/landing-page/src/app/components/ui/input-otp.tsx +77 -0
- package/landing-page/src/app/components/ui/input.tsx +21 -0
- package/landing-page/src/app/components/ui/label.tsx +24 -0
- package/landing-page/src/app/components/ui/menubar.tsx +276 -0
- package/landing-page/src/app/components/ui/navigation-menu.tsx +168 -0
- package/landing-page/src/app/components/ui/pagination.tsx +127 -0
- package/landing-page/src/app/components/ui/popover.tsx +48 -0
- package/landing-page/src/app/components/ui/progress.tsx +31 -0
- package/landing-page/src/app/components/ui/radio-group.tsx +45 -0
- package/landing-page/src/app/components/ui/resizable.tsx +56 -0
- package/landing-page/src/app/components/ui/scroll-area.tsx +58 -0
- package/landing-page/src/app/components/ui/select.tsx +189 -0
- package/landing-page/src/app/components/ui/separator.tsx +28 -0
- package/landing-page/src/app/components/ui/sheet.tsx +139 -0
- package/landing-page/src/app/components/ui/sidebar.tsx +726 -0
- package/landing-page/src/app/components/ui/skeleton.tsx +13 -0
- package/landing-page/src/app/components/ui/slider.tsx +63 -0
- package/landing-page/src/app/components/ui/sonner.tsx +25 -0
- package/landing-page/src/app/components/ui/switch.tsx +31 -0
- package/landing-page/src/app/components/ui/table.tsx +116 -0
- package/landing-page/src/app/components/ui/tabs.tsx +66 -0
- package/landing-page/src/app/components/ui/textarea.tsx +18 -0
- package/landing-page/src/app/components/ui/toggle-group.tsx +73 -0
- package/landing-page/src/app/components/ui/toggle.tsx +47 -0
- package/landing-page/src/app/components/ui/tooltip.tsx +61 -0
- package/landing-page/src/app/components/ui/use-mobile.ts +21 -0
- package/landing-page/src/app/components/ui/utils.ts +6 -0
- package/landing-page/src/components/docs/DocsContent.tsx +718 -0
- package/landing-page/src/components/docs/DocsSidebar.tsx +84 -0
- package/landing-page/src/components/landing/CTA.tsx +59 -0
- package/landing-page/src/components/landing/Comparison.tsx +84 -0
- package/landing-page/src/components/landing/FaultyTerminal.tsx +424 -0
- package/landing-page/src/components/landing/Features.tsx +201 -0
- package/landing-page/src/components/landing/Hero.tsx +142 -0
- package/landing-page/src/components/landing/Pricing.tsx +140 -0
- package/landing-page/src/components/landing/Roadmap.tsx +86 -0
- package/landing-page/src/components/landing/Security.tsx +81 -0
- package/landing-page/src/components/landing/TerminalWindow.tsx +27 -0
- package/landing-page/src/components/landing/UseCases.tsx +55 -0
- package/landing-page/src/components/landing/Workflow.tsx +101 -0
- package/landing-page/src/components/layout/DashboardNavbar.tsx +37 -0
- package/landing-page/src/components/layout/Footer.tsx +55 -0
- package/landing-page/src/components/layout/LandingNavbar.tsx +82 -0
- package/landing-page/src/components/ui/badge.tsx +39 -0
- package/landing-page/src/components/ui/breadcrumb.tsx +115 -0
- package/landing-page/src/components/ui/button.tsx +57 -0
- package/landing-page/src/components/ui/card.tsx +79 -0
- package/landing-page/src/components/ui/mock-terminal.tsx +68 -0
- package/landing-page/src/components/ui/separator.tsx +28 -0
- package/landing-page/src/lib/utils.ts +6 -0
- package/landing-page/src/main.tsx +10 -0
- package/landing-page/src/pages/Dashboard.tsx +133 -0
- package/landing-page/src/pages/DocsPage.tsx +79 -0
- package/landing-page/src/pages/LandingPage.tsx +31 -0
- package/landing-page/src/pages/TerminalView.tsx +106 -0
- package/landing-page/src/styles/fonts.css +0 -0
- package/landing-page/src/styles/index.css +3 -0
- package/landing-page/src/styles/tailwind.css +4 -0
- package/landing-page/src/styles/theme.css +181 -0
- package/landing-page/vite.config.ts +19 -0
- package/npm/darwin-arm64/bin/gssh +0 -0
- package/npm/darwin-arm64/package.json +20 -0
- package/package.json +74 -0
- package/scripts/build.ts +284 -0
- package/scripts/release.ts +140 -0
- package/src/__tests__/test-utils.ts +298 -0
- package/src/commands/__tests__/serve-messages.test.ts +190 -0
- package/src/commands/access.ts +298 -0
- package/src/commands/add.ts +452 -0
- package/src/commands/auth.ts +364 -0
- package/src/commands/connect.ts +287 -0
- package/src/commands/directory.ts +16 -0
- package/src/commands/host.ts +396 -0
- package/src/commands/identity.ts +184 -0
- package/src/commands/list.ts +200 -0
- package/src/commands/relay.ts +315 -0
- package/src/commands/remove.ts +241 -0
- package/src/commands/serve.ts +1493 -0
- package/src/commands/share.ts +456 -0
- package/src/commands/status.ts +125 -0
- package/src/commands/switch.ts +353 -0
- package/src/commands/tmux.ts +317 -0
- package/src/core/__tests__/access.test.ts +240 -0
- package/src/core/access.ts +277 -0
- package/src/core/bundle.ts +342 -0
- package/src/core/config.ts +510 -0
- package/src/core/git.ts +317 -0
- package/src/core/github.ts +151 -0
- package/src/core/identity.ts +631 -0
- package/src/core/linear.ts +225 -0
- package/src/core/shell.ts +161 -0
- package/src/core/trusted-relays.ts +315 -0
- package/src/index.ts +821 -0
- package/src/lib/remote-session/index.ts +7 -0
- package/src/lib/remote-session/protocol.ts +267 -0
- package/src/lib/remote-session/session-handler.ts +581 -0
- package/src/lib/remote-session/workspace-scanner.ts +167 -0
- package/src/lib/tmux-lite/README.md +81 -0
- package/src/lib/tmux-lite/cli.ts +796 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/handshake-runner.ts +349 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/mock-relay.ts +291 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/test-identities.ts +142 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/authorization.integration.test.ts +339 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/e2e-communication.integration.test.ts +477 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/error-handling.integration.test.ts +499 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/handshake.integration.test.ts +371 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/security.integration.test.ts +573 -0
- package/src/lib/tmux-lite/crypto/access-control.test.ts +512 -0
- package/src/lib/tmux-lite/crypto/access-control.ts +320 -0
- package/src/lib/tmux-lite/crypto/frames.test.ts +262 -0
- package/src/lib/tmux-lite/crypto/frames.ts +141 -0
- package/src/lib/tmux-lite/crypto/handshake.ts +894 -0
- package/src/lib/tmux-lite/crypto/identity.test.ts +220 -0
- package/src/lib/tmux-lite/crypto/identity.ts +286 -0
- package/src/lib/tmux-lite/crypto/index.ts +51 -0
- package/src/lib/tmux-lite/crypto/invites.test.ts +381 -0
- package/src/lib/tmux-lite/crypto/invites.ts +215 -0
- package/src/lib/tmux-lite/crypto/keyexchange.ts +435 -0
- package/src/lib/tmux-lite/crypto/keys.test.ts +58 -0
- package/src/lib/tmux-lite/crypto/keys.ts +47 -0
- package/src/lib/tmux-lite/crypto/secretbox.test.ts +169 -0
- package/src/lib/tmux-lite/crypto/secretbox.ts +124 -0
- package/src/lib/tmux-lite/handshake-handler.ts +451 -0
- package/src/lib/tmux-lite/protocol.test.ts +307 -0
- package/src/lib/tmux-lite/protocol.ts +266 -0
- package/src/lib/tmux-lite/relay-client.ts +506 -0
- package/src/lib/tmux-lite/server.ts +1250 -0
- package/src/lib/tmux-lite/shell-integration.sh +37 -0
- package/src/lib/tmux-lite/terminal-queries.test.ts +54 -0
- package/src/lib/tmux-lite/terminal-queries.ts +49 -0
- package/src/relay/__tests__/e2e-flow.test.ts +1284 -0
- package/src/relay/__tests__/helpers/auth.ts +354 -0
- package/src/relay/__tests__/helpers/ports.ts +51 -0
- package/src/relay/__tests__/protocol-validation.test.ts +265 -0
- package/src/relay/authorization.ts +303 -0
- package/src/relay/embedded-assets.generated.d.ts +15 -0
- package/src/relay/identity.ts +352 -0
- package/src/relay/index.ts +57 -0
- package/src/relay/pipes.test.ts +427 -0
- package/src/relay/pipes.ts +195 -0
- package/src/relay/protocol.ts +804 -0
- package/src/relay/registries.test.ts +437 -0
- package/src/relay/registries.ts +593 -0
- package/src/relay/server.test.ts +1323 -0
- package/src/relay/server.ts +1092 -0
- package/src/relay/signing.ts +238 -0
- package/src/relay/types.ts +69 -0
- package/src/serve/client-session-manager.ts +622 -0
- package/src/serve/daemon.ts +497 -0
- package/src/serve/pty-session.ts +236 -0
- package/src/serve/types.ts +169 -0
- package/src/shared/components/Flow.tsx +453 -0
- package/src/shared/components/Flow.tui.tsx +343 -0
- package/src/shared/components/Flow.web.tsx +442 -0
- package/src/shared/components/Inbox.tsx +446 -0
- package/src/shared/components/Inbox.tui.tsx +262 -0
- package/src/shared/components/Inbox.web.tsx +329 -0
- package/src/shared/components/MachineList.tsx +187 -0
- package/src/shared/components/MachineList.tui.tsx +161 -0
- package/src/shared/components/MachineList.web.tsx +210 -0
- package/src/shared/components/ProjectList.tsx +176 -0
- package/src/shared/components/ProjectList.tui.tsx +109 -0
- package/src/shared/components/ProjectList.web.tsx +143 -0
- package/src/shared/components/SpacesBrowser.tsx +332 -0
- package/src/shared/components/SpacesBrowser.tui.tsx +163 -0
- package/src/shared/components/SpacesBrowser.web.tsx +221 -0
- package/src/shared/components/index.ts +103 -0
- package/src/shared/hooks/index.ts +16 -0
- package/src/shared/hooks/useNavigation.ts +226 -0
- package/src/shared/index.ts +122 -0
- package/src/shared/providers/LocalMachineProvider.ts +425 -0
- package/src/shared/providers/MachineProvider.ts +165 -0
- package/src/shared/providers/RemoteMachineProvider.ts +444 -0
- package/src/shared/providers/index.ts +26 -0
- package/src/shared/types.ts +145 -0
- package/src/tui/adapters.ts +120 -0
- package/src/tui/app.tsx +1816 -0
- package/src/tui/components/Terminal.tsx +580 -0
- package/src/tui/hooks/index.ts +35 -0
- package/src/tui/hooks/useAppState.ts +314 -0
- package/src/tui/hooks/useDaemonStatus.ts +174 -0
- package/src/tui/hooks/useInboxTUI.ts +113 -0
- package/src/tui/hooks/useRemoteMachines.ts +209 -0
- package/src/tui/index.ts +24 -0
- package/src/tui/state.ts +299 -0
- package/src/tui/terminal-bracketed-paste.test.ts +45 -0
- package/src/tui/terminal-bracketed-paste.ts +47 -0
- package/src/types/bundle.ts +112 -0
- package/src/types/config.ts +89 -0
- package/src/types/errors.ts +206 -0
- package/src/types/identity.ts +284 -0
- package/src/types/workspace-fuzzy.ts +49 -0
- package/src/types/workspace.ts +151 -0
- package/src/utils/bun-socket-writer.ts +80 -0
- package/src/utils/deps.ts +127 -0
- package/src/utils/fuzzy-match.ts +125 -0
- package/src/utils/logger.ts +127 -0
- package/src/utils/markdown.ts +254 -0
- package/src/utils/onboarding.ts +229 -0
- package/src/utils/prompts.ts +114 -0
- package/src/utils/run-commands.ts +112 -0
- package/src/utils/run-scripts.ts +142 -0
- package/src/utils/sanitize.ts +98 -0
- package/src/utils/secrets.ts +122 -0
- package/src/utils/shell-escape.ts +40 -0
- package/src/utils/utf8.ts +79 -0
- package/src/utils/workspace-state.ts +47 -0
- package/src/web/README.md +73 -0
- package/src/web/bun.lock +575 -0
- package/src/web/eslint.config.js +23 -0
- package/src/web/index.html +16 -0
- package/src/web/package.json +37 -0
- package/src/web/public/vite.svg +1 -0
- package/src/web/src/App.tsx +604 -0
- package/src/web/src/assets/react.svg +1 -0
- package/src/web/src/components/Terminal.tsx +207 -0
- package/src/web/src/hooks/useRelayConnection.ts +224 -0
- package/src/web/src/hooks/useTerminal.ts +699 -0
- package/src/web/src/index.css +55 -0
- package/src/web/src/lib/crypto/__tests__/web-terminal.test.ts +1158 -0
- package/src/web/src/lib/crypto/frames.ts +205 -0
- package/src/web/src/lib/crypto/handshake.ts +396 -0
- package/src/web/src/lib/crypto/identity.ts +128 -0
- package/src/web/src/lib/crypto/keyexchange.ts +246 -0
- package/src/web/src/lib/crypto/relay-signing.ts +53 -0
- package/src/web/src/lib/invite.ts +58 -0
- package/src/web/src/lib/storage/identity-store.ts +94 -0
- package/src/web/src/main.tsx +10 -0
- package/src/web/src/types/identity.ts +45 -0
- package/src/web/tsconfig.app.json +28 -0
- package/src/web/tsconfig.json +7 -0
- package/src/web/tsconfig.node.json +26 -0
- package/src/web/vite.config.ts +31 -0
- package/todo-security.md +92 -0
- package/tsconfig.json +23 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-shm +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-wal +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-shm +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-wal +0 -0
- package/worker/bun.lock +237 -0
- package/worker/package.json +22 -0
- package/worker/schema.sql +96 -0
- package/worker/src/handlers/auth.ts +451 -0
- package/worker/src/handlers/subdomains.ts +376 -0
- package/worker/src/handlers/user.ts +98 -0
- package/worker/src/index.ts +70 -0
- package/worker/src/middleware/auth.ts +152 -0
- package/worker/src/services/cloudflare.ts +609 -0
- package/worker/src/types.ts +96 -0
- package/worker/tsconfig.json +15 -0
- package/worker/wrangler.toml +26 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Terminal as TerminalIcon, Wifi, Battery, Command } from "lucide-react";
|
|
2
|
+
import { cn } from "../../lib/utils";
|
|
3
|
+
import { motion } from "motion/react";
|
|
4
|
+
|
|
5
|
+
interface MockTerminalProps {
|
|
6
|
+
title?: string;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
className?: string;
|
|
9
|
+
status?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function MockTerminal({ title = "gitspace.sh", children, className, status }: MockTerminalProps) {
|
|
13
|
+
return (
|
|
14
|
+
<div className={cn("rounded-lg border border-white/10 bg-black/90 shadow-2xl overflow-hidden font-mono text-sm", className)}>
|
|
15
|
+
{/* Title Bar */}
|
|
16
|
+
<div className="flex items-center justify-between px-4 py-2 bg-white/5 border-b border-white/5">
|
|
17
|
+
<div className="flex items-center gap-2">
|
|
18
|
+
<div className="flex gap-1.5">
|
|
19
|
+
<div className="w-3 h-3 rounded-full bg-red-500/50" />
|
|
20
|
+
<div className="w-3 h-3 rounded-full bg-amber-500/50" />
|
|
21
|
+
<div className="w-3 h-3 rounded-full bg-green-500/50" />
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
<div className="absolute left-1/2 -translate-x-1/2 text-xs text-muted-foreground font-medium flex items-center gap-1.5">
|
|
25
|
+
<TerminalIcon className="w-3 h-3" />
|
|
26
|
+
{title}
|
|
27
|
+
</div>
|
|
28
|
+
<div className="w-10" /> {/* Spacer */}
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
{/* Content */}
|
|
32
|
+
<div className="p-4 min-h-[200px] text-gray-300 space-y-2">
|
|
33
|
+
{children}
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
{/* Status Bar (optional) */}
|
|
37
|
+
{status && (
|
|
38
|
+
<div className="px-4 py-1.5 bg-green-500/10 border-t border-green-500/20 text-green-400 text-xs flex items-center justify-between">
|
|
39
|
+
<span className="flex items-center gap-2">
|
|
40
|
+
<span className="relative flex h-2 w-2">
|
|
41
|
+
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"></span>
|
|
42
|
+
<span className="relative inline-flex rounded-full h-2 w-2 bg-green-500"></span>
|
|
43
|
+
</span>
|
|
44
|
+
{status}
|
|
45
|
+
</span>
|
|
46
|
+
<span className="opacity-70">via iPhone 15 Pro</span>
|
|
47
|
+
</div>
|
|
48
|
+
)}
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function TerminalLine({ children, prefix = "$" }: { children: React.ReactNode, prefix?: string }) {
|
|
54
|
+
return (
|
|
55
|
+
<div className="flex gap-3">
|
|
56
|
+
<span className="text-green-500 shrink-0 select-none">{prefix}</span>
|
|
57
|
+
<span>{children}</span>
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function AIZwResponse({ children }: { children: React.ReactNode }) {
|
|
63
|
+
return (
|
|
64
|
+
<div className="pl-4 border-l-2 border-white/10 my-2 py-1 ml-1">
|
|
65
|
+
<div className="text-muted-foreground">{children}</div>
|
|
66
|
+
</div>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import * as SeparatorPrimitive from "@radix-ui/react-separator"
|
|
3
|
+
|
|
4
|
+
import { cn } from "../../lib/utils"
|
|
5
|
+
|
|
6
|
+
const Separator = React.forwardRef<
|
|
7
|
+
React.ElementRef<typeof SeparatorPrimitive.Root>,
|
|
8
|
+
React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
|
|
9
|
+
>(
|
|
10
|
+
(
|
|
11
|
+
{ className, orientation = "horizontal", ...props },
|
|
12
|
+
ref
|
|
13
|
+
) => (
|
|
14
|
+
<SeparatorPrimitive.Root
|
|
15
|
+
ref={ref}
|
|
16
|
+
orientation={orientation}
|
|
17
|
+
className={cn(
|
|
18
|
+
"shrink-0 bg-border",
|
|
19
|
+
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
|
|
20
|
+
className
|
|
21
|
+
)}
|
|
22
|
+
{...props}
|
|
23
|
+
/>
|
|
24
|
+
)
|
|
25
|
+
)
|
|
26
|
+
Separator.displayName = SeparatorPrimitive.Root.displayName
|
|
27
|
+
|
|
28
|
+
export { Separator }
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { DashboardNavbar } from "../components/layout/DashboardNavbar";
|
|
2
|
+
import { Card, CardHeader, CardTitle, CardContent } from "../app/components/ui/card";
|
|
3
|
+
import { Button } from "../app/components/ui/button";
|
|
4
|
+
import { Plus, CheckCircle2, XCircle, AlertTriangle, Terminal, Bell } from "lucide-react";
|
|
5
|
+
import { Link } from "react-router-dom";
|
|
6
|
+
import { Badge } from "../app/components/ui/badge";
|
|
7
|
+
|
|
8
|
+
export default function Dashboard() {
|
|
9
|
+
return (
|
|
10
|
+
<div className="min-h-screen bg-black text-white selection:bg-green-500/30">
|
|
11
|
+
<DashboardNavbar />
|
|
12
|
+
|
|
13
|
+
<main className="container mx-auto px-4 py-8 space-y-8">
|
|
14
|
+
|
|
15
|
+
{/* Machines Section */}
|
|
16
|
+
<section>
|
|
17
|
+
<div className="flex items-center justify-between mb-4">
|
|
18
|
+
<h2 className="text-xl font-semibold flex items-center gap-2">
|
|
19
|
+
<Terminal className="w-5 h-5 text-muted-foreground" />
|
|
20
|
+
Machines
|
|
21
|
+
</h2>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<Card className="bg-white/5 border-white/10">
|
|
25
|
+
<CardContent className="p-0 divide-y divide-white/5">
|
|
26
|
+
|
|
27
|
+
{/* Machine 1 */}
|
|
28
|
+
<div className="p-4 flex items-center justify-between hover:bg-white/5 transition-colors group">
|
|
29
|
+
<div className="flex items-start gap-4">
|
|
30
|
+
<div className="mt-1 h-2 w-2 rounded-full bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.5)]" />
|
|
31
|
+
<div>
|
|
32
|
+
<div className="font-mono font-medium text-lg text-green-400 group-hover:underline cursor-pointer">
|
|
33
|
+
<Link to="/terminal">brad-macbook</Link>
|
|
34
|
+
</div>
|
|
35
|
+
<div className="text-sm text-muted-foreground mt-1 flex items-center gap-3">
|
|
36
|
+
<span>3 sessions</span>
|
|
37
|
+
<span className="w-1 h-1 rounded-full bg-white/20" />
|
|
38
|
+
<span>Connected 2m ago</span>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div className="text-sm font-mono text-muted-foreground">
|
|
43
|
+
<span className="px-2 py-1 rounded bg-white/5 border border-white/10">v1.2.4</span>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
{/* Machine 2 */}
|
|
48
|
+
<div className="p-4 flex items-center justify-between hover:bg-white/5 transition-colors opacity-60">
|
|
49
|
+
<div className="flex items-start gap-4">
|
|
50
|
+
<div className="mt-1 h-2 w-2 rounded-full bg-red-500" />
|
|
51
|
+
<div>
|
|
52
|
+
<div className="font-mono font-medium text-lg text-gray-400">work-laptop</div>
|
|
53
|
+
<div className="text-sm text-muted-foreground mt-1">
|
|
54
|
+
Last seen 3 days ago
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
<div className="text-sm font-mono text-muted-foreground">
|
|
59
|
+
Offline
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
{/* Add New */}
|
|
64
|
+
<div className="p-3 bg-white/[0.02] hover:bg-white/5 transition-colors cursor-pointer text-center">
|
|
65
|
+
<Button variant="ghost" className="text-muted-foreground hover:text-white w-full h-auto py-2">
|
|
66
|
+
<Plus className="w-4 h-4 mr-2" /> Link New Machine
|
|
67
|
+
</Button>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
</CardContent>
|
|
71
|
+
</Card>
|
|
72
|
+
</section>
|
|
73
|
+
|
|
74
|
+
{/* Inbox Section */}
|
|
75
|
+
<section>
|
|
76
|
+
<div className="flex items-center justify-between mb-4">
|
|
77
|
+
<h2 className="text-xl font-semibold flex items-center gap-2">
|
|
78
|
+
<Bell className="w-5 h-5 text-muted-foreground" />
|
|
79
|
+
Recent Inbox
|
|
80
|
+
</h2>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<Card className="bg-white/5 border-white/10">
|
|
84
|
+
<CardContent className="p-0 divide-y divide-white/5">
|
|
85
|
+
|
|
86
|
+
{/* Item 1 */}
|
|
87
|
+
<div className="p-4 flex items-center justify-between hover:bg-white/5 transition-colors">
|
|
88
|
+
<div className="flex items-center gap-4">
|
|
89
|
+
<CheckCircle2 className="w-5 h-5 text-green-500" />
|
|
90
|
+
<div>
|
|
91
|
+
<div className="font-medium text-gray-200">feature-auth: Claude finished</div>
|
|
92
|
+
<div className="text-sm text-muted-foreground font-mono mt-0.5">exit 0</div>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
<span className="text-sm text-muted-foreground">5m ago</span>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
{/* Item 2 */}
|
|
99
|
+
<div className="p-4 flex items-center justify-between hover:bg-white/5 transition-colors">
|
|
100
|
+
<div className="flex items-center gap-4">
|
|
101
|
+
<XCircle className="w-5 h-5 text-red-500" />
|
|
102
|
+
<div>
|
|
103
|
+
<div className="font-medium text-gray-200">api-refactor: npm test failed</div>
|
|
104
|
+
<div className="text-sm text-muted-foreground font-mono mt-0.5">exit 1</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
<span className="text-sm text-muted-foreground">20m ago</span>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
{/* Item 3 */}
|
|
111
|
+
<div className="p-4 flex items-center justify-between hover:bg-white/5 transition-colors">
|
|
112
|
+
<div className="flex items-center gap-4">
|
|
113
|
+
<AlertTriangle className="w-5 h-5 text-amber-500" />
|
|
114
|
+
<div>
|
|
115
|
+
<div className="font-medium text-gray-200">main: Process went idle</div>
|
|
116
|
+
<div className="text-sm text-muted-foreground font-mono mt-0.5">Waiting for input</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
<span className="text-sm text-muted-foreground">1h ago</span>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
<div className="p-3 bg-white/[0.02] hover:bg-white/5 transition-colors cursor-pointer text-center">
|
|
123
|
+
<span className="text-sm text-muted-foreground hover:text-white transition-colors">View All →</span>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
</CardContent>
|
|
127
|
+
</Card>
|
|
128
|
+
</section>
|
|
129
|
+
|
|
130
|
+
</main>
|
|
131
|
+
</div>
|
|
132
|
+
);
|
|
133
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { useState, useEffect } from "react";
|
|
2
|
+
import { useLocation } from "react-router-dom";
|
|
3
|
+
import { DocsSidebar } from "../components/docs/DocsSidebar";
|
|
4
|
+
import { DocsContent } from "../components/docs/DocsContent";
|
|
5
|
+
import { LandingNavbar } from "../components/layout/LandingNavbar";
|
|
6
|
+
import { Footer } from "../components/layout/Footer";
|
|
7
|
+
import { Menu, X } from "lucide-react";
|
|
8
|
+
import { Button } from "../app/components/ui/button";
|
|
9
|
+
import { Sheet, SheetContent, SheetTrigger } from "../app/components/ui/sheet";
|
|
10
|
+
|
|
11
|
+
export default function DocsPage() {
|
|
12
|
+
const location = useLocation();
|
|
13
|
+
const [activeSection, setActiveSection] = useState("overview");
|
|
14
|
+
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
|
15
|
+
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const params = new URLSearchParams(location.search);
|
|
18
|
+
const section = params.get("section");
|
|
19
|
+
if (section) {
|
|
20
|
+
setActiveSection(section);
|
|
21
|
+
}
|
|
22
|
+
}, [location]);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div className="min-h-screen bg-black text-white selection:bg-green-500/30 flex flex-col">
|
|
26
|
+
<LandingNavbar />
|
|
27
|
+
|
|
28
|
+
<div className="flex-1 container mx-auto flex overflow-hidden">
|
|
29
|
+
{/* Desktop Sidebar */}
|
|
30
|
+
<DocsSidebar
|
|
31
|
+
activeSection={activeSection}
|
|
32
|
+
onSectionChange={setActiveSection}
|
|
33
|
+
className="border-r border-zinc-800"
|
|
34
|
+
/>
|
|
35
|
+
|
|
36
|
+
{/* Mobile Menu Trigger - Visible only on small screens */}
|
|
37
|
+
<div className="lg:hidden fixed bottom-6 right-6 z-50">
|
|
38
|
+
<Sheet open={mobileMenuOpen} onOpenChange={setMobileMenuOpen}>
|
|
39
|
+
<SheetTrigger asChild>
|
|
40
|
+
<Button size="icon" className="h-12 w-12 rounded-full bg-green-500 hover:bg-green-600 text-black shadow-lg shadow-green-900/20">
|
|
41
|
+
<Menu className="h-6 w-6" />
|
|
42
|
+
</Button>
|
|
43
|
+
</SheetTrigger>
|
|
44
|
+
<SheetContent side="left" className="bg-black border-r border-zinc-800 p-0 w-80">
|
|
45
|
+
<div className="p-4 border-b border-zinc-800 flex items-center justify-between">
|
|
46
|
+
<span className="font-bold">Documentation</span>
|
|
47
|
+
{/* Close button is handled by Sheet automatically usually, but we can customize */}
|
|
48
|
+
</div>
|
|
49
|
+
<DocsSidebar
|
|
50
|
+
activeSection={activeSection}
|
|
51
|
+
onSectionChange={(section) => {
|
|
52
|
+
setActiveSection(section);
|
|
53
|
+
setMobileMenuOpen(false);
|
|
54
|
+
}}
|
|
55
|
+
className="w-full border-none"
|
|
56
|
+
/>
|
|
57
|
+
</SheetContent>
|
|
58
|
+
</Sheet>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
{/* Main Content */}
|
|
62
|
+
<main className="flex-1 overflow-y-auto h-[calc(100vh-3.5rem)]">
|
|
63
|
+
<div className="max-w-4xl mx-auto px-6 py-12 md:px-12 md:py-16">
|
|
64
|
+
<DocsContent section={activeSection} />
|
|
65
|
+
|
|
66
|
+
{/* Simple footer within docs for "Next" navigation could go here */}
|
|
67
|
+
<div className="mt-20 pt-8 border-t border-zinc-800 flex justify-between text-sm text-zinc-500">
|
|
68
|
+
<span>Last updated: Jan 8, 2026</span>
|
|
69
|
+
<a href="#" className="hover:text-green-500 transition-colors">Edit this page on GitHub</a>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
<div className="lg:hidden">
|
|
73
|
+
<Footer />
|
|
74
|
+
</div>
|
|
75
|
+
</main>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LandingNavbar } from "../components/layout/LandingNavbar";
|
|
2
|
+
import { Hero } from "../components/landing/Hero";
|
|
3
|
+
import { Features } from "../components/landing/Features";
|
|
4
|
+
import { Workflow } from "../components/landing/Workflow";
|
|
5
|
+
import { Comparison } from "../components/landing/Comparison";
|
|
6
|
+
import { Security } from "../components/landing/Security";
|
|
7
|
+
import { UseCases } from "../components/landing/UseCases";
|
|
8
|
+
import { Pricing } from "../components/landing/Pricing";
|
|
9
|
+
import { Roadmap } from "../components/landing/Roadmap";
|
|
10
|
+
import { CTA } from "../components/landing/CTA";
|
|
11
|
+
import { Footer } from "../components/layout/Footer";
|
|
12
|
+
|
|
13
|
+
export default function LandingPage() {
|
|
14
|
+
return (
|
|
15
|
+
<div className="min-h-screen bg-black text-white selection:bg-green-500/30">
|
|
16
|
+
<LandingNavbar />
|
|
17
|
+
<main>
|
|
18
|
+
<Hero />
|
|
19
|
+
<Features />
|
|
20
|
+
<Workflow />
|
|
21
|
+
<Comparison />
|
|
22
|
+
<UseCases />
|
|
23
|
+
<Security />
|
|
24
|
+
<Roadmap />
|
|
25
|
+
<Pricing />
|
|
26
|
+
<CTA />
|
|
27
|
+
</main>
|
|
28
|
+
<Footer />
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { DashboardNavbar } from "../components/layout/DashboardNavbar";
|
|
2
|
+
import { MockTerminal, TerminalLine, AIZwResponse } from "../components/ui/mock-terminal";
|
|
3
|
+
import {
|
|
4
|
+
Breadcrumb,
|
|
5
|
+
BreadcrumbItem,
|
|
6
|
+
BreadcrumbLink,
|
|
7
|
+
BreadcrumbList,
|
|
8
|
+
BreadcrumbSeparator,
|
|
9
|
+
BreadcrumbPage
|
|
10
|
+
} from "../app/components/ui/breadcrumb";
|
|
11
|
+
import { Button } from "../app/components/ui/button";
|
|
12
|
+
import { Share, ExternalLink, MonitorOff } from "lucide-react";
|
|
13
|
+
import { Link } from "react-router-dom";
|
|
14
|
+
|
|
15
|
+
export default function TerminalView() {
|
|
16
|
+
return (
|
|
17
|
+
<div className="min-h-screen bg-black text-white selection:bg-green-500/30 flex flex-col">
|
|
18
|
+
{/* Simple header for terminal view - maybe different from dashboard */}
|
|
19
|
+
<header className="border-b border-white/10 bg-black px-4 h-14 flex items-center justify-between">
|
|
20
|
+
<Breadcrumb>
|
|
21
|
+
<BreadcrumbList className="text-sm font-mono">
|
|
22
|
+
<BreadcrumbItem>
|
|
23
|
+
<BreadcrumbLink asChild>
|
|
24
|
+
<Link to="/dashboard" className="hover:text-white transition-colors">gitspace.sh</Link>
|
|
25
|
+
</BreadcrumbLink>
|
|
26
|
+
</BreadcrumbItem>
|
|
27
|
+
<BreadcrumbSeparator />
|
|
28
|
+
<BreadcrumbItem>
|
|
29
|
+
<BreadcrumbLink asChild>
|
|
30
|
+
<Link to="/dashboard" className="hover:text-white transition-colors">brad-macbook</Link>
|
|
31
|
+
</BreadcrumbLink>
|
|
32
|
+
</BreadcrumbItem>
|
|
33
|
+
<BreadcrumbSeparator />
|
|
34
|
+
<BreadcrumbItem>
|
|
35
|
+
<BreadcrumbPage className="text-white">feature-auth</BreadcrumbPage>
|
|
36
|
+
</BreadcrumbItem>
|
|
37
|
+
</BreadcrumbList>
|
|
38
|
+
</Breadcrumb>
|
|
39
|
+
|
|
40
|
+
<div className="flex items-center gap-2">
|
|
41
|
+
<Button variant="outline" size="sm" className="h-8 border-white/10 hover:bg-white/5 gap-2">
|
|
42
|
+
<Share className="w-3 h-3" /> Share
|
|
43
|
+
</Button>
|
|
44
|
+
<Button variant="outline" size="sm" className="h-8 border-white/10 hover:bg-white/5 gap-2 text-red-400 hover:text-red-300">
|
|
45
|
+
<MonitorOff className="w-3 h-3" /> Detach
|
|
46
|
+
</Button>
|
|
47
|
+
</div>
|
|
48
|
+
</header>
|
|
49
|
+
|
|
50
|
+
<main className="flex-1 p-4 md:p-6 flex flex-col">
|
|
51
|
+
<div className="flex-1 bg-black rounded-lg border border-white/10 overflow-hidden flex flex-col relative shadow-2xl">
|
|
52
|
+
{/* Mock Terminal Content - Reusing the component but tailored styling */}
|
|
53
|
+
<div className="bg-white/5 px-4 py-2 border-b border-white/5 flex items-center justify-between">
|
|
54
|
+
<div className="flex gap-1.5 opacity-50 hover:opacity-100 transition-opacity">
|
|
55
|
+
<div className="w-3 h-3 rounded-full bg-red-500" />
|
|
56
|
+
<div className="w-3 h-3 rounded-full bg-amber-500" />
|
|
57
|
+
<div className="w-3 h-3 rounded-full bg-green-500" />
|
|
58
|
+
</div>
|
|
59
|
+
<div className="text-xs font-mono text-muted-foreground">zsh — 80x24</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div className="p-4 font-mono text-sm md:text-base space-y-4 text-gray-300 flex-1 overflow-auto">
|
|
63
|
+
<TerminalLine prefix="$">claude "add unit tests for the auth module"</TerminalLine>
|
|
64
|
+
|
|
65
|
+
<AIZwResponse>
|
|
66
|
+
<p className="mb-2">I'll add comprehensive unit tests for the authentication module. Let me first examine the existing code structure...</p>
|
|
67
|
+
<div className="space-y-1 text-xs md:text-sm text-muted-foreground/80">
|
|
68
|
+
<div>Reading src/auth/login.ts</div>
|
|
69
|
+
<div>Reading src/auth/session.ts</div>
|
|
70
|
+
<div>Reading src/auth/middleware.ts</div>
|
|
71
|
+
</div>
|
|
72
|
+
</AIZwResponse>
|
|
73
|
+
|
|
74
|
+
<div className="mt-8 max-w-md">
|
|
75
|
+
<div className="flex justify-between text-xs mb-1.5 text-muted-foreground">
|
|
76
|
+
<span>Generating tests...</span>
|
|
77
|
+
<span>30%</span>
|
|
78
|
+
</div>
|
|
79
|
+
<div className="h-2 w-full bg-white/10 rounded-full overflow-hidden">
|
|
80
|
+
<div className="h-full bg-green-500 w-[30%] rounded-full animate-pulse" />
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div className="animate-pulse">█</div>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<div className="bg-white/5 px-4 py-1.5 border-t border-white/5 text-xs text-muted-foreground flex justify-between items-center">
|
|
88
|
+
<span className="flex items-center gap-2">
|
|
89
|
+
<LockIcon className="w-3 h-3" /> End-to-end encrypted
|
|
90
|
+
</span>
|
|
91
|
+
<span>Ctrl+Esc: exit</span>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</main>
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function LockIcon({ className }: { className?: string }) {
|
|
100
|
+
return (
|
|
101
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className={className}>
|
|
102
|
+
<rect width="18" height="11" x="3" y="11" rx="2" ry="2" />
|
|
103
|
+
<path d="M7 11V7a5 5 0 0 1 10 0v4" />
|
|
104
|
+
</svg>
|
|
105
|
+
)
|
|
106
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
@custom-variant dark (&:is(.dark *));
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--font-size: 16px;
|
|
5
|
+
--background: #ffffff;
|
|
6
|
+
--foreground: oklch(0.145 0 0);
|
|
7
|
+
--card: #ffffff;
|
|
8
|
+
--card-foreground: oklch(0.145 0 0);
|
|
9
|
+
--popover: oklch(1 0 0);
|
|
10
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
11
|
+
--primary: #030213;
|
|
12
|
+
--primary-foreground: oklch(1 0 0);
|
|
13
|
+
--secondary: oklch(0.95 0.0058 264.53);
|
|
14
|
+
--secondary-foreground: #030213;
|
|
15
|
+
--muted: #ececf0;
|
|
16
|
+
--muted-foreground: #717182;
|
|
17
|
+
--accent: #e9ebef;
|
|
18
|
+
--accent-foreground: #030213;
|
|
19
|
+
--destructive: #d4183d;
|
|
20
|
+
--destructive-foreground: #ffffff;
|
|
21
|
+
--border: rgba(0, 0, 0, 0.1);
|
|
22
|
+
--input: transparent;
|
|
23
|
+
--input-background: #f3f3f5;
|
|
24
|
+
--switch-background: #cbced4;
|
|
25
|
+
--font-weight-medium: 500;
|
|
26
|
+
--font-weight-normal: 400;
|
|
27
|
+
--ring: oklch(0.708 0 0);
|
|
28
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
29
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
30
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
31
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
32
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
33
|
+
--radius: 0.625rem;
|
|
34
|
+
--sidebar: oklch(0.985 0 0);
|
|
35
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
36
|
+
--sidebar-primary: #030213;
|
|
37
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
38
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
39
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
40
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
41
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.dark {
|
|
45
|
+
--background: oklch(0.145 0 0);
|
|
46
|
+
--foreground: oklch(0.985 0 0);
|
|
47
|
+
--card: oklch(0.145 0 0);
|
|
48
|
+
--card-foreground: oklch(0.985 0 0);
|
|
49
|
+
--popover: oklch(0.145 0 0);
|
|
50
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
51
|
+
--primary: oklch(0.985 0 0);
|
|
52
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
53
|
+
--secondary: oklch(0.269 0 0);
|
|
54
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
55
|
+
--muted: oklch(0.269 0 0);
|
|
56
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
57
|
+
--accent: oklch(0.269 0 0);
|
|
58
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
59
|
+
--destructive: oklch(0.396 0.141 25.723);
|
|
60
|
+
--destructive-foreground: oklch(0.637 0.237 25.331);
|
|
61
|
+
--border: oklch(0.269 0 0);
|
|
62
|
+
--input: oklch(0.269 0 0);
|
|
63
|
+
--ring: oklch(0.439 0 0);
|
|
64
|
+
--font-weight-medium: 500;
|
|
65
|
+
--font-weight-normal: 400;
|
|
66
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
67
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
68
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
69
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
70
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
71
|
+
--sidebar: oklch(0.205 0 0);
|
|
72
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
73
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
74
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
75
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
76
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
77
|
+
--sidebar-border: oklch(0.269 0 0);
|
|
78
|
+
--sidebar-ring: oklch(0.439 0 0);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@theme inline {
|
|
82
|
+
--color-background: var(--background);
|
|
83
|
+
--color-foreground: var(--foreground);
|
|
84
|
+
--color-card: var(--card);
|
|
85
|
+
--color-card-foreground: var(--card-foreground);
|
|
86
|
+
--color-popover: var(--popover);
|
|
87
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
88
|
+
--color-primary: var(--primary);
|
|
89
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
90
|
+
--color-secondary: var(--secondary);
|
|
91
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
92
|
+
--color-muted: var(--muted);
|
|
93
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
94
|
+
--color-accent: var(--accent);
|
|
95
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
96
|
+
--color-destructive: var(--destructive);
|
|
97
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
98
|
+
--color-border: var(--border);
|
|
99
|
+
--color-input: var(--input);
|
|
100
|
+
--color-input-background: var(--input-background);
|
|
101
|
+
--color-switch-background: var(--switch-background);
|
|
102
|
+
--color-ring: var(--ring);
|
|
103
|
+
--color-chart-1: var(--chart-1);
|
|
104
|
+
--color-chart-2: var(--chart-2);
|
|
105
|
+
--color-chart-3: var(--chart-3);
|
|
106
|
+
--color-chart-4: var(--chart-4);
|
|
107
|
+
--color-chart-5: var(--chart-5);
|
|
108
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
109
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
110
|
+
--radius-lg: var(--radius);
|
|
111
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
112
|
+
--color-sidebar: var(--sidebar);
|
|
113
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
114
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
115
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
116
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
117
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
118
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
119
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
@layer base {
|
|
123
|
+
* {
|
|
124
|
+
@apply border-border outline-ring/50;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
body {
|
|
128
|
+
@apply bg-background text-foreground;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Default typography styles for HTML elements (h1-h4, p, label, button, input).
|
|
133
|
+
* These are in @layer base, so Tailwind utility classes (like text-sm, text-lg) automatically override them.
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
html {
|
|
137
|
+
font-size: var(--font-size);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
h1 {
|
|
141
|
+
font-size: var(--text-2xl);
|
|
142
|
+
font-weight: var(--font-weight-medium);
|
|
143
|
+
line-height: 1.5;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
h2 {
|
|
147
|
+
font-size: var(--text-xl);
|
|
148
|
+
font-weight: var(--font-weight-medium);
|
|
149
|
+
line-height: 1.5;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
h3 {
|
|
153
|
+
font-size: var(--text-lg);
|
|
154
|
+
font-weight: var(--font-weight-medium);
|
|
155
|
+
line-height: 1.5;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
h4 {
|
|
159
|
+
font-size: var(--text-base);
|
|
160
|
+
font-weight: var(--font-weight-medium);
|
|
161
|
+
line-height: 1.5;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
label {
|
|
165
|
+
font-size: var(--text-base);
|
|
166
|
+
font-weight: var(--font-weight-medium);
|
|
167
|
+
line-height: 1.5;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
button {
|
|
171
|
+
font-size: var(--text-base);
|
|
172
|
+
font-weight: var(--font-weight-medium);
|
|
173
|
+
line-height: 1.5;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
input {
|
|
177
|
+
font-size: var(--text-base);
|
|
178
|
+
font-weight: var(--font-weight-normal);
|
|
179
|
+
line-height: 1.5;
|
|
180
|
+
}
|
|
181
|
+
}
|