From 990b2bf7dea5c6417863519db54dce0a6788051a Mon Sep 17 00:00:00 2001 From: MacRimi Date: Thu, 13 Feb 2025 23:04:40 +0100 Subject: [PATCH] update --- web/CHANGELOG.md | 34 + web/README.md | 26 + web/app/changelog/changelog.md | 34 + web/app/changelog/page.tsx | 24 + web/app/components/DocSidebar.tsx | 22 +- web/app/components/footer.tsx | 108 +-- web/app/components/hero.tsx | 35 +- web/app/components/navbar.tsx | 100 +-- web/app/components/testimonials.tsx | 22 +- web/app/guides/[slug]/page.tsx | 20 +- .../guides/nvidia_proxmox/nvidia_proxmox.mdx | 52 ++ web/app/guides/page.tsx | 10 +- web/app/layout.tsx | 20 +- web/app/page.tsx | 2 - web/components.json | 21 + web/components/DocSidebar.tsx | 50 ++ web/components/footer.tsx | 58 ++ web/components/hero.tsx | 30 + .../components/mouse-move-effect.tsx | 0 web/components/navbar.tsx | 73 ++ web/{app => }/components/resources.tsx | 0 web/{app => }/components/support-project.tsx | 0 web/components/testimonials.tsx | 35 + web/components/theme-provider.tsx | 11 + web/components/ui/accordion.tsx | 58 ++ web/components/ui/alert-dialog.tsx | 141 ++++ web/components/ui/alert.tsx | 59 ++ web/components/ui/aspect-ratio.tsx | 7 + web/components/ui/avatar.tsx | 50 ++ web/components/ui/badge.tsx | 36 + web/components/ui/breadcrumb.tsx | 115 +++ web/{app => }/components/ui/button.tsx | 0 web/components/ui/calendar.tsx | 66 ++ web/components/ui/card.tsx | 79 ++ web/components/ui/carousel.tsx | 262 ++++++ web/components/ui/chart.tsx | 365 +++++++++ web/components/ui/checkbox.tsx | 30 + web/components/ui/collapsible.tsx | 11 + web/components/ui/command.tsx | 153 ++++ web/components/ui/context-menu.tsx | 200 +++++ web/components/ui/dialog.tsx | 122 +++ web/components/ui/drawer.tsx | 118 +++ web/components/ui/dropdown-menu.tsx | 200 +++++ web/components/ui/form.tsx | 178 ++++ web/components/ui/hover-card.tsx | 29 + web/components/ui/input-otp.tsx | 71 ++ web/components/ui/input.tsx | 22 + web/components/ui/label.tsx | 26 + web/components/ui/menubar.tsx | 236 ++++++ web/components/ui/navigation-menu.tsx | 128 +++ web/components/ui/pagination.tsx | 117 +++ web/components/ui/popover.tsx | 31 + web/components/ui/progress.tsx | 28 + web/components/ui/radio-group.tsx | 44 + web/components/ui/resizable.tsx | 45 ++ web/components/ui/scroll-area.tsx | 48 ++ web/components/ui/select.tsx | 160 ++++ web/components/ui/separator.tsx | 31 + web/components/ui/sheet.tsx | 140 ++++ web/components/ui/sidebar.tsx | 763 ++++++++++++++++++ web/components/ui/skeleton.tsx | 15 + web/components/ui/slider.tsx | 28 + web/components/ui/sonner.tsx | 31 + web/{app => }/components/ui/steps.tsx | 0 web/components/ui/switch.tsx | 29 + web/components/ui/table.tsx | 117 +++ web/components/ui/tabs.tsx | 55 ++ web/components/ui/textarea.tsx | 22 + web/{app => }/components/ui/toast.tsx | 0 web/components/ui/toaster.tsx | 35 + web/components/ui/toggle-group.tsx | 61 ++ web/components/ui/toggle.tsx | 45 ++ web/components/ui/tooltip.tsx | 30 + web/components/ui/use-mobile.tsx | 19 + web/components/ui/use-toast.ts | 194 +++++ web/guides/example_guide.md | 12 + web/guides/nvidia_proxmox.md | 27 + web/next.config.mjs | 48 ++ web/package.json | 89 +- web/postcss.config.mjs | 8 + web/tailwind.config.js | 4 +- web/tsconfig.json | 9 +- web/v0-user-next.config.js | 16 + web/web/app/changelog/page.tsx | 24 + web/web/app/components/ui/button.tsx | 48 ++ web/web/app/components/ui/steps.tsx | 35 + web/web/app/globals.css | 60 ++ web/web/app/guides/[slug]/page.tsx | 30 + web/web/app/layout.tsx | 31 + web/web/app/page.tsx | 16 + web/web/components.json | 17 + web/web/next.config.js | 12 + web/web/package.json | 15 + web/web/styles/globals.css | 60 ++ web/web/tailwind.config.js | 72 ++ web/web/tsconfig.json | 29 + web2/app/components/CTA.tsx | 18 + {web => web2}/app/components/ClientLayout.tsx | 0 web2/app/components/DocSidebar.tsx | 50 ++ .../app/components/MouseMoveEffect.tsx | 0 web2/app/components/features.tsx | 44 + web2/app/components/footer.tsx | 58 ++ web2/app/components/header.tsx | 27 + web2/app/components/hero.tsx | 30 + web2/app/components/mouse-move-effect.tsx | 29 + web2/app/components/navbar.tsx | 73 ++ web2/app/components/pricing.tsx | 53 ++ web2/app/components/productPreview.tsx | 21 + web2/app/components/resources.tsx | 52 ++ web2/app/components/support-project.tsx | 26 + web2/app/components/testimonials.tsx | 35 + .../app/components/theme-provider.tsx | 0 web2/app/components/ui/button.tsx | 56 ++ web2/app/components/ui/steps.tsx | 35 + web2/app/components/ui/toast.tsx | 129 +++ web2/app/docs/installation/page.tsx | 33 + web2/app/docs/introduction/page.tsx | 25 + web2/app/docs/layout.tsx | 16 + web2/app/globals.css | 60 ++ web2/app/guides/[slug]/page.tsx | 38 + web2/app/guides/page.tsx | 46 ++ web2/app/layout.tsx | 23 + web2/app/page.tsx | 20 + web2/hooks/use-mobile.tsx | 19 + web2/hooks/use-toast.ts | 194 +++++ web2/lib/utils.ts | 6 + {web => web2}/next.config.js | 0 {web => web2}/package-lock.json | 0 web2/package.json | 42 + web2/public/placeholder-logo.png | Bin 0 -> 958 bytes web2/public/placeholder-logo.svg | 1 + web2/public/placeholder-user.jpg | Bin 0 -> 2615 bytes web2/public/placeholder.jpg | Bin 0 -> 1596 bytes web2/public/placeholder.svg | 1 + web2/styles/globals.css | 94 +++ web2/tailwind.config.js | 72 ++ web2/tsconfig.json | 30 + 137 files changed, 7536 insertions(+), 219 deletions(-) create mode 100644 web/CHANGELOG.md create mode 100644 web/README.md create mode 100644 web/app/changelog/changelog.md create mode 100644 web/app/changelog/page.tsx create mode 100644 web/app/guides/nvidia_proxmox/nvidia_proxmox.mdx create mode 100644 web/components.json create mode 100644 web/components/DocSidebar.tsx create mode 100644 web/components/footer.tsx create mode 100644 web/components/hero.tsx rename web/{app => }/components/mouse-move-effect.tsx (100%) create mode 100644 web/components/navbar.tsx rename web/{app => }/components/resources.tsx (100%) rename web/{app => }/components/support-project.tsx (100%) create mode 100644 web/components/testimonials.tsx create mode 100644 web/components/theme-provider.tsx create mode 100644 web/components/ui/accordion.tsx create mode 100644 web/components/ui/alert-dialog.tsx create mode 100644 web/components/ui/alert.tsx create mode 100644 web/components/ui/aspect-ratio.tsx create mode 100644 web/components/ui/avatar.tsx create mode 100644 web/components/ui/badge.tsx create mode 100644 web/components/ui/breadcrumb.tsx rename web/{app => }/components/ui/button.tsx (100%) create mode 100644 web/components/ui/calendar.tsx create mode 100644 web/components/ui/card.tsx create mode 100644 web/components/ui/carousel.tsx create mode 100644 web/components/ui/chart.tsx create mode 100644 web/components/ui/checkbox.tsx create mode 100644 web/components/ui/collapsible.tsx create mode 100644 web/components/ui/command.tsx create mode 100644 web/components/ui/context-menu.tsx create mode 100644 web/components/ui/dialog.tsx create mode 100644 web/components/ui/drawer.tsx create mode 100644 web/components/ui/dropdown-menu.tsx create mode 100644 web/components/ui/form.tsx create mode 100644 web/components/ui/hover-card.tsx create mode 100644 web/components/ui/input-otp.tsx create mode 100644 web/components/ui/input.tsx create mode 100644 web/components/ui/label.tsx create mode 100644 web/components/ui/menubar.tsx create mode 100644 web/components/ui/navigation-menu.tsx create mode 100644 web/components/ui/pagination.tsx create mode 100644 web/components/ui/popover.tsx create mode 100644 web/components/ui/progress.tsx create mode 100644 web/components/ui/radio-group.tsx create mode 100644 web/components/ui/resizable.tsx create mode 100644 web/components/ui/scroll-area.tsx create mode 100644 web/components/ui/select.tsx create mode 100644 web/components/ui/separator.tsx create mode 100644 web/components/ui/sheet.tsx create mode 100644 web/components/ui/sidebar.tsx create mode 100644 web/components/ui/skeleton.tsx create mode 100644 web/components/ui/slider.tsx create mode 100644 web/components/ui/sonner.tsx rename web/{app => }/components/ui/steps.tsx (100%) create mode 100644 web/components/ui/switch.tsx create mode 100644 web/components/ui/table.tsx create mode 100644 web/components/ui/tabs.tsx create mode 100644 web/components/ui/textarea.tsx rename web/{app => }/components/ui/toast.tsx (100%) create mode 100644 web/components/ui/toaster.tsx create mode 100644 web/components/ui/toggle-group.tsx create mode 100644 web/components/ui/toggle.tsx create mode 100644 web/components/ui/tooltip.tsx create mode 100644 web/components/ui/use-mobile.tsx create mode 100644 web/components/ui/use-toast.ts create mode 100644 web/guides/example_guide.md create mode 100644 web/guides/nvidia_proxmox.md create mode 100644 web/next.config.mjs create mode 100644 web/postcss.config.mjs create mode 100644 web/v0-user-next.config.js create mode 100644 web/web/app/changelog/page.tsx create mode 100644 web/web/app/components/ui/button.tsx create mode 100644 web/web/app/components/ui/steps.tsx create mode 100644 web/web/app/globals.css create mode 100644 web/web/app/guides/[slug]/page.tsx create mode 100644 web/web/app/layout.tsx create mode 100644 web/web/app/page.tsx create mode 100644 web/web/components.json create mode 100644 web/web/next.config.js create mode 100644 web/web/package.json create mode 100644 web/web/styles/globals.css create mode 100644 web/web/tailwind.config.js create mode 100644 web/web/tsconfig.json create mode 100644 web2/app/components/CTA.tsx rename {web => web2}/app/components/ClientLayout.tsx (100%) create mode 100644 web2/app/components/DocSidebar.tsx rename {web => web2}/app/components/MouseMoveEffect.tsx (100%) create mode 100644 web2/app/components/features.tsx create mode 100644 web2/app/components/footer.tsx create mode 100644 web2/app/components/header.tsx create mode 100644 web2/app/components/hero.tsx create mode 100644 web2/app/components/mouse-move-effect.tsx create mode 100644 web2/app/components/navbar.tsx create mode 100644 web2/app/components/pricing.tsx create mode 100644 web2/app/components/productPreview.tsx create mode 100644 web2/app/components/resources.tsx create mode 100644 web2/app/components/support-project.tsx create mode 100644 web2/app/components/testimonials.tsx rename {web => web2}/app/components/theme-provider.tsx (100%) create mode 100644 web2/app/components/ui/button.tsx create mode 100644 web2/app/components/ui/steps.tsx create mode 100644 web2/app/components/ui/toast.tsx create mode 100644 web2/app/docs/installation/page.tsx create mode 100644 web2/app/docs/introduction/page.tsx create mode 100644 web2/app/docs/layout.tsx create mode 100644 web2/app/globals.css create mode 100644 web2/app/guides/[slug]/page.tsx create mode 100644 web2/app/guides/page.tsx create mode 100644 web2/app/layout.tsx create mode 100644 web2/app/page.tsx create mode 100644 web2/hooks/use-mobile.tsx create mode 100644 web2/hooks/use-toast.ts create mode 100644 web2/lib/utils.ts rename {web => web2}/next.config.js (100%) rename {web => web2}/package-lock.json (100%) create mode 100644 web2/package.json create mode 100644 web2/public/placeholder-logo.png create mode 100644 web2/public/placeholder-logo.svg create mode 100644 web2/public/placeholder-user.jpg create mode 100644 web2/public/placeholder.jpg create mode 100644 web2/public/placeholder.svg create mode 100644 web2/styles/globals.css create mode 100644 web2/tailwind.config.js create mode 100644 web2/tsconfig.json diff --git a/web/CHANGELOG.md b/web/CHANGELOG.md new file mode 100644 index 0000000..e8ec34e --- /dev/null +++ b/web/CHANGELOG.md @@ -0,0 +1,34 @@ +# Changelog + +All notable changes to ProxMenux will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added +- Initial project setup +- Basic menu structure +- Documentation framework + +## [0.1.0] - 2023-06-15 + +### Added +- Core functionality for executing shell scripts +- Menu-driven interface for script selection +- Basic error handling and logging + +### Changed +- Improved script organization with categories + +### Fixed +- Issue with script permissions on certain systems + +## [0.0.1] - 2023-06-01 + +### Added +- Project initialization +- README with basic project description +- License file + diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..746cbfc --- /dev/null +++ b/web/README.md @@ -0,0 +1,26 @@ +# ProxMenux + +ProxMenux is a menu-driven script for Proxmox VE management. This repository contains both the core ProxMenux tool and its documentation website. + +## Project Structure + +- `/web`: Contains the Next.js website for ProxMenux documentation +- `/guides`: Markdown files for various guides +- `CHANGELOG.md`: Project changelog + +## Getting Started + +To run the documentation website locally: + +1. Navigate to the `/web` directory +2. Install dependencies: `npm install` +3. Run the development server: `npm run dev` + +## Deployment + +This project is set up for automatic deployment to GitHub Pages using GitHub Actions. Any push to the `main` branch will trigger a new build and deployment. + +## Contributing + +Contributions are welcome! Please feel free to submit a Pull Request. + diff --git a/web/app/changelog/changelog.md b/web/app/changelog/changelog.md new file mode 100644 index 0000000..e8ec34e --- /dev/null +++ b/web/app/changelog/changelog.md @@ -0,0 +1,34 @@ +# Changelog + +All notable changes to ProxMenux will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added +- Initial project setup +- Basic menu structure +- Documentation framework + +## [0.1.0] - 2023-06-15 + +### Added +- Core functionality for executing shell scripts +- Menu-driven interface for script selection +- Basic error handling and logging + +### Changed +- Improved script organization with categories + +### Fixed +- Issue with script permissions on certain systems + +## [0.0.1] - 2023-06-01 + +### Added +- Project initialization +- README with basic project description +- License file + diff --git a/web/app/changelog/page.tsx b/web/app/changelog/page.tsx new file mode 100644 index 0000000..92be156 --- /dev/null +++ b/web/app/changelog/page.tsx @@ -0,0 +1,24 @@ +import fs from "fs" +import path from "path" +import { remark } from "remark" +import html from "remark-html" + +async function getChangelog() { + const changelogPath = path.join(process.cwd(), "CHANGELOG.md") + const fileContents = fs.readFileSync(changelogPath, "utf8") + + const result = await remark().use(html).process(fileContents) + return result.toString() +} + +export default async function ChangelogPage() { + const changelogContent = await getChangelog() + + return ( +
+

