@beyondcorp/beyond-ui 1.0.81 → 1.0.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/DashboardLayout/DashboardLayout.d.ts +4 -0
- package/dist/components/DashboardLayout/DashboardLayout.js +2 -2
- package/dist/components/DashboardLayout/DashboardLayout.js.map +1 -1
- package/dist/components/Sidebar/LogoutButton.d.ts +11 -0
- package/dist/components/Sidebar/LogoutButton.js +25 -0
- package/dist/components/Sidebar/LogoutButton.js.map +1 -0
- package/dist/components/Sidebar/ProfileButton.d.ts +14 -0
- package/dist/components/Sidebar/ProfileButton.js +16 -0
- package/dist/components/Sidebar/ProfileButton.js.map +1 -0
- package/dist/components/Sidebar/Sidebar.d.ts +4 -0
- package/dist/components/Sidebar/Sidebar.js +5 -3
- package/dist/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/contexts/AuthContext.js +1 -1
- package/package.json +1 -1
|
@@ -27,6 +27,10 @@ interface DashboardLayoutProps {
|
|
|
27
27
|
sidebarTitleLetter?: string;
|
|
28
28
|
/** Optional className for SidebarHeader */
|
|
29
29
|
sidebarHeaderClassName?: string;
|
|
30
|
+
/** Props for ProfileButton in Sidebar */
|
|
31
|
+
profileButtonProps?: import("../Sidebar/ProfileButton").ProfileButtonProps;
|
|
32
|
+
/** Props for LogoutButton in Sidebar */
|
|
33
|
+
logoutButtonProps?: import("../Sidebar/LogoutButton").LogoutButtonProps;
|
|
30
34
|
}
|
|
31
35
|
declare const DashboardLayout: React.ForwardRefExoticComponent<DashboardLayoutProps & React.RefAttributes<HTMLDivElement>>;
|
|
32
36
|
export { DashboardLayout };
|
|
@@ -4,7 +4,7 @@ import { cn } from '../../utils/cn.js';
|
|
|
4
4
|
import { Sidebar } from '../Sidebar/Sidebar.js';
|
|
5
5
|
import { DashboardHeader } from '../DashboardHeader/DashboardHeader.js';
|
|
6
6
|
|
|
7
|
-
const DashboardLayout = React.forwardRef(({ children, className, sidebarMenuItems, activeSidebarItem, breadcrumbs, onSidebarItemClick, showSearch, searchPlaceholder, onSearchChange, sidebarTitle, sidebarTitleLetter, sidebarHeaderClassName, ...props }, ref) => {
|
|
7
|
+
const DashboardLayout = React.forwardRef(({ children, className, sidebarMenuItems, activeSidebarItem, breadcrumbs, onSidebarItemClick, showSearch, searchPlaceholder, onSearchChange, sidebarTitle, sidebarTitleLetter, sidebarHeaderClassName, profileButtonProps, logoutButtonProps, ...props }, ref) => {
|
|
8
8
|
const [sidebarCollapsed, setSidebarCollapsed] = React.useState(false);
|
|
9
9
|
const toggleSidebar = () => {
|
|
10
10
|
setSidebarCollapsed(prev => !prev);
|
|
@@ -17,7 +17,7 @@ const DashboardLayout = React.forwardRef(({ children, className, sidebarMenuItem
|
|
|
17
17
|
height: "100vh",
|
|
18
18
|
width: sidebarCollapsed ? "4rem" : "18rem", // Tailwind: w-16 or w-72
|
|
19
19
|
transition: "width 0.3s",
|
|
20
|
-
} }), jsx(DashboardHeader, { sidebarCollapsed: sidebarCollapsed, onMenuToggle: toggleSidebar, breadcrumbs: breadcrumbs, showSearch: showSearch, searchPlaceholder: searchPlaceholder, onSearchChange: onSearchChange, style: {
|
|
20
|
+
}, profileButtonProps: profileButtonProps, logoutButtonProps: logoutButtonProps }), jsx(DashboardHeader, { sidebarCollapsed: sidebarCollapsed, onMenuToggle: toggleSidebar, breadcrumbs: breadcrumbs, showSearch: showSearch, searchPlaceholder: searchPlaceholder, onSearchChange: onSearchChange, style: {
|
|
21
21
|
zIndex: 30,
|
|
22
22
|
position: "fixed",
|
|
23
23
|
top: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardLayout.js","sources":["../../../src/components/DashboardLayout/DashboardLayout.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { Sidebar, type MenuItem } from \"../Sidebar\";\r\nimport { DashboardHeader, type BreadcrumbItem } from \"../DashboardHeader\";\r\n\r\n/**\r\n * DashboardLayoutProps\r\n * - sidebarTitle: Title text for Sidebar header (default: \"Beyond\")\r\n * - sidebarTitleLetter: Letter/initial for Sidebar header (default: \"B\")\r\n * - sidebarHeaderClassName: Optional className for SidebarHeader\r\n *\r\n * These props are forwarded to Sidebar for dynamic header branding.\r\n */\r\ninterface DashboardLayoutProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n sidebarMenuItems?: MenuItem[];\r\n activeSidebarItem?: string;\r\n breadcrumbs?: BreadcrumbItem[];\r\n onSidebarItemClick?: (itemId: string) => void;\r\n showSearch?: boolean;\r\n searchPlaceholder?: string;\r\n onSearchChange?: (value: string) => void;\r\n sidebarClassName?: string;\r\n disableSidebarMargin?: boolean;\r\n /** Sidebar header title (default: \"Beyond\") */\r\n sidebarTitle?: string;\r\n /** Sidebar header letter (default: \"B\") */\r\n sidebarTitleLetter?: string;\r\n /** Optional className for SidebarHeader */\r\n sidebarHeaderClassName?: string;\r\n}\r\n\r\nconst DashboardLayout = React.forwardRef<HTMLDivElement, DashboardLayoutProps>(\r\n ({\r\n children,\r\n className,\r\n sidebarMenuItems,\r\n activeSidebarItem,\r\n breadcrumbs,\r\n onSidebarItemClick,\r\n showSearch,\r\n searchPlaceholder,\r\n onSearchChange,\r\n sidebarTitle,\r\n sidebarTitleLetter,\r\n sidebarHeaderClassName,\r\n ...props\r\n }, ref) => {\r\n const [sidebarCollapsed, setSidebarCollapsed] = React.useState(false);\r\n\r\n const toggleSidebar = () => {\r\n setSidebarCollapsed(prev => !prev);\r\n };\r\n\r\n return (\r\n <div ref={ref} className={cn(\"bg-gray-50 w-full h-screen overflow-hidden\", className)} {...props}>\r\n {/* Fixed Sidebar */}\r\n <Sidebar\r\n collapsed={sidebarCollapsed}\r\n onToggle={toggleSidebar}\r\n menuItems={sidebarMenuItems}\r\n activeItem={activeSidebarItem}\r\n onItemClick={onSidebarItemClick}\r\n className={props.sidebarClassName}\r\n title={sidebarTitle}\r\n titleLetter={sidebarTitleLetter}\r\n headerClassName={sidebarHeaderClassName}\r\n style={{\r\n zIndex: 50,\r\n position: \"fixed\",\r\n left: 0,\r\n top: 0,\r\n height: \"100vh\",\r\n width: sidebarCollapsed ? \"4rem\" : \"18rem\", // Tailwind: w-16 or w-72\r\n transition: \"width 0.3s\",\r\n }}\r\n />\r\n\r\n {/* Fixed Header */}\r\n <DashboardHeader\r\n sidebarCollapsed={sidebarCollapsed}\r\n onMenuToggle={toggleSidebar}\r\n breadcrumbs={breadcrumbs}\r\n showSearch={showSearch}\r\n searchPlaceholder={searchPlaceholder}\r\n onSearchChange={onSearchChange}\r\n style={{\r\n zIndex: 30,\r\n position: \"fixed\",\r\n top: 0,\r\n left: sidebarCollapsed ? \"4rem\" : \"18rem\",\r\n right: 0,\r\n width: `calc(100% - ${sidebarCollapsed ? \"4rem\" : \"18rem\"})`,\r\n transition: \"left 0.3s, width 0.3s\",\r\n }}\r\n />\r\n\r\n {/* Main Content Area (scrollable) */}\r\n <div\r\n className={cn(\r\n \"relative w-full h-full\",\r\n props.disableSidebarMargin ? \"\" : \"\"\r\n )}\r\n style={{\r\n marginLeft: sidebarCollapsed ? \"4rem\" : \"18rem\",\r\n marginTop: \"4.5rem\", // Header height (py-4 + border)\r\n height: \"calc(100vh - 4.5rem)\",\r\n overflowY: \"auto\",\r\n transition: \"margin-left 0.3s\",\r\n }}\r\n >\r\n <main className=\"p-10 w-[90vw]\">\r\n {children}\r\n </main>\r\n </div>\r\n\r\n {/* Mobile Overlay */}\r\n {!sidebarCollapsed && (\r\n <div\r\n className=\"fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden\"\r\n onClick={toggleSidebar}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDashboardLayout.displayName = \"DashboardLayout\";\r\n\r\nexport { DashboardLayout };"],"names":["_jsxs","_jsx"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"DashboardLayout.js","sources":["../../../src/components/DashboardLayout/DashboardLayout.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { Sidebar, type MenuItem } from \"../Sidebar\";\r\nimport { DashboardHeader, type BreadcrumbItem } from \"../DashboardHeader\";\r\n\r\n/**\r\n * DashboardLayoutProps\r\n * - sidebarTitle: Title text for Sidebar header (default: \"Beyond\")\r\n * - sidebarTitleLetter: Letter/initial for Sidebar header (default: \"B\")\r\n * - sidebarHeaderClassName: Optional className for SidebarHeader\r\n *\r\n * These props are forwarded to Sidebar for dynamic header branding.\r\n */\r\ninterface DashboardLayoutProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n sidebarMenuItems?: MenuItem[];\r\n activeSidebarItem?: string;\r\n breadcrumbs?: BreadcrumbItem[];\r\n onSidebarItemClick?: (itemId: string) => void;\r\n showSearch?: boolean;\r\n searchPlaceholder?: string;\r\n onSearchChange?: (value: string) => void;\r\n sidebarClassName?: string;\r\n disableSidebarMargin?: boolean;\r\n /** Sidebar header title (default: \"Beyond\") */\r\n sidebarTitle?: string;\r\n /** Sidebar header letter (default: \"B\") */\r\n sidebarTitleLetter?: string;\r\n /** Optional className for SidebarHeader */\r\n sidebarHeaderClassName?: string;\r\n /** Props for ProfileButton in Sidebar */\r\n profileButtonProps?: import(\"../Sidebar/ProfileButton\").ProfileButtonProps;\r\n /** Props for LogoutButton in Sidebar */\r\n logoutButtonProps?: import(\"../Sidebar/LogoutButton\").LogoutButtonProps;\r\n}\r\n\r\nconst DashboardLayout = React.forwardRef<HTMLDivElement, DashboardLayoutProps>(\r\n ({\r\n children,\r\n className,\r\n sidebarMenuItems,\r\n activeSidebarItem,\r\n breadcrumbs,\r\n onSidebarItemClick,\r\n showSearch,\r\n searchPlaceholder,\r\n onSearchChange,\r\n sidebarTitle,\r\n sidebarTitleLetter,\r\n sidebarHeaderClassName,\r\n profileButtonProps,\r\n logoutButtonProps,\r\n ...props\r\n }, ref) => {\r\n const [sidebarCollapsed, setSidebarCollapsed] = React.useState(false);\r\n\r\n const toggleSidebar = () => {\r\n setSidebarCollapsed(prev => !prev);\r\n };\r\n\r\n return (\r\n <div ref={ref} className={cn(\"bg-gray-50 w-full h-screen overflow-hidden\", className)} {...props}>\r\n {/* Fixed Sidebar */}\r\n <Sidebar\r\n collapsed={sidebarCollapsed}\r\n onToggle={toggleSidebar}\r\n menuItems={sidebarMenuItems}\r\n activeItem={activeSidebarItem}\r\n onItemClick={onSidebarItemClick}\r\n className={props.sidebarClassName}\r\n title={sidebarTitle}\r\n titleLetter={sidebarTitleLetter}\r\n headerClassName={sidebarHeaderClassName}\r\n style={{\r\n zIndex: 50,\r\n position: \"fixed\",\r\n left: 0,\r\n top: 0,\r\n height: \"100vh\",\r\n width: sidebarCollapsed ? \"4rem\" : \"18rem\", // Tailwind: w-16 or w-72\r\n transition: \"width 0.3s\",\r\n }}\r\n profileButtonProps={profileButtonProps}\r\n logoutButtonProps={logoutButtonProps}\r\n />\r\n\r\n {/* Fixed Header */}\r\n <DashboardHeader\r\n sidebarCollapsed={sidebarCollapsed}\r\n onMenuToggle={toggleSidebar}\r\n breadcrumbs={breadcrumbs}\r\n showSearch={showSearch}\r\n searchPlaceholder={searchPlaceholder}\r\n onSearchChange={onSearchChange}\r\n style={{\r\n zIndex: 30,\r\n position: \"fixed\",\r\n top: 0,\r\n left: sidebarCollapsed ? \"4rem\" : \"18rem\",\r\n right: 0,\r\n width: `calc(100% - ${sidebarCollapsed ? \"4rem\" : \"18rem\"})`,\r\n transition: \"left 0.3s, width 0.3s\",\r\n }}\r\n />\r\n\r\n {/* Main Content Area (scrollable) */}\r\n <div\r\n className={cn(\r\n \"relative w-full h-full\",\r\n props.disableSidebarMargin ? \"\" : \"\"\r\n )}\r\n style={{\r\n marginLeft: sidebarCollapsed ? \"4rem\" : \"18rem\",\r\n marginTop: \"4.5rem\", // Header height (py-4 + border)\r\n height: \"calc(100vh - 4.5rem)\",\r\n overflowY: \"auto\",\r\n transition: \"margin-left 0.3s\",\r\n }}\r\n >\r\n <main className=\"p-10 w-[90vw]\">\r\n {children}\r\n </main>\r\n </div>\r\n\r\n {/* Mobile Overlay */}\r\n {!sidebarCollapsed && (\r\n <div\r\n className=\"fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden\"\r\n onClick={toggleSidebar}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDashboardLayout.displayName = \"DashboardLayout\";\r\n\r\nexport { DashboardLayout };"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* LogoutButton
|
|
4
|
+
* - Dual API: context-aware (uses useAuth) and stateless (accepts onLogout prop).
|
|
5
|
+
* - If onLogout prop is provided, uses it; otherwise, falls back to useAuth.
|
|
6
|
+
* - Theme-agnostic, reusable.
|
|
7
|
+
*/
|
|
8
|
+
export interface LogoutButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
9
|
+
onLogout?: () => void;
|
|
10
|
+
}
|
|
11
|
+
export declare const LogoutButton: React.ForwardRefExoticComponent<LogoutButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { LogOut } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { useAuth } from '../../contexts/AuthContext.js';
|
|
6
|
+
|
|
7
|
+
const LogoutButton = React.forwardRef(({ className, onLogout, ...props }, ref) => {
|
|
8
|
+
// Use provided onLogout prop, or fallback to context
|
|
9
|
+
const context = useAuth ? useAuth() : undefined;
|
|
10
|
+
const handleClick = (e) => {
|
|
11
|
+
if (props.onClick)
|
|
12
|
+
props.onClick(e);
|
|
13
|
+
if (onLogout) {
|
|
14
|
+
onLogout();
|
|
15
|
+
}
|
|
16
|
+
else if (context?.logout) {
|
|
17
|
+
context.logout();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
return (jsxs(Button, { ref: ref, variant: "danger", size: "sm", className: className, onClick: handleClick, ...props, children: [jsx(LogOut, { className: "h-3 w-3 mr-1" }), "Logout"] }));
|
|
21
|
+
});
|
|
22
|
+
LogoutButton.displayName = "LogoutButton";
|
|
23
|
+
|
|
24
|
+
export { LogoutButton };
|
|
25
|
+
//# sourceMappingURL=LogoutButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogoutButton.js","sources":["../../../src/components/Sidebar/LogoutButton.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { LogOut } from \"lucide-react\";\r\nimport { Button } from \"../Button\";\r\nimport { useAuth } from \"../../contexts/AuthContext\";\r\n\r\n/**\r\n * LogoutButton\r\n * - Dual API: context-aware (uses useAuth) and stateless (accepts onLogout prop).\r\n * - If onLogout prop is provided, uses it; otherwise, falls back to useAuth.\r\n * - Theme-agnostic, reusable.\r\n */\r\nexport interface LogoutButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n onLogout?: () => void;\r\n}\r\n\r\nexport const LogoutButton = React.forwardRef<HTMLButtonElement, LogoutButtonProps>(\r\n ({ className, onLogout, ...props }, ref) => {\r\n // Use provided onLogout prop, or fallback to context\r\n const context = useAuth ? useAuth() : undefined;\r\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\r\n if (props.onClick) props.onClick(e);\r\n if (onLogout) {\r\n onLogout();\r\n } else if (context?.logout) {\r\n context.logout();\r\n }\r\n };\r\n return (\r\n <Button\r\n ref={ref}\r\n variant=\"danger\"\r\n size=\"sm\"\r\n className={className}\r\n onClick={handleClick}\r\n {...props}\r\n >\r\n <LogOut className=\"h-3 w-3 mr-1\" />\r\n Logout\r\n </Button>\r\n );\r\n }\r\n);\r\n\r\nLogoutButton.displayName = \"LogoutButton\";"],"names":["_jsxs","_jsx"],"mappings":";;;;;;MAea,YAAY,GAAG,KAAK,CAAC,UAAU,CAC1C,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;;AAEzC,IAAA,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS;AAC/C,IAAA,MAAM,WAAW,GAAG,CAAC,CAAsC,KAAI;QAC7D,IAAI,KAAK,CAAC,OAAO;AAAE,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,EAAE;QACZ;AAAO,aAAA,IAAI,OAAO,EAAE,MAAM,EAAE;YAC1B,OAAO,CAAC,MAAM,EAAE;QAClB;AACF,IAAA,CAAC;AACD,IAAA,QACEA,IAAA,CAAC,MAAM,EAAA,EACL,GAAG,EAAE,GAAG,EACR,OAAO,EAAC,QAAQ,EAChB,IAAI,EAAC,IAAI,EACT,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,WAAW,EAAA,GAChB,KAAK,EAAA,QAAA,EAAA,CAETC,GAAA,CAAC,MAAM,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,EAAA,QAAA,CAAA,EAAA,CAE5B;AAEb,CAAC;AAGH,YAAY,CAAC,WAAW,GAAG,cAAc;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* ProfileButton
|
|
4
|
+
* - Dual API: context-aware (uses useAuth) and stateless (accepts user/onClick props).
|
|
5
|
+
* - If user prop is provided, uses it; otherwise, falls back to useAuth.
|
|
6
|
+
* - Theme-agnostic, reusable.
|
|
7
|
+
*/
|
|
8
|
+
export interface ProfileButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
9
|
+
user?: {
|
|
10
|
+
name?: string;
|
|
11
|
+
email?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare const ProfileButton: React.ForwardRefExoticComponent<ProfileButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { User } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { useAuth } from '../../contexts/AuthContext.js';
|
|
6
|
+
|
|
7
|
+
const ProfileButton = React.forwardRef(({ className, user, ...props }, ref) => {
|
|
8
|
+
// Use provided user prop, or fallback to context
|
|
9
|
+
const context = useAuth ? useAuth() : undefined;
|
|
10
|
+
user || context?.user || {};
|
|
11
|
+
return (jsxs(Button, { ref: ref, variant: "secondary", size: "sm", className: className, ...props, children: [jsx(User, { className: "h-3 w-3 mr-1" }), "Profile"] }));
|
|
12
|
+
});
|
|
13
|
+
ProfileButton.displayName = "ProfileButton";
|
|
14
|
+
|
|
15
|
+
export { ProfileButton };
|
|
16
|
+
//# sourceMappingURL=ProfileButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileButton.js","sources":["../../../src/components/Sidebar/ProfileButton.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { User } from \"lucide-react\";\r\nimport { Button } from \"../Button\";\r\nimport { useAuth } from \"../../contexts/AuthContext\";\r\n\r\n/**\r\n * ProfileButton\r\n * - Dual API: context-aware (uses useAuth) and stateless (accepts user/onClick props).\r\n * - If user prop is provided, uses it; otherwise, falls back to useAuth.\r\n * - Theme-agnostic, reusable.\r\n */\r\nexport interface ProfileButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n user?: { name?: string; email?: string };\r\n}\r\n\r\nexport const ProfileButton = React.forwardRef<HTMLButtonElement, ProfileButtonProps>(\r\n ({ className, user, ...props }, ref) => {\r\n // Use provided user prop, or fallback to context\r\n const context = useAuth ? useAuth() : undefined;\r\n const displayUser = user || context?.user || {};\r\n return (\r\n <Button\r\n ref={ref}\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n className={className}\r\n {...props}\r\n >\r\n <User className=\"h-3 w-3 mr-1\" />\r\n Profile\r\n </Button>\r\n );\r\n }\r\n);\r\n\r\nProfileButton.displayName = \"ProfileButton\";"],"names":["_jsxs","_jsx"],"mappings":";;;;;;MAea,aAAa,GAAG,KAAK,CAAC,UAAU,CAC3C,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;;AAErC,IAAA,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS;IAC3B,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI;AAC7C,IAAA,QACEA,IAAA,CAAC,MAAM,EAAA,EACL,GAAG,EAAE,GAAG,EACR,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,IAAI,EACT,SAAS,EAAE,SAAS,EAAA,GAChB,KAAK,aAETC,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,EAAA,SAAA,CAAA,EAAA,CAE1B;AAEb,CAAC;AAGH,aAAa,CAAC,WAAW,GAAG,eAAe;;;;"}
|
|
@@ -33,6 +33,10 @@ interface SidebarProps extends VariantProps<typeof sidebarVariants> {
|
|
|
33
33
|
/** Optional className for SidebarHeader */
|
|
34
34
|
headerClassName?: string;
|
|
35
35
|
style?: React.CSSProperties;
|
|
36
|
+
/** Props for ProfileButton (stateless usage) */
|
|
37
|
+
profileButtonProps?: import("./ProfileButton").ProfileButtonProps;
|
|
38
|
+
/** Props for LogoutButton (stateless usage) */
|
|
39
|
+
logoutButtonProps?: import("./LogoutButton").LogoutButtonProps;
|
|
36
40
|
}
|
|
37
41
|
declare const Sidebar: React.ForwardRefExoticComponent<SidebarProps & React.RefAttributes<HTMLDivElement>>;
|
|
38
42
|
export { Sidebar, sidebarVariants, type MenuItem };
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { Home, BarChart3, Users, Settings, FileText, Calendar, Mail, Bell, ChevronRight, ChevronLeft,
|
|
3
|
+
import { Home, BarChart3, Users, Settings, FileText, Calendar, Mail, Bell, ChevronRight, ChevronLeft, ChevronDown } from 'lucide-react';
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
5
5
|
import { cn } from '../../utils/cn.js';
|
|
6
6
|
import { Avatar, AvatarImage, AvatarFallback } from '../Avatar/Avatar.js';
|
|
7
7
|
import { Badge } from '../Badge/Badge.js';
|
|
8
|
+
import { ProfileButton } from './ProfileButton.js';
|
|
9
|
+
import { LogoutButton } from './LogoutButton.js';
|
|
8
10
|
import { SidebarHeader } from './SidebarHeader.js';
|
|
9
11
|
|
|
10
12
|
const sidebarVariants = cva("fixed left-0 top-0 z-40 h-screen bg-white border-r border-gray-200 transition-all duration-300 ease-in-out", {
|
|
@@ -89,7 +91,7 @@ const defaultMenuItems = [
|
|
|
89
91
|
href: "/settings",
|
|
90
92
|
},
|
|
91
93
|
];
|
|
92
|
-
const Sidebar = React.forwardRef(({ className, collapsed = false, onToggle, menuItems = defaultMenuItems, activeItem = "dashboard", onItemClick, title = "Beyond", titleLetter = "B", headerClassName, ...props }, ref) => {
|
|
94
|
+
const Sidebar = React.forwardRef(({ className, collapsed = false, onToggle, menuItems = defaultMenuItems, activeItem = "dashboard", onItemClick, title = "Beyond", titleLetter = "B", headerClassName, profileButtonProps, logoutButtonProps, ...props }, ref) => {
|
|
93
95
|
const [expandedItems, setExpandedItems] = React.useState([]);
|
|
94
96
|
const toggleExpanded = (itemId) => {
|
|
95
97
|
setExpandedItems(prev => prev.includes(itemId)
|
|
@@ -110,7 +112,7 @@ const Sidebar = React.forwardRef(({ className, collapsed = false, onToggle, menu
|
|
|
110
112
|
const hasChildren = item.children && item.children.length > 0;
|
|
111
113
|
return (jsxs("div", { children: [jsx("button", { onClick: () => handleItemClick(item), className: cn(menuItemVariants({ active: isActive, collapsed }), level > 0 && "ml-4 pl-8", "relative"), children: jsxs("div", { className: "flex items-center min-w-0 flex-1", children: [jsx("div", { className: "flex-shrink-0", children: item.icon }), !collapsed && (jsxs(Fragment, { children: [jsx("span", { className: "ml-3 truncate", children: item.label }), item.badge && (jsx(Badge, { variant: "danger", className: "ml-auto text-xs", children: item.badge })), hasChildren && (jsx(ChevronDown, { className: cn("ml-auto h-4 w-4 transition-transform duration-200", isExpanded && "rotate-180") }))] }))] }) }), hasChildren && !collapsed && isExpanded && (jsx("div", { className: "mt-1 space-y-1", children: item.children?.map(child => renderMenuItem(child, level + 1)) }))] }, item.id));
|
|
112
114
|
};
|
|
113
|
-
return (jsxs("div", { ref: ref, className: cn("flex flex-col h-screen", sidebarVariants({ collapsed }), className), style: props.style, ...props, children: [jsxs("div", { className: "flex items-center justify-between p-4 border-b border-gray-200", children: [!collapsed && (jsx(SidebarHeader, { title: title, letter: titleLetter, className: headerClassName })), jsx("button", { onClick: onToggle, className: "p-1.5 rounded-lg hover:bg-gray-100 transition-colors", children: collapsed ? (jsx(ChevronRight, { className: "h-4 w-4 text-gray-600" })) : (jsx(ChevronLeft, { className: "h-4 w-4 text-gray-600" })) })] }), jsx("nav", { className: "flex-1 px-4 py-6 space-y-2 overflow-y-auto", children: menuItems.map(item => renderMenuItem(item)) }), jsx("div", { className: "border-t border-gray-200 p-4", children: collapsed ? (jsx("div", { className: "flex justify-center", children: jsxs(Avatar, { size: "sm", children: [jsx(AvatarImage, { src: "https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64" }), jsx(AvatarFallback, { children: "JD" })] }) })) : (jsxs("div", { className: "space-y-3", children: [jsxs("div", { className: "flex items-center space-x-3", children: [jsxs(Avatar, { size: "sm", children: [jsx(AvatarImage, { src: "https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64" }), jsx(AvatarFallback, { children: "JD" })] }), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("p", { className: "text-sm font-medium text-gray-900 truncate", children: "John Doe" }), jsx("p", { className: "text-xs text-gray-500 truncate", children: "john@company.com" })] })] }), jsxs("div", { className: "flex space-x-2", children: [
|
|
115
|
+
return (jsxs("div", { ref: ref, className: cn("flex flex-col h-screen", sidebarVariants({ collapsed }), className), style: props.style, ...props, children: [jsxs("div", { className: "flex items-center justify-between p-4 border-b border-gray-200", children: [!collapsed && (jsx(SidebarHeader, { title: title, letter: titleLetter, className: headerClassName })), jsx("button", { onClick: onToggle, className: "p-1.5 rounded-lg hover:bg-gray-100 transition-colors", children: collapsed ? (jsx(ChevronRight, { className: "h-4 w-4 text-gray-600" })) : (jsx(ChevronLeft, { className: "h-4 w-4 text-gray-600" })) })] }), jsx("nav", { className: "flex-1 px-4 py-6 space-y-2 overflow-y-auto", children: menuItems.map(item => renderMenuItem(item)) }), jsx("div", { className: "border-t border-gray-200 p-4", children: collapsed ? (jsx("div", { className: "flex justify-center", children: jsxs(Avatar, { size: "sm", children: [jsx(AvatarImage, { src: "https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64" }), jsx(AvatarFallback, { children: "JD" })] }) })) : (jsxs("div", { className: "space-y-3", children: [jsxs("div", { className: "flex items-center space-x-3", children: [jsxs(Avatar, { size: "sm", children: [jsx(AvatarImage, { src: "https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64" }), jsx(AvatarFallback, { children: "JD" })] }), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("p", { className: "text-sm font-medium text-gray-900 truncate", children: "John Doe" }), jsx("p", { className: "text-xs text-gray-500 truncate", children: "john@company.com" })] })] }), jsxs("div", { className: "flex space-x-2", children: [jsx(ProfileButton, { className: "flex-1", ...profileButtonProps }), jsx(LogoutButton, { className: "flex-1", ...logoutButtonProps })] })] })) })] }));
|
|
114
116
|
});
|
|
115
117
|
Sidebar.displayName = "Sidebar";
|
|
116
118
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.js","sources":["../../../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { \n ChevronLeft, \n ChevronRight, \n ChevronDown, \n Home, \n BarChart3, \n Users, \n Settings, \n FileText, \n Calendar, \n Mail, \n Bell,\n LogOut,\n User\n} from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\n\nconst sidebarVariants = cva(\n \"fixed left-0 top-0 z-40 h-screen bg-white border-r border-gray-200 transition-all duration-300 ease-in-out\",\n {\n variants: {\n collapsed: {\n false: \"w-72\",\n true: \"w-16\",\n },\n },\n defaultVariants: {\n collapsed: false,\n },\n }\n);\n\nconst menuItemVariants = cva(\n \"flex items-center w-full px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-200 group\",\n {\n variants: {\n active: {\n true: \"bg-primary-50 text-primary-700 border-r-2 border-primary-600\",\n false: \"text-gray-700 hover:bg-gray-50 hover:text-gray-900\",\n },\n collapsed: {\n true: \"justify-center px-2\",\n false: \"justify-start\",\n },\n },\n defaultVariants: {\n active: false,\n collapsed: false,\n },\n }\n);\n\ninterface MenuItem {\n id: string;\n label: string;\n icon: React.ReactNode;\n href?: string;\n badge?: string;\n children?: MenuItem[];\n}\n\nimport { SidebarHeader } from \"./SidebarHeader\";\n\n/**\n * SidebarProps\n * - title: The main title text in the sidebar header (default: \"Beyond\").\n * - titleLetter: The single letter/initial in the colored box (default: \"B\").\n * - headerClassName: Optional className for SidebarHeader for further customization.\n *\n * These props allow consumers to fully customize the Sidebar header section.\n * If not provided, the default branding is preserved for backward compatibility.\n */\ninterface SidebarProps extends VariantProps<typeof sidebarVariants> {\n className?: string;\n onToggle?: () => void;\n menuItems?: MenuItem[];\n activeItem?: string;\n onItemClick?: (itemId: string) => void;\n /** Sidebar header title (default: \"Beyond\") */\n title?: string;\n /** Sidebar header letter (default: \"B\") */\n titleLetter?: string;\n /** Optional className for SidebarHeader */\n headerClassName?: string;\n style?: React.CSSProperties;\n}\n\nconst defaultMenuItems: MenuItem[] = [\n {\n id: \"dashboard\",\n label: \"Dashboard\",\n icon: <Home className=\"h-5 w-5\" />,\n href: \"/dashboard\",\n },\n {\n id: \"analytics\",\n label: \"Analytics\",\n icon: <BarChart3 className=\"h-5 w-5\" />,\n href: \"/analytics\",\n badge: \"New\",\n },\n {\n id: \"users\",\n label: \"Users\",\n icon: <Users className=\"h-5 w-5\" />,\n children: [\n { id: \"all-users\", label: \"All Users\", icon: <Users className=\"h-4 w-4\" /> },\n { id: \"user-roles\", label: \"User Roles\", icon: <Settings className=\"h-4 w-4\" /> },\n ],\n },\n {\n id: \"reports\",\n label: \"Reports\",\n icon: <FileText className=\"h-5 w-5\" />,\n href: \"/reports\",\n },\n {\n id: \"calendar\",\n label: \"Calendar\",\n icon: <Calendar className=\"h-5 w-5\" />,\n href: \"/calendar\",\n },\n {\n id: \"messages\",\n label: \"Messages\",\n icon: <Mail className=\"h-5 w-5\" />,\n href: \"/messages\",\n badge: \"3\",\n },\n {\n id: \"notifications\",\n label: \"Notifications\",\n icon: <Bell className=\"h-5 w-5\" />,\n href: \"/notifications\",\n },\n {\n id: \"settings\",\n label: \"Settings\",\n icon: <Settings className=\"h-5 w-5\" />,\n href: \"/settings\",\n },\n];\n\nconst Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>(\n ({\n className,\n collapsed = false,\n onToggle,\n menuItems = defaultMenuItems,\n activeItem = \"dashboard\",\n onItemClick,\n title = \"Beyond\",\n titleLetter = \"B\",\n headerClassName,\n ...props\n }, ref) => {\n const [expandedItems, setExpandedItems] = React.useState<string[]>([]);\n\n const toggleExpanded = (itemId: string) => {\n setExpandedItems(prev => \n prev.includes(itemId) \n ? prev.filter(id => id !== itemId)\n : [...prev, itemId]\n );\n };\n\n const handleItemClick = (item: MenuItem) => {\n if (item.children) {\n toggleExpanded(item.id);\n } else {\n onItemClick?.(item.id);\n }\n };\n\n const renderMenuItem = (item: MenuItem, level = 0) => {\n const isActive = activeItem === item.id;\n const isExpanded = expandedItems.includes(item.id);\n const hasChildren = item.children && item.children.length > 0;\n\n return (\n <div key={item.id}>\n <button\n onClick={() => handleItemClick(item)}\n className={cn(\n menuItemVariants({ active: isActive, collapsed }),\n level > 0 && \"ml-4 pl-8\",\n \"relative\"\n )}\n >\n <div className=\"flex items-center min-w-0 flex-1\">\n <div className=\"flex-shrink-0\">\n {item.icon}\n </div>\n {!collapsed && (\n <>\n <span className=\"ml-3 truncate\">{item.label}</span>\n {item.badge && (\n <Badge variant=\"danger\" className=\"ml-auto text-xs\">\n {item.badge}\n </Badge>\n )}\n {hasChildren && (\n <ChevronDown \n className={cn(\n \"ml-auto h-4 w-4 transition-transform duration-200\",\n isExpanded && \"rotate-180\"\n )}\n />\n )}\n </>\n )}\n </div>\n </button>\n \n {hasChildren && !collapsed && isExpanded && (\n <div className=\"mt-1 space-y-1\">\n {item.children?.map(child => renderMenuItem(child, level + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col h-screen\",\n sidebarVariants({ collapsed }),\n className\n )}\n style={props.style}\n {...props}\n >\n {/*\n Sidebar Header\n - Uses SidebarHeader for dynamic branding.\n - Props: title, titleLetter, headerClassName.\n - If not provided, defaults to \"Beyond\" and \"B\" for backward compatibility.\n */}\n <div className=\"flex items-center justify-between p-4 border-b border-gray-200\">\n {!collapsed && (\n <SidebarHeader\n title={title}\n letter={titleLetter}\n className={headerClassName}\n />\n )}\n <button\n onClick={onToggle}\n className=\"p-1.5 rounded-lg hover:bg-gray-100 transition-colors\"\n >\n {collapsed ? (\n <ChevronRight className=\"h-4 w-4 text-gray-600\" />\n ) : (\n <ChevronLeft className=\"h-4 w-4 text-gray-600\" />\n )}\n </button>\n </div>\n\n {/* Navigation Menu */}\n <nav className=\"flex-1 px-4 py-6 space-y-2 overflow-y-auto\">\n {menuItems.map(item => renderMenuItem(item))}\n </nav>\n\n {/* User Profile Section */}\n <div className=\"border-t border-gray-200 p-4\">\n {collapsed ? (\n <div className=\"flex justify-center\">\n <Avatar size=\"sm\">\n <AvatarImage src=\"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\" />\n <AvatarFallback>JD</AvatarFallback>\n </Avatar>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"flex items-center space-x-3\">\n <Avatar size=\"sm\">\n <AvatarImage src=\"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\" />\n <AvatarFallback>JD</AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n John Doe\n </p>\n <p className=\"text-xs text-gray-500 truncate\">\n john@company.com\n </p>\n </div>\n </div>\n <div className=\"flex space-x-2\">\n <button className=\"flex-1 flex items-center justify-center px-3 py-2 text-xs font-medium text-gray-700 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors\">\n <User className=\"h-3 w-3 mr-1\" />\n Profile\n </button>\n <button className=\"flex-1 flex items-center justify-center px-3 py-2 text-xs font-medium text-gray-700 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors\">\n <LogOut className=\"h-3 w-3 mr-1\" />\n Logout\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nSidebar.displayName = \"Sidebar\";\n\nexport { Sidebar, sidebarVariants, type MenuItem };"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Sidebar.js","sources":["../../../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { \n ChevronLeft, \n ChevronRight, \n ChevronDown, \n Home, \n BarChart3, \n Users, \n Settings, \n FileText, \n Calendar, \n Mail, \n Bell,\n LogOut,\n User\n} from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\nimport { ProfileButton } from \"./ProfileButton\";\nimport { LogoutButton } from \"./LogoutButton\";\n\nconst sidebarVariants = cva(\n \"fixed left-0 top-0 z-40 h-screen bg-white border-r border-gray-200 transition-all duration-300 ease-in-out\",\n {\n variants: {\n collapsed: {\n false: \"w-72\",\n true: \"w-16\",\n },\n },\n defaultVariants: {\n collapsed: false,\n },\n }\n);\n\nconst menuItemVariants = cva(\n \"flex items-center w-full px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-200 group\",\n {\n variants: {\n active: {\n true: \"bg-primary-50 text-primary-700 border-r-2 border-primary-600\",\n false: \"text-gray-700 hover:bg-gray-50 hover:text-gray-900\",\n },\n collapsed: {\n true: \"justify-center px-2\",\n false: \"justify-start\",\n },\n },\n defaultVariants: {\n active: false,\n collapsed: false,\n },\n }\n);\n\ninterface MenuItem {\n id: string;\n label: string;\n icon: React.ReactNode;\n href?: string;\n badge?: string;\n children?: MenuItem[];\n}\n\nimport { SidebarHeader } from \"./SidebarHeader\";\n\n/**\n * SidebarProps\n * - title: The main title text in the sidebar header (default: \"Beyond\").\n * - titleLetter: The single letter/initial in the colored box (default: \"B\").\n * - headerClassName: Optional className for SidebarHeader for further customization.\n *\n * These props allow consumers to fully customize the Sidebar header section.\n * If not provided, the default branding is preserved for backward compatibility.\n */\ninterface SidebarProps extends VariantProps<typeof sidebarVariants> {\n className?: string;\n onToggle?: () => void;\n menuItems?: MenuItem[];\n activeItem?: string;\n onItemClick?: (itemId: string) => void;\n /** Sidebar header title (default: \"Beyond\") */\n title?: string;\n /** Sidebar header letter (default: \"B\") */\n titleLetter?: string;\n /** Optional className for SidebarHeader */\n headerClassName?: string;\n style?: React.CSSProperties;\n /** Props for ProfileButton (stateless usage) */\n profileButtonProps?: import(\"./ProfileButton\").ProfileButtonProps;\n /** Props for LogoutButton (stateless usage) */\n logoutButtonProps?: import(\"./LogoutButton\").LogoutButtonProps;\n}\n\nconst defaultMenuItems: MenuItem[] = [\n {\n id: \"dashboard\",\n label: \"Dashboard\",\n icon: <Home className=\"h-5 w-5\" />,\n href: \"/dashboard\",\n },\n {\n id: \"analytics\",\n label: \"Analytics\",\n icon: <BarChart3 className=\"h-5 w-5\" />,\n href: \"/analytics\",\n badge: \"New\",\n },\n {\n id: \"users\",\n label: \"Users\",\n icon: <Users className=\"h-5 w-5\" />,\n children: [\n { id: \"all-users\", label: \"All Users\", icon: <Users className=\"h-4 w-4\" /> },\n { id: \"user-roles\", label: \"User Roles\", icon: <Settings className=\"h-4 w-4\" /> },\n ],\n },\n {\n id: \"reports\",\n label: \"Reports\",\n icon: <FileText className=\"h-5 w-5\" />,\n href: \"/reports\",\n },\n {\n id: \"calendar\",\n label: \"Calendar\",\n icon: <Calendar className=\"h-5 w-5\" />,\n href: \"/calendar\",\n },\n {\n id: \"messages\",\n label: \"Messages\",\n icon: <Mail className=\"h-5 w-5\" />,\n href: \"/messages\",\n badge: \"3\",\n },\n {\n id: \"notifications\",\n label: \"Notifications\",\n icon: <Bell className=\"h-5 w-5\" />,\n href: \"/notifications\",\n },\n {\n id: \"settings\",\n label: \"Settings\",\n icon: <Settings className=\"h-5 w-5\" />,\n href: \"/settings\",\n },\n];\n\nconst Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>(\n ({\n className,\n collapsed = false,\n onToggle,\n menuItems = defaultMenuItems,\n activeItem = \"dashboard\",\n onItemClick,\n title = \"Beyond\",\n titleLetter = \"B\",\n headerClassName,\n profileButtonProps,\n logoutButtonProps,\n ...props\n }, ref) => {\n const [expandedItems, setExpandedItems] = React.useState<string[]>([]);\n\n const toggleExpanded = (itemId: string) => {\n setExpandedItems(prev => \n prev.includes(itemId) \n ? prev.filter(id => id !== itemId)\n : [...prev, itemId]\n );\n };\n\n const handleItemClick = (item: MenuItem) => {\n if (item.children) {\n toggleExpanded(item.id);\n } else {\n onItemClick?.(item.id);\n }\n };\n\n const renderMenuItem = (item: MenuItem, level = 0) => {\n const isActive = activeItem === item.id;\n const isExpanded = expandedItems.includes(item.id);\n const hasChildren = item.children && item.children.length > 0;\n\n return (\n <div key={item.id}>\n <button\n onClick={() => handleItemClick(item)}\n className={cn(\n menuItemVariants({ active: isActive, collapsed }),\n level > 0 && \"ml-4 pl-8\",\n \"relative\"\n )}\n >\n <div className=\"flex items-center min-w-0 flex-1\">\n <div className=\"flex-shrink-0\">\n {item.icon}\n </div>\n {!collapsed && (\n <>\n <span className=\"ml-3 truncate\">{item.label}</span>\n {item.badge && (\n <Badge variant=\"danger\" className=\"ml-auto text-xs\">\n {item.badge}\n </Badge>\n )}\n {hasChildren && (\n <ChevronDown \n className={cn(\n \"ml-auto h-4 w-4 transition-transform duration-200\",\n isExpanded && \"rotate-180\"\n )}\n />\n )}\n </>\n )}\n </div>\n </button>\n \n {hasChildren && !collapsed && isExpanded && (\n <div className=\"mt-1 space-y-1\">\n {item.children?.map(child => renderMenuItem(child, level + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col h-screen\",\n sidebarVariants({ collapsed }),\n className\n )}\n style={props.style}\n {...props}\n >\n {/*\n Sidebar Header\n - Uses SidebarHeader for dynamic branding.\n - Props: title, titleLetter, headerClassName.\n - If not provided, defaults to \"Beyond\" and \"B\" for backward compatibility.\n */}\n <div className=\"flex items-center justify-between p-4 border-b border-gray-200\">\n {!collapsed && (\n <SidebarHeader\n title={title}\n letter={titleLetter}\n className={headerClassName}\n />\n )}\n <button\n onClick={onToggle}\n className=\"p-1.5 rounded-lg hover:bg-gray-100 transition-colors\"\n >\n {collapsed ? (\n <ChevronRight className=\"h-4 w-4 text-gray-600\" />\n ) : (\n <ChevronLeft className=\"h-4 w-4 text-gray-600\" />\n )}\n </button>\n </div>\n\n {/* Navigation Menu */}\n <nav className=\"flex-1 px-4 py-6 space-y-2 overflow-y-auto\">\n {menuItems.map(item => renderMenuItem(item))}\n </nav>\n\n {/* User Profile Section */}\n <div className=\"border-t border-gray-200 p-4\">\n {collapsed ? (\n <div className=\"flex justify-center\">\n <Avatar size=\"sm\">\n <AvatarImage src=\"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\" />\n <AvatarFallback>JD</AvatarFallback>\n </Avatar>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"flex items-center space-x-3\">\n <Avatar size=\"sm\">\n <AvatarImage src=\"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\" />\n <AvatarFallback>JD</AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n John Doe\n </p>\n <p className=\"text-xs text-gray-500 truncate\">\n john@company.com\n </p>\n </div>\n </div>\n <div className=\"flex space-x-2\">\n {/* Reusable, theme-agnostic profile/logout buttons */}\n <ProfileButton className=\"flex-1\" {...profileButtonProps} />\n <LogoutButton className=\"flex-1\" {...logoutButtonProps} />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nSidebar.displayName = \"Sidebar\";\n\nexport { Sidebar, sidebarVariants, type MenuItem };"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, useReducer, useEffect, useCallback
|
|
2
|
+
import { createContext, useContext, useReducer, useEffect, useCallback } from 'react';
|
|
3
3
|
import { authService } from '../services/authService.js';
|
|
4
4
|
|
|
5
5
|
const authReducer = (state, action) => {
|