diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index e69de29..0c20393 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -0,0 +1,29 @@ +import AppCard from "@/components/app-card"; + +export default function Dashboard() { + const mockService = { + id: crypto.randomUUID(), + name: "Redis", + address: "127.0.0.1:6379", + }; + + const mockServiceDesc = { + id: crypto.randomUUID(), + name: "Postgres", + address: "127.0.0.1:5432", + description: "An disk-based database, with full modularity.", + }; + + return ( +
+ {/* Heading */} +
+

Dashboard

+
+
+ + +
+
+ ); +} diff --git a/app/scripts/page.tsx b/app/scripts/page.tsx new file mode 100644 index 0000000..dfb0886 --- /dev/null +++ b/app/scripts/page.tsx @@ -0,0 +1,3 @@ +export default function ScriptPage() { + return

Script Page

; +} diff --git a/app/ssh/page.tsx b/app/ssh/page.tsx new file mode 100644 index 0000000..0420409 --- /dev/null +++ b/app/ssh/page.tsx @@ -0,0 +1,3 @@ +export default function SSHPage() { + return

SSH Page

; +} diff --git a/app/write/page.tsx b/app/write/page.tsx new file mode 100644 index 0000000..76e80ee --- /dev/null +++ b/app/write/page.tsx @@ -0,0 +1,3 @@ +export default function WritePage() { + return

Write Page

; +} diff --git a/bun.lock b/bun.lock index 3aa4972..1ec00e2 100644 --- a/bun.lock +++ b/bun.lock @@ -10,6 +10,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^1.21.0", + "motion": "^12.42.0", "next": "16.2.9", "radix-ui": "^1.6.0", "react": "19.2.4", @@ -577,6 +578,8 @@ "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + "framer-motion": ["framer-motion@12.42.0", "", { "dependencies": { "motion-dom": "^12.42.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA=="], + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], "fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], @@ -741,6 +744,12 @@ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + "motion": ["motion@12.42.0", "", { "dependencies": { "framer-motion": "^12.42.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA=="], + + "motion-dom": ["motion-dom@12.42.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w=="], + + "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "nanoid": ["nanoid@3.3.15", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="], diff --git a/components/action-menu.tsx b/components/action-menu.tsx new file mode 100644 index 0000000..46ba12e --- /dev/null +++ b/components/action-menu.tsx @@ -0,0 +1,83 @@ +import { Terminal, Pencil, FileTerminal } from "lucide-react"; +import { motion } from "motion/react"; + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +type Props = { + id: string; +}; + +export default function ActionMenu({ id }: Props) { + const buttonClass = + "flex h-8 w-8 items-center justify-center rounded-lg text-muted-foreground transition-all duration-150 hover:bg-green-50 hover:text-green-600 active:scale-95"; + return ( + + +
+ + + + + +

SSH

+
+
+ + + + + + +

Create Blog

+
+
+ + + + + + +

Run Scripts

+
+
+
+
+
+ ); +} diff --git a/components/app-card.tsx b/components/app-card.tsx new file mode 100644 index 0000000..3796a63 --- /dev/null +++ b/components/app-card.tsx @@ -0,0 +1,87 @@ +"use client"; + +import { motion, AnimatePresence } from "motion/react"; +import { useState } from "react"; +import ActionMenu from "./action-menu"; + +type App = { + id: string; + name: string; + description?: string; + address: string; + ssh_addr?: string; +}; + +interface Props { + app: App; +} + +export default function AppCard({ app }: Props) { + let pingStatus = true; + + const [hovered, setHovered] = useState(false); + + return ( +
setHovered(true)} + onMouseLeave={() => setHovered(false)} + className={` + relative + rounded-2xl + bg-gray-100 + p-3 + ${hovered && "border bg-white"} + transition-all + duration-200 + `} + > +
+
+
+
+
+
+ +

{app.name}

+ + {app.address} + + {/* + {hovered && ( + + {app.description && {app.description}} + + + )} + */} + + + {hovered && ( + + {app.description && ( + + {app.description} + + )} + + + )} + +
+ ); +} diff --git a/components/nav-main.tsx b/components/nav-main.tsx index 080d731..876e18e 100644 --- a/components/nav-main.tsx +++ b/components/nav-main.tsx @@ -1,10 +1,5 @@ "use client"; -import { - Collapsible, - CollapsibleContent, - CollapsibleTrigger, -} from "@/components/ui/collapsible"; import { SidebarGroup, SidebarGroupLabel, @@ -12,6 +7,7 @@ import { SidebarMenuButton, SidebarMenuItem, } from "@/components/ui/sidebar"; +import Link from "next/link"; export function NavMain({ items, @@ -25,18 +21,24 @@ export function NavMain({ }) { return ( - Platform + Aperture {items.map((item) => ( - - - {item.icon} - {item.title} - - + + + + {item.icon} + {item.title} + + + ))} diff --git a/components/sidebar.tsx b/components/sidebar.tsx index a783210..006606e 100644 --- a/components/sidebar.tsx +++ b/components/sidebar.tsx @@ -19,7 +19,7 @@ export default function Sidebar({ children }: Props) {
-
{children}
+
{children}
); diff --git a/package.json b/package.json index cf55719..1cebec1 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^1.21.0", + "motion": "^12.42.0", "next": "16.2.9", "radix-ui": "^1.6.0", "react": "19.2.4",