From f9bf220bb1132e59f3bb1dbbdf364024088bf890 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sun, 7 Dec 2025 05:39:06 -0600 Subject: [PATCH] feat: enhance documentation site with new components and styles - Added new dependencies including @radix-ui/react-dropdown-menu, class-variance-authority, clsx, tailwind-merge, and tw-animate-css. - Introduced new JSON configuration for components and updated layout with logo and navigation links. - Created new MDX files for remote server documentation, including setup instructions and security recommendations. - Updated global CSS to include new styles and themes. - Removed outdated home layout and page components to streamline the documentation structure. --- apps/docs-new/app/(home)/layout.tsx | 6 - apps/docs-new/app/(home)/page.tsx | 27 -- apps/docs-new/app/global.css | 121 ++++++++- apps/docs-new/app/icon.svg | 5 + apps/docs-new/components.json | 22 ++ apps/docs-new/components/Logo.tsx | 27 ++ apps/docs-new/components/NavLinks.tsx | 95 +++++++ apps/docs-new/components/ui/dropdown-menu.tsx | 257 ++++++++++++++++++ apps/docs-new/content/docs/api/meta.json | 2 +- apps/docs-new/content/docs/cli/meta.json | 2 +- apps/docs-new/content/docs/core/meta.json | 20 +- .../deployments.mdx | 6 +- .../ec2-instructions.mdx | 2 +- .../index.mdx | 8 +- .../instructions.mdx | 2 +- .../security.mdx | 0 .../validate.mdx | 0 apps/docs-new/lib/layout.shared.tsx | 21 +- apps/docs-new/lib/utils.ts | 6 + apps/docs-new/mdx-components.tsx | 13 + apps/docs-new/package.json | 7 +- pnpm-lock.yaml | 92 ++++++- 22 files changed, 674 insertions(+), 67 deletions(-) delete mode 100644 apps/docs-new/app/(home)/layout.tsx delete mode 100644 apps/docs-new/app/(home)/page.tsx create mode 100644 apps/docs-new/app/icon.svg create mode 100644 apps/docs-new/components.json create mode 100644 apps/docs-new/components/Logo.tsx create mode 100644 apps/docs-new/components/NavLinks.tsx create mode 100644 apps/docs-new/components/ui/dropdown-menu.tsx rename apps/docs-new/content/docs/core/{multi-server => remote-servers}/deployments.mdx (89%) rename apps/docs-new/content/docs/core/{multi-server => remote-servers}/ec2-instructions.mdx (96%) rename apps/docs-new/content/docs/core/{multi-server => remote-servers}/index.mdx (64%) rename apps/docs-new/content/docs/core/{multi-server => remote-servers}/instructions.mdx (96%) rename apps/docs-new/content/docs/core/{multi-server => remote-servers}/security.mdx (100%) rename apps/docs-new/content/docs/core/{multi-server => remote-servers}/validate.mdx (100%) create mode 100644 apps/docs-new/lib/utils.ts diff --git a/apps/docs-new/app/(home)/layout.tsx b/apps/docs-new/app/(home)/layout.tsx deleted file mode 100644 index 77379fa..0000000 --- a/apps/docs-new/app/(home)/layout.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { HomeLayout } from 'fumadocs-ui/layouts/home'; -import { baseOptions } from '@/lib/layout.shared'; - -export default function Layout({ children }: LayoutProps<'/'>) { - return {children}; -} diff --git a/apps/docs-new/app/(home)/page.tsx b/apps/docs-new/app/(home)/page.tsx deleted file mode 100644 index af5f812..0000000 --- a/apps/docs-new/app/(home)/page.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import Link from 'next/link'; - -export default function HomePage() { - return ( -
-

Dokploy Documentation

-

- Open Source Alternative to Vercel, Netlify and Heroku. Deploy your applications with ease. -

-
- - Get Started - - - View on GitHub - -
-
- ); -} diff --git a/apps/docs-new/app/global.css b/apps/docs-new/app/global.css index 6ff46f2..df41f94 100644 --- a/apps/docs-new/app/global.css +++ b/apps/docs-new/app/global.css @@ -1,3 +1,122 @@ @import 'tailwindcss'; -@import 'fumadocs-ui/css/ocean.css'; +@import 'fumadocs-ui/css/solar.css'; @import 'fumadocs-ui/css/preset.css'; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/apps/docs-new/app/icon.svg b/apps/docs-new/app/icon.svg new file mode 100644 index 0000000..3a8930d --- /dev/null +++ b/apps/docs-new/app/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/docs-new/components.json b/apps/docs-new/components.json new file mode 100644 index 0000000..3a64255 --- /dev/null +++ b/apps/docs-new/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "app/global.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/apps/docs-new/components/Logo.tsx b/apps/docs-new/components/Logo.tsx new file mode 100644 index 0000000..7112fbb --- /dev/null +++ b/apps/docs-new/components/Logo.tsx @@ -0,0 +1,27 @@ +import type { ComponentPropsWithoutRef } from 'react'; + +export function Logo(props: ComponentPropsWithoutRef<'svg'>) { + return ( + + + + + + + + ) +} diff --git a/apps/docs-new/components/NavLinks.tsx b/apps/docs-new/components/NavLinks.tsx new file mode 100644 index 0000000..fa4e660 --- /dev/null +++ b/apps/docs-new/components/NavLinks.tsx @@ -0,0 +1,95 @@ +import { Menu } from 'lucide-react'; +import { LogIn, UserPlus, Globe, Heart, Github, Rss } from 'lucide-react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; + +export function NavLinks() { + const links = [ + { + text: 'Login', + url: 'https://app.dokploy.com/', + icon: LogIn, + }, + { + text: 'Sign Up', + url: 'https://app.dokploy.com/register', + icon: UserPlus, + }, + { + text: 'Website', + url: 'https://dokploy.com', + icon: Globe, + }, + { + text: 'Discord', + url: 'https://discord.com/invite/2tBnJ3jDJc', + icon: () => ( + + + + ), + }, + { + text: 'Support', + url: 'https://opencollective.com/dokploy', + icon: Heart, + }, + { + text: 'Github', + url: 'https://github.com/dokploy/dokploy', + icon: Github, + }, + { + text: 'Blog', + url: 'https://dokploy.com/blog', + icon: Rss, + }, + ]; + + return ( + + + + + + {links.map((link, index) => { + const IconComponent = link.icon; + const showSeparator = index === 2; + + return ( +
+ + + + {link.text} + + + {showSeparator && } +
+ ); + })} +
+
+ ); +} diff --git a/apps/docs-new/components/ui/dropdown-menu.tsx b/apps/docs-new/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..bbe6fb0 --- /dev/null +++ b/apps/docs-new/components/ui/dropdown-menu.tsx @@ -0,0 +1,257 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function DropdownMenu({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuContent({ + className, + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function DropdownMenuGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuItem({ + className, + inset, + variant = "default", + ...props +}: React.ComponentProps & { + inset?: boolean + variant?: "default" | "destructive" +}) { + return ( + + ) +} + +function DropdownMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuRadioGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuRadioItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + ) +} + +function DropdownMenuSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuShortcut({ + className, + ...props +}: React.ComponentProps<"span">) { + return ( + + ) +} + +function DropdownMenuSub({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuSubTrigger({ + className, + inset, + children, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + {children} + + + ) +} + +function DropdownMenuSubContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + DropdownMenu, + DropdownMenuPortal, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuLabel, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubTrigger, + DropdownMenuSubContent, +} diff --git a/apps/docs-new/content/docs/api/meta.json b/apps/docs-new/content/docs/api/meta.json index 7fd17a1..598f314 100644 --- a/apps/docs-new/content/docs/api/meta.json +++ b/apps/docs-new/content/docs/api/meta.json @@ -1,7 +1,7 @@ { "title": "API", "description": "API Documentation", - "icon": "Building2", + "icon": "Code", "root": true, "pages": ["---Get Started---", "index", "---API---", "...", "---Reference---"] } diff --git a/apps/docs-new/content/docs/cli/meta.json b/apps/docs-new/content/docs/cli/meta.json index 2429f37..d6afdbf 100644 --- a/apps/docs-new/content/docs/cli/meta.json +++ b/apps/docs-new/content/docs/cli/meta.json @@ -1,7 +1,7 @@ { "title": "CLI", "description": "CLI Documentation", - "icon": "Building2", + "icon": "SquareTerminal", "root": true, "pages": [ "---Get Started---", diff --git a/apps/docs-new/content/docs/core/meta.json b/apps/docs-new/content/docs/core/meta.json index aca81dd..c1e3ef9 100644 --- a/apps/docs-new/content/docs/core/meta.json +++ b/apps/docs-new/content/docs/core/meta.json @@ -1,7 +1,7 @@ { "title": "Core", "description": "The core of Dokploy", - "icon": "Building2", + "icon": "Package", "root": true, "pages": [ "---Introduction---", @@ -38,10 +38,16 @@ "auto-deploy", "schedule-jobs", "volume-backups", - "providers", - "watch-paths", - "---Advanced---", - "cluster", - "multi-server" - ] + "providers", + "watch-paths", + "---Remote Servers---", + "remote-servers/index", + "remote-servers/instructions", + "remote-servers/deployments", + "remote-servers/ec2-instructions", + "remote-servers/security", + "remote-servers/validate", + "---Advanced---", + "cluster" +] } diff --git a/apps/docs-new/content/docs/core/multi-server/deployments.mdx b/apps/docs-new/content/docs/core/remote-servers/deployments.mdx similarity index 89% rename from apps/docs-new/content/docs/core/multi-server/deployments.mdx rename to apps/docs-new/content/docs/core/remote-servers/deployments.mdx index 14d3fac..25fb373 100644 --- a/apps/docs-new/content/docs/core/multi-server/deployments.mdx +++ b/apps/docs-new/content/docs/core/remote-servers/deployments.mdx @@ -6,7 +6,7 @@ description: "Configure and set up your remote server deployment" import { ImageZoom } from "fumadocs-ui/components/image-zoom"; import { Callout } from "fumadocs-ui/components/callout"; -To get started with multi-server, you'll need to configure the initial setup for your remote server. +To get started with remote servers, you'll need to configure the initial setup for your remote server. ## Server Setup @@ -22,7 +22,7 @@ The server setup process prepares the necessary environment for securely and eff @@ -36,7 +36,7 @@ Example of the server setup logs: \ No newline at end of file diff --git a/apps/docs-new/content/docs/core/multi-server/ec2-instructions.mdx b/apps/docs-new/content/docs/core/remote-servers/ec2-instructions.mdx similarity index 96% rename from apps/docs-new/content/docs/core/multi-server/ec2-instructions.mdx rename to apps/docs-new/content/docs/core/remote-servers/ec2-instructions.mdx index e2ee2a6..8b5278e 100644 --- a/apps/docs-new/content/docs/core/multi-server/ec2-instructions.mdx +++ b/apps/docs-new/content/docs/core/remote-servers/ec2-instructions.mdx @@ -1,6 +1,6 @@ --- title: EC2 Instructions -description: "Instructions for setting up a multi-server on EC2" +description: "Instructions for setting up a remote server on EC2" --- When using EC2 instances, by default you don't have root access, and Dokploy needs root access to install the necessary packages without restrictions. diff --git a/apps/docs-new/content/docs/core/multi-server/index.mdx b/apps/docs-new/content/docs/core/remote-servers/index.mdx similarity index 64% rename from apps/docs-new/content/docs/core/multi-server/index.mdx rename to apps/docs-new/content/docs/core/remote-servers/index.mdx index 084abea..250e337 100644 --- a/apps/docs-new/content/docs/core/multi-server/index.mdx +++ b/apps/docs-new/content/docs/core/remote-servers/index.mdx @@ -1,17 +1,17 @@ --- -title: Multi Server +title: Remote Servers description: "Deploy your apps to multiple servers remotely." --- import { Callout } from "fumadocs-ui/components/callout"; -Multi server allows you to deploy your apps remotely to different servers without needing to build and run them where the Dokploy UI is installed. +Remote servers allows you to deploy your apps remotely to different servers without needing to build and run them where the Dokploy UI is installed. -To use the multi-server feature, you need to have Dokploy UI installed either locally or on a remote server. We recommend using a remote server for better connectivity, security, and isolation, for remote instances we install only a traefik instance. +To use the remote servers feature, you need to have Dokploy UI installed either locally or on a remote server. We recommend using a remote server for better connectivity, security, and isolation, for remote instances we install only a traefik instance. If you plan to only deploy apps to remote servers and use Dokploy UI for managing deployments, Dokploy will use around 250 MB of RAM and minimal CPU, so a low-resource server should be sufficient. -All the features we have documented previously are supported by Dokploy Multi Server. The only feature not supported is remote server monitoring, due to performance reasons. However, all functionalities should work the same as when deploying on the same server where Dokploy UI is installed. +All the features we have documented previously are supported by Dokploy Remote Servers. The only feature not supported is remote server monitoring, due to performance reasons. However, all functionalities should work the same as when deploying on the same server where Dokploy UI is installed. ## Features diff --git a/apps/docs-new/content/docs/core/multi-server/instructions.mdx b/apps/docs-new/content/docs/core/remote-servers/instructions.mdx similarity index 96% rename from apps/docs-new/content/docs/core/multi-server/instructions.mdx rename to apps/docs-new/content/docs/core/remote-servers/instructions.mdx index f3e1152..67cfaa6 100644 --- a/apps/docs-new/content/docs/core/multi-server/instructions.mdx +++ b/apps/docs-new/content/docs/core/remote-servers/instructions.mdx @@ -5,7 +5,7 @@ description: "Example to setup a remote server and deploy application in a VPS." import { Callout } from "fumadocs-ui/components/callout"; -Multi server allows you to deploy your apps remotely to different servers without needing to build and run them where the Dokploy UI is installed. +Remote servers allows you to deploy your apps remotely to different servers without needing to build and run them where the Dokploy UI is installed. ## Requirements diff --git a/apps/docs-new/content/docs/core/multi-server/security.mdx b/apps/docs-new/content/docs/core/remote-servers/security.mdx similarity index 100% rename from apps/docs-new/content/docs/core/multi-server/security.mdx rename to apps/docs-new/content/docs/core/remote-servers/security.mdx diff --git a/apps/docs-new/content/docs/core/multi-server/validate.mdx b/apps/docs-new/content/docs/core/remote-servers/validate.mdx similarity index 100% rename from apps/docs-new/content/docs/core/multi-server/validate.mdx rename to apps/docs-new/content/docs/core/remote-servers/validate.mdx diff --git a/apps/docs-new/lib/layout.shared.tsx b/apps/docs-new/lib/layout.shared.tsx index 535608b..d3b2bce 100644 --- a/apps/docs-new/lib/layout.shared.tsx +++ b/apps/docs-new/lib/layout.shared.tsx @@ -1,22 +1,19 @@ import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; +import { Logo } from '@/components/Logo'; +import { NavLinks } from '@/components/NavLinks'; export function baseOptions(): BaseLayoutProps { return { nav: { - title: 'Dokploy', + title: ( +
+ + Dokploy +
+ ), url: 'https://dokploy.com', + children: , }, - links: [ - { - text: 'Documentation', - url: '/docs', - active: 'nested-url', - }, - { - text: 'API', - url: '/docs/api', - }, - ], githubUrl: 'https://github.com/Dokploy/dokploy', }; } diff --git a/apps/docs-new/lib/utils.ts b/apps/docs-new/lib/utils.ts new file mode 100644 index 0000000..bd0c391 --- /dev/null +++ b/apps/docs-new/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/docs-new/mdx-components.tsx b/apps/docs-new/mdx-components.tsx index a75dd1a..f71bb7f 100644 --- a/apps/docs-new/mdx-components.tsx +++ b/apps/docs-new/mdx-components.tsx @@ -9,5 +9,18 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents { ImageZoom, Callout, ...components, + p: ({ children }) => ( +

+ {children} +

+ ), + li: ({ children, id }) => ( +
  • + {children} +
  • + ), }; } diff --git a/apps/docs-new/package.json b/apps/docs-new/package.json index 066967a..38132b5 100644 --- a/apps/docs-new/package.json +++ b/apps/docs-new/package.json @@ -10,13 +10,17 @@ "postinstall": "fumadocs-mdx" }, "dependencies": { + "@radix-ui/react-dropdown-menu": "^2.1.16", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", "fumadocs-core": "16.2.3", "fumadocs-mdx": "14.1.0", "fumadocs-ui": "16.2.3", "lucide-react": "^0.552.0", "next": "16.0.1", "react": "^19.2.0", - "react-dom": "^19.2.0" + "react-dom": "^19.2.0", + "tailwind-merge": "^2.5.4" }, "devDependencies": { "@tailwindcss/postcss": "^4.1.16", @@ -26,6 +30,7 @@ "@types/react-dom": "^19.2.2", "postcss": "^8.5.6", "tailwindcss": "^4.1.16", + "tw-animate-css": "^1.4.0", "typescript": "^5.9.3" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c3fa1d..e1813f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,6 +91,15 @@ importers: apps/docs-new: dependencies: + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 fumadocs-core: specifier: 16.2.3 version: 16.2.3(@types/react@18.3.5)(lucide-react@0.552.0(react@19.2.1))(next@16.0.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(zod@4.1.13) @@ -112,6 +121,9 @@ importers: react-dom: specifier: ^19.2.0 version: 19.2.1(react@19.2.1) + tailwind-merge: + specifier: ^2.5.4 + version: 2.5.4 devDependencies: '@tailwindcss/postcss': specifier: ^4.1.16 @@ -134,6 +146,9 @@ importers: tailwindcss: specifier: ^4.1.16 version: 4.1.17 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -1748,6 +1763,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.1.0': resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} peerDependencies: @@ -1819,6 +1847,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-navigation-menu@1.2.1': resolution: {integrity: sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==} peerDependencies: @@ -4107,6 +4148,7 @@ packages: oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + deprecated: use oniguruma-to-es instead openapi-sampler@1.5.1: resolution: {integrity: sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==} @@ -4832,6 +4874,9 @@ packages: turndown@7.2.0: resolution: {integrity: sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + typescript@5.1.6: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} @@ -6327,6 +6372,21 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.5)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.5)(react@18.2.0)': dependencies: react: 18.2.0 @@ -6399,6 +6459,32 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.5)(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.5)(react@19.2.1) + aria-hidden: 1.2.4 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.2(@types/react@18.3.5)(react@19.2.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-navigation-menu@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -8116,7 +8202,7 @@ snapshots: '@fumari/json-schema-to-typescript': 1.1.1 '@radix-ui/react-select': 2.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) - class-variance-authority: 0.7.0 + class-variance-authority: 0.7.1 fast-glob: 3.3.2 fumadocs-core: 14.3.1(@types/react@18.3.5)(next@16.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fumadocs-ui: 14.3.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(next@16.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.14) @@ -8151,7 +8237,7 @@ snapshots: '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) '@radix-ui/react-tabs': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tailwindcss/typography': 0.5.15(tailwindcss@3.4.14) - class-variance-authority: 0.7.0 + class-variance-authority: 0.7.1 fumadocs-core: 14.3.1(@types/react@18.3.5)(next@16.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lucide-react: 0.455.0(react@18.3.1) next: 16.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10244,6 +10330,8 @@ snapshots: dependencies: '@mixmark-io/domino': 2.2.0 + tw-animate-css@1.4.0: {} + typescript@5.1.6: {} typescript@5.6.3: {}