mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-08-06 15:56:23 +00:00
Move Monitor dashboard UI copy into translation keys and expand the English source catalog across the main pages, modals, and shared AppImage components.
115 lines
4.2 KiB
TypeScript
115 lines
4.2 KiB
TypeScript
"use client"
|
|
|
|
import * as React from "react"
|
|
import * as DialogPrimitive from "@radix-ui/react-dialog"
|
|
import { cva, type VariantProps } from "class-variance-authority"
|
|
import { X } from "lucide-react"
|
|
|
|
import { useT } from "@/lib/i18n/provider"
|
|
import { cn } from "@/lib/utils"
|
|
|
|
const Sheet = DialogPrimitive.Root
|
|
|
|
const SheetTrigger = DialogPrimitive.Trigger
|
|
|
|
const SheetClose = DialogPrimitive.Close
|
|
|
|
const SheetPortal = DialogPrimitive.Portal
|
|
|
|
const SheetOverlay = React.forwardRef<
|
|
React.ElementRef<typeof DialogPrimitive.Overlay>,
|
|
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
|
|
>(({ className, ...props }, ref) => (
|
|
<DialogPrimitive.Overlay
|
|
className={cn(
|
|
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
className,
|
|
)}
|
|
{...props}
|
|
ref={ref}
|
|
/>
|
|
))
|
|
SheetOverlay.displayName = DialogPrimitive.Overlay.displayName
|
|
|
|
const sheetVariants = cva(
|
|
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
|
|
{
|
|
variants: {
|
|
side: {
|
|
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
bottom:
|
|
"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
right:
|
|
"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
|
|
},
|
|
},
|
|
defaultVariants: {
|
|
side: "right",
|
|
},
|
|
},
|
|
)
|
|
|
|
interface SheetContentProps
|
|
extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>,
|
|
VariantProps<typeof sheetVariants> {}
|
|
|
|
const SheetContent = React.forwardRef<React.ElementRef<typeof DialogPrimitive.Content>, SheetContentProps>(
|
|
({ side = "right", className, children, ...props }, ref) => {
|
|
const t = useT()
|
|
|
|
return (
|
|
<SheetPortal>
|
|
<SheetOverlay />
|
|
<DialogPrimitive.Content ref={ref} className={cn(sheetVariants({ side }), className)} {...props}>
|
|
{children}
|
|
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
|
|
<X className="h-4 w-4" />
|
|
<span className="sr-only">{t("actions.close")}</span>
|
|
</DialogPrimitive.Close>
|
|
</DialogPrimitive.Content>
|
|
</SheetPortal>
|
|
)
|
|
},
|
|
)
|
|
SheetContent.displayName = DialogPrimitive.Content.displayName
|
|
|
|
const SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
|
|
<div className={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...props} />
|
|
)
|
|
SheetHeader.displayName = "SheetHeader"
|
|
|
|
const SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
|
|
<div className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)} {...props} />
|
|
)
|
|
SheetFooter.displayName = "SheetFooter"
|
|
|
|
const SheetTitle = React.forwardRef<
|
|
React.ElementRef<typeof DialogPrimitive.Title>,
|
|
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
|
|
>(({ className, ...props }, ref) => (
|
|
<DialogPrimitive.Title ref={ref} className={cn("text-lg font-semibold text-foreground", className)} {...props} />
|
|
))
|
|
SheetTitle.displayName = DialogPrimitive.Title.displayName
|
|
|
|
const SheetDescription = React.forwardRef<
|
|
React.ElementRef<typeof DialogPrimitive.Description>,
|
|
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
|
|
>(({ className, ...props }, ref) => (
|
|
<DialogPrimitive.Description ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
|
|
))
|
|
SheetDescription.displayName = DialogPrimitive.Description.displayName
|
|
|
|
export {
|
|
Sheet,
|
|
SheetPortal,
|
|
SheetOverlay,
|
|
SheetTrigger,
|
|
SheetClose,
|
|
SheetContent,
|
|
SheetHeader,
|
|
SheetFooter,
|
|
SheetTitle,
|
|
SheetDescription,
|
|
}
|