@beyondcorp/beyond-ui 1.2.85 → 1.2.87
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/DashboardHeader/DashboardHeader.js +5 -5
- package/dist/components/DashboardHeader/DashboardHeader.js.map +1 -1
- package/dist/components/DashboardLayout/DashboardLayout.js +1 -1
- package/dist/components/DashboardLayout/DashboardLayout.js.map +1 -1
- package/dist/components/DataTable/DataTable.js +7 -7
- package/dist/components/DataTable/DataTable.js.map +1 -1
- package/dist/components/Modal/Modal.js +3 -3
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/ProfileManagement/ProfileCard.js +1 -1
- package/dist/components/ProfileManagement/ProfileCard.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.js +5 -5
- package/dist/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/components/Sidebar/SidebarHeader.js +1 -1
- package/dist/components/Sidebar/SidebarHeader.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -29,25 +29,25 @@ const DashboardHeader = React.forwardRef(({ className, breadcrumbs = [{ label: "
|
|
|
29
29
|
setSearchValue(value);
|
|
30
30
|
onSearchChange?.(value);
|
|
31
31
|
};
|
|
32
|
-
return (jsx("header", { ref: ref, className: cn("z-30 bg-white border-b border-gray-200 transition-all duration-300", className), style: props.style, ...props, children: jsxs("div", { className: "flex w-full items-center justify-between px-6 py-4", children: [jsxs("div", { className: "flex items-center space-x-4 flex-shrink-0 flex-grow-0 min-w-0", children: [Array.isArray(leftSlot)
|
|
32
|
+
return (jsx("header", { ref: ref, className: cn("z-30 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 transition-all duration-300", className), style: props.style, ...props, children: jsxs("div", { className: "flex w-full items-center justify-between px-6 py-4", children: [jsxs("div", { className: "flex items-center space-x-4 flex-shrink-0 flex-grow-0 min-w-0", children: [Array.isArray(leftSlot)
|
|
33
33
|
? leftSlot.map((item, idx) => (jsx("span", { onClick: item.onClick, className: item.onClick ? "cursor-pointer" : undefined, children: item.element }, item.id || idx)))
|
|
34
34
|
: leftSlot, (isSectionVisible(showMenuButton, isMobile ? "mobile" : "desktop")) && (jsx(Button, { variant: "ghost", size: "sm", onClick: e => {
|
|
35
35
|
onMenuButtonClick?.();
|
|
36
36
|
onMenuToggle?.();
|
|
37
|
-
}, className: "md:hidden", children: jsx(Menu, { className: "h-5 w-5" }) })), isSectionVisible(showBreadcrumbs, isMobile ? "mobile" : "desktop") && (jsx("nav", { className: cn("flex items-center space-x-2 text-sm", isMobile ? "w-full overflow-x-auto whitespace-nowrap py-1" : ""), children: breadcrumbs.map((item, index) => (jsxs(React.Fragment, { children: [index > 0 && (jsx("span", { className: "text-gray-400", children: "/" })), item.href ? (jsx("a", { href: item.href, className: "text-gray-600 hover:text-gray-900 transition-colors", onClick: e => {
|
|
37
|
+
}, className: "md:hidden", children: jsx(Menu, { className: "h-5 w-5" }) })), isSectionVisible(showBreadcrumbs, isMobile ? "mobile" : "desktop") && (jsx("nav", { className: cn("flex items-center space-x-2 text-sm", isMobile ? "w-full overflow-x-auto whitespace-nowrap py-1" : ""), children: breadcrumbs.map((item, index) => (jsxs(React.Fragment, { children: [index > 0 && (jsx("span", { className: "text-gray-400", children: "/" })), item.href ? (jsx("a", { href: item.href, className: "text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors", onClick: e => {
|
|
38
38
|
onBreadcrumbClick?.(item, index);
|
|
39
|
-
}, children: item.label })) : (jsx("span", { className: "text-gray-900 font-medium", onClick: e => {
|
|
39
|
+
}, children: item.label })) : (jsx("span", { className: "text-gray-900 dark:text-white font-medium", onClick: e => {
|
|
40
40
|
onBreadcrumbClick?.(item, index);
|
|
41
41
|
}, style: onBreadcrumbClick ? { cursor: "pointer" } : undefined, children: item.label }))] }, index))) }))] }), centerSlot ? (jsx("div", { className: "flex-1 min-w-0 flex justify-center", children: Array.isArray(centerSlot)
|
|
42
42
|
? centerSlot.map((item, idx) => (jsx("span", { onClick: item.onClick, className: item.onClick ? "cursor-pointer" : undefined, children: item.element }, item.id || idx)))
|
|
43
|
-
: centerSlot })) : (isSectionVisible(showSearch, isMobile ? "mobile" : "desktop") && (jsx("div", { className: "flex-1 min-w-0 mx-2", children: jsxs("div", { className: "relative", children: [jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { type: "text", placeholder: searchPlaceholder, value: searchValue, onChange: handleSearchChange, className: "pl-10 bg-gray-50 border-gray-200 focus:bg-white w-full" })] }) }))), jsxs("div", { className: "flex items-center space-x-3 flex-shrink-0 flex-grow-0 min-w-0", children: [Array.isArray(rightSlot)
|
|
43
|
+
: centerSlot })) : (isSectionVisible(showSearch, isMobile ? "mobile" : "desktop") && (jsx("div", { className: "flex-1 min-w-0 mx-2", children: jsxs("div", { className: "relative", children: [jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400 dark:text-gray-500" }), jsx(Input, { type: "text", placeholder: searchPlaceholder, value: searchValue, onChange: handleSearchChange, className: "pl-10 bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700 focus:bg-white dark:focus:bg-gray-900 dark:text-white w-full" })] }) }))), jsxs("div", { className: "flex items-center space-x-3 flex-shrink-0 flex-grow-0 min-w-0", children: [Array.isArray(rightSlot)
|
|
44
44
|
? rightSlot.map((item, idx) => (jsx("span", { onClick: item.onClick, className: item.onClick ? "cursor-pointer" : undefined, children: item.element }, item.id || idx)))
|
|
45
45
|
: rightSlot, isSectionVisible(showNotifications, isMobile ? "mobile" : "desktop") && (jsx("div", { className: "relative", children: jsxs(Button, { variant: "ghost", size: "sm", className: "relative", onClick: onNotificationClick, children: [jsx(Bell, { className: "h-5 w-5" }), jsx(Badge, { variant: "danger", className: "absolute -top-1 -right-1 h-5 w-5 text-xs p-0 flex items-center justify-center", children: "3" })] }) })), isSectionVisible(showSettings, isMobile ? "mobile" : "desktop") && (jsx(Button, { variant: "ghost", size: "sm", onClick: onSettingsClick, children: jsx(Settings, { className: "h-5 w-5" }) })), isSectionVisible(showProfile, isMobile ? "mobile" : "desktop") && (jsxs("div", { className: cn("flex items-center space-x-3 pl-3 border-l border-gray-200", onProfileClick ? "cursor-pointer hover:bg-gray-100 transition" : ""), onClick: onProfileClick, tabIndex: onProfileClick ? 0 : undefined, role: onProfileClick ? "button" : undefined, onKeyDown: onProfileClick ? (e) => {
|
|
46
46
|
if (e.key === "Enter" || e.key === " ") {
|
|
47
47
|
e.preventDefault();
|
|
48
48
|
onProfileClick();
|
|
49
49
|
}
|
|
50
|
-
} : undefined, "aria-label": onProfileClick ? "Profile section" : undefined, children: [jsxs("div", { className: "hidden sm:block text-right", children: [jsx("p", { className: "text-sm font-medium text-gray-900", children: "John Doe" }), jsx("p", { className: "text-xs text-gray-500", children: "Administrator" })] }), 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" })] })] }))] })] }) }));
|
|
50
|
+
} : undefined, "aria-label": onProfileClick ? "Profile section" : undefined, children: [jsxs("div", { className: "hidden sm:block text-right", children: [jsx("p", { className: "text-sm font-medium text-gray-900 dark:text-white", children: "John Doe" }), jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: "Administrator" })] }), 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" })] })] }))] })] }) }));
|
|
51
51
|
});
|
|
52
52
|
DashboardHeader.displayName = "DashboardHeader";
|
|
53
53
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardHeader.js","sources":["../../../src/components/DashboardHeader/DashboardHeader.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Search, Bell, Settings, Menu } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { Input } from \"../Input\";\nimport { Button } from \"../Button\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\n\ninterface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ntype ResponsiveShow = boolean | { mobile?: boolean; desktop?: boolean };\n\ntype DashboardHeaderSlotItem = {\n element: React.ReactNode;\n onClick?: () => void;\n id?: string;\n};\ntype DashboardHeaderSlot = React.ReactNode | DashboardHeaderSlotItem[];\n\ninterface DashboardHeaderProps {\n className?: string;\n breadcrumbs?: BreadcrumbItem[];\n onMenuToggle?: () => void;\n sidebarCollapsed?: boolean;\n showSearch?: ResponsiveShow;\n searchPlaceholder?: string;\n onSearchChange?: (value: string) => void;\n style?: React.CSSProperties;\n\n // New flexible API\n showBreadcrumbs?: ResponsiveShow; // default true\n showNotifications?: ResponsiveShow; // default true\n showSettings?: ResponsiveShow; // default true\n showProfile?: ResponsiveShow; // default true\n showMenuButton?: ResponsiveShow; // default true\n\n // OnClick handlers for standard components\n onMenuButtonClick?: () => void;\n onNotificationClick?: () => void;\n onSettingsClick?: () => void;\n onProfileClick?: () => void;\n onBreadcrumbClick?: (item: BreadcrumbItem, index: number) => void;\n\n // Custom slots\n leftSlot?: DashboardHeaderSlot;\n centerSlot?: DashboardHeaderSlot;\n rightSlot?: DashboardHeaderSlot;\n}\n\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\n\nconst DashboardHeader = React.forwardRef<HTMLDivElement, DashboardHeaderProps>(\n ({\n className,\n breadcrumbs = [{ label: \"Dashboard\" }],\n onMenuToggle,\n sidebarCollapsed = false,\n showSearch = true,\n searchPlaceholder = \"Search...\",\n onSearchChange,\n showBreadcrumbs = true,\n showNotifications = true,\n showSettings = true,\n showProfile = true,\n showMenuButton = true,\n leftSlot,\n centerSlot,\n rightSlot,\n onMenuButtonClick,\n onNotificationClick,\n onSettingsClick,\n onProfileClick,\n onBreadcrumbClick,\n ...props\n }, ref) => {\n const [searchValue, setSearchValue] = React.useState(\"\");\n const { currentBreakpoint } = useBreakpoint();\n\n // Helper to resolve ResponsiveShow prop\n const isSectionVisible = (\n prop: ResponsiveShow | undefined,\n view: \"mobile\" | \"desktop\"\n ): boolean => {\n if (typeof prop === \"boolean\") return prop;\n if (!prop) return true;\n if (view === \"mobile\") return prop.mobile ?? false;\n if (view === \"desktop\") return prop.desktop ?? false;\n return true;\n };\n\n const isMobile = currentBreakpoint === \"sm\" || currentBreakpoint === \"md\";\n const isDesktop = currentBreakpoint === \"lg\" || currentBreakpoint === \"xl\" || currentBreakpoint === \"2xl\";\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setSearchValue(value);\n onSearchChange?.(value);\n };\n\n return (\n <header\n ref={ref}\n className={cn(\n \"z-30 bg-white border-b border-gray-200 transition-all duration-300\",\n className\n )}\n style={props.style}\n {...props}\n >\n <div className=\"flex w-full items-center justify-between px-6 py-4\">\n {/* Left Section */}\n <div className=\"flex items-center space-x-4 flex-shrink-0 flex-grow-0 min-w-0\">\n {/* Custom left slot */}\n {Array.isArray(leftSlot)\n ? leftSlot.map((item, idx) => (\n <span\n key={item.id || idx}\n onClick={item.onClick}\n className={item.onClick ? \"cursor-pointer\" : undefined}\n >\n {item.element}\n </span>\n ))\n : leftSlot}\n\n {/* Mobile Menu Button */}\n {(isSectionVisible(showMenuButton, isMobile ? \"mobile\" : \"desktop\")) && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={e => {\n onMenuButtonClick?.();\n onMenuToggle?.();\n }}\n className=\"md:hidden\"\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n )}\n\n {/* Breadcrumbs */}\n {isSectionVisible(showBreadcrumbs, isMobile ? \"mobile\" : \"desktop\") && (\n <nav\n className={cn(\n \"flex items-center space-x-2 text-sm\",\n isMobile ? \"w-full overflow-x-auto whitespace-nowrap py-1\" : \"\"\n )}\n >\n {breadcrumbs.map((item, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <span className=\"text-gray-400\">/</span>\n )}\n {item.href ? (\n <a\n href={item.href}\n className=\"text-gray-600 hover:text-gray-900 transition-colors\"\n onClick={e => {\n onBreadcrumbClick?.(item, index);\n }}\n >\n {item.label}\n </a>\n ) : (\n <span\n className=\"text-gray-900 font-medium\"\n onClick={e => {\n onBreadcrumbClick?.(item, index);\n }}\n style={onBreadcrumbClick ? { cursor: \"pointer\" } : undefined}\n >\n {item.label}\n </span>\n )}\n </React.Fragment>\n ))}\n </nav>\n )}\n </div>\n\n {/* Center Section - Search or custom center slot */}\n {centerSlot ? (\n <div className=\"flex-1 min-w-0 flex justify-center\">\n {Array.isArray(centerSlot)\n ? centerSlot.map((item, idx) => (\n <span\n key={item.id || idx}\n onClick={item.onClick}\n className={item.onClick ? \"cursor-pointer\" : undefined}\n >\n {item.element}\n </span>\n ))\n : centerSlot}\n </div>\n ) : (\n isSectionVisible(showSearch, isMobile ? \"mobile\" : \"desktop\") && (\n <div className=\"flex-1 min-w-0 mx-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={handleSearchChange}\n className=\"pl-10 bg-gray-50 border-gray-200 focus:bg-white w-full\"\n />\n </div>\n </div>\n )\n )}\n\n {/* Right Section */}\n <div className=\"flex items-center space-x-3 flex-shrink-0 flex-grow-0 min-w-0\">\n {/* Custom right slot */}\n {Array.isArray(rightSlot)\n ? rightSlot.map((item, idx) => (\n <span\n key={item.id || idx}\n onClick={item.onClick}\n className={item.onClick ? \"cursor-pointer\" : undefined}\n >\n {item.element}\n </span>\n ))\n : rightSlot}\n\n {/* Notifications */}\n {isSectionVisible(showNotifications, isMobile ? \"mobile\" : \"desktop\") && (\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"relative\"\n onClick={onNotificationClick}\n >\n <Bell className=\"h-5 w-5\" />\n <Badge\n variant=\"danger\"\n className=\"absolute -top-1 -right-1 h-5 w-5 text-xs p-0 flex items-center justify-center\"\n >\n 3\n </Badge>\n </Button>\n </div>\n )}\n\n {/* Settings */}\n {isSectionVisible(showSettings, isMobile ? \"mobile\" : \"desktop\") && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onSettingsClick}\n >\n <Settings className=\"h-5 w-5\" />\n </Button>\n )}\n\n {/* User Profile */}\n {isSectionVisible(showProfile, isMobile ? \"mobile\" : \"desktop\") && (\n <div\n className={cn(\n \"flex items-center space-x-3 pl-3 border-l border-gray-200\",\n onProfileClick ? \"cursor-pointer hover:bg-gray-100 transition\" : \"\"\n )}\n onClick={onProfileClick}\n tabIndex={onProfileClick ? 0 : undefined}\n role={onProfileClick ? \"button\" : undefined}\n onKeyDown={onProfileClick ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onProfileClick();\n }\n } : undefined}\n aria-label={onProfileClick ? \"Profile section\" : undefined}\n >\n <div className=\"hidden sm:block text-right\">\n <p className=\"text-sm font-medium text-gray-900\">John Doe</p>\n <p className=\"text-xs text-gray-500\">Administrator</p>\n </div>\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>\n </div>\n </header>\n );\n }\n);\n\nDashboardHeader.displayName = \"DashboardHeader\";\n\nexport { DashboardHeader, type BreadcrumbItem, type DashboardHeaderProps };"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DashboardHeader.js","sources":["../../../src/components/DashboardHeader/DashboardHeader.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Search, Bell, Settings, Menu } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { Input } from \"../Input\";\nimport { Button } from \"../Button\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\n\ninterface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ntype ResponsiveShow = boolean | { mobile?: boolean; desktop?: boolean };\n\ntype DashboardHeaderSlotItem = {\n element: React.ReactNode;\n onClick?: () => void;\n id?: string;\n};\ntype DashboardHeaderSlot = React.ReactNode | DashboardHeaderSlotItem[];\n\ninterface DashboardHeaderProps {\n className?: string;\n breadcrumbs?: BreadcrumbItem[];\n onMenuToggle?: () => void;\n sidebarCollapsed?: boolean;\n showSearch?: ResponsiveShow;\n searchPlaceholder?: string;\n onSearchChange?: (value: string) => void;\n style?: React.CSSProperties;\n\n // New flexible API\n showBreadcrumbs?: ResponsiveShow; // default true\n showNotifications?: ResponsiveShow; // default true\n showSettings?: ResponsiveShow; // default true\n showProfile?: ResponsiveShow; // default true\n showMenuButton?: ResponsiveShow; // default true\n\n // OnClick handlers for standard components\n onMenuButtonClick?: () => void;\n onNotificationClick?: () => void;\n onSettingsClick?: () => void;\n onProfileClick?: () => void;\n onBreadcrumbClick?: (item: BreadcrumbItem, index: number) => void;\n\n // Custom slots\n leftSlot?: DashboardHeaderSlot;\n centerSlot?: DashboardHeaderSlot;\n rightSlot?: DashboardHeaderSlot;\n}\n\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\n\nconst DashboardHeader = React.forwardRef<HTMLDivElement, DashboardHeaderProps>(\n ({\n className,\n breadcrumbs = [{ label: \"Dashboard\" }],\n onMenuToggle,\n sidebarCollapsed = false,\n showSearch = true,\n searchPlaceholder = \"Search...\",\n onSearchChange,\n showBreadcrumbs = true,\n showNotifications = true,\n showSettings = true,\n showProfile = true,\n showMenuButton = true,\n leftSlot,\n centerSlot,\n rightSlot,\n onMenuButtonClick,\n onNotificationClick,\n onSettingsClick,\n onProfileClick,\n onBreadcrumbClick,\n ...props\n }, ref) => {\n const [searchValue, setSearchValue] = React.useState(\"\");\n const { currentBreakpoint } = useBreakpoint();\n\n // Helper to resolve ResponsiveShow prop\n const isSectionVisible = (\n prop: ResponsiveShow | undefined,\n view: \"mobile\" | \"desktop\"\n ): boolean => {\n if (typeof prop === \"boolean\") return prop;\n if (!prop) return true;\n if (view === \"mobile\") return prop.mobile ?? false;\n if (view === \"desktop\") return prop.desktop ?? false;\n return true;\n };\n\n const isMobile = currentBreakpoint === \"sm\" || currentBreakpoint === \"md\";\n const isDesktop = currentBreakpoint === \"lg\" || currentBreakpoint === \"xl\" || currentBreakpoint === \"2xl\";\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setSearchValue(value);\n onSearchChange?.(value);\n };\n\n return (\n <header\n ref={ref}\n className={cn(\n \"z-30 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 transition-all duration-300\",\n className\n )}\n style={props.style}\n {...props}\n >\n <div className=\"flex w-full items-center justify-between px-6 py-4\">\n {/* Left Section */}\n <div className=\"flex items-center space-x-4 flex-shrink-0 flex-grow-0 min-w-0\">\n {/* Custom left slot */}\n {Array.isArray(leftSlot)\n ? leftSlot.map((item, idx) => (\n <span\n key={item.id || idx}\n onClick={item.onClick}\n className={item.onClick ? \"cursor-pointer\" : undefined}\n >\n {item.element}\n </span>\n ))\n : leftSlot}\n\n {/* Mobile Menu Button */}\n {(isSectionVisible(showMenuButton, isMobile ? \"mobile\" : \"desktop\")) && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={e => {\n onMenuButtonClick?.();\n onMenuToggle?.();\n }}\n className=\"md:hidden\"\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n )}\n\n {/* Breadcrumbs */}\n {isSectionVisible(showBreadcrumbs, isMobile ? \"mobile\" : \"desktop\") && (\n <nav\n className={cn(\n \"flex items-center space-x-2 text-sm\",\n isMobile ? \"w-full overflow-x-auto whitespace-nowrap py-1\" : \"\"\n )}\n >\n {breadcrumbs.map((item, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <span className=\"text-gray-400\">/</span>\n )}\n {item.href ? (\n <a\n href={item.href}\n className=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors\"\n onClick={e => {\n onBreadcrumbClick?.(item, index);\n }}\n >\n {item.label}\n </a>\n ) : (\n <span\n className=\"text-gray-900 dark:text-white font-medium\"\n onClick={e => {\n onBreadcrumbClick?.(item, index);\n }}\n style={onBreadcrumbClick ? { cursor: \"pointer\" } : undefined}\n >\n {item.label}\n </span>\n )}\n </React.Fragment>\n ))}\n </nav>\n )}\n </div>\n\n {/* Center Section - Search or custom center slot */}\n {centerSlot ? (\n <div className=\"flex-1 min-w-0 flex justify-center\">\n {Array.isArray(centerSlot)\n ? centerSlot.map((item, idx) => (\n <span\n key={item.id || idx}\n onClick={item.onClick}\n className={item.onClick ? \"cursor-pointer\" : undefined}\n >\n {item.element}\n </span>\n ))\n : centerSlot}\n </div>\n ) : (\n isSectionVisible(showSearch, isMobile ? \"mobile\" : \"desktop\") && (\n <div className=\"flex-1 min-w-0 mx-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400 dark:text-gray-500\" />\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={handleSearchChange}\n className=\"pl-10 bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700 focus:bg-white dark:focus:bg-gray-900 dark:text-white w-full\"\n />\n </div>\n </div>\n )\n )}\n\n {/* Right Section */}\n <div className=\"flex items-center space-x-3 flex-shrink-0 flex-grow-0 min-w-0\">\n {/* Custom right slot */}\n {Array.isArray(rightSlot)\n ? rightSlot.map((item, idx) => (\n <span\n key={item.id || idx}\n onClick={item.onClick}\n className={item.onClick ? \"cursor-pointer\" : undefined}\n >\n {item.element}\n </span>\n ))\n : rightSlot}\n\n {/* Notifications */}\n {isSectionVisible(showNotifications, isMobile ? \"mobile\" : \"desktop\") && (\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"relative\"\n onClick={onNotificationClick}\n >\n <Bell className=\"h-5 w-5\" />\n <Badge\n variant=\"danger\"\n className=\"absolute -top-1 -right-1 h-5 w-5 text-xs p-0 flex items-center justify-center\"\n >\n 3\n </Badge>\n </Button>\n </div>\n )}\n\n {/* Settings */}\n {isSectionVisible(showSettings, isMobile ? \"mobile\" : \"desktop\") && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onSettingsClick}\n >\n <Settings className=\"h-5 w-5\" />\n </Button>\n )}\n\n {/* User Profile */}\n {isSectionVisible(showProfile, isMobile ? \"mobile\" : \"desktop\") && (\n <div\n className={cn(\n \"flex items-center space-x-3 pl-3 border-l border-gray-200\",\n onProfileClick ? \"cursor-pointer hover:bg-gray-100 transition\" : \"\"\n )}\n onClick={onProfileClick}\n tabIndex={onProfileClick ? 0 : undefined}\n role={onProfileClick ? \"button\" : undefined}\n onKeyDown={onProfileClick ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onProfileClick();\n }\n } : undefined}\n aria-label={onProfileClick ? \"Profile section\" : undefined}\n >\n <div className=\"hidden sm:block text-right\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">John Doe</p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">Administrator</p>\n </div>\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>\n </div>\n </header>\n );\n }\n);\n\nDashboardHeader.displayName = \"DashboardHeader\";\n\nexport { DashboardHeader, type BreadcrumbItem, type DashboardHeaderProps };"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ const DashboardLayout = React.forwardRef(({ children, className, sidebarMenuItem
|
|
|
9
9
|
const toggleSidebar = () => {
|
|
10
10
|
setSidebarCollapsed(prev => !prev);
|
|
11
11
|
};
|
|
12
|
-
return (jsxs("div", { ref: ref, className: cn("bg-gray-50 w-full h-screen overflow-hidden", className), ...props, children: [jsx(Sidebar, { collapsed: sidebarCollapsed, onToggle: toggleSidebar, menuItems: sidebarMenuItems, activeItem: activeSidebarItem, onItemClick: onSidebarItemClick, className: props.sidebarClassName, title: sidebarTitle, titleLetter: sidebarTitleLetter, headerClassName: sidebarHeaderClassName, style: {
|
|
12
|
+
return (jsxs("div", { ref: ref, className: cn("bg-gray-50 dark:bg-gray-900 w-full h-screen overflow-hidden", className), ...props, children: [jsx(Sidebar, { collapsed: sidebarCollapsed, onToggle: toggleSidebar, menuItems: sidebarMenuItems, activeItem: activeSidebarItem, onItemClick: onSidebarItemClick, className: props.sidebarClassName, title: sidebarTitle, titleLetter: sidebarTitleLetter, headerClassName: sidebarHeaderClassName, style: {
|
|
13
13
|
zIndex: 50,
|
|
14
14
|
position: "fixed",
|
|
15
15
|
left: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardLayout.js","sources":["../../../src/components/DashboardLayout/DashboardLayout.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Sidebar, type MenuItem, type SidebarProfileSectionProps } from \"../Sidebar\";\nimport { DashboardHeader, type BreadcrumbItem } from \"../DashboardHeader\";\n\n/**\n * DashboardLayoutProps\n * - sidebarTitle: Title text for Sidebar header (default: \"Beyond\")\n * - sidebarTitleLetter: Letter/initial for Sidebar header (default: \"B\")\n * - sidebarHeaderClassName: Optional className for SidebarHeader\n *\n * These props are forwarded to Sidebar for dynamic header branding.\n */\nimport type { DashboardHeaderProps } from \"../DashboardHeader\";\n\ninterface DashboardLayoutProps {\n children: React.ReactNode;\n className?: string;\n sidebarMenuItems?: MenuItem[];\n activeSidebarItem?: string;\n breadcrumbs?: BreadcrumbItem[];\n onSidebarItemClick?: (itemId: string) => void;\n showSearch?: boolean;\n searchPlaceholder?: string;\n onSearchChange?: (value: string) => void;\n sidebarClassName?: string;\n disableSidebarMargin?: boolean;\n /** Sidebar header title (default: \"Beyond\") */\n sidebarTitle?: string;\n /** Sidebar header letter (default: \"B\") */\n sidebarTitleLetter?: string;\n /** Optional className for SidebarHeader */\n sidebarHeaderClassName?: string;\n /** Props for ProfileButton in Sidebar */\n profileButtonProps?: import(\"../Sidebar/ProfileButton\").ProfileButtonProps;\n /** Props for LogoutButton in Sidebar */\n logoutButtonProps?: import(\"../Sidebar/LogoutButton\").LogoutButtonProps;\n /** Props for Sidebar profile section (avatar, name, email, etc.) */\n profileSectionProps?: SidebarProfileSectionProps;\n\n /** Props to customize DashboardHeader */\n dashboardHeaderProps?: DashboardHeaderProps;\n}\n\nconst DashboardLayout = React.forwardRef<HTMLDivElement, DashboardLayoutProps>(\n ({\n children,\n className,\n sidebarMenuItems,\n activeSidebarItem,\n breadcrumbs,\n onSidebarItemClick,\n showSearch,\n searchPlaceholder,\n onSearchChange,\n sidebarTitle,\n sidebarTitleLetter,\n sidebarHeaderClassName,\n profileButtonProps,\n logoutButtonProps,\n profileSectionProps,\n dashboardHeaderProps,\n ...props\n }, ref) => {\n const [sidebarCollapsed, setSidebarCollapsed] = React.useState(false);\n\n const toggleSidebar = () => {\n setSidebarCollapsed(prev => !prev);\n };\n\n return (\n <div ref={ref} className={cn(\"bg-gray-50 w-full h-screen overflow-hidden\", className)} {...props}>\n {/* Fixed Sidebar */}\n <Sidebar\n collapsed={sidebarCollapsed}\n onToggle={toggleSidebar}\n menuItems={sidebarMenuItems}\n activeItem={activeSidebarItem}\n onItemClick={onSidebarItemClick}\n className={props.sidebarClassName}\n title={sidebarTitle}\n titleLetter={sidebarTitleLetter}\n headerClassName={sidebarHeaderClassName}\n style={{\n zIndex: 50,\n position: \"fixed\",\n left: 0,\n top: 0,\n height: \"100vh\",\n width: sidebarCollapsed ? \"4rem\" : \"18rem\", // Tailwind: w-16 or w-72\n transition: \"width 0.3s\",\n }}\n profileButtonProps={profileButtonProps}\n logoutButtonProps={logoutButtonProps}\n profileSectionProps={profileSectionProps}\n />\n\n {/* Fixed Header */}\n <DashboardHeader\n sidebarCollapsed={sidebarCollapsed}\n onMenuToggle={toggleSidebar}\n breadcrumbs={breadcrumbs}\n showSearch={showSearch}\n searchPlaceholder={searchPlaceholder}\n onSearchChange={onSearchChange}\n style={{\n zIndex: 30,\n position: \"fixed\",\n top: 0,\n left: sidebarCollapsed ? \"4rem\" : \"18rem\",\n right: 0,\n width: `calc(100% - ${sidebarCollapsed ? \"4rem\" : \"18rem\"})`,\n transition: \"left 0.3s, width 0.3s\",\n }}\n {...dashboardHeaderProps}\n />\n\n {/* Main Content Area (scrollable) */}\n <div\n className={cn(\n \"relative w-full h-full\",\n props.disableSidebarMargin ? \"\" : \"\"\n )}\n style={{\n marginLeft: sidebarCollapsed ? \"4rem\" : \"18rem\",\n marginTop: \"4.5rem\", // Header height (py-4 + border)\n height: \"calc(100vh - 4.5rem)\",\n overflowY: \"auto\",\n transition: \"margin-left 0.3s\",\n }}\n >\n <main className=\"p-10 w-[90vw]\">\n {children}\n </main>\n </div>\n\n {/* Mobile Overlay */}\n {!sidebarCollapsed && (\n <div\n className=\"fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden\"\n onClick={toggleSidebar}\n />\n )}\n </div>\n );\n }\n);\n\nDashboardLayout.displayName = \"DashboardLayout\";\n\nexport { DashboardLayout };"],"names":["_jsxs","_jsx"],"mappings":";;;;;;AA4CA,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CACtC,CAAC,EACC,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,GAAG,KAAK,EACT,EAAE,GAAG,KAAI;AACR,IAAA,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IAErE,MAAM,aAAa,GAAG,MAAK;QACzB,mBAAmB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;AACpC,IAAA,CAAC;IAED,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"DashboardLayout.js","sources":["../../../src/components/DashboardLayout/DashboardLayout.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Sidebar, type MenuItem, type SidebarProfileSectionProps } from \"../Sidebar\";\nimport { DashboardHeader, type BreadcrumbItem } from \"../DashboardHeader\";\n\n/**\n * DashboardLayoutProps\n * - sidebarTitle: Title text for Sidebar header (default: \"Beyond\")\n * - sidebarTitleLetter: Letter/initial for Sidebar header (default: \"B\")\n * - sidebarHeaderClassName: Optional className for SidebarHeader\n *\n * These props are forwarded to Sidebar for dynamic header branding.\n */\nimport type { DashboardHeaderProps } from \"../DashboardHeader\";\n\ninterface DashboardLayoutProps {\n children: React.ReactNode;\n className?: string;\n sidebarMenuItems?: MenuItem[];\n activeSidebarItem?: string;\n breadcrumbs?: BreadcrumbItem[];\n onSidebarItemClick?: (itemId: string) => void;\n showSearch?: boolean;\n searchPlaceholder?: string;\n onSearchChange?: (value: string) => void;\n sidebarClassName?: string;\n disableSidebarMargin?: boolean;\n /** Sidebar header title (default: \"Beyond\") */\n sidebarTitle?: string;\n /** Sidebar header letter (default: \"B\") */\n sidebarTitleLetter?: string;\n /** Optional className for SidebarHeader */\n sidebarHeaderClassName?: string;\n /** Props for ProfileButton in Sidebar */\n profileButtonProps?: import(\"../Sidebar/ProfileButton\").ProfileButtonProps;\n /** Props for LogoutButton in Sidebar */\n logoutButtonProps?: import(\"../Sidebar/LogoutButton\").LogoutButtonProps;\n /** Props for Sidebar profile section (avatar, name, email, etc.) */\n profileSectionProps?: SidebarProfileSectionProps;\n\n /** Props to customize DashboardHeader */\n dashboardHeaderProps?: DashboardHeaderProps;\n}\n\nconst DashboardLayout = React.forwardRef<HTMLDivElement, DashboardLayoutProps>(\n ({\n children,\n className,\n sidebarMenuItems,\n activeSidebarItem,\n breadcrumbs,\n onSidebarItemClick,\n showSearch,\n searchPlaceholder,\n onSearchChange,\n sidebarTitle,\n sidebarTitleLetter,\n sidebarHeaderClassName,\n profileButtonProps,\n logoutButtonProps,\n profileSectionProps,\n dashboardHeaderProps,\n ...props\n }, ref) => {\n const [sidebarCollapsed, setSidebarCollapsed] = React.useState(false);\n\n const toggleSidebar = () => {\n setSidebarCollapsed(prev => !prev);\n };\n\n return (\n <div ref={ref} className={cn(\"bg-gray-50 dark:bg-gray-900 w-full h-screen overflow-hidden\", className)} {...props}>\n {/* Fixed Sidebar */}\n <Sidebar\n collapsed={sidebarCollapsed}\n onToggle={toggleSidebar}\n menuItems={sidebarMenuItems}\n activeItem={activeSidebarItem}\n onItemClick={onSidebarItemClick}\n className={props.sidebarClassName}\n title={sidebarTitle}\n titleLetter={sidebarTitleLetter}\n headerClassName={sidebarHeaderClassName}\n style={{\n zIndex: 50,\n position: \"fixed\",\n left: 0,\n top: 0,\n height: \"100vh\",\n width: sidebarCollapsed ? \"4rem\" : \"18rem\", // Tailwind: w-16 or w-72\n transition: \"width 0.3s\",\n }}\n profileButtonProps={profileButtonProps}\n logoutButtonProps={logoutButtonProps}\n profileSectionProps={profileSectionProps}\n />\n\n {/* Fixed Header */}\n <DashboardHeader\n sidebarCollapsed={sidebarCollapsed}\n onMenuToggle={toggleSidebar}\n breadcrumbs={breadcrumbs}\n showSearch={showSearch}\n searchPlaceholder={searchPlaceholder}\n onSearchChange={onSearchChange}\n style={{\n zIndex: 30,\n position: \"fixed\",\n top: 0,\n left: sidebarCollapsed ? \"4rem\" : \"18rem\",\n right: 0,\n width: `calc(100% - ${sidebarCollapsed ? \"4rem\" : \"18rem\"})`,\n transition: \"left 0.3s, width 0.3s\",\n }}\n {...dashboardHeaderProps}\n />\n\n {/* Main Content Area (scrollable) */}\n <div\n className={cn(\n \"relative w-full h-full\",\n props.disableSidebarMargin ? \"\" : \"\"\n )}\n style={{\n marginLeft: sidebarCollapsed ? \"4rem\" : \"18rem\",\n marginTop: \"4.5rem\", // Header height (py-4 + border)\n height: \"calc(100vh - 4.5rem)\",\n overflowY: \"auto\",\n transition: \"margin-left 0.3s\",\n }}\n >\n <main className=\"p-10 w-[90vw]\">\n {children}\n </main>\n </div>\n\n {/* Mobile Overlay */}\n {!sidebarCollapsed && (\n <div\n className=\"fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden\"\n onClick={toggleSidebar}\n />\n )}\n </div>\n );\n }\n);\n\nDashboardLayout.displayName = \"DashboardLayout\";\n\nexport { DashboardLayout };"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import { Card, CardContent } from '../Card/Card.js';
|
|
|
11
11
|
import { useBreakpoint } from '../../hooks/useBreakpoint.js';
|
|
12
12
|
import { Select } from '../Select/Select.js';
|
|
13
13
|
|
|
14
|
-
const tableVariants = cva("w-full border-collapse bg-white", {
|
|
14
|
+
const tableVariants = cva("w-full border-collapse bg-white dark:bg-gray-900", {
|
|
15
15
|
variants: {
|
|
16
16
|
size: {
|
|
17
17
|
small: "text-xs",
|
|
@@ -19,7 +19,7 @@ const tableVariants = cva("w-full border-collapse bg-white", {
|
|
|
19
19
|
large: "text-base",
|
|
20
20
|
},
|
|
21
21
|
bordered: {
|
|
22
|
-
true: "border border-gray-200",
|
|
22
|
+
true: "border border-gray-200 dark:border-gray-800",
|
|
23
23
|
false: "",
|
|
24
24
|
},
|
|
25
25
|
},
|
|
@@ -28,7 +28,7 @@ const tableVariants = cva("w-full border-collapse bg-white", {
|
|
|
28
28
|
bordered: false,
|
|
29
29
|
},
|
|
30
30
|
});
|
|
31
|
-
const cellVariants = cva("border-b border-gray-200 transition-colors", {
|
|
31
|
+
const cellVariants = cva("border-b border-gray-200 dark:border-gray-800 transition-colors", {
|
|
32
32
|
variants: {
|
|
33
33
|
size: {
|
|
34
34
|
small: "px-2 py-1",
|
|
@@ -41,8 +41,8 @@ const cellVariants = cva("border-b border-gray-200 transition-colors", {
|
|
|
41
41
|
right: "text-right",
|
|
42
42
|
},
|
|
43
43
|
type: {
|
|
44
|
-
header: "bg-gray-50 font-semibold text-gray-900 border-b-2 border-gray-200",
|
|
45
|
-
body: "text-gray-700 hover:bg-gray-50",
|
|
44
|
+
header: "bg-gray-50 dark:bg-gray-800/50 font-semibold text-gray-900 dark:text-gray-100 border-b-2 border-gray-200 dark:border-gray-800",
|
|
45
|
+
body: "text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800/50",
|
|
46
46
|
},
|
|
47
47
|
},
|
|
48
48
|
defaultVariants: {
|
|
@@ -220,9 +220,9 @@ const DataTable = ({ columns, dataSource, loading = false, rowKey = 'id', pagina
|
|
|
220
220
|
// Mobile-first responsive: useBreakpoint to switch between table and card layouts
|
|
221
221
|
const { isBelow } = useBreakpoint();
|
|
222
222
|
if (loading) {
|
|
223
|
-
return (jsxs("div", { className: cn("w-full", className), children: [title && jsx("div", { className: "mb-4", children: title() }), jsx("div", { className: "border border-gray-200 rounded-lg overflow-hidden", children: jsx("div", { className: "p-4 space-y-3", children: Array.from({ length: 5 }).map((_, i) => (jsxs("div", { className: "flex space-x-4", children: [jsx(Skeleton, { className: "h-4 w-8" }), jsx(Skeleton, { className: "h-4 flex-1" }), jsx(Skeleton, { className: "h-4 w-24" }), jsx(Skeleton, { className: "h-4 w-16" })] }, i))) }) })] }));
|
|
223
|
+
return (jsxs("div", { className: cn("w-full", className), children: [title && jsx("div", { className: "mb-4", children: title() }), jsx("div", { className: "border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden", children: jsx("div", { className: "p-4 space-y-3", children: Array.from({ length: 5 }).map((_, i) => (jsxs("div", { className: "flex space-x-4", children: [jsx(Skeleton, { className: "h-4 w-8" }), jsx(Skeleton, { className: "h-4 flex-1" }), jsx(Skeleton, { className: "h-4 w-24" }), jsx(Skeleton, { className: "h-4 w-16" })] }, i))) }) })] }));
|
|
224
224
|
}
|
|
225
|
-
return (jsxs("div", { className: cn("w-full", className), children: [title && jsx("div", { className: "mb-4", children: title() }), jsxs("div", { className: "border border-gray-200 rounded-lg overflow-hidden", children: [isBelow('md') ? (jsx("div", { className: "space-y-4 p-2", children: paginatedData.length === 0 ? (jsxs("div", { className: "text-gray-500 text-center py-8", children: [jsx("div", { className: "text-4xl mb-2", children: "\uD83D\uDCCB" }), jsx("div", { children: "No data available" })] })) : (paginatedData.map((record, index) => {
|
|
225
|
+
return (jsxs("div", { className: cn("w-full", className), children: [title && jsx("div", { className: "mb-4", children: title() }), jsxs("div", { className: "border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden", children: [isBelow('md') ? (jsx("div", { className: "space-y-4 p-2", children: paginatedData.length === 0 ? (jsxs("div", { className: "text-gray-500 dark:text-gray-400 text-center py-8", children: [jsx("div", { className: "text-4xl mb-2", children: "\uD83D\uDCCB" }), jsx("div", { children: "No data available" })] })) : (paginatedData.map((record, index) => {
|
|
226
226
|
const key = getRowKey(record, index);
|
|
227
227
|
const isSelected = selectedRowKeys.includes(key);
|
|
228
228
|
return (jsx(Card, { variant: isSelected ? "elevated" : "default", padding: "sm", className: cn("transition-shadow", isSelected && "border-primary-600 shadow-lg"), children: jsxs(CardContent, { className: "space-y-2", children: [rowSelection && (jsxs("div", { className: "flex items-center mb-2", children: [jsx(Checkbox, { checked: isSelected, onChange: (e) => handleRowSelect(record, e.target.checked), ...rowSelection.getCheckboxProps?.(record) }), jsx("span", { className: "ml-2 text-xs text-gray-500", children: "Select" })] })), columns.map((column) => (jsxs("div", { className: "flex justify-between items-center py-1 border-b last:border-b-0", children: [jsx("span", { className: "font-medium text-gray-700", children: column.title }), jsx("span", { className: "text-gray-900", children: column.render
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.js","sources":["../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { useState, useMemo, useCallback } from \"react\";\nimport { \n ChevronUp, \n ChevronDown, \n Search, \n Filter, \n ChevronLeft, \n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n MoreHorizontal,\n Check,\n Minus\n} from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { Input } from \"../Input\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Badge } from \"../Badge\";\nimport { Spinner } from \"../Spinner\";\nimport { Skeleton } from \"../Skeleton\";\nimport { Card, CardContent } from \"../Card\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { Select } from \"../Select\";\nimport type {\n DataTableProps,\n Column,\n FilterValue,\n SortConfig,\n PaginationConfig,\n RowSelection\n} from \"./DataTable.types\";\n\nconst tableVariants = cva(\n \"w-full border-collapse bg-white\",\n {\n variants: {\n size: {\n small: \"text-xs\",\n middle: \"text-sm\",\n large: \"text-base\",\n },\n bordered: {\n true: \"border border-gray-200\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"middle\",\n bordered: false,\n },\n }\n);\n\nconst cellVariants = cva(\n \"border-b border-gray-200 transition-colors\",\n {\n variants: {\n size: {\n small: \"px-2 py-1\",\n middle: \"px-4 py-3\",\n large: \"px-6 py-4\",\n },\n align: {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n },\n type: {\n header: \"bg-gray-50 font-semibold text-gray-900 border-b-2 border-gray-200\",\n body: \"text-gray-700 hover:bg-gray-50\",\n },\n },\n defaultVariants: {\n size: \"middle\",\n align: \"left\",\n type: \"body\",\n },\n }\n);\n\n// Filter component for individual columns\nconst ColumnFilter = <T extends Record<string, any>>({\n column,\n value,\n onChange,\n}: {\n column: Column<T>;\n value: any;\n onChange: (value: any) => void;\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [tempValue, setTempValue] = useState(value || '');\n\n const handleApply = () => {\n onChange(tempValue);\n setIsOpen(false);\n };\n\n const handleClear = () => {\n setTempValue('');\n onChange('');\n setIsOpen(false);\n };\n\n if (!column.filterable) return null;\n\n return (\n <div className=\"relative inline-block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"p-1 h-6 w-6\",\n value && \"text-primary-600\"\n )}\n >\n <Filter className=\"h-3 w-3\" />\n </Button>\n \n {isOpen && (\n <>\n <div \n className=\"fixed inset-0 z-10\" \n onClick={() => setIsOpen(false)}\n />\n <div className=\"absolute top-full left-0 z-20 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg p-3 min-w-[200px]\">\n {column.filterType === 'select' && column.filterOptions ? (\n <div className=\"space-y-2\">\n {column.filterOptions.map((option) => (\n <label key={option.value} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={tempValue === option.value}\n onChange={() => setTempValue(\n tempValue === option.value ? '' : option.value\n )}\n />\n <span className=\"text-sm\">{option.label}</span>\n </label>\n ))}\n </div>\n ) : (\n <Input\n placeholder={`Filter ${column.title}`}\n value={tempValue}\n onChange={(e) => setTempValue(e.target.value)}\n className=\"mb-2\"\n />\n )}\n \n <div className=\"flex justify-end space-x-2 mt-3\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClear}>\n Clear\n </Button>\n <Button variant=\"primary\" size=\"sm\" onClick={handleApply}>\n Apply\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n\n// Pagination component\nconst TablePagination: React.FC<{\n pagination: PaginationConfig;\n onChange: (page: number, pageSize: number) => void;\n}> = ({ pagination, onChange }) => {\n const { current, pageSize, total, showSizeChanger = true, pageSizeOptions = [10, 20, 50, 100] } = pagination;\n const totalPages = Math.ceil(total / pageSize);\n const startRecord = (current - 1) * pageSize + 1;\n const endRecord = Math.min(current * pageSize, total);\n\n const getPageNumbers = () => {\n const pages = [];\n const maxVisible = 5;\n \n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n const start = Math.max(1, current - 2);\n const end = Math.min(totalPages, start + maxVisible - 1);\n \n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n }\n \n return pages;\n };\n\n // Convert pageSizeOptions to SelectOption format\n const selectOptions = pageSizeOptions.map(size => ({\n label: String(size),\n value: String(size),\n }));\n\n return (\n <div className=\"flex items-center justify-between px-4 py-3 bg-background border-t border-border\">\n <div className=\"flex items-center space-x-4\">\n <span className=\"text-sm text-foreground\">\n Showing {startRecord} to {endRecord} of {total} results\n </span>\n \n {showSizeChanger && (\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-foreground\">Show</span>\n <Select\n options={selectOptions}\n value={String(pageSize)}\n onChange={e => onChange(1, Number(e.target.value))}\n variant=\"default\"\n selectSize=\"sm\"\n aria-label=\"Select number of items per page\"\n />\n <span className=\"text-sm text-foreground\">per page</span>\n </div>\n )}\n </div>\n \n <div className=\"flex items-center space-x-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(1, pageSize)}\n disabled={current === 1}\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(current - 1, pageSize)}\n disabled={current === 1}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n {getPageNumbers().map(page => (\n <Button\n key={page}\n variant={current === page ? \"primary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => onChange(page, pageSize)}\n className=\"min-w-[32px]\"\n aria-label={`Go to page ${page}`}\n >\n {page}\n </Button>\n ))}\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(current + 1, pageSize)}\n disabled={current === totalPages}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(totalPages, pageSize)}\n disabled={current === totalPages}\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n};\n\nexport const DataTable = <T extends Record<string, any>>({\n columns,\n dataSource,\n loading = false,\n rowKey = 'id',\n pagination = { current: 1, pageSize: 10, total: 0 },\n rowSelection,\n size = 'middle',\n bordered = false,\n showHeader = true,\n title,\n footer,\n className,\n onSort,\n onFilter,\n onChange,\n ...props\n}: DataTableProps<T>) => {\n const [sortConfig, setSortConfig] = useState<SortConfig>({ key: '', direction: null });\n const [filters, setFilters] = useState<FilterValue>({});\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>(\n rowSelection?.selectedRowKeys || []\n );\n\n // Get row key function\n const getRowKey = useCallback((record: T, index: number): React.Key => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n return record[rowKey] || index;\n }, [rowKey]);\n\n // Handle sorting\n const handleSort = useCallback((columnKey: string) => {\n let newDirection: 'asc' | 'desc' | null;\n if (sortConfig.key !== columnKey) {\n newDirection = 'asc';\n } else if (sortConfig.direction === 'asc') {\n newDirection = 'desc';\n } else if (sortConfig.direction === 'desc') {\n newDirection = null;\n } else {\n newDirection = 'asc';\n }\n const newSortConfig: SortConfig = { key: columnKey, direction: newDirection };\n setSortConfig(newSortConfig);\n onSort?.(newSortConfig);\n onChange?.(pagination as PaginationConfig, filters, newSortConfig);\n }, [sortConfig, pagination, filters, onSort, onChange]);\n\n // Handle filtering\n const handleFilter = useCallback((columnKey: string, value: any) => {\n const newFilters = { ...filters };\n if (value === '' || value === null || value === undefined) {\n delete newFilters[columnKey];\n } else {\n newFilters[columnKey] = value;\n }\n \n setFilters(newFilters);\n onFilter?.(newFilters);\n onChange?.(pagination as PaginationConfig, newFilters, sortConfig);\n }, [filters, pagination, sortConfig, onFilter, onChange]);\n\n // Handle row selection\n const handleRowSelect = useCallback((record: T, selected: boolean) => {\n const key = getRowKey(record, 0);\n let newSelectedKeys: React.Key[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedKeys = selected ? [key] : [];\n } else {\n newSelectedKeys = selected \n ? [...selectedRowKeys, key]\n : selectedRowKeys.filter(k => k !== key);\n }\n \n setSelectedRowKeys(newSelectedKeys);\n const selectedRows = dataSource.filter(item => \n newSelectedKeys.includes(getRowKey(item, 0))\n );\n \n rowSelection?.onChange?.(newSelectedKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, {} as Event);\n }, [selectedRowKeys, rowSelection, dataSource, getRowKey]);\n\n // Handle select all\n const handleSelectAll = useCallback((selected: boolean) => {\n const newSelectedKeys = selected \n ? dataSource.map((item, index) => getRowKey(item, index))\n : [];\n \n setSelectedRowKeys(newSelectedKeys);\n const selectedRows = selected ? dataSource : [];\n \n rowSelection?.onChange?.(newSelectedKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, dataSource);\n }, [dataSource, rowSelection, getRowKey]);\n\n // Filter and sort data\n const processedData = useMemo(() => {\n let result = [...dataSource];\n \n // Apply filters\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== '' && value !== null && value !== undefined) {\n result = result.filter(item => {\n const itemValue = item[key];\n if (typeof itemValue === 'string') {\n return itemValue.toLowerCase().includes(String(value).toLowerCase());\n }\n return itemValue === value;\n });\n }\n });\n \n // Apply sorting\n if (sortConfig.key && sortConfig.direction) {\n result.sort((a, b) => {\n const aValue = a[sortConfig.key];\n const bValue = b[sortConfig.key];\n \n if (aValue === bValue) return 0;\n \n const comparison = aValue < bValue ? -1 : 1;\n return sortConfig.direction === 'asc' ? comparison : -comparison;\n });\n }\n \n return result;\n }, [dataSource, filters, sortConfig]);\n\n // Pagination logic\n const paginatedData = useMemo(() => {\n if (!pagination) return processedData;\n \n const { current, pageSize } = pagination;\n const startIndex = (current - 1) * pageSize;\n return processedData.slice(startIndex, startIndex + pageSize);\n }, [processedData, pagination]);\n\n // Update pagination total\n const currentPagination = useMemo(() => {\n if (!pagination) return false;\n return {\n ...pagination,\n total: processedData.length,\n };\n }, [pagination, processedData.length]);\n\n // Selection state\n const isAllSelected = selectedRowKeys.length === dataSource.length && dataSource.length > 0;\n const isIndeterminate = selectedRowKeys.length > 0 && selectedRowKeys.length < dataSource.length;\n\n // Mobile-first responsive: useBreakpoint to switch between table and card layouts\n const { isBelow } = useBreakpoint();\n\n if (loading) {\n return (\n <div className={cn(\"w-full\", className)}>\n {title && <div className=\"mb-4\">{title()}</div>}\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <div className=\"p-4 space-y-3\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"flex space-x-4\">\n <Skeleton className=\"h-4 w-8\" />\n <Skeleton className=\"h-4 flex-1\" />\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-16\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn(\"w-full\", className)}>\n {title && <div className=\"mb-4\">{title()}</div>}\n\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n {/* Card layout for mobile */}\n {isBelow('md') ? (\n <div className=\"space-y-4 p-2\">\n {paginatedData.length === 0 ? (\n <div className=\"text-gray-500 text-center py-8\">\n <div className=\"text-4xl mb-2\">📋</div>\n <div>No data available</div>\n </div>\n ) : (\n paginatedData.map((record, index) => {\n const key = getRowKey(record, index);\n const isSelected = selectedRowKeys.includes(key);\n\n return (\n <Card\n key={key}\n variant={isSelected ? \"elevated\" : \"default\"}\n padding=\"sm\"\n className={cn(\n \"transition-shadow\",\n isSelected && \"border-primary-600 shadow-lg\"\n )}\n >\n <CardContent className=\"space-y-2\">\n {rowSelection && (\n <div className=\"flex items-center mb-2\">\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleRowSelect(record, e.target.checked)}\n {...rowSelection.getCheckboxProps?.(record)}\n />\n <span className=\"ml-2 text-xs text-gray-500\">Select</span>\n </div>\n )}\n {columns.map((column) => (\n <div key={column.key} className=\"flex justify-between items-center py-1 border-b last:border-b-0\">\n <span className=\"font-medium text-gray-700\">{column.title}</span>\n <span className=\"text-gray-900\">\n {column.render\n ? column.render(record[column.dataIndex], record, index)\n : String(record[column.dataIndex] || '')\n }\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n );\n })\n )}\n </div>\n ) : (\n // Table layout for desktop/tablet\n <div className=\"overflow-x-auto\">\n <table className={cn(tableVariants({ size, bordered }))}>\n {showHeader && (\n <thead>\n <tr>\n {rowSelection && (\n <th className={cn(cellVariants({ size, type: \"header\" }), \"w-12\")}>\n {rowSelection.type !== 'radio' && (\n <Checkbox\n checked={isAllSelected}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className={cn(isIndeterminate && \"indeterminate\")}\n />\n )}\n </th>\n )}\n \n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n cellVariants({\n size,\n align: column.align,\n type: \"header\"\n }),\n column.width && `w-[${column.width}]`\n )}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <span>{column.title}</span>\n {column.sortable && (\n <button\n onClick={() => handleSort(column.key)}\n className=\"flex flex-col items-center hover:text-primary-600\"\n >\n <ChevronUp\n className={cn(\n \"h-3 w-3\",\n sortConfig.key === column.key && sortConfig.direction === 'asc'\n ? \"text-primary-600\"\n : \"text-gray-400\"\n )}\n />\n <ChevronDown\n className={cn(\n \"h-3 w-3 -mt-1\",\n sortConfig.key === column.key && sortConfig.direction === 'desc'\n ? \"text-primary-600\"\n : \"text-gray-400\"\n )}\n />\n </button>\n )}\n </div>\n \n <ColumnFilter\n column={column}\n value={filters[column.key]}\n onChange={(value) => handleFilter(column.key, value)}\n />\n </div>\n </th>\n ))}\n </tr>\n </thead>\n )}\n \n <tbody>\n {paginatedData.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length + (rowSelection ? 1 : 0)}\n className={cn(cellVariants({ size, align: \"center\" }), \"py-8\")}\n >\n <div className=\"text-gray-500\">\n <div className=\"text-4xl mb-2\">📋</div>\n <div>No data available</div>\n </div>\n </td>\n </tr>\n ) : (\n paginatedData.map((record, index) => {\n const key = getRowKey(record, index);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <tr\n key={key}\n className={cn(\n \"hover:bg-gray-50 transition-colors\",\n isSelected && \"bg-primary-50\"\n )}\n {...(props.onRow?.(record, index) ?? {})}\n >\n {rowSelection && (\n <td className={cn(cellVariants({ size }))}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleRowSelect(record, e.target.checked)}\n {...rowSelection.getCheckboxProps?.(record)}\n />\n </td>\n )}\n \n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(cellVariants({\n size,\n align: column.align\n }))}\n >\n {column.render\n ? column.render(record[column.dataIndex], record, index)\n : String(record[column.dataIndex] || '')\n }\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n )}\n {/* Always show pagination controls below data */}\n {currentPagination && (\n <div className=\"pt-2\">\n <TablePagination\n pagination={currentPagination}\n onChange={(page, pageSize) => {\n const newPagination = { ...currentPagination, current: page, pageSize };\n onChange?.(newPagination, filters, sortConfig);\n }}\n />\n </div>\n )}\n </div>\n\n {footer && <div className=\"mt-4\">{footer()}</div>}\n </div>\n );\n};\n\nDataTable.displayName = \"DataTable\";"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable.js","sources":["../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { useState, useMemo, useCallback } from \"react\";\nimport { \n ChevronUp, \n ChevronDown, \n Search, \n Filter, \n ChevronLeft, \n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n MoreHorizontal,\n Check,\n Minus\n} from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { Input } from \"../Input\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Badge } from \"../Badge\";\nimport { Spinner } from \"../Spinner\";\nimport { Skeleton } from \"../Skeleton\";\nimport { Card, CardContent } from \"../Card\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { Select } from \"../Select\";\nimport type {\n DataTableProps,\n Column,\n FilterValue,\n SortConfig,\n PaginationConfig,\n RowSelection\n} from \"./DataTable.types\";\n\nconst tableVariants = cva(\n \"w-full border-collapse bg-white dark:bg-gray-900\",\n {\n variants: {\n size: {\n small: \"text-xs\",\n middle: \"text-sm\",\n large: \"text-base\",\n },\n bordered: {\n true: \"border border-gray-200 dark:border-gray-800\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"middle\",\n bordered: false,\n },\n }\n);\n\nconst cellVariants = cva(\n \"border-b border-gray-200 dark:border-gray-800 transition-colors\",\n {\n variants: {\n size: {\n small: \"px-2 py-1\",\n middle: \"px-4 py-3\",\n large: \"px-6 py-4\",\n },\n align: {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n },\n type: {\n header: \"bg-gray-50 dark:bg-gray-800/50 font-semibold text-gray-900 dark:text-gray-100 border-b-2 border-gray-200 dark:border-gray-800\",\n body: \"text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800/50\",\n },\n },\n defaultVariants: {\n size: \"middle\",\n align: \"left\",\n type: \"body\",\n },\n }\n);\n\n// Filter component for individual columns\nconst ColumnFilter = <T extends Record<string, any>>({\n column,\n value,\n onChange,\n}: {\n column: Column<T>;\n value: any;\n onChange: (value: any) => void;\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [tempValue, setTempValue] = useState(value || '');\n\n const handleApply = () => {\n onChange(tempValue);\n setIsOpen(false);\n };\n\n const handleClear = () => {\n setTempValue('');\n onChange('');\n setIsOpen(false);\n };\n\n if (!column.filterable) return null;\n\n return (\n <div className=\"relative inline-block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"p-1 h-6 w-6\",\n value && \"text-primary-600\"\n )}\n >\n <Filter className=\"h-3 w-3\" />\n </Button>\n \n {isOpen && (\n <>\n <div \n className=\"fixed inset-0 z-10\" \n onClick={() => setIsOpen(false)}\n />\n <div className=\"absolute top-full left-0 z-20 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg p-3 min-w-[200px]\">\n {column.filterType === 'select' && column.filterOptions ? (\n <div className=\"space-y-2\">\n {column.filterOptions.map((option) => (\n <label key={option.value} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={tempValue === option.value}\n onChange={() => setTempValue(\n tempValue === option.value ? '' : option.value\n )}\n />\n <span className=\"text-sm\">{option.label}</span>\n </label>\n ))}\n </div>\n ) : (\n <Input\n placeholder={`Filter ${column.title}`}\n value={tempValue}\n onChange={(e) => setTempValue(e.target.value)}\n className=\"mb-2\"\n />\n )}\n \n <div className=\"flex justify-end space-x-2 mt-3\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClear}>\n Clear\n </Button>\n <Button variant=\"primary\" size=\"sm\" onClick={handleApply}>\n Apply\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n\n// Pagination component\nconst TablePagination: React.FC<{\n pagination: PaginationConfig;\n onChange: (page: number, pageSize: number) => void;\n}> = ({ pagination, onChange }) => {\n const { current, pageSize, total, showSizeChanger = true, pageSizeOptions = [10, 20, 50, 100] } = pagination;\n const totalPages = Math.ceil(total / pageSize);\n const startRecord = (current - 1) * pageSize + 1;\n const endRecord = Math.min(current * pageSize, total);\n\n const getPageNumbers = () => {\n const pages = [];\n const maxVisible = 5;\n \n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n const start = Math.max(1, current - 2);\n const end = Math.min(totalPages, start + maxVisible - 1);\n \n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n }\n \n return pages;\n };\n\n // Convert pageSizeOptions to SelectOption format\n const selectOptions = pageSizeOptions.map(size => ({\n label: String(size),\n value: String(size),\n }));\n\n return (\n <div className=\"flex items-center justify-between px-4 py-3 bg-background border-t border-border\">\n <div className=\"flex items-center space-x-4\">\n <span className=\"text-sm text-foreground\">\n Showing {startRecord} to {endRecord} of {total} results\n </span>\n \n {showSizeChanger && (\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-foreground\">Show</span>\n <Select\n options={selectOptions}\n value={String(pageSize)}\n onChange={e => onChange(1, Number(e.target.value))}\n variant=\"default\"\n selectSize=\"sm\"\n aria-label=\"Select number of items per page\"\n />\n <span className=\"text-sm text-foreground\">per page</span>\n </div>\n )}\n </div>\n \n <div className=\"flex items-center space-x-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(1, pageSize)}\n disabled={current === 1}\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(current - 1, pageSize)}\n disabled={current === 1}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n \n {getPageNumbers().map(page => (\n <Button\n key={page}\n variant={current === page ? \"primary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => onChange(page, pageSize)}\n className=\"min-w-[32px]\"\n aria-label={`Go to page ${page}`}\n >\n {page}\n </Button>\n ))}\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(current + 1, pageSize)}\n disabled={current === totalPages}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n \n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange(totalPages, pageSize)}\n disabled={current === totalPages}\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n};\n\nexport const DataTable = <T extends Record<string, any>>({\n columns,\n dataSource,\n loading = false,\n rowKey = 'id',\n pagination = { current: 1, pageSize: 10, total: 0 },\n rowSelection,\n size = 'middle',\n bordered = false,\n showHeader = true,\n title,\n footer,\n className,\n onSort,\n onFilter,\n onChange,\n ...props\n}: DataTableProps<T>) => {\n const [sortConfig, setSortConfig] = useState<SortConfig>({ key: '', direction: null });\n const [filters, setFilters] = useState<FilterValue>({});\n const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>(\n rowSelection?.selectedRowKeys || []\n );\n\n // Get row key function\n const getRowKey = useCallback((record: T, index: number): React.Key => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n return record[rowKey] || index;\n }, [rowKey]);\n\n // Handle sorting\n const handleSort = useCallback((columnKey: string) => {\n let newDirection: 'asc' | 'desc' | null;\n if (sortConfig.key !== columnKey) {\n newDirection = 'asc';\n } else if (sortConfig.direction === 'asc') {\n newDirection = 'desc';\n } else if (sortConfig.direction === 'desc') {\n newDirection = null;\n } else {\n newDirection = 'asc';\n }\n const newSortConfig: SortConfig = { key: columnKey, direction: newDirection };\n setSortConfig(newSortConfig);\n onSort?.(newSortConfig);\n onChange?.(pagination as PaginationConfig, filters, newSortConfig);\n }, [sortConfig, pagination, filters, onSort, onChange]);\n\n // Handle filtering\n const handleFilter = useCallback((columnKey: string, value: any) => {\n const newFilters = { ...filters };\n if (value === '' || value === null || value === undefined) {\n delete newFilters[columnKey];\n } else {\n newFilters[columnKey] = value;\n }\n \n setFilters(newFilters);\n onFilter?.(newFilters);\n onChange?.(pagination as PaginationConfig, newFilters, sortConfig);\n }, [filters, pagination, sortConfig, onFilter, onChange]);\n\n // Handle row selection\n const handleRowSelect = useCallback((record: T, selected: boolean) => {\n const key = getRowKey(record, 0);\n let newSelectedKeys: React.Key[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedKeys = selected ? [key] : [];\n } else {\n newSelectedKeys = selected \n ? [...selectedRowKeys, key]\n : selectedRowKeys.filter(k => k !== key);\n }\n \n setSelectedRowKeys(newSelectedKeys);\n const selectedRows = dataSource.filter(item => \n newSelectedKeys.includes(getRowKey(item, 0))\n );\n \n rowSelection?.onChange?.(newSelectedKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, {} as Event);\n }, [selectedRowKeys, rowSelection, dataSource, getRowKey]);\n\n // Handle select all\n const handleSelectAll = useCallback((selected: boolean) => {\n const newSelectedKeys = selected \n ? dataSource.map((item, index) => getRowKey(item, index))\n : [];\n \n setSelectedRowKeys(newSelectedKeys);\n const selectedRows = selected ? dataSource : [];\n \n rowSelection?.onChange?.(newSelectedKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, dataSource);\n }, [dataSource, rowSelection, getRowKey]);\n\n // Filter and sort data\n const processedData = useMemo(() => {\n let result = [...dataSource];\n \n // Apply filters\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== '' && value !== null && value !== undefined) {\n result = result.filter(item => {\n const itemValue = item[key];\n if (typeof itemValue === 'string') {\n return itemValue.toLowerCase().includes(String(value).toLowerCase());\n }\n return itemValue === value;\n });\n }\n });\n \n // Apply sorting\n if (sortConfig.key && sortConfig.direction) {\n result.sort((a, b) => {\n const aValue = a[sortConfig.key];\n const bValue = b[sortConfig.key];\n \n if (aValue === bValue) return 0;\n \n const comparison = aValue < bValue ? -1 : 1;\n return sortConfig.direction === 'asc' ? comparison : -comparison;\n });\n }\n \n return result;\n }, [dataSource, filters, sortConfig]);\n\n // Pagination logic\n const paginatedData = useMemo(() => {\n if (!pagination) return processedData;\n \n const { current, pageSize } = pagination;\n const startIndex = (current - 1) * pageSize;\n return processedData.slice(startIndex, startIndex + pageSize);\n }, [processedData, pagination]);\n\n // Update pagination total\n const currentPagination = useMemo(() => {\n if (!pagination) return false;\n return {\n ...pagination,\n total: processedData.length,\n };\n }, [pagination, processedData.length]);\n\n // Selection state\n const isAllSelected = selectedRowKeys.length === dataSource.length && dataSource.length > 0;\n const isIndeterminate = selectedRowKeys.length > 0 && selectedRowKeys.length < dataSource.length;\n\n // Mobile-first responsive: useBreakpoint to switch between table and card layouts\n const { isBelow } = useBreakpoint();\n\n if (loading) {\n return (\n <div className={cn(\"w-full\", className)}>\n {title && <div className=\"mb-4\">{title()}</div>}\n <div className=\"border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden\">\n <div className=\"p-4 space-y-3\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"flex space-x-4\">\n <Skeleton className=\"h-4 w-8\" />\n <Skeleton className=\"h-4 flex-1\" />\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-16\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn(\"w-full\", className)}>\n {title && <div className=\"mb-4\">{title()}</div>}\n\n <div className=\"border border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden\">\n {/* Card layout for mobile */}\n {isBelow('md') ? (\n <div className=\"space-y-4 p-2\">\n {paginatedData.length === 0 ? (\n <div className=\"text-gray-500 dark:text-gray-400 text-center py-8\">\n <div className=\"text-4xl mb-2\">📋</div>\n <div>No data available</div>\n </div>\n ) : (\n paginatedData.map((record, index) => {\n const key = getRowKey(record, index);\n const isSelected = selectedRowKeys.includes(key);\n\n return (\n <Card\n key={key}\n variant={isSelected ? \"elevated\" : \"default\"}\n padding=\"sm\"\n className={cn(\n \"transition-shadow\",\n isSelected && \"border-primary-600 shadow-lg\"\n )}\n >\n <CardContent className=\"space-y-2\">\n {rowSelection && (\n <div className=\"flex items-center mb-2\">\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleRowSelect(record, e.target.checked)}\n {...rowSelection.getCheckboxProps?.(record)}\n />\n <span className=\"ml-2 text-xs text-gray-500\">Select</span>\n </div>\n )}\n {columns.map((column) => (\n <div key={column.key} className=\"flex justify-between items-center py-1 border-b last:border-b-0\">\n <span className=\"font-medium text-gray-700\">{column.title}</span>\n <span className=\"text-gray-900\">\n {column.render\n ? column.render(record[column.dataIndex], record, index)\n : String(record[column.dataIndex] || '')\n }\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n );\n })\n )}\n </div>\n ) : (\n // Table layout for desktop/tablet\n <div className=\"overflow-x-auto\">\n <table className={cn(tableVariants({ size, bordered }))}>\n {showHeader && (\n <thead>\n <tr>\n {rowSelection && (\n <th className={cn(cellVariants({ size, type: \"header\" }), \"w-12\")}>\n {rowSelection.type !== 'radio' && (\n <Checkbox\n checked={isAllSelected}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className={cn(isIndeterminate && \"indeterminate\")}\n />\n )}\n </th>\n )}\n \n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n cellVariants({\n size,\n align: column.align,\n type: \"header\"\n }),\n column.width && `w-[${column.width}]`\n )}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <span>{column.title}</span>\n {column.sortable && (\n <button\n onClick={() => handleSort(column.key)}\n className=\"flex flex-col items-center hover:text-primary-600\"\n >\n <ChevronUp\n className={cn(\n \"h-3 w-3\",\n sortConfig.key === column.key && sortConfig.direction === 'asc'\n ? \"text-primary-600\"\n : \"text-gray-400\"\n )}\n />\n <ChevronDown\n className={cn(\n \"h-3 w-3 -mt-1\",\n sortConfig.key === column.key && sortConfig.direction === 'desc'\n ? \"text-primary-600\"\n : \"text-gray-400\"\n )}\n />\n </button>\n )}\n </div>\n \n <ColumnFilter\n column={column}\n value={filters[column.key]}\n onChange={(value) => handleFilter(column.key, value)}\n />\n </div>\n </th>\n ))}\n </tr>\n </thead>\n )}\n \n <tbody>\n {paginatedData.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length + (rowSelection ? 1 : 0)}\n className={cn(cellVariants({ size, align: \"center\" }), \"py-8\")}\n >\n <div className=\"text-gray-500\">\n <div className=\"text-4xl mb-2\">📋</div>\n <div>No data available</div>\n </div>\n </td>\n </tr>\n ) : (\n paginatedData.map((record, index) => {\n const key = getRowKey(record, index);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <tr\n key={key}\n className={cn(\n \"hover:bg-gray-50 transition-colors\",\n isSelected && \"bg-primary-50\"\n )}\n {...(props.onRow?.(record, index) ?? {})}\n >\n {rowSelection && (\n <td className={cn(cellVariants({ size }))}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleRowSelect(record, e.target.checked)}\n {...rowSelection.getCheckboxProps?.(record)}\n />\n </td>\n )}\n \n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(cellVariants({\n size,\n align: column.align\n }))}\n >\n {column.render\n ? column.render(record[column.dataIndex], record, index)\n : String(record[column.dataIndex] || '')\n }\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n )}\n {/* Always show pagination controls below data */}\n {currentPagination && (\n <div className=\"pt-2\">\n <TablePagination\n pagination={currentPagination}\n onChange={(page, pageSize) => {\n const newPagination = { ...currentPagination, current: page, pageSize };\n onChange?.(newPagination, filters, sortConfig);\n }}\n />\n </div>\n )}\n </div>\n\n {footer && <div className=\"mt-4\">{footer()}</div>}\n </div>\n );\n};\n\nDataTable.displayName = \"DataTable\";"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { X } from 'lucide-react';
|
|
|
3
3
|
import { cva } from 'class-variance-authority';
|
|
4
4
|
import { cn } from '../../utils/cn.js';
|
|
5
5
|
|
|
6
|
-
const modalVariants = cva("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-white p-6 shadow-lg duration-200 sm:rounded-lg", {
|
|
6
|
+
const modalVariants = cva("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 p-6 shadow-lg duration-200 sm:rounded-lg", {
|
|
7
7
|
variants: {
|
|
8
8
|
size: {
|
|
9
9
|
sm: "max-w-sm",
|
|
@@ -26,8 +26,8 @@ const Modal = ({ open, onOpenChange, children, size, }) => {
|
|
|
26
26
|
return (jsxs(Fragment, { children: [jsx("div", { className: "fixed inset-0 z-50 bg-black/50 backdrop-blur-sm", onClick: handleClose }), jsxs("div", { className: cn(modalVariants({ size })), children: [jsxs("button", { onClick: handleClose, className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 disabled:pointer-events-none", children: [jsx(X, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: "Close" })] }), children] })] }));
|
|
27
27
|
};
|
|
28
28
|
const ModalHeader = ({ className, ...props }) => (jsx("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props }));
|
|
29
|
-
const ModalTitle = ({ className, ...props }) => (jsx("h2", { className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
|
|
30
|
-
const ModalDescription = ({ className, ...props }) => (jsx("p", { className: cn("text-sm text-gray-500", className), ...props }));
|
|
29
|
+
const ModalTitle = ({ className, ...props }) => (jsx("h2", { className: cn("text-lg font-semibold leading-none tracking-tight text-gray-900 dark:text-white", className), ...props }));
|
|
30
|
+
const ModalDescription = ({ className, ...props }) => (jsx("p", { className: cn("text-sm text-gray-500 dark:text-gray-400", className), ...props }));
|
|
31
31
|
const ModalContent = ({ className, ...props }) => (jsx("div", { className: cn("grid gap-4 py-4", className), ...props }));
|
|
32
32
|
const ModalFooter = ({ className, ...props }) => (jsx("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props }));
|
|
33
33
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { X } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst modalVariants = cva(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-white p-6 shadow-lg duration-200 sm:rounded-lg\",\n {\n variants: {\n size: {\n sm: \"max-w-sm\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[95vw] max-h-[95vh]\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\ninterface ModalProps extends VariantProps<typeof modalVariants> {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nconst Modal: React.FC<ModalProps> = ({ \n open, \n onOpenChange, \n children, \n size,\n}) => {\n const handleClose = () => {\n onOpenChange?.(false);\n };\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm\"\n onClick={handleClose}\n />\n \n {/* Modal Content */}\n <div className={cn(modalVariants({ size }))}>\n <button\n onClick={handleClose}\n className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 disabled:pointer-events-none\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </button>\n {children}\n </div>\n </>\n );\n};\n\nconst ModalHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\n\nconst ModalTitle: React.FC<React.HTMLAttributes<HTMLHeadingElement>> = ({\n className,\n ...props\n}) => (\n <h2\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n);\n\nconst ModalDescription: React.FC<React.HTMLAttributes<HTMLParagraphElement>> = ({\n className,\n ...props\n}) => (\n <p\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n);\n\nconst ModalContent: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div className={cn(\"grid gap-4 py-4\", className)} {...props} />\n);\n\nconst ModalFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\n\nexport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalContent,\n ModalFooter,\n modalVariants,\n};"],"names":["_jsxs","_Fragment","_jsx"],"mappings":";;;;;AAKA,MAAM,aAAa,GAAG,GAAG,CACvB,
|
|
1
|
+
{"version":3,"file":"Modal.js","sources":["../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { X } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst modalVariants = cva(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 p-6 shadow-lg duration-200 sm:rounded-lg\",\n {\n variants: {\n size: {\n sm: \"max-w-sm\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[95vw] max-h-[95vh]\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\ninterface ModalProps extends VariantProps<typeof modalVariants> {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nconst Modal: React.FC<ModalProps> = ({ \n open, \n onOpenChange, \n children, \n size,\n}) => {\n const handleClose = () => {\n onOpenChange?.(false);\n };\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm\"\n onClick={handleClose}\n />\n \n {/* Modal Content */}\n <div className={cn(modalVariants({ size }))}>\n <button\n onClick={handleClose}\n className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 disabled:pointer-events-none\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </button>\n {children}\n </div>\n </>\n );\n};\n\nconst ModalHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\n\nconst ModalTitle: React.FC<React.HTMLAttributes<HTMLHeadingElement>> = ({\n className,\n ...props\n}) => (\n <h2\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight text-gray-900 dark:text-white\",\n className\n )}\n {...props}\n />\n);\n\nconst ModalDescription: React.FC<React.HTMLAttributes<HTMLParagraphElement>> = ({\n className,\n ...props\n}) => (\n <p\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n);\n\nconst ModalContent: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div className={cn(\"grid gap-4 py-4\", className)} {...props} />\n);\n\nconst ModalFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n className,\n ...props\n}) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\n\nexport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalContent,\n ModalFooter,\n modalVariants,\n};"],"names":["_jsxs","_Fragment","_jsx"],"mappings":";;;;;AAKA,MAAM,aAAa,GAAG,GAAG,CACvB,iNAAiN,EACjN;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,UAAU;AACd,YAAA,EAAE,EAAE,UAAU;AACd,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,IAAI,EAAE,2BAA2B;AAClC,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AASH,MAAM,KAAK,GAAyB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,IAAI,GACL,KAAI;IACH,MAAM,WAAW,GAAG,MAAK;AACvB,QAAA,YAAY,GAAG,KAAK,CAAC;AACvB,IAAA,CAAC;AAED,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;IAEtB,QACEA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CAEEC,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,iDAAiD,EAC3D,OAAO,EAAE,WAAW,EAAA,CACpB,EAGFF,cAAK,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAA,QAAA,EAAA,CACzCA,IAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,6MAA6M,aAEvNE,GAAA,CAAC,CAAC,EAAA,EAAC,SAAS,EAAC,SAAS,GAAG,EACzBA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,OAAA,EAAA,CAAa,CAAA,EAAA,CAC/B,EACR,QAAQ,CAAA,EAAA,CACL,CAAA,EAAA,CACL;AAEP;AAEA,MAAM,WAAW,GAAmD,CAAC,EACnE,SAAS,EACT,GAAG,KAAK,EACT,MACCA,aACE,SAAS,EAAE,EAAE,CACX,oDAAoD,EACpD,SAAS,CACV,EAAA,GACG,KAAK,EAAA,CACT;AAGJ,MAAM,UAAU,GAAuD,CAAC,EACtE,SAAS,EACT,GAAG,KAAK,EACT,MACCA,YACE,SAAS,EAAE,EAAE,CACX,iFAAiF,EACjF,SAAS,CACV,EAAA,GACG,KAAK,EAAA,CACT;AAGJ,MAAM,gBAAgB,GAAyD,CAAC,EAC9E,SAAS,EACT,GAAG,KAAK,EACT,MACCA,WACE,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,SAAS,CAAC,EAAA,GAChE,KAAK,EAAA,CACT;AAGJ,MAAM,YAAY,GAAmD,CAAC,EACpE,SAAS,EACT,GAAG,KAAK,EACT,MACCA,aAAK,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAAA,GAAM,KAAK,EAAA,CAAI;AAGjE,MAAM,WAAW,GAAmD,CAAC,EACnE,SAAS,EACT,GAAG,KAAK,EACT,MACCA,aACE,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,SAAS,CACV,EAAA,GACG,KAAK,EAAA,CACT;;;;"}
|
|
@@ -9,7 +9,7 @@ import { cn } from '../../utils/cn.js';
|
|
|
9
9
|
* - Can be used for any section (profile, info, address, custom).
|
|
10
10
|
* - Theme-agnostic, accessible, and fully typed.
|
|
11
11
|
*/
|
|
12
|
-
const ProfileCard = ({ header, children, footer, className, style, ...rest }) => (jsxs(Card, { className: cn("flex flex-col gap-4 p-6 rounded-xl bg-white shadow-sm border border-gray-100 mb-6", className), style: style, ...rest, children: [header && (jsx("div", { className: "flex items-center justify-between mb-2", children: header })), jsx("div", { className: "flex-1", children: children }), footer && (jsx("div", { className: "mt-4", children: footer }))] }));
|
|
12
|
+
const ProfileCard = ({ header, children, footer, className, style, ...rest }) => (jsxs(Card, { className: cn("flex flex-col gap-4 p-6 rounded-xl bg-white dark:bg-gray-900 shadow-sm border border-gray-100 dark:border-gray-800 mb-6", className), style: style, ...rest, children: [header && (jsx("div", { className: "flex items-center justify-between mb-2", children: header })), jsx("div", { className: "flex-1", children: children }), footer && (jsx("div", { className: "mt-4", children: footer }))] }));
|
|
13
13
|
ProfileCard.displayName = "ProfileCard";
|
|
14
14
|
|
|
15
15
|
export { ProfileCard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileCard.js","sources":["../../../src/components/ProfileManagement/ProfileCard.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Card } from \"../Card\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ProfileCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Optional section title/header */\n header?: React.ReactNode;\n /** Main content of the card (fields, avatar, actions, etc.) */\n children: React.ReactNode;\n /** Optional footer (actions, buttons, etc.) */\n footer?: React.ReactNode;\n /** Card className override */\n className?: string;\n /** Card style override */\n style?: React.CSSProperties;\n}\n\n/**\n * ProfileCard\n * - Fully reusable, dynamic card for profile management UIs.\n * - Consumer controls all content via children/render prop.\n * - Can be used for any section (profile, info, address, custom).\n * - Theme-agnostic, accessible, and fully typed.\n */\nexport const ProfileCard: React.FC<ProfileCardProps> = ({\n header,\n children,\n footer,\n className,\n style,\n ...rest\n}) => (\n <Card\n className={cn(\n \"flex flex-col gap-4 p-6 rounded-xl bg-white shadow-sm border border-gray-100 mb-6\",\n className\n )}\n style={style}\n {...rest}\n >\n {header && (\n <div className=\"flex items-center justify-between mb-2\">\n {header}\n </div>\n )}\n <div className=\"flex-1\">{children}</div>\n {footer && (\n <div className=\"mt-4\">{footer}</div>\n )}\n </Card>\n);\n\nProfileCard.displayName = \"ProfileCard\";"],"names":["_jsxs","_jsx"],"mappings":";;;;AAiBA;;;;;;AAMG;AACI,MAAM,WAAW,GAA+B,CAAC,EACtD,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,MACCA,IAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAE,EAAE,CACX,
|
|
1
|
+
{"version":3,"file":"ProfileCard.js","sources":["../../../src/components/ProfileManagement/ProfileCard.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Card } from \"../Card\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface ProfileCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Optional section title/header */\n header?: React.ReactNode;\n /** Main content of the card (fields, avatar, actions, etc.) */\n children: React.ReactNode;\n /** Optional footer (actions, buttons, etc.) */\n footer?: React.ReactNode;\n /** Card className override */\n className?: string;\n /** Card style override */\n style?: React.CSSProperties;\n}\n\n/**\n * ProfileCard\n * - Fully reusable, dynamic card for profile management UIs.\n * - Consumer controls all content via children/render prop.\n * - Can be used for any section (profile, info, address, custom).\n * - Theme-agnostic, accessible, and fully typed.\n */\nexport const ProfileCard: React.FC<ProfileCardProps> = ({\n header,\n children,\n footer,\n className,\n style,\n ...rest\n}) => (\n <Card\n className={cn(\n \"flex flex-col gap-4 p-6 rounded-xl bg-white dark:bg-gray-900 shadow-sm border border-gray-100 dark:border-gray-800 mb-6\",\n className\n )}\n style={style}\n {...rest}\n >\n {header && (\n <div className=\"flex items-center justify-between mb-2\">\n {header}\n </div>\n )}\n <div className=\"flex-1\">{children}</div>\n {footer && (\n <div className=\"mt-4\">{footer}</div>\n )}\n </Card>\n);\n\nProfileCard.displayName = \"ProfileCard\";"],"names":["_jsxs","_jsx"],"mappings":";;;;AAiBA;;;;;;AAMG;AACI,MAAM,WAAW,GAA+B,CAAC,EACtD,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,MACCA,IAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAE,EAAE,CACX,yHAAyH,EACzH,SAAS,CACV,EACD,KAAK,EAAE,KAAK,EAAA,GACR,IAAI,EAAA,QAAA,EAAA,CAEP,MAAM,KACLC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,YACpD,MAAM,EAAA,CACH,CACP,EACDA,aAAK,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAE,QAAQ,EAAA,CAAO,EACvC,MAAM,KACLA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,MAAM,YAAE,MAAM,EAAA,CAAO,CACrC,CAAA,EAAA,CACI;AAGT,WAAW,CAAC,WAAW,GAAG,aAAa;;;;"}
|
|
@@ -9,7 +9,7 @@ import { ProfileButton } from './ProfileButton.js';
|
|
|
9
9
|
import { LogoutButton } from './LogoutButton.js';
|
|
10
10
|
import { SidebarHeader } from './SidebarHeader.js';
|
|
11
11
|
|
|
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", {
|
|
12
|
+
const sidebarVariants = cva("fixed left-0 top-0 z-40 h-screen bg-white dark:bg-gray-900 border-r border-gray-200 dark:border-gray-800 transition-all duration-300 ease-in-out", {
|
|
13
13
|
variants: {
|
|
14
14
|
collapsed: {
|
|
15
15
|
false: "w-72",
|
|
@@ -23,8 +23,8 @@ const sidebarVariants = cva("fixed left-0 top-0 z-40 h-screen bg-white border-r
|
|
|
23
23
|
const menuItemVariants = cva("flex items-center w-full px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-200 group", {
|
|
24
24
|
variants: {
|
|
25
25
|
active: {
|
|
26
|
-
true: "bg-primary-50 text-primary-700 border-r-2 border-primary-600",
|
|
27
|
-
false: "text-gray-700 hover:bg-gray-50 hover:text-gray-900",
|
|
26
|
+
true: "bg-primary-50 dark:bg-primary-900/20 text-primary-700 dark:text-primary-400 border-r-2 border-primary-600",
|
|
27
|
+
false: "text-gray-700 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800/50 hover:text-gray-900 dark:hover:text-white",
|
|
28
28
|
},
|
|
29
29
|
collapsed: {
|
|
30
30
|
true: "justify-center px-2",
|
|
@@ -114,9 +114,9 @@ const Sidebar = React.forwardRef(({ className, collapsed = false, onToggle, menu
|
|
|
114
114
|
};
|
|
115
115
|
// Profile section props with fallbacks
|
|
116
116
|
const { avatarUrl = "https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64", name = "John Doe", email = "john@company.com", avatarFallback = "JD", collapsedAvatarSize = "sm", expandedAvatarSize = "sm", onClick } = profileSectionProps || {};
|
|
117
|
-
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: jsx("div", { className: cn("rounded-lg transition-colors", onClick && "cursor-pointer hover:bg-primary-50 focus:bg-primary-100 outline-none ring-2 ring-transparent focus:ring-primary-300"), tabIndex: onClick ? 0 : undefined, role: onClick ? "button" : undefined, "aria-label": onClick ? "View profile" : undefined, onClick: onClick, onKeyDown: onClick ? (e) => { if (e.key === "Enter" || e.key === " ")
|
|
117
|
+
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 dark:border-gray-800", children: [!collapsed && (jsx(SidebarHeader, { title: title, letter: titleLetter, className: headerClassName })), jsx("button", { onClick: onToggle, className: "p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors", children: collapsed ? (jsx(ChevronRight, { className: "h-4 w-4 text-gray-600 dark:text-gray-400" })) : (jsx(ChevronLeft, { className: "h-4 w-4 text-gray-600 dark:text-gray-400" })) })] }), 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 dark:border-gray-800 p-4", children: collapsed ? (jsx("div", { className: "flex justify-center", children: jsx("div", { className: cn("rounded-lg transition-colors", onClick && "cursor-pointer hover:bg-primary-50 focus:bg-primary-100 outline-none ring-2 ring-transparent focus:ring-primary-300"), tabIndex: onClick ? 0 : undefined, role: onClick ? "button" : undefined, "aria-label": onClick ? "View profile" : undefined, onClick: onClick, onKeyDown: onClick ? (e) => { if (e.key === "Enter" || e.key === " ")
|
|
118
118
|
onClick(e); } : undefined, children: jsxs(Avatar, { size: collapsedAvatarSize, children: [jsx(AvatarImage, { src: avatarUrl }), jsx(AvatarFallback, { children: avatarFallback })] }) }) })) : (jsxs("div", { className: "space-y-3", children: [jsxs("div", { className: cn("flex items-center space-x-3 rounded-lg transition-colors", onClick && "cursor-pointer hover:bg-primary-50 focus:bg-primary-100 outline-none ring-2 ring-transparent focus:ring-primary-300"), tabIndex: onClick ? 0 : undefined, role: onClick ? "button" : undefined, "aria-label": onClick ? "View profile" : undefined, onClick: onClick, onKeyDown: onClick ? (e) => { if (e.key === "Enter" || e.key === " ")
|
|
119
|
-
onClick(e); } : undefined, children: [jsxs(Avatar, { size: expandedAvatarSize, children: [jsx(AvatarImage, { src: avatarUrl }), jsx(AvatarFallback, { children: avatarFallback })] }), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("p", { className: "text-sm font-medium text-gray-900 truncate", children: name }), jsx("p", { className: "text-xs text-gray-500 truncate", children: email })] })] }), jsxs("div", { className: "flex space-x-2", children: [jsx(ProfileButton, { className: "flex-1", ...profileButtonProps }), jsx(LogoutButton, { className: "flex-1", ...logoutButtonProps })] })] })) })] }));
|
|
119
|
+
onClick(e); } : undefined, children: [jsxs(Avatar, { size: expandedAvatarSize, children: [jsx(AvatarImage, { src: avatarUrl }), jsx(AvatarFallback, { children: avatarFallback })] }), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("p", { className: "text-sm font-medium text-gray-900 dark:text-white truncate", children: name }), jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 truncate", children: email })] })] }), jsxs("div", { className: "flex space-x-2", children: [jsx(ProfileButton, { className: "flex-1", ...profileButtonProps }), jsx(LogoutButton, { className: "flex-1", ...logoutButtonProps })] })] })) })] }));
|
|
120
120
|
});
|
|
121
121
|
Sidebar.displayName = "Sidebar";
|
|
122
122
|
|
|
@@ -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\";\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\nexport interface SidebarProfileSectionProps {\n avatarUrl?: string;\n name?: string;\n email?: string;\n avatarFallback?: string;\n collapsedAvatarSize?: \"sm\" | \"md\" | \"lg\";\n expandedAvatarSize?: \"sm\" | \"md\" | \"lg\";\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n}\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 /** Dynamic profile section props */\n profileSectionProps?: SidebarProfileSectionProps;\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 profileSectionProps,\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 // Profile section props with fallbacks\n const {\n avatarUrl = \"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\",\n name = \"John Doe\",\n email = \"john@company.com\",\n avatarFallback = \"JD\",\n collapsedAvatarSize = \"sm\",\n expandedAvatarSize = \"sm\",\n onClick\n } = profileSectionProps || {};\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 {/* Sidebar Header */}\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 <div\n className={cn(\n \"rounded-lg transition-colors\",\n onClick && \"cursor-pointer hover:bg-primary-50 focus:bg-primary-100 outline-none ring-2 ring-transparent focus:ring-primary-300\"\n )}\n tabIndex={onClick ? 0 : undefined}\n role={onClick ? \"button\" : undefined}\n aria-label={onClick ? \"View profile\" : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => { if (e.key === \"Enter\" || e.key === \" \") onClick(e as any); } : undefined}\n >\n <Avatar size={collapsedAvatarSize}>\n <AvatarImage src={avatarUrl} />\n <AvatarFallback>{avatarFallback}</AvatarFallback>\n </Avatar>\n </div>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div\n className={cn(\n \"flex items-center space-x-3 rounded-lg transition-colors\",\n onClick && \"cursor-pointer hover:bg-primary-50 focus:bg-primary-100 outline-none ring-2 ring-transparent focus:ring-primary-300\"\n )}\n tabIndex={onClick ? 0 : undefined}\n role={onClick ? \"button\" : undefined}\n aria-label={onClick ? \"View profile\" : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => { if (e.key === \"Enter\" || e.key === \" \") onClick(e as any); } : undefined}\n >\n <Avatar size={expandedAvatarSize}>\n <AvatarImage src={avatarUrl} />\n <AvatarFallback>{avatarFallback}</AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n {name}\n </p>\n <p className=\"text-xs text-gray-500 truncate\">\n {email}\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
|
+
{"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 dark:bg-gray-900 border-r border-gray-200 dark:border-gray-800 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 dark:bg-primary-900/20 text-primary-700 dark:text-primary-400 border-r-2 border-primary-600\",\n false: \"text-gray-700 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800/50 hover:text-gray-900 dark:hover:text-white\",\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\nexport interface SidebarProfileSectionProps {\n avatarUrl?: string;\n name?: string;\n email?: string;\n avatarFallback?: string;\n collapsedAvatarSize?: \"sm\" | \"md\" | \"lg\";\n expandedAvatarSize?: \"sm\" | \"md\" | \"lg\";\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n}\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 /** Dynamic profile section props */\n profileSectionProps?: SidebarProfileSectionProps;\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 profileSectionProps,\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 // Profile section props with fallbacks\n const {\n avatarUrl = \"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\",\n name = \"John Doe\",\n email = \"john@company.com\",\n avatarFallback = \"JD\",\n collapsedAvatarSize = \"sm\",\n expandedAvatarSize = \"sm\",\n onClick\n } = profileSectionProps || {};\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 {/* Sidebar Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-800\">\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 dark:hover:bg-gray-800 transition-colors\"\n >\n {collapsed ? (\n <ChevronRight className=\"h-4 w-4 text-gray-600 dark:text-gray-400\" />\n ) : (\n <ChevronLeft className=\"h-4 w-4 text-gray-600 dark:text-gray-400\" />\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 dark:border-gray-800 p-4\">\n {collapsed ? (\n <div className=\"flex justify-center\">\n <div\n className={cn(\n \"rounded-lg transition-colors\",\n onClick && \"cursor-pointer hover:bg-primary-50 focus:bg-primary-100 outline-none ring-2 ring-transparent focus:ring-primary-300\"\n )}\n tabIndex={onClick ? 0 : undefined}\n role={onClick ? \"button\" : undefined}\n aria-label={onClick ? \"View profile\" : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => { if (e.key === \"Enter\" || e.key === \" \") onClick(e as any); } : undefined}\n >\n <Avatar size={collapsedAvatarSize}>\n <AvatarImage src={avatarUrl} />\n <AvatarFallback>{avatarFallback}</AvatarFallback>\n </Avatar>\n </div>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div\n className={cn(\n \"flex items-center space-x-3 rounded-lg transition-colors\",\n onClick && \"cursor-pointer hover:bg-primary-50 focus:bg-primary-100 outline-none ring-2 ring-transparent focus:ring-primary-300\"\n )}\n tabIndex={onClick ? 0 : undefined}\n role={onClick ? \"button\" : undefined}\n aria-label={onClick ? \"View profile\" : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => { if (e.key === \"Enter\" || e.key === \" \") onClick(e as any); } : undefined}\n >\n <Avatar size={expandedAvatarSize}>\n <AvatarImage src={avatarUrl} />\n <AvatarFallback>{avatarFallback}</AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white truncate\">\n {name}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 truncate\">\n {email}\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,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { cn } from '../../utils/cn.js';
|
|
3
3
|
|
|
4
|
-
const SidebarHeader = ({ title = "Beyond", letter = "B", className, }) => (jsxs("div", { className: cn("flex items-center space-x-2", className), children: [jsx("div", { className: "w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center", children: jsx("span", { className: "text-white font-bold text-sm", children: letter }) }), jsx("span", { className: "font-bold text-xl text-gray-900", children: title })] }));
|
|
4
|
+
const SidebarHeader = ({ title = "Beyond", letter = "B", className, }) => (jsxs("div", { className: cn("flex items-center space-x-2", className), children: [jsx("div", { className: "w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center", children: jsx("span", { className: "text-white font-bold text-sm", children: letter }) }), jsx("span", { className: "font-bold text-xl text-gray-900 dark:text-white", children: title })] }));
|
|
5
5
|
SidebarHeader.displayName = "SidebarHeader";
|
|
6
6
|
|
|
7
7
|
export { SidebarHeader };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SidebarHeader.js","sources":["../../../src/components/Sidebar/SidebarHeader.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/**\n * SidebarHeader\n * - Reusable header for Sidebar and other layouts.\n * - Accepts dynamic title and letter for branding.\n * - Uses theme tokens (bg-primary-600, text-white, etc.) for theme-agnostic design.\n * - Allows className override for further customization.\n *\n * @example\n * <SidebarHeader title=\"Admin Panel\" letter=\"A\" />\n */\nexport interface SidebarHeaderProps {\n /** Main title text (default: \"Beyond\") */\n title?: string;\n /** Letter/initial in colored box (default: \"B\") */\n letter?: string;\n /** Optional className for root element */\n className?: string;\n}\n\nexport const SidebarHeader: React.FC<SidebarHeaderProps> = ({\n title = \"Beyond\",\n letter = \"B\",\n className,\n}) => (\n <div className={cn(\"flex items-center space-x-2\", className)}>\n <div className=\"w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center\">\n <span className=\"text-white font-bold text-sm\">{letter}</span>\n </div>\n <span className=\"font-bold text-xl text-gray-900\">{title}</span>\n </div>\n);\n\nSidebarHeader.displayName = \"SidebarHeader\";"],"names":["_jsxs","_jsx"],"mappings":";;;AAsBO,MAAM,aAAa,GAAiC,CAAC,EAC1D,KAAK,GAAG,QAAQ,EAChB,MAAM,GAAG,GAAG,EACZ,SAAS,GACV,MACCA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,CAC1DC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oEAAoE,EAAA,QAAA,EACjFA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAE,MAAM,EAAA,CAAQ,EAAA,CAC1D,EACNA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,
|
|
1
|
+
{"version":3,"file":"SidebarHeader.js","sources":["../../../src/components/Sidebar/SidebarHeader.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/**\n * SidebarHeader\n * - Reusable header for Sidebar and other layouts.\n * - Accepts dynamic title and letter for branding.\n * - Uses theme tokens (bg-primary-600, text-white, etc.) for theme-agnostic design.\n * - Allows className override for further customization.\n *\n * @example\n * <SidebarHeader title=\"Admin Panel\" letter=\"A\" />\n */\nexport interface SidebarHeaderProps {\n /** Main title text (default: \"Beyond\") */\n title?: string;\n /** Letter/initial in colored box (default: \"B\") */\n letter?: string;\n /** Optional className for root element */\n className?: string;\n}\n\nexport const SidebarHeader: React.FC<SidebarHeaderProps> = ({\n title = \"Beyond\",\n letter = \"B\",\n className,\n}) => (\n <div className={cn(\"flex items-center space-x-2\", className)}>\n <div className=\"w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center\">\n <span className=\"text-white font-bold text-sm\">{letter}</span>\n </div>\n <span className=\"font-bold text-xl text-gray-900 dark:text-white\">{title}</span>\n </div>\n);\n\nSidebarHeader.displayName = \"SidebarHeader\";"],"names":["_jsxs","_jsx"],"mappings":";;;AAsBO,MAAM,aAAa,GAAiC,CAAC,EAC1D,KAAK,GAAG,QAAQ,EAChB,MAAM,GAAG,GAAG,EACZ,SAAS,GACV,MACCA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,CAC1DC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oEAAoE,EAAA,QAAA,EACjFA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAE,MAAM,EAAA,CAAQ,EAAA,CAC1D,EACNA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,iDAAiD,EAAA,QAAA,EAAE,KAAK,EAAA,CAAQ,CAAA,EAAA,CAC5E;AAGR,aAAa,CAAC,WAAW,GAAG,eAAe;;;;"}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-2{bottom:.5rem}.left-0{left:0}.left-2{left:.5rem}.left-3{left:.75rem}.left-4{left:1rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-16{top:4rem}.top-2{top:.5rem}.top-20{top:5rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-full{grid-column:1/-1}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.-mb-px{margin-bottom:-1px}.-mt-1{margin-top:-.25rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-12{margin-left:3rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[133\.33\%\]{height:133.33%}.h-\[70vh\]{height:70vh}.h-\[800px\]{height:800px}.h-\[80vh\]{height:80vh}.h-\[calc\(100vh-4rem\)\]{height:calc(100vh - 4rem)}.h-full{height:100%}.h-screen{height:100vh}.max-h-80{max-height:20rem}.max-h-\[28rem\]{max-height:28rem}.max-h-\[95vh\]{max-height:95vh}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[400px\]{min-height:400px}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[133\.33\%\]{width:133.33%}.w-\[90vw\]{width:90vw}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[200px\]{min-width:200px}.min-w-\[32px\]{min-width:32px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[95vw\]{max-width:95vw}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-screen-2xl{max-width:1536px}.max-w-screen-lg{max-width:1024px}.max-w-screen-md{max-width:768px}.max-w-screen-sm{max-width:640px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow-0{flex-grow:0}.border-collapse{border-collapse:collapse}.origin-top-left{transform-origin:top left}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-x-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x:-50%}.translate-y-\[-50\%\]{--tw-translate-y:-50%}.rotate-180,.translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-75,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.scroll-mt-20{scroll-margin-top:5rem}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-current{border-color:currentColor}.border-danger-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-danger-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-primary-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-primary-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity,1))}.border-primary-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-primary-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.border-success-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.border-success-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-warning-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-danger-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-danger-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-danger-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-danger-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-primary-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-secondary-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity,1))}.bg-success-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-success-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.bg-success-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-success-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-warning-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.bg-warning-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.bg-warning-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-warning-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/20{background-color:hsla(0,0%,100%,.2)}.bg-white\/80{background-color:hsla(0,0%,100%,.8)}.bg-opacity-40{--tw-bg-opacity:0.4}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-danger-500{--tw-gradient-from:#ef4444 var(--tw-gradient-from-position);--tw-gradient-to:rgba(239,68,68,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-gray-50{--tw-gradient-from:#f9fafb var(--tw-gradient-from-position);--tw-gradient-to:rgba(249,250,251,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-primary-500{--tw-gradient-from:#3b82f6 var(--tw-gradient-from-position);--tw-gradient-to:rgba(59,130,246,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-secondary-500{--tw-gradient-from:#64748b var(--tw-gradient-from-position);--tw-gradient-to:rgba(100,116,139,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-success-500{--tw-gradient-from:#22c55e var(--tw-gradient-from-position);--tw-gradient-to:rgba(34,197,94,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-warning-500{--tw-gradient-from:#f59e0b var(--tw-gradient-from-position);--tw-gradient-to:rgba(245,158,11,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-danger-600{--tw-gradient-to:#dc2626 var(--tw-gradient-to-position)}.to-primary-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.to-secondary-600{--tw-gradient-to:#475569 var(--tw-gradient-to-position)}.to-success-600{--tw-gradient-to:#16a34a var(--tw-gradient-to-position)}.to-warning-600{--tw-gradient-to:#d97706 var(--tw-gradient-to-position)}.to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.bg-cover{background-size:cover}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-8{padding-left:2rem}.pr-10{padding-right:2.5rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-current{color:currentColor}.text-danger-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-danger-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-danger-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-primary-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-primary-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-primary-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-primary-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-secondary-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.text-success-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-success-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.text-success-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-warning-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-warning-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/60{color:hsla(0,0%,100%,.6)}.text-white\/80{color:hsla(0,0%,100%,.8)}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.opacity-0{opacity:0}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-transparent{--tw-ring-color:transparent}.ring-offset-white{--tw-ring-offset-color:#fff}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.placeholder\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.last\:border-b-0:last-child{border-bottom-width:0}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.hover\:border-primary-500:hover{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.hover\:bg-black\/10:hover{background-color:rgba(0,0,0,.1)}.hover\:bg-danger-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\:bg-primary-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.hover\:bg-primary-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.hover\:bg-primary-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\:bg-secondary-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.hover\:bg-success-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.hover\:bg-warning-700:hover{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.hover\:text-orange-600:hover{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.hover\:text-primary-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.hover\:text-primary-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:border-primary-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.focus\:bg-primary-100:focus{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-danger-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity,1))}.focus\:ring-primary-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}.focus\:ring-primary-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-danger-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity,1))}.focus-visible\:ring-primary-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.focus-visible\:ring-success-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity,1))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-white:focus-visible{--tw-ring-offset-color:#fff}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group:hover .group-hover\:opacity-100{opacity:1}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked],.data-\[state\=checked\]\:translate-x-5[data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:1.25rem}.data-\[state\=checked\]\:translate-x-6[data-state=checked]{--tw-translate-x:1.5rem}.data-\[state\=checked\]\:translate-x-6[data-state=checked],.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px}.data-\[state\=active\]\:border-b-2[data-state=active]{border-bottom-width:2px}.data-\[state\=active\]\:border-primary-600[data-state=active],.data-\[state\=checked\]\:border-primary-600[data-state=checked]{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.data-\[state\=active\]\:bg-primary-100[data-state=active]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.data-\[state\=active\]\:bg-white[data-state=active]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-primary-600[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.data-\[state\=unchecked\]\:bg-gray-200[data-state=unchecked]{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.data-\[state\=active\]\:text-gray-950[data-state=active]{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.data-\[state\=active\]\:text-primary-600[data-state=active]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.data-\[state\=active\]\:text-primary-700[data-state=active]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.data-\[state\=checked\]\:text-white[data-state=checked]{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:mb-4{margin-bottom:1rem}.sm\:mb-6{margin-bottom:1.5rem}.sm\:mb-8{margin-bottom:2rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mr-2{margin-right:.5rem}.sm\:mt-12{margin-top:3rem}.sm\:mt-16{margin-top:4rem}.sm\:mt-8{margin-top:2rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:hidden{display:none}.sm\:aspect-\[16\/9\]{aspect-ratio:16/9}.sm\:aspect-square{aspect-ratio:1/1}.sm\:h-12{height:3rem}.sm\:h-16{height:4rem}.sm\:h-4{height:1rem}.sm\:h-5{height:1.25rem}.sm\:h-6{height:1.5rem}.sm\:h-8{height:2rem}.sm\:w-12{width:3rem}.sm\:w-16{width:4rem}.sm\:w-4{width:1rem}.sm\:w-5{width:1.25rem}.sm\:w-6{width:1.5rem}.sm\:w-64{width:16rem}.sm\:w-8{width:2rem}.sm\:w-auto{width:auto}.sm\:max-w-none{max-width:none}.sm\:flex-none{flex:none}.sm\:flex-shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:1rem}.sm\:gap-6{gap:1.5rem}.sm\:gap-8{gap:2rem}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.sm\:rounded-lg{border-radius:.5rem}.sm\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-tr-none{border-top-right-radius:0}.sm\:p-2{padding:.5rem}.sm\:p-3{padding:.75rem}.sm\:p-4{padding:1rem}.sm\:p-6{padding:1.5rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:pb-6{padding-bottom:1.5rem}.sm\:pl-4{padding-left:1rem}.sm\:pt-8{padding-top:2rem}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:p-6{padding:1.5rem}.md\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1024px){.lg\:sticky{position:sticky}.lg\:top-4{top:1rem}.lg\:order-first{order:-9999}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:mb-8{margin-bottom:2rem}.lg\:ml-8{margin-left:2rem}.lg\:mt-0{margin-top:0}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:aspect-video{aspect-ratio:16/9}.lg\:max-h-96{max-height:24rem}.lg\:w-64{width:16rem}.lg\:w-80{width:20rem}.lg\:w-96{width:24rem}.lg\:flex-1{flex:1 1 0%}.lg\:flex-shrink-0{flex-shrink:0}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:gap-8{gap:2rem}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-8{padding-top:2rem;padding-bottom:2rem}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}}@media (min-width:1280px){.xl\:col-span-6{grid-column:span 6/span 6}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:1536px){.\32xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:bg-primary-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.dark\:bg-secondary-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity,1))}.dark\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.dark\:text-primary-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.dark\:hover\:bg-primary-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.dark\:hover\:bg-primary-900:hover{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-secondary-500:hover{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity,1))}.dark\:focus\:ring-primary-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(96 165 250/var(--tw-ring-opacity,1))}}.\[\&_p\]\:leading-relaxed p{line-height:1.625}
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-2{bottom:.5rem}.left-0{left:0}.left-2{left:.5rem}.left-3{left:.75rem}.left-4{left:1rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-16{top:4rem}.top-2{top:.5rem}.top-20{top:5rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-full{grid-column:1/-1}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.-mb-px{margin-bottom:-1px}.-mt-1{margin-top:-.25rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-12{margin-left:3rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[133\.33\%\]{height:133.33%}.h-\[70vh\]{height:70vh}.h-\[800px\]{height:800px}.h-\[80vh\]{height:80vh}.h-\[calc\(100vh-4rem\)\]{height:calc(100vh - 4rem)}.h-full{height:100%}.h-screen{height:100vh}.max-h-80{max-height:20rem}.max-h-\[28rem\]{max-height:28rem}.max-h-\[95vh\]{max-height:95vh}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[400px\]{min-height:400px}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[133\.33\%\]{width:133.33%}.w-\[90vw\]{width:90vw}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[200px\]{min-width:200px}.min-w-\[32px\]{min-width:32px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[95vw\]{max-width:95vw}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-screen-2xl{max-width:1536px}.max-w-screen-lg{max-width:1024px}.max-w-screen-md{max-width:768px}.max-w-screen-sm{max-width:640px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow-0{flex-grow:0}.border-collapse{border-collapse:collapse}.origin-top-left{transform-origin:top left}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-x-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x:-50%}.translate-y-\[-50\%\]{--tw-translate-y:-50%}.rotate-180,.translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-75,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.scroll-mt-20{scroll-margin-top:5rem}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-current{border-color:currentColor}.border-danger-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-danger-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-primary-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-primary-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity,1))}.border-primary-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-primary-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.border-success-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.border-success-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-warning-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-danger-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-danger-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-danger-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-danger-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-primary-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-secondary-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity,1))}.bg-success-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-success-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.bg-success-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-success-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-warning-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.bg-warning-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.bg-warning-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-warning-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/20{background-color:hsla(0,0%,100%,.2)}.bg-white\/80{background-color:hsla(0,0%,100%,.8)}.bg-opacity-40{--tw-bg-opacity:0.4}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-danger-500{--tw-gradient-from:#ef4444 var(--tw-gradient-from-position);--tw-gradient-to:rgba(239,68,68,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-gray-50{--tw-gradient-from:#f9fafb var(--tw-gradient-from-position);--tw-gradient-to:rgba(249,250,251,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-primary-500{--tw-gradient-from:#3b82f6 var(--tw-gradient-from-position);--tw-gradient-to:rgba(59,130,246,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-secondary-500{--tw-gradient-from:#64748b var(--tw-gradient-from-position);--tw-gradient-to:rgba(100,116,139,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-success-500{--tw-gradient-from:#22c55e var(--tw-gradient-from-position);--tw-gradient-to:rgba(34,197,94,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-warning-500{--tw-gradient-from:#f59e0b var(--tw-gradient-from-position);--tw-gradient-to:rgba(245,158,11,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-danger-600{--tw-gradient-to:#dc2626 var(--tw-gradient-to-position)}.to-primary-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.to-secondary-600{--tw-gradient-to:#475569 var(--tw-gradient-to-position)}.to-success-600{--tw-gradient-to:#16a34a var(--tw-gradient-to-position)}.to-warning-600{--tw-gradient-to:#d97706 var(--tw-gradient-to-position)}.to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.bg-cover{background-size:cover}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-8{padding-left:2rem}.pr-10{padding-right:2.5rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-current{color:currentColor}.text-danger-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-danger-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-danger-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-primary-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-primary-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-primary-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-primary-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-secondary-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.text-success-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-success-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.text-success-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-warning-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-warning-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/60{color:hsla(0,0%,100%,.6)}.text-white\/80{color:hsla(0,0%,100%,.8)}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.opacity-0{opacity:0}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-transparent{--tw-ring-color:transparent}.ring-offset-white{--tw-ring-offset-color:#fff}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.placeholder\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.last\:border-b-0:last-child{border-bottom-width:0}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.hover\:border-primary-500:hover{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.hover\:bg-black\/10:hover{background-color:rgba(0,0,0,.1)}.hover\:bg-danger-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\:bg-primary-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.hover\:bg-primary-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.hover\:bg-primary-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\:bg-secondary-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.hover\:bg-success-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.hover\:bg-warning-700:hover{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.hover\:text-orange-600:hover{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.hover\:text-primary-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.hover\:text-primary-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:border-primary-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.focus\:bg-primary-100:focus{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-danger-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity,1))}.focus\:ring-primary-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}.focus\:ring-primary-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-danger-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity,1))}.focus-visible\:ring-primary-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.focus-visible\:ring-success-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity,1))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-white:focus-visible{--tw-ring-offset-color:#fff}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group:hover .group-hover\:opacity-100{opacity:1}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked],.data-\[state\=checked\]\:translate-x-5[data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:1.25rem}.data-\[state\=checked\]\:translate-x-6[data-state=checked]{--tw-translate-x:1.5rem}.data-\[state\=checked\]\:translate-x-6[data-state=checked],.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px}.data-\[state\=active\]\:border-b-2[data-state=active]{border-bottom-width:2px}.data-\[state\=active\]\:border-primary-600[data-state=active],.data-\[state\=checked\]\:border-primary-600[data-state=checked]{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.data-\[state\=active\]\:bg-primary-100[data-state=active]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.data-\[state\=active\]\:bg-white[data-state=active]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-primary-600[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.data-\[state\=unchecked\]\:bg-gray-200[data-state=unchecked]{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.data-\[state\=active\]\:text-gray-950[data-state=active]{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.data-\[state\=active\]\:text-primary-600[data-state=active]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.data-\[state\=active\]\:text-primary-700[data-state=active]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.data-\[state\=checked\]\:text-white[data-state=checked]{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:border-gray-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:bg-gray-800\/50:is(.dark *){background-color:rgba(31,41,55,.5)}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.dark\:bg-primary-400:is(.dark *){--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.dark\:bg-primary-900\/20:is(.dark *){background-color:rgba(30,58,138,.2)}.dark\:bg-secondary-400:is(.dark *){--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-gray-900:is(.dark *){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.dark\:text-primary-300:is(.dark *){--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:hover\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-800\/50:hover:is(.dark *){background-color:rgba(31,41,55,.5)}.dark\:hover\:bg-primary-500:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.dark\:hover\:bg-primary-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-secondary-500:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity,1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:focus\:bg-gray-900:focus:is(.dark *){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.dark\:focus\:ring-primary-400:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(96 165 250/var(--tw-ring-opacity,1))}@media (min-width:640px){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:mb-4{margin-bottom:1rem}.sm\:mb-6{margin-bottom:1.5rem}.sm\:mb-8{margin-bottom:2rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mr-2{margin-right:.5rem}.sm\:mt-12{margin-top:3rem}.sm\:mt-16{margin-top:4rem}.sm\:mt-8{margin-top:2rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:hidden{display:none}.sm\:aspect-\[16\/9\]{aspect-ratio:16/9}.sm\:aspect-square{aspect-ratio:1/1}.sm\:h-12{height:3rem}.sm\:h-16{height:4rem}.sm\:h-4{height:1rem}.sm\:h-5{height:1.25rem}.sm\:h-6{height:1.5rem}.sm\:h-8{height:2rem}.sm\:w-12{width:3rem}.sm\:w-16{width:4rem}.sm\:w-4{width:1rem}.sm\:w-5{width:1.25rem}.sm\:w-6{width:1.5rem}.sm\:w-64{width:16rem}.sm\:w-8{width:2rem}.sm\:w-auto{width:auto}.sm\:max-w-none{max-width:none}.sm\:flex-none{flex:none}.sm\:flex-shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:1rem}.sm\:gap-6{gap:1.5rem}.sm\:gap-8{gap:2rem}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.sm\:rounded-lg{border-radius:.5rem}.sm\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-tr-none{border-top-right-radius:0}.sm\:p-2{padding:.5rem}.sm\:p-3{padding:.75rem}.sm\:p-4{padding:1rem}.sm\:p-6{padding:1.5rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:pb-6{padding-bottom:1.5rem}.sm\:pl-4{padding-left:1rem}.sm\:pt-8{padding-top:2rem}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:p-6{padding:1.5rem}.md\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1024px){.lg\:sticky{position:sticky}.lg\:top-4{top:1rem}.lg\:order-first{order:-9999}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:mb-8{margin-bottom:2rem}.lg\:ml-8{margin-left:2rem}.lg\:mt-0{margin-top:0}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:aspect-video{aspect-ratio:16/9}.lg\:max-h-96{max-height:24rem}.lg\:w-64{width:16rem}.lg\:w-80{width:20rem}.lg\:w-96{width:24rem}.lg\:flex-1{flex:1 1 0%}.lg\:flex-shrink-0{flex-shrink:0}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:gap-8{gap:2rem}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-8{padding-top:2rem;padding-bottom:2rem}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}}@media (min-width:1280px){.xl\:col-span-6{grid-column:span 6/span 6}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:1536px){.\32xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}}.\[\&_p\]\:leading-relaxed p{line-height:1.625}
|