From 77d79aceeba3e2abb840f15946f5dc03f3d3d5df Mon Sep 17 00:00:00 2001 From: Isa Eken Date: Fri, 28 Feb 2025 06:58:05 +0300 Subject: [PATCH] Add Slide Over component with examples and documentation Introduce a reusable Slide Over component for sliding panels, built using Radix Dialog. Added two examples: a demo for editing profiles and a close button variation. Included documentation with installation steps, usage, and live previews. --- apps/web/config/docs.ts | 5 + .../content/docs/components/slide-over.mdx | 94 ++++++++++++ apps/web/public/r/index.json | 13 ++ .../examples/slide-over-close-button.tsx | 56 +++++++ .../default/examples/slide-over-demo.tsx | 56 +++++++ apps/web/registry/default/ui/slide-over.tsx | 140 ++++++++++++++++++ apps/web/registry/registry-examples.ts | 22 +++ apps/web/registry/registry-ui.ts | 11 ++ 8 files changed, 397 insertions(+) create mode 100644 apps/web/content/docs/components/slide-over.mdx create mode 100644 apps/web/registry/default/examples/slide-over-close-button.tsx create mode 100644 apps/web/registry/default/examples/slide-over-demo.tsx create mode 100644 apps/web/registry/default/ui/slide-over.tsx diff --git a/apps/web/config/docs.ts b/apps/web/config/docs.ts index bb69db08..1415d060 100644 --- a/apps/web/config/docs.ts +++ b/apps/web/config/docs.ts @@ -200,6 +200,11 @@ export const docsConfig: DocsConfig = { href: "/docs/components/alert-dialog", items: [], }, + { + title: "Slide Over", + href: "/docs/components/slide-over", + items: [], + }, { title: "Animated List", href: "/docs/components/animated-list", diff --git a/apps/web/content/docs/components/slide-over.mdx b/apps/web/content/docs/components/slide-over.mdx new file mode 100644 index 00000000..be42ab53 --- /dev/null +++ b/apps/web/content/docs/components/slide-over.mdx @@ -0,0 +1,94 @@ +--- +title: Slide Over +description: A window overlaid on either the primary window or another dialog window, rendering the content underneath inert. +featured: true +component: true +links: + doc: https://www.radix-ui.com/docs/primitives/components/dialog + api: https://www.radix-ui.com/docs/primitives/components/dialog#api-reference +--- + + + +## Installation + + + + + CLI + Manual + + + +```bash +npx nyxb@latest add slide-over +``` + + + + + + + +Install the following dependencies: + +```bash + @radix-ui/react-dialog +``` + +Copy and paste the following code into your project. + + + +Update the import paths to match your project setup. + + + + + + + +## Usage + +```tsx +import { + SlideOver, + SlideOverContent, + SlideOverDescription, + SlideOverHeader, + SlideOverTitle, + SlideOverTrigger, +} from "~/components/ui/slide-over" +``` + +```tsx + + Open + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete your account + and remove your data from our servers. + + + + +``` + +## Examples + +### Custom close button + + diff --git a/apps/web/public/r/index.json b/apps/web/public/r/index.json index 507c5b48..296575ac 100644 --- a/apps/web/public/r/index.json +++ b/apps/web/public/r/index.json @@ -496,6 +496,19 @@ } ] }, + { + "name": "slide-over", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-dialog" + ], + "files": [ + { + "path": "ui/slide-over.tsx", + "type": "registry:ui" + } + ] + }, { "name": "dock", "type": "registry:ui", diff --git a/apps/web/registry/default/examples/slide-over-close-button.tsx b/apps/web/registry/default/examples/slide-over-close-button.tsx new file mode 100644 index 00000000..d72cafab --- /dev/null +++ b/apps/web/registry/default/examples/slide-over-close-button.tsx @@ -0,0 +1,56 @@ +import { Copy } from "lucide-react" + +import { Button } from "~/registry/default/ui/button" +import { + SlideOver, + SlideOverClose, + SlideOverContent, + SlideOverDescription, + SlideOverFooter, + SlideOverHeader, + SlideOverTitle, + SlideOverTrigger, +} from "~/registry/default/ui/slide-over" +import { Input } from "~/registry/default/ui/input" +import { Label } from "~/registry/default/ui/label" + +export default function SlideOverCloseButton() { + return ( + + + + + + + Share link + + Anyone who has this link will be able to view this. + + +
+
+ + +
+ +
+ + + + + +
+
+ ) +} diff --git a/apps/web/registry/default/examples/slide-over-demo.tsx b/apps/web/registry/default/examples/slide-over-demo.tsx new file mode 100644 index 00000000..426d7f7e --- /dev/null +++ b/apps/web/registry/default/examples/slide-over-demo.tsx @@ -0,0 +1,56 @@ +import { Button } from "~/registry/default/ui/button" +import { + SlideOver, + SlideOverContent, + SlideOverDescription, + SlideOverFooter, + SlideOverHeader, + SlideOverTitle, + SlideOverTrigger, +} from "~/registry/default/ui/slide-over" +import { Input } from "~/registry/default/ui/input" +import { Label } from "~/registry/default/ui/label" + +export default function SlideOverDemo() { + return ( + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're + done. + + +
+
+ + +
+
+ + +
+
+ + + +
+
+ ) +} diff --git a/apps/web/registry/default/ui/slide-over.tsx b/apps/web/registry/default/ui/slide-over.tsx new file mode 100644 index 00000000..68d3bc37 --- /dev/null +++ b/apps/web/registry/default/ui/slide-over.tsx @@ -0,0 +1,140 @@ +import {ComponentPropsWithoutRef, forwardRef, HTMLAttributes} from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import {X} from "lucide-react"; +import * as React from "react"; +import {ny} from "~/lib/utils"; + +const SlideOver = DialogPrimitive.Root; + +const SlideOverTrigger = DialogPrimitive.Trigger; + +const SlideOverPortal = DialogPrimitive.Portal; + +const SlideOverOverlay = forwardRef< + HTMLDivElement, + ComponentPropsWithoutRef +>(({className, ...props}, ref) => ( + +)); +SlideOverOverlay.displayName = 'SlideOverOverlay'; + +const SlideOverContent = forwardRef< + HTMLDivElement, + ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + +
+ {children} +
+
+
+)); +SlideOverContent.displayName = 'SlideOverContent'; + +const SlideOverClose = forwardRef< + HTMLButtonElement, + ComponentPropsWithoutRef +>(({className, ...props}, ref) => ( + + + Close + +)); +SlideOverClose.displayName = 'SlideOverClose'; + +function SlideOverHeader({ + className, + ...props +}: HTMLAttributes) { + return ( +
+ ); +} +SlideOverHeader.displayName = 'SlideOverHeader'; + +function SlideOverFooter({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
+ ) +} +SlideOverFooter.displayName = 'SlideOverFooter'; + +const SlideOverTitle = forwardRef< + HTMLHeadingElement, + ComponentPropsWithoutRef +>(({className, ...props}, ref) => ( + +)); +SlideOverTitle.displayName = 'SlideOverTitle'; + +const SlideOverDescription = forwardRef< + HTMLParagraphElement, + ComponentPropsWithoutRef +>(({className, ...props}, ref) => ( + +)); +SlideOverDescription.displayName = 'SlideOverDescription'; + +export { + SlideOver, + SlideOverTrigger, + SlideOverPortal, + SlideOverClose, + SlideOverOverlay, + SlideOverContent, + SlideOverHeader, + SlideOverFooter, + SlideOverTitle, + SlideOverDescription, +} diff --git a/apps/web/registry/registry-examples.ts b/apps/web/registry/registry-examples.ts index fbaba24d..6b97c469 100644 --- a/apps/web/registry/registry-examples.ts +++ b/apps/web/registry/registry-examples.ts @@ -653,6 +653,28 @@ export const examples: Registry["items"] = [ }, ], }, + { + name: "slide-over-demo", + type: "registry:example", + registryDependencies: ["dialog"], + files: [ + { + path: "examples/slide-over-demo.tsx", + type: "registry:example", + }, + ], + }, + { + name: "slide-over-close-button", + type: "registry:example", + registryDependencies: ["dialog", "button"], + files: [ + { + path: "examples/slide-over-close-button.tsx", + type: "registry:example", + }, + ], + }, { name: "drawer-demo", type: "registry:example", diff --git a/apps/web/registry/registry-ui.ts b/apps/web/registry/registry-ui.ts index efeba6cc..7d6b502a 100644 --- a/apps/web/registry/registry-ui.ts +++ b/apps/web/registry/registry-ui.ts @@ -434,6 +434,17 @@ export const ui: Registry["items"] = [ }, ], }, + { + name: "slide-over", + type: "registry:ui", + dependencies: ["@radix-ui/react-dialog"], + files: [ + { + path: "ui/slide-over.tsx", + type: "registry:ui", + }, + ], + }, { name: "dock", type: "registry:ui",