Changelog

+
+
+ ) +} + diff --git a/web/app/components/DocSidebar.tsx b/web/app/components/DocSidebar.tsx index ded63cf..a91e41d 100644 --- a/web/app/components/DocSidebar.tsx +++ b/web/app/components/DocSidebar.tsx @@ -1,9 +1,5 @@ -"use client" - import Link from "next/link" import { usePathname } from "next/navigation" -import { useState } from "react" -import { Menu } from "lucide-react" const sidebarItems = [ { title: "Introduction", href: "/docs/introduction" }, @@ -11,33 +7,23 @@ const sidebarItems = [ { title: "Getting Started", href: "/docs/getting-started" }, { title: "Features", href: "/docs/features" }, { title: "API", href: "/docs/api" }, - { title: "Guides", href: "/guides" }, { title: "FAQ", href: "/docs/faq" }, ] export default function DocSidebar() { const pathname = usePathname() - const [isOpen, setIsOpen] = useState(false) return ( -
) } diff --git a/web/app/components/navbar.tsx b/web/app/components/navbar.tsx index 1c11daa..d077eda 100644 --- a/web/app/components/navbar.tsx +++ b/web/app/components/navbar.tsx @@ -1,73 +1,47 @@ -"use client" - import Link from "next/link" -import Image from "next/image" -import { Book, GitBranch, FileText, Github, Menu } from "lucide-react" -import { useState } from "react" +import { Button } from "@/components/ui/button" export default function Navbar() { - const [isMenuOpen, setIsMenuOpen] = useState(false) - - const navItems = [ - { href: "/docs/introduction", icon: , label: "Documentation" }, - { href: "/changelog", icon: , label: "Changelog" }, - { href: "/guides", icon: , label: "Guides" }, - { href: "https://github.com/MacRimi/ProxMenux", icon: , label: "GitHub" }, - ] - return ( -
-
+
+ ) } diff --git a/web/app/components/testimonials.tsx b/web/app/components/testimonials.tsx index 9044196..81fc6ac 100644 --- a/web/app/components/testimonials.tsx +++ b/web/app/components/testimonials.tsx @@ -18,16 +18,18 @@ const testimonials = [ export default function Testimonials() { return ( -
-

What Our Customers Say

-
- {testimonials.map((testimonial, index) => ( -
-

"{testimonial.quote}"

-

{testimonial.author}

-

{testimonial.company}

-
- ))} +
+
+

What Our Customers Say

+
+ {testimonials.map((testimonial, index) => ( +
+

"{testimonial.quote}"

+

{testimonial.author}

+

{testimonial.company}

+
+ ))} +
) diff --git a/web/app/guides/[slug]/page.tsx b/web/app/guides/[slug]/page.tsx index b3da8d1..6c90183 100644 --- a/web/app/guides/[slug]/page.tsx +++ b/web/app/guides/[slug]/page.tsx @@ -3,30 +3,21 @@ import path from "path" import { remark } from "remark" import html from "remark-html" -// Function to retrieve the guide content based on the slug async function getGuideContent(slug: string) { - // Adjusted to look inside the correct 'guides' folder at the root level of the project - const guidePath = path.join(process.cwd(), "..", "guides", slug, "index.md") // Corrected to look in the root directory + const guidePath = path.join(process.cwd(), "guides", `${slug}.md`) const fileContents = fs.readFileSync(guidePath, "utf8") const result = await remark().use(html).process(fileContents) return result.toString() } -// Function to generate static paths for all available guides export async function generateStaticParams() { - // Adjusted to look in the correct 'guides' folder at the root level of the project - const guidesPath = path.join(process.cwd(), "..", "guides") - const guideFolders = fs.readdirSync(guidesPath, { withFileTypes: true }) // Read only directories - - return guideFolders - .filter((folder) => folder.isDirectory()) // Ensure it's a directory - .map((folder) => ({ - slug: folder.name, // Use the folder name as slug - })) + const guideFiles = fs.readdirSync(path.join(process.cwd(), "guides")) + return guideFiles.map((file) => ({ + slug: file.replace(/\.md$/, ""), + })) } -// Page component to render a guide based on its slug export default async function GuidePage({ params }: { params: { slug: string } }) { const guideContent = await getGuideContent(params.slug) @@ -36,3 +27,4 @@ export default async function GuidePage({ params }: { params: { slug: string } }
) } + diff --git a/web/app/guides/nvidia_proxmox/nvidia_proxmox.mdx b/web/app/guides/nvidia_proxmox/nvidia_proxmox.mdx new file mode 100644 index 0000000..07d23b4 --- /dev/null +++ b/web/app/guides/nvidia_proxmox/nvidia_proxmox.mdx @@ -0,0 +1,52 @@ +# Setting up NVIDIA Drivers on Proxmox VE with GPU Passthrough + +This guide explains how to install and configure NVIDIA drivers on your Proxmox VE host and enable GPU passthrough to your virtual machines. This allows you to leverage the power of your NVIDIA GPU within your VMs for tasks like machine learning, gaming, or video editing. + +## Prerequisites + +Before you begin, ensure you have the following: + +* A Proxmox VE server with an NVIDIA GPU installed. +* Access to the Proxmox VE command line interface (CLI) via SSH. +* A basic understanding of Proxmox VE and virtual machine management. + +## Installing the NVIDIA Driver on the Proxmox VE Host + +This step involves installing the NVIDIA driver on your Proxmox VE host operating system. The exact steps may vary slightly depending on your Proxmox VE version and the specific NVIDIA GPU you are using. Consult the official NVIDIA documentation for the most up-to-date instructions. + +Generally, you will need to download the appropriate driver package from the NVIDIA website and then install it using the package manager for your distribution. + +## Enabling GPU Passthrough + +Once the NVIDIA driver is installed, you need to enable GPU passthrough for your virtual machines. This involves assigning the GPU to a specific VM. + +1. **Identify your GPU:** Use the `lspci` command to identify the PCI address of your NVIDIA GPU. The output will look something like this: + + \`\`\`bash + 01:00.0 VGA compatible controller: NVIDIA Corporation ... + \`\`\` + + Note the `01:00.0` part – this is the PCI address. + +2. **Create a VM:** Create a new virtual machine in Proxmox VE. + +3. **Assign the GPU:** During the VM creation process, or afterwards using the VM's configuration, assign the NVIDIA GPU to the VM using the PCI address you identified earlier. This is typically done in the "Hardware" section of the VM's settings. + +4. **Install the Guest Additions:** Once the VM is created, install the appropriate guest additions for your VM's operating system. This will ensure that the VM can properly utilize the passed-through GPU. + +## Verifying GPU Passthrough + +After completing these steps, boot your VM and verify that the NVIDIA GPU is working correctly. You can use tools like `nvidia-smi` (within the VM) to check the GPU status and utilization. + +## Troubleshooting + +If you encounter any issues, check the following: + +* **Driver Installation:** Ensure the NVIDIA driver is correctly installed on the Proxmox VE host. +* **PCI Address:** Double-check that you have used the correct PCI address when assigning the GPU to the VM. +* **Guest Additions:** Make sure the appropriate guest additions are installed within the VM. +* **VM Configuration:** Verify that the VM's configuration is correct and that the GPU is properly assigned. +* **Proxmox VE Logs:** Check the Proxmox VE logs for any errors related to the GPU or VM. + +This guide provides a general overview. For more detailed instructions and troubleshooting tips, refer to the official NVIDIA and Proxmox VE documentation. + diff --git a/web/app/guides/page.tsx b/web/app/guides/page.tsx index b8b1360..3176df6 100644 --- a/web/app/guides/page.tsx +++ b/web/app/guides/page.tsx @@ -1,13 +1,11 @@ import Link from "next/link" -// Interface defining the structure of a guide interface Guide { title: string description: string slug: string } -// Guide list (manually added, can be automated later) const guides: Guide[] = [ { title: "Setting up NVIDIA Drivers on Proxmox VE with GPU Passthrough", @@ -16,14 +14,13 @@ const guides: Guide[] = [ slug: "nvidia_proxmox", }, { - title: "Example Additional Guide", - description: "This is a sample guide to show how multiple guides are handled.", + title: "Ejemplo de GuĂ­a Adicional", + description: "Esta es una guĂ­a de ejemplo para mostrar cĂłmo se manejan mĂșltiples guĂ­as.", slug: "example_guide", }, - // Add more guides as needed + // Añade mĂĄs guĂ­as aquĂ­ segĂșn sea necesario ] -// Main component that renders the list of available guides export default function GuidesPage() { return (
@@ -44,3 +41,4 @@ export default function GuidesPage() {
) } + diff --git a/web/app/layout.tsx b/web/app/layout.tsx index a3583ea..2d6a68b 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -1,7 +1,9 @@ import "./globals.css" import { Inter } from "next/font/google" +import type React from "react" import type { Metadata } from "next" -import ClientLayout from "@/components/ClientLayout" +import Navbar from "@/components/navbar" +import MouseMoveEffect from "@/components/mouse-move-effect" const inter = Inter({ subsets: ["latin"] }) @@ -9,15 +11,25 @@ export const metadata: Metadata = { title: "ProxMenux - A menu-driven script for Proxmox VE management", description: "ProxMenux is a tool designed to execute shell scripts in an organized manner for Proxmox VE management.", - generator: "v0.dev", + generator: 'v0.dev' } -export default function RootLayout({ children }: { children: React.ReactNode }) { +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { return ( - {children} + + +
{children}
) } + + + +import './globals.css' \ No newline at end of file diff --git a/web/app/page.tsx b/web/app/page.tsx index fbdcb44..67e5883 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -1,5 +1,3 @@ -"use client"; - import Hero from "@/components/hero" import Resources from "@/components/resources" import SupportProject from "@/components/support-project" diff --git a/web/components.json b/web/components.json new file mode 100644 index 0000000..d9ef0ae --- /dev/null +++ b/web/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/web/components/DocSidebar.tsx b/web/components/DocSidebar.tsx new file mode 100644 index 0000000..ded63cf --- /dev/null +++ b/web/components/DocSidebar.tsx @@ -0,0 +1,50 @@ +"use client" + +import Link from "next/link" +import { usePathname } from "next/navigation" +import { useState } from "react" +import { Menu } from "lucide-react" + +const sidebarItems = [ + { title: "Introduction", href: "/docs/introduction" }, + { title: "Installation", href: "/docs/installation" }, + { title: "Getting Started", href: "/docs/getting-started" }, + { title: "Features", href: "/docs/features" }, + { title: "API", href: "/docs/api" }, + { title: "Guides", href: "/guides" }, + { title: "FAQ", href: "/docs/faq" }, +] + +export default function DocSidebar() { + const pathname = usePathname() + const [isOpen, setIsOpen] = useState(false) + + return ( + + ) +} + diff --git a/web/components/footer.tsx b/web/components/footer.tsx new file mode 100644 index 0000000..8c731f0 --- /dev/null +++ b/web/components/footer.tsx @@ -0,0 +1,58 @@ +import Link from "next/link" +import { MessageCircle } from "lucide-react" +import Image from "next/image" + +export default function Footer() { + return ( +
+
+
+ {/* Support Section - Left Side */} +
+

Sponsor

+

+ If you would like to support the project, you can buy me a coffee on Ko-fi! Thank you! 😊 +

+ + Support me on Ko-fi + +
+ + {/* Connect Section - Right Side */} +
+

Connect

+

+ Join our community discussions on GitHub to get help, share ideas, and contribute to the project. +

+ + + Join the Discussion + +
+
+ + {/* Copyright - Center */} +
+

© {new Date().getFullYear()} ProxMenux. All rights reserved.

+
+
+
+ ) +} + diff --git a/web/components/hero.tsx b/web/components/hero.tsx new file mode 100644 index 0000000..09f0438 --- /dev/null +++ b/web/components/hero.tsx @@ -0,0 +1,30 @@ +import { Button } from "@/components/ui/button" +import { ArrowRight } from "lucide-react" +import Link from "next/link" + +export default function Hero() { + return ( +
+

+ ProxMenux{" "} + + A menu-driven script for Proxmox VE management + +

+

+ ProxMenu is a tool designed to execute shell scripts in an organized manner, using a menu system with categories + to facilitate access and execution of various scripts hosted on GitHub. ProxMenu simplifies script usage, aiming + to improve productivity and streamline automated tasks. +

+
+ +
+
+ ) +} + diff --git a/web/app/components/mouse-move-effect.tsx b/web/components/mouse-move-effect.tsx similarity index 100% rename from web/app/components/mouse-move-effect.tsx rename to web/components/mouse-move-effect.tsx diff --git a/web/components/navbar.tsx b/web/components/navbar.tsx new file mode 100644 index 0000000..1c11daa --- /dev/null +++ b/web/components/navbar.tsx @@ -0,0 +1,73 @@ +"use client" + +import Link from "next/link" +import Image from "next/image" +import { Book, GitBranch, FileText, Github, Menu } from "lucide-react" +import { useState } from "react" + +export default function Navbar() { + const [isMenuOpen, setIsMenuOpen] = useState(false) + + const navItems = [ + { href: "/docs/introduction", icon: , label: "Documentation" }, + { href: "/changelog", icon: , label: "Changelog" }, + { href: "/guides", icon: , label: "Guides" }, + { href: "https://github.com/MacRimi/ProxMenux", icon: , label: "GitHub" }, + ] + + return ( +
+
+
+ + ProxMenux Logo + ProxMenux + + + {/* Desktop menu */} + + + {/* Mobile menu button */} + +
+ + {/* Mobile menu */} + {isMenuOpen && ( + + )} +
+
+ ) +} + diff --git a/web/app/components/resources.tsx b/web/components/resources.tsx similarity index 100% rename from web/app/components/resources.tsx rename to web/components/resources.tsx diff --git a/web/app/components/support-project.tsx b/web/components/support-project.tsx similarity index 100% rename from web/app/components/support-project.tsx rename to web/components/support-project.tsx diff --git a/web/components/testimonials.tsx b/web/components/testimonials.tsx new file mode 100644 index 0000000..9044196 --- /dev/null +++ b/web/components/testimonials.tsx @@ -0,0 +1,35 @@ +const testimonials = [ + { + quote: "StreamLine has revolutionized our team's workflow. It's a game-changer!", + author: "Jane Doe", + company: "Tech Innovators Inc.", + }, + { + quote: "The best project management tool we've ever used. Highly recommended!", + author: "John Smith", + company: "Creative Solutions LLC", + }, + { + quote: "StreamLine helped us increase productivity by 40%. It's incredible!", + author: "Emily Johnson", + company: "Startup Ventures", + }, +] + +export default function Testimonials() { + return ( +
+

What Our Customers Say

+
+ {testimonials.map((testimonial, index) => ( +
+

"{testimonial.quote}"

+

{testimonial.author}

+

{testimonial.company}

+
+ ))} +
+
+ ) +} + diff --git a/web/components/theme-provider.tsx b/web/components/theme-provider.tsx new file mode 100644 index 0000000..55c2f6e --- /dev/null +++ b/web/components/theme-provider.tsx @@ -0,0 +1,11 @@ +'use client' + +import * as React from 'react' +import { + ThemeProvider as NextThemesProvider, + type ThemeProviderProps, +} from 'next-themes' + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children} +} diff --git a/web/components/ui/accordion.tsx b/web/components/ui/accordion.tsx new file mode 100644 index 0000000..24c788c --- /dev/null +++ b/web/components/ui/accordion.tsx @@ -0,0 +1,58 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) + +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/web/components/ui/alert-dialog.tsx b/web/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..25e7b47 --- /dev/null +++ b/web/components/ui/alert-dialog.tsx @@ -0,0 +1,141 @@ +"use client" + +import * as React from "react" +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +const AlertDialog = AlertDialogPrimitive.Root + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger + +const AlertDialogPortal = AlertDialogPrimitive.Portal + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)) +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogHeader.displayName = "AlertDialogHeader" + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogFooter.displayName = "AlertDialogFooter" + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/web/components/ui/alert.tsx b/web/components/ui/alert.tsx new file mode 100644 index 0000000..41fa7e0 --- /dev/null +++ b/web/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground", + { + variants: { + variant: { + default: "bg-background text-foreground", + destructive: + "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = "Alert" + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertTitle, AlertDescription } diff --git a/web/components/ui/aspect-ratio.tsx b/web/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..d6a5226 --- /dev/null +++ b/web/components/ui/aspect-ratio.tsx @@ -0,0 +1,7 @@ +"use client" + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" + +const AspectRatio = AspectRatioPrimitive.Root + +export { AspectRatio } diff --git a/web/components/ui/avatar.tsx b/web/components/ui/avatar.tsx new file mode 100644 index 0000000..51e507b --- /dev/null +++ b/web/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/web/components/ui/badge.tsx b/web/components/ui/badge.tsx new file mode 100644 index 0000000..f000e3e --- /dev/null +++ b/web/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/web/components/ui/breadcrumb.tsx b/web/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..60e6c96 --- /dev/null +++ b/web/components/ui/breadcrumb.tsx @@ -0,0 +1,115 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { ChevronRight, MoreHorizontal } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<"nav"> & { + separator?: React.ReactNode + } +>(({ ...props }, ref) =>