1399 lines
40 KiB
JavaScript
1399 lines
40 KiB
JavaScript
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
import * as React from "react";
|
|
import { useState, useEffect, useCallback, Fragment as Fragment$1 } from "react";
|
|
import { Slot } from "@radix-ui/react-slot";
|
|
import { cva } from "class-variance-authority";
|
|
import { PanelLeftIcon, Settings, LogOut, ChevronsUpDown, LayoutGrid, GalleryHorizontal, Package, TableOfContents, ChevronRight } from "lucide-react";
|
|
import { c as cn, B as Button, q as queryParams, b as logout } from "./index-CY6fYws-.js";
|
|
import { S as Sheet, e as SheetHeader, c as SheetTitle, d as SheetDescription, b as SheetContent } from "./sheet-Bq2cyJmx.js";
|
|
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
import { usePage, Link, router } from "@inertiajs/react";
|
|
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
import { A as AppLogoIcon } from "./app-logo-icon-kpljnLMz.js";
|
|
const MOBILE_BREAKPOINT = 768;
|
|
function useIsMobile() {
|
|
const [isMobile, setIsMobile] = useState();
|
|
useEffect(() => {
|
|
const mql = window.matchMedia(
|
|
`(max-width: ${MOBILE_BREAKPOINT - 1}px)`
|
|
);
|
|
const onChange = () => {
|
|
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
};
|
|
mql.addEventListener("change", onChange);
|
|
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
return () => mql.removeEventListener("change", onChange);
|
|
}, []);
|
|
return !!isMobile;
|
|
}
|
|
function TooltipProvider({
|
|
delayDuration = 0,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
TooltipPrimitive.Provider,
|
|
{
|
|
"data-slot": "tooltip-provider",
|
|
delayDuration,
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function Tooltip({
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }) });
|
|
}
|
|
function TooltipTrigger({
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
|
|
}
|
|
function TooltipContent({
|
|
className,
|
|
sideOffset = 4,
|
|
children,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
|
|
TooltipPrimitive.Content,
|
|
{
|
|
"data-slot": "tooltip-content",
|
|
sideOffset,
|
|
className: cn(
|
|
"bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-w-sm rounded-md px-3 py-1.5 text-xs",
|
|
className
|
|
),
|
|
...props,
|
|
children: [
|
|
children,
|
|
/* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: "bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })
|
|
]
|
|
}
|
|
) });
|
|
}
|
|
const SIDEBAR_COOKIE_NAME = "sidebar_state";
|
|
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
|
|
const SIDEBAR_WIDTH = "16rem";
|
|
const SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
const SIDEBAR_WIDTH_ICON = "3rem";
|
|
const SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
const SidebarContext = React.createContext(null);
|
|
function useSidebar() {
|
|
const context = React.useContext(SidebarContext);
|
|
if (!context) {
|
|
throw new Error("useSidebar must be used within a SidebarProvider.");
|
|
}
|
|
return context;
|
|
}
|
|
function SidebarProvider({
|
|
defaultOpen = true,
|
|
open: openProp,
|
|
onOpenChange: setOpenProp,
|
|
className,
|
|
style,
|
|
children,
|
|
...props
|
|
}) {
|
|
const isMobile = useIsMobile();
|
|
const [openMobile, setOpenMobile] = React.useState(false);
|
|
const [_open, _setOpen] = React.useState(defaultOpen);
|
|
const open = openProp ?? _open;
|
|
const setOpen = React.useCallback(
|
|
(value) => {
|
|
const openState = typeof value === "function" ? value(open) : value;
|
|
if (setOpenProp) {
|
|
setOpenProp(openState);
|
|
} else {
|
|
_setOpen(openState);
|
|
}
|
|
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
|
|
},
|
|
[setOpenProp, open]
|
|
);
|
|
const toggleSidebar = React.useCallback(() => {
|
|
return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
|
|
}, [isMobile, setOpen, setOpenMobile]);
|
|
React.useEffect(() => {
|
|
const handleKeyDown = (event) => {
|
|
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
|
|
event.preventDefault();
|
|
toggleSidebar();
|
|
}
|
|
};
|
|
window.addEventListener("keydown", handleKeyDown);
|
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
}, [toggleSidebar]);
|
|
const state = open ? "expanded" : "collapsed";
|
|
const contextValue = React.useMemo(
|
|
() => ({
|
|
state,
|
|
open,
|
|
setOpen,
|
|
isMobile,
|
|
openMobile,
|
|
setOpenMobile,
|
|
toggleSidebar
|
|
}),
|
|
[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
|
|
);
|
|
return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
"data-slot": "sidebar-wrapper",
|
|
style: {
|
|
"--sidebar-width": SIDEBAR_WIDTH,
|
|
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
|
|
...style
|
|
},
|
|
className: cn(
|
|
"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full",
|
|
className
|
|
),
|
|
...props,
|
|
children
|
|
}
|
|
) }) });
|
|
}
|
|
function Sidebar({
|
|
side = "left",
|
|
variant = "sidebar",
|
|
collapsible = "offcanvas",
|
|
className,
|
|
children,
|
|
...props
|
|
}) {
|
|
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
|
|
if (collapsible === "none") {
|
|
return /* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
"data-slot": "sidebar",
|
|
className: cn(
|
|
"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col",
|
|
className
|
|
),
|
|
...props,
|
|
children
|
|
}
|
|
);
|
|
}
|
|
if (isMobile) {
|
|
return /* @__PURE__ */ jsxs(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: [
|
|
/* @__PURE__ */ jsxs(SheetHeader, { className: "sr-only", children: [
|
|
/* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }),
|
|
/* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })
|
|
] }),
|
|
/* @__PURE__ */ jsx(
|
|
SheetContent,
|
|
{
|
|
"data-sidebar": "sidebar",
|
|
"data-slot": "sidebar",
|
|
"data-mobile": "true",
|
|
className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",
|
|
style: {
|
|
"--sidebar-width": SIDEBAR_WIDTH_MOBILE
|
|
},
|
|
side,
|
|
children: /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children })
|
|
}
|
|
)
|
|
] });
|
|
}
|
|
return /* @__PURE__ */ jsxs(
|
|
"div",
|
|
{
|
|
className: "group peer text-sidebar-foreground hidden md:block",
|
|
"data-state": state,
|
|
"data-collapsible": state === "collapsed" ? collapsible : "",
|
|
"data-variant": variant,
|
|
"data-side": side,
|
|
"data-slot": "sidebar",
|
|
children: [
|
|
/* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
className: cn(
|
|
"relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
|
|
"group-data-[collapsible=offcanvas]:w-0",
|
|
"group-data-[side=right]:rotate-180",
|
|
variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
|
|
)
|
|
}
|
|
),
|
|
/* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
className: cn(
|
|
"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
|
|
side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
|
|
// Adjust the padding for floating and inset variants.
|
|
variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
className
|
|
),
|
|
...props,
|
|
children: /* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
"data-sidebar": "sidebar",
|
|
className: "bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm",
|
|
children
|
|
}
|
|
)
|
|
}
|
|
)
|
|
]
|
|
}
|
|
);
|
|
}
|
|
function SidebarTrigger({
|
|
className,
|
|
onClick,
|
|
...props
|
|
}) {
|
|
const { toggleSidebar } = useSidebar();
|
|
return /* @__PURE__ */ jsxs(
|
|
Button,
|
|
{
|
|
"data-sidebar": "trigger",
|
|
"data-slot": "sidebar-trigger",
|
|
variant: "ghost",
|
|
size: "icon",
|
|
className: cn("h-7 w-7", className),
|
|
onClick: (event) => {
|
|
onClick?.(event);
|
|
toggleSidebar();
|
|
},
|
|
...props,
|
|
children: [
|
|
/* @__PURE__ */ jsx(PanelLeftIcon, {}),
|
|
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
|
|
]
|
|
}
|
|
);
|
|
}
|
|
function SidebarInset({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"main",
|
|
{
|
|
"data-slot": "sidebar-inset",
|
|
className: cn(
|
|
"bg-background relative flex max-w-full min-h-svh flex-1 flex-col",
|
|
"peer-data-[variant=inset]:min-h-[calc(100svh-(--spacing(4)))] md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-0",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function SidebarHeader({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
"data-slot": "sidebar-header",
|
|
"data-sidebar": "header",
|
|
className: cn("flex flex-col gap-2 p-2", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function SidebarFooter({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
"data-slot": "sidebar-footer",
|
|
"data-sidebar": "footer",
|
|
className: cn("flex flex-col gap-2 p-2", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function SidebarContent({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
"data-slot": "sidebar-content",
|
|
"data-sidebar": "content",
|
|
className: cn(
|
|
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function SidebarGroup({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"div",
|
|
{
|
|
"data-slot": "sidebar-group",
|
|
"data-sidebar": "group",
|
|
className: cn("relative flex w-full min-w-0 flex-col p-2", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function SidebarGroupLabel({
|
|
className,
|
|
asChild = false,
|
|
...props
|
|
}) {
|
|
const Comp = asChild ? Slot : "div";
|
|
return /* @__PURE__ */ jsx(
|
|
Comp,
|
|
{
|
|
"data-slot": "sidebar-group-label",
|
|
"data-sidebar": "group-label",
|
|
className: cn(
|
|
"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 group-data-[collapsible=icon]:select-none group-data-[collapsible=icon]:pointer-events-none",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function SidebarMenu({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"ul",
|
|
{
|
|
"data-slot": "sidebar-menu",
|
|
"data-sidebar": "menu",
|
|
className: cn("flex w-full min-w-0 flex-col gap-1", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function SidebarMenuItem({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"li",
|
|
{
|
|
"data-slot": "sidebar-menu-item",
|
|
"data-sidebar": "menu-item",
|
|
className: cn("group/menu-item relative", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
const sidebarMenuButtonVariants = cva(
|
|
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
|
{
|
|
variants: {
|
|
variant: {
|
|
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
outline: "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"
|
|
},
|
|
size: {
|
|
default: "h-8 text-sm",
|
|
sm: "h-7 text-xs",
|
|
lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!"
|
|
}
|
|
},
|
|
defaultVariants: {
|
|
variant: "default",
|
|
size: "default"
|
|
}
|
|
}
|
|
);
|
|
function SidebarMenuButton({
|
|
asChild = false,
|
|
isActive = false,
|
|
variant = "default",
|
|
size = "default",
|
|
tooltip,
|
|
className,
|
|
...props
|
|
}) {
|
|
const Comp = asChild ? Slot : "button";
|
|
const { isMobile, state } = useSidebar();
|
|
const button = /* @__PURE__ */ jsx(
|
|
Comp,
|
|
{
|
|
"data-slot": "sidebar-menu-button",
|
|
"data-sidebar": "menu-button",
|
|
"data-size": size,
|
|
"data-active": isActive,
|
|
className: cn(sidebarMenuButtonVariants({ variant, size }), className),
|
|
...props
|
|
}
|
|
);
|
|
if (!tooltip) {
|
|
return button;
|
|
}
|
|
if (typeof tooltip === "string") {
|
|
tooltip = {
|
|
children: tooltip
|
|
};
|
|
}
|
|
return /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
|
|
/* @__PURE__ */ jsx(
|
|
TooltipContent,
|
|
{
|
|
side: "right",
|
|
align: "center",
|
|
hidden: state !== "collapsed" || isMobile,
|
|
...tooltip
|
|
}
|
|
)
|
|
] });
|
|
}
|
|
function AppContent({
|
|
variant = "header",
|
|
children,
|
|
...props
|
|
}) {
|
|
if (variant === "sidebar") {
|
|
return /* @__PURE__ */ jsx(SidebarInset, { ...props, children });
|
|
}
|
|
return /* @__PURE__ */ jsx(
|
|
"main",
|
|
{
|
|
className: "mx-auto flex h-full w-full max-w-7xl flex-1 flex-col gap-4 rounded-xl",
|
|
...props,
|
|
children
|
|
}
|
|
);
|
|
}
|
|
function AppShell({ children, variant = "header" }) {
|
|
const isOpen = usePage().props.sidebarOpen;
|
|
if (variant === "header") {
|
|
return /* @__PURE__ */ jsx("div", { className: "flex min-h-screen w-full flex-col", children });
|
|
}
|
|
return /* @__PURE__ */ jsx(SidebarProvider, { defaultOpen: isOpen, children });
|
|
}
|
|
function NavMain({ items = [] }) {
|
|
const page = usePage();
|
|
return /* @__PURE__ */ jsxs(SidebarGroup, { className: "px-2 py-0", children: [
|
|
/* @__PURE__ */ jsx(SidebarGroupLabel, { children: "Platform" }),
|
|
/* @__PURE__ */ jsx(SidebarMenu, { children: items.map((item) => /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(
|
|
SidebarMenuButton,
|
|
{
|
|
asChild: true,
|
|
isActive: page.url.startsWith(
|
|
typeof item.href === "string" ? item.href : item.href.url
|
|
),
|
|
tooltip: { children: item.title },
|
|
children: /* @__PURE__ */ jsxs(Link, { href: item.href, prefetch: true, children: [
|
|
item.icon && /* @__PURE__ */ jsx(item.icon, {}),
|
|
/* @__PURE__ */ jsx("span", { children: item.title })
|
|
] })
|
|
}
|
|
) }, item.title)) })
|
|
] });
|
|
}
|
|
function DropdownMenu({
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
|
|
}
|
|
function DropdownMenuTrigger({
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
DropdownMenuPrimitive.Trigger,
|
|
{
|
|
"data-slot": "dropdown-menu-trigger",
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function DropdownMenuContent({
|
|
className,
|
|
sideOffset = 4,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
DropdownMenuPrimitive.Content,
|
|
{
|
|
"data-slot": "dropdown-menu-content",
|
|
sideOffset,
|
|
className: cn(
|
|
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
) });
|
|
}
|
|
function DropdownMenuGroup({
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
|
|
}
|
|
function DropdownMenuItem({
|
|
className,
|
|
inset,
|
|
variant = "default",
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
DropdownMenuPrimitive.Item,
|
|
{
|
|
"data-slot": "dropdown-menu-item",
|
|
"data-inset": inset,
|
|
"data-variant": variant,
|
|
className: cn(
|
|
"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/40 data-[variant=destructive]:focus:text-destructive-foreground data-[variant=destructive]:*:[svg]:!text-destructive-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function DropdownMenuLabel({
|
|
className,
|
|
inset,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
DropdownMenuPrimitive.Label,
|
|
{
|
|
"data-slot": "dropdown-menu-label",
|
|
"data-inset": inset,
|
|
className: cn(
|
|
"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function DropdownMenuSeparator({
|
|
className,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
DropdownMenuPrimitive.Separator,
|
|
{
|
|
"data-slot": "dropdown-menu-separator",
|
|
className: cn("bg-border -mx-1 my-1 h-px", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function Avatar({
|
|
className,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
AvatarPrimitive.Root,
|
|
{
|
|
"data-slot": "avatar",
|
|
className: cn(
|
|
"relative flex size-8 shrink-0 overflow-hidden rounded-full",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function AvatarImage({
|
|
className,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
AvatarPrimitive.Image,
|
|
{
|
|
"data-slot": "avatar-image",
|
|
className: cn("aspect-square size-full", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function AvatarFallback({
|
|
className,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
AvatarPrimitive.Fallback,
|
|
{
|
|
"data-slot": "avatar-fallback",
|
|
className: cn(
|
|
"bg-muted flex size-full items-center justify-center rounded-full",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function useInitials() {
|
|
return useCallback((fullName) => {
|
|
const names = fullName.trim().split(" ");
|
|
if (names.length === 0) return "";
|
|
if (names.length === 1) return names[0].charAt(0).toUpperCase();
|
|
const firstInitial = names[0].charAt(0);
|
|
const lastInitial = names[names.length - 1].charAt(0);
|
|
return `${firstInitial}${lastInitial}`.toUpperCase();
|
|
}, []);
|
|
}
|
|
function UserInfo({
|
|
user,
|
|
showEmail = false
|
|
}) {
|
|
const getInitials = useInitials();
|
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
/* @__PURE__ */ jsxs(Avatar, { className: "h-8 w-8 overflow-hidden rounded-full", children: [
|
|
/* @__PURE__ */ jsx(AvatarImage, { src: user.avatar, alt: user.name }),
|
|
/* @__PURE__ */ jsx(AvatarFallback, { className: "rounded-lg bg-neutral-200 text-black dark:bg-neutral-700 dark:text-white", children: getInitials(user.name) })
|
|
] }),
|
|
/* @__PURE__ */ jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [
|
|
/* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: user.name }),
|
|
showEmail && /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-muted-foreground", children: user.email })
|
|
] })
|
|
] });
|
|
}
|
|
function useMobileNavigation() {
|
|
return useCallback(() => {
|
|
document.body.style.removeProperty("pointer-events");
|
|
}, []);
|
|
}
|
|
const edit = (options) => ({
|
|
url: edit.url(options),
|
|
method: "get"
|
|
});
|
|
edit.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/settings/profile"
|
|
};
|
|
edit.url = (options) => {
|
|
return edit.definition.url + queryParams(options);
|
|
};
|
|
edit.get = (options) => ({
|
|
url: edit.url(options),
|
|
method: "get"
|
|
});
|
|
edit.head = (options) => ({
|
|
url: edit.url(options),
|
|
method: "head"
|
|
});
|
|
const editForm = (options) => ({
|
|
action: edit.url(options),
|
|
method: "get"
|
|
});
|
|
editForm.get = (options) => ({
|
|
action: edit.url(options),
|
|
method: "get"
|
|
});
|
|
editForm.head = (options) => ({
|
|
action: edit.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
edit.form = editForm;
|
|
const update = (options) => ({
|
|
url: update.url(options),
|
|
method: "patch"
|
|
});
|
|
update.definition = {
|
|
methods: ["patch"],
|
|
url: "/settings/profile"
|
|
};
|
|
update.url = (options) => {
|
|
return update.definition.url + queryParams(options);
|
|
};
|
|
update.patch = (options) => ({
|
|
url: update.url(options),
|
|
method: "patch"
|
|
});
|
|
const updateForm = (options) => ({
|
|
action: update.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "PATCH",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "post"
|
|
});
|
|
updateForm.patch = (options) => ({
|
|
action: update.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "PATCH",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "post"
|
|
});
|
|
update.form = updateForm;
|
|
const destroy = (options) => ({
|
|
url: destroy.url(options),
|
|
method: "delete"
|
|
});
|
|
destroy.definition = {
|
|
methods: ["delete"],
|
|
url: "/settings/profile"
|
|
};
|
|
destroy.url = (options) => {
|
|
return destroy.definition.url + queryParams(options);
|
|
};
|
|
destroy.delete = (options) => ({
|
|
url: destroy.url(options),
|
|
method: "delete"
|
|
});
|
|
const destroyForm = (options) => ({
|
|
action: destroy.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "DELETE",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "post"
|
|
});
|
|
destroyForm.delete = (options) => ({
|
|
action: destroy.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "DELETE",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "post"
|
|
});
|
|
destroy.form = destroyForm;
|
|
({
|
|
edit: Object.assign(edit, edit),
|
|
update: Object.assign(update, update),
|
|
destroy: Object.assign(destroy, destroy)
|
|
});
|
|
function UserMenuContent({ user }) {
|
|
const cleanup = useMobileNavigation();
|
|
const handleLogout = () => {
|
|
cleanup();
|
|
router.flushAll();
|
|
};
|
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
/* @__PURE__ */ jsx(DropdownMenuLabel, { className: "p-0 font-normal", children: /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 px-1 py-1.5 text-left text-sm", children: /* @__PURE__ */ jsx(UserInfo, { user, showEmail: true }) }) }),
|
|
/* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
|
|
/* @__PURE__ */ jsx(DropdownMenuGroup, { children: /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
Link,
|
|
{
|
|
className: "block w-full",
|
|
href: edit(),
|
|
as: "button",
|
|
prefetch: true,
|
|
onClick: cleanup,
|
|
children: [
|
|
/* @__PURE__ */ jsx(Settings, { className: "mr-2" }),
|
|
"Settings"
|
|
]
|
|
}
|
|
) }) }),
|
|
/* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
|
|
/* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
Link,
|
|
{
|
|
className: "block w-full",
|
|
href: logout(),
|
|
as: "button",
|
|
onClick: handleLogout,
|
|
"data-test": "logout-button",
|
|
children: [
|
|
/* @__PURE__ */ jsx(LogOut, { className: "mr-2" }),
|
|
"Log out"
|
|
]
|
|
}
|
|
) })
|
|
] });
|
|
}
|
|
function NavUser() {
|
|
const { auth } = usePage().props;
|
|
const { state } = useSidebar();
|
|
const isMobile = useIsMobile();
|
|
return /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
SidebarMenuButton,
|
|
{
|
|
size: "lg",
|
|
className: "group text-sidebar-accent-foreground data-[state=open]:bg-sidebar-accent",
|
|
children: [
|
|
/* @__PURE__ */ jsx(UserInfo, { user: auth.user }),
|
|
/* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-auto size-4" })
|
|
]
|
|
}
|
|
) }),
|
|
/* @__PURE__ */ jsx(
|
|
DropdownMenuContent,
|
|
{
|
|
className: "w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg",
|
|
align: "end",
|
|
side: isMobile ? "bottom" : state === "collapsed" ? "left" : "bottom",
|
|
children: /* @__PURE__ */ jsx(UserMenuContent, { user: auth.user })
|
|
}
|
|
)
|
|
] }) }) });
|
|
}
|
|
const show = (options) => ({
|
|
url: show.url(options),
|
|
method: "get"
|
|
});
|
|
show.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/faq/show"
|
|
};
|
|
show.url = (options) => {
|
|
return show.definition.url + queryParams(options);
|
|
};
|
|
show.get = (options) => ({
|
|
url: show.url(options),
|
|
method: "get"
|
|
});
|
|
show.head = (options) => ({
|
|
url: show.url(options),
|
|
method: "head"
|
|
});
|
|
const showForm = (options) => ({
|
|
action: show.url(options),
|
|
method: "get"
|
|
});
|
|
showForm.get = (options) => ({
|
|
action: show.url(options),
|
|
method: "get"
|
|
});
|
|
showForm.head = (options) => ({
|
|
action: show.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
show.form = showForm;
|
|
const add$3 = (options) => ({
|
|
url: add$3.url(options),
|
|
method: "get"
|
|
});
|
|
add$3.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/faq/add"
|
|
};
|
|
add$3.url = (options) => {
|
|
return add$3.definition.url + queryParams(options);
|
|
};
|
|
add$3.get = (options) => ({
|
|
url: add$3.url(options),
|
|
method: "get"
|
|
});
|
|
add$3.head = (options) => ({
|
|
url: add$3.url(options),
|
|
method: "head"
|
|
});
|
|
const addForm$2 = (options) => ({
|
|
action: add$3.url(options),
|
|
method: "get"
|
|
});
|
|
addForm$2.get = (options) => ({
|
|
action: add$3.url(options),
|
|
method: "get"
|
|
});
|
|
addForm$2.head = (options) => ({
|
|
action: add$3.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
add$3.form = addForm$2;
|
|
const addFaq = (options) => ({
|
|
url: addFaq.url(options),
|
|
method: "post"
|
|
});
|
|
addFaq.definition = {
|
|
methods: ["post"],
|
|
url: "/faq/add"
|
|
};
|
|
addFaq.url = (options) => {
|
|
return addFaq.definition.url + queryParams(options);
|
|
};
|
|
addFaq.post = (options) => ({
|
|
url: addFaq.url(options),
|
|
method: "post"
|
|
});
|
|
const addFaqForm = (options) => ({
|
|
action: addFaq.url(options),
|
|
method: "post"
|
|
});
|
|
addFaqForm.post = (options) => ({
|
|
action: addFaq.url(options),
|
|
method: "post"
|
|
});
|
|
addFaq.form = addFaqForm;
|
|
const faq = {
|
|
show: Object.assign(show, show),
|
|
add: Object.assign(add$3, add$3),
|
|
addFaq: Object.assign(addFaq, addFaq)
|
|
};
|
|
const post = (options) => ({
|
|
url: post.url(options),
|
|
method: "post"
|
|
});
|
|
post.definition = {
|
|
methods: ["post"],
|
|
url: "/product/add"
|
|
};
|
|
post.url = (options) => {
|
|
return post.definition.url + queryParams(options);
|
|
};
|
|
post.post = (options) => ({
|
|
url: post.url(options),
|
|
method: "post"
|
|
});
|
|
const postForm = (options) => ({
|
|
action: post.url(options),
|
|
method: "post"
|
|
});
|
|
postForm.post = (options) => ({
|
|
action: post.url(options),
|
|
method: "post"
|
|
});
|
|
post.form = postForm;
|
|
const add$2 = {
|
|
post: Object.assign(post, post)
|
|
};
|
|
const index$3 = (options) => ({
|
|
url: index$3.url(options),
|
|
method: "get"
|
|
});
|
|
index$3.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/product/dashboard"
|
|
};
|
|
index$3.url = (options) => {
|
|
return index$3.definition.url + queryParams(options);
|
|
};
|
|
index$3.get = (options) => ({
|
|
url: index$3.url(options),
|
|
method: "get"
|
|
});
|
|
index$3.head = (options) => ({
|
|
url: index$3.url(options),
|
|
method: "head"
|
|
});
|
|
const indexForm$3 = (options) => ({
|
|
action: index$3.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm$3.get = (options) => ({
|
|
action: index$3.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm$3.head = (options) => ({
|
|
action: index$3.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
index$3.form = indexForm$3;
|
|
const add$1 = (options) => ({
|
|
url: add$1.url(options),
|
|
method: "get"
|
|
});
|
|
add$1.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/product/add"
|
|
};
|
|
add$1.url = (options) => {
|
|
return add$1.definition.url + queryParams(options);
|
|
};
|
|
add$1.get = (options) => ({
|
|
url: add$1.url(options),
|
|
method: "get"
|
|
});
|
|
add$1.head = (options) => ({
|
|
url: add$1.url(options),
|
|
method: "head"
|
|
});
|
|
const addForm$1 = (options) => ({
|
|
action: add$1.url(options),
|
|
method: "get"
|
|
});
|
|
addForm$1.get = (options) => ({
|
|
action: add$1.url(options),
|
|
method: "get"
|
|
});
|
|
addForm$1.head = (options) => ({
|
|
action: add$1.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
add$1.form = addForm$1;
|
|
const product = {
|
|
index: Object.assign(index$3, index$3),
|
|
add: Object.assign(add$1, add$2)
|
|
};
|
|
const index$2 = (options) => ({
|
|
url: index$2.url(options),
|
|
method: "get"
|
|
});
|
|
index$2.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/carousel"
|
|
};
|
|
index$2.url = (options) => {
|
|
return index$2.definition.url + queryParams(options);
|
|
};
|
|
index$2.get = (options) => ({
|
|
url: index$2.url(options),
|
|
method: "get"
|
|
});
|
|
index$2.head = (options) => ({
|
|
url: index$2.url(options),
|
|
method: "head"
|
|
});
|
|
const indexForm$2 = (options) => ({
|
|
action: index$2.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm$2.get = (options) => ({
|
|
action: index$2.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm$2.head = (options) => ({
|
|
action: index$2.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
index$2.form = indexForm$2;
|
|
const add = (options) => ({
|
|
url: add.url(options),
|
|
method: "get"
|
|
});
|
|
add.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/carousel/add"
|
|
};
|
|
add.url = (options) => {
|
|
return add.definition.url + queryParams(options);
|
|
};
|
|
add.get = (options) => ({
|
|
url: add.url(options),
|
|
method: "get"
|
|
});
|
|
add.head = (options) => ({
|
|
url: add.url(options),
|
|
method: "head"
|
|
});
|
|
const addForm = (options) => ({
|
|
action: add.url(options),
|
|
method: "get"
|
|
});
|
|
addForm.get = (options) => ({
|
|
action: add.url(options),
|
|
method: "get"
|
|
});
|
|
addForm.head = (options) => ({
|
|
action: add.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
add.form = addForm;
|
|
const store$1 = (options) => ({
|
|
url: store$1.url(options),
|
|
method: "post"
|
|
});
|
|
store$1.definition = {
|
|
methods: ["post"],
|
|
url: "/carousel"
|
|
};
|
|
store$1.url = (options) => {
|
|
return store$1.definition.url + queryParams(options);
|
|
};
|
|
store$1.post = (options) => ({
|
|
url: store$1.url(options),
|
|
method: "post"
|
|
});
|
|
const storeForm$1 = (options) => ({
|
|
action: store$1.url(options),
|
|
method: "post"
|
|
});
|
|
storeForm$1.post = (options) => ({
|
|
action: store$1.url(options),
|
|
method: "post"
|
|
});
|
|
store$1.form = storeForm$1;
|
|
const carousel = {
|
|
index: Object.assign(index$2, index$2),
|
|
add: Object.assign(add, add),
|
|
store: Object.assign(store$1, store$1)
|
|
};
|
|
const index$1 = (options) => ({
|
|
url: index$1.url(options),
|
|
method: "get"
|
|
});
|
|
index$1.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/dashboard"
|
|
};
|
|
index$1.url = (options) => {
|
|
return index$1.definition.url + queryParams(options);
|
|
};
|
|
index$1.get = (options) => ({
|
|
url: index$1.url(options),
|
|
method: "get"
|
|
});
|
|
index$1.head = (options) => ({
|
|
url: index$1.url(options),
|
|
method: "head"
|
|
});
|
|
const indexForm$1 = (options) => ({
|
|
action: index$1.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm$1.get = (options) => ({
|
|
action: index$1.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm$1.head = (options) => ({
|
|
action: index$1.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
index$1.form = indexForm$1;
|
|
const dashboard = {
|
|
index: Object.assign(index$1, index$1),
|
|
faq: Object.assign(faq, faq),
|
|
product: Object.assign(product, product),
|
|
carousel: Object.assign(carousel, carousel)
|
|
};
|
|
const index = (options) => ({
|
|
url: index.url(options),
|
|
method: "get"
|
|
});
|
|
index.definition = {
|
|
methods: ["get", "head"],
|
|
url: "/testimonial"
|
|
};
|
|
index.url = (options) => {
|
|
return index.definition.url + queryParams(options);
|
|
};
|
|
index.get = (options) => ({
|
|
url: index.url(options),
|
|
method: "get"
|
|
});
|
|
index.head = (options) => ({
|
|
url: index.url(options),
|
|
method: "head"
|
|
});
|
|
const indexForm = (options) => ({
|
|
action: index.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm.get = (options) => ({
|
|
action: index.url(options),
|
|
method: "get"
|
|
});
|
|
indexForm.head = (options) => ({
|
|
action: index.url({
|
|
[options?.mergeQuery ? "mergeQuery" : "query"]: {
|
|
_method: "HEAD",
|
|
...options?.query ?? options?.mergeQuery ?? {}
|
|
}
|
|
}),
|
|
method: "get"
|
|
});
|
|
index.form = indexForm;
|
|
const store = (options) => ({
|
|
url: store.url(options),
|
|
method: "post"
|
|
});
|
|
store.definition = {
|
|
methods: ["post"],
|
|
url: "/testimonial"
|
|
};
|
|
store.url = (options) => {
|
|
return store.definition.url + queryParams(options);
|
|
};
|
|
store.post = (options) => ({
|
|
url: store.url(options),
|
|
method: "post"
|
|
});
|
|
const storeForm = (options) => ({
|
|
action: store.url(options),
|
|
method: "post"
|
|
});
|
|
storeForm.post = (options) => ({
|
|
action: store.url(options),
|
|
method: "post"
|
|
});
|
|
store.form = storeForm;
|
|
const testimonial = {
|
|
index: Object.assign(index, index),
|
|
store: Object.assign(store, store)
|
|
};
|
|
function AppLogo() {
|
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
/* @__PURE__ */ jsx("div", { className: "flex aspect-square size-8 items-center justify-center rounded-md bg-sidebar-primary text-sidebar-primary-foreground", children: /* @__PURE__ */ jsx(AppLogoIcon, { className: "size-5 fill-current text-white dark:text-black" }) }),
|
|
/* @__PURE__ */ jsx("div", { className: "ml-1 grid flex-1 text-left text-sm", children: /* @__PURE__ */ jsx("span", { className: "mb-0.5 truncate leading-tight font-semibold", children: "Soorya Carpet" }) })
|
|
] });
|
|
}
|
|
const mainNavItems = [
|
|
{
|
|
title: "Dashboard",
|
|
href: dashboard.index(),
|
|
icon: LayoutGrid
|
|
},
|
|
{
|
|
title: "Home Page Slider",
|
|
href: carousel.index(),
|
|
icon: GalleryHorizontal
|
|
},
|
|
{
|
|
title: "Products",
|
|
href: dashboard.product.index(),
|
|
icon: Package
|
|
},
|
|
{
|
|
title: "Testimonial",
|
|
href: testimonial.index(),
|
|
icon: GalleryHorizontal
|
|
},
|
|
{
|
|
title: "FAQs",
|
|
href: dashboard.faq.show(),
|
|
icon: TableOfContents
|
|
}
|
|
];
|
|
function AppSidebar() {
|
|
return /* @__PURE__ */ jsxs(Sidebar, { collapsible: "icon", variant: "inset", children: [
|
|
/* @__PURE__ */ jsx(SidebarHeader, { children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(SidebarMenuButton, { size: "lg", asChild: true, children: /* @__PURE__ */ jsx(Link, { href: dashboard.index(), prefetch: true, children: /* @__PURE__ */ jsx(AppLogo, {}) }) }) }) }) }),
|
|
/* @__PURE__ */ jsx(SidebarContent, { children: /* @__PURE__ */ jsx(NavMain, { items: mainNavItems }) }),
|
|
/* @__PURE__ */ jsx(SidebarFooter, { children: /* @__PURE__ */ jsx(NavUser, {}) })
|
|
] });
|
|
}
|
|
function Breadcrumb({ ...props }) {
|
|
return /* @__PURE__ */ jsx("nav", { "aria-label": "breadcrumb", "data-slot": "breadcrumb", ...props });
|
|
}
|
|
function BreadcrumbList({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"ol",
|
|
{
|
|
"data-slot": "breadcrumb-list",
|
|
className: cn(
|
|
"text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
|
|
className
|
|
),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function BreadcrumbItem({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"li",
|
|
{
|
|
"data-slot": "breadcrumb-item",
|
|
className: cn("inline-flex items-center gap-1.5", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function BreadcrumbLink({
|
|
asChild,
|
|
className,
|
|
...props
|
|
}) {
|
|
const Comp = asChild ? Slot : "a";
|
|
return /* @__PURE__ */ jsx(
|
|
Comp,
|
|
{
|
|
"data-slot": "breadcrumb-link",
|
|
className: cn("hover:text-foreground transition-colors", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function BreadcrumbPage({ className, ...props }) {
|
|
return /* @__PURE__ */ jsx(
|
|
"span",
|
|
{
|
|
"data-slot": "breadcrumb-page",
|
|
role: "link",
|
|
"aria-disabled": "true",
|
|
"aria-current": "page",
|
|
className: cn("text-foreground font-normal", className),
|
|
...props
|
|
}
|
|
);
|
|
}
|
|
function BreadcrumbSeparator({
|
|
children,
|
|
className,
|
|
...props
|
|
}) {
|
|
return /* @__PURE__ */ jsx(
|
|
"li",
|
|
{
|
|
"data-slot": "breadcrumb-separator",
|
|
role: "presentation",
|
|
"aria-hidden": "true",
|
|
className: cn("[&>svg]:size-3.5", className),
|
|
...props,
|
|
children: children ?? /* @__PURE__ */ jsx(ChevronRight, {})
|
|
}
|
|
);
|
|
}
|
|
function Breadcrumbs({
|
|
breadcrumbs
|
|
}) {
|
|
return /* @__PURE__ */ jsx(Fragment, { children: breadcrumbs.length > 0 && /* @__PURE__ */ jsx(Breadcrumb, { children: /* @__PURE__ */ jsx(BreadcrumbList, { children: breadcrumbs.map((item, index2) => {
|
|
const isLast = index2 === breadcrumbs.length - 1;
|
|
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
/* @__PURE__ */ jsx(BreadcrumbItem, { children: isLast ? /* @__PURE__ */ jsx(BreadcrumbPage, { children: item.title }) : /* @__PURE__ */ jsx(BreadcrumbLink, { asChild: true, children: /* @__PURE__ */ jsx(Link, { href: item.href, children: item.title }) }) }),
|
|
!isLast && /* @__PURE__ */ jsx(BreadcrumbSeparator, {})
|
|
] }, index2);
|
|
}) }) }) });
|
|
}
|
|
function AppSidebarHeader({
|
|
breadcrumbs = []
|
|
}) {
|
|
return /* @__PURE__ */ jsx("header", { className: "flex h-16 shrink-0 items-center gap-2 border-b border-sidebar-border/50 px-6 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
/* @__PURE__ */ jsx(SidebarTrigger, { className: "-ml-1" }),
|
|
/* @__PURE__ */ jsx(Breadcrumbs, { breadcrumbs })
|
|
] }) });
|
|
}
|
|
function AppSidebarLayout({
|
|
children,
|
|
breadcrumbs = []
|
|
}) {
|
|
return /* @__PURE__ */ jsxs(AppShell, { variant: "sidebar", children: [
|
|
/* @__PURE__ */ jsx(AppSidebar, {}),
|
|
/* @__PURE__ */ jsxs(AppContent, { variant: "sidebar", className: "overflow-x-hidden", children: [
|
|
/* @__PURE__ */ jsx(AppSidebarHeader, { breadcrumbs }),
|
|
children
|
|
] })
|
|
] });
|
|
}
|
|
const AppLayout = ({ children, breadcrumbs, ...props }) => /* @__PURE__ */ jsx(AppSidebarLayout, { breadcrumbs, ...props, children });
|
|
export {
|
|
AppLayout as A,
|
|
index$1 as a,
|
|
carousel as c,
|
|
dashboard as d,
|
|
edit as e,
|
|
index as i
|
|
};
